├── .gitignore ├── LICENSE ├── Makefile ├── README.md ├── example ├── contracts.json └── test_example.py ├── pytest_ethereum ├── __init__.py ├── account.py ├── contract.py ├── log.py ├── package.py ├── plugin.py ├── tester.py └── utils.py ├── setup.py └── tests ├── api ├── accounts │ └── test_account.py ├── conftest.py ├── contracts │ ├── Faucet.sol │ ├── conftest.py │ ├── test_basic.py │ ├── test_factory.py │ └── test_owned.py └── tester │ └── test_tester.py └── plugin ├── conftest.py └── test_assetfile.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Setuptools stuff 2 | build/ 3 | dist/ 4 | pytest_ethereum.egg-info/ 5 | 6 | # Python stuff 7 | __pycache__/ 8 | 9 | # py.test stuff 10 | .pytest_cache/ 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright 2017 Bryant Eisenbach 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software 6 | and associated documentation files (the "Software"), to deal in the Software without restriction, 7 | including without limitation the rights to use, copy, modify, merge, publish, distribute, 8 | sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all copies or 12 | substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT 15 | NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 16 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 17 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT 18 | OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 19 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | install: clean 2 | -pip freeze | xargs pip uninstall -y 3 | pip install -e . 4 | 5 | test: install 6 | py.test tests/ 7 | 8 | # Verify our example project 9 | .PHONY: example 10 | example: install 11 | py.test --package-file example/contracts.json example/ 12 | 13 | upload: test example 14 | pip install twine 15 | python setup.py sdist 16 | twine upload dist/* 17 | 18 | # Checks dry run, then prompts to execute 19 | clean: 20 | rm -rf build/ 21 | rm -rf dist/ 22 | rm -rf pytest_ethereum.egg-info/ 23 | rm -rf __pycache__/ 24 | rm -rf .pytest_cache/ 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PyTest Ethereum Plugin 2 | *py.test plugin for testing Ethereum Smart Contracts* 3 | 4 | --- 5 | 6 | # Usage 7 | 8 | Step 1: Install 9 | ```bash 10 | pip install pytest-ethereum # python 3.6+ 11 | ``` 12 | 13 | Step 2: Compile your contracts into a package (soon to be ethPM-compliant) 14 | ```bash 15 | solc --combined-json abi,bin,bin-runtime contracts/ > contracts.json 16 | ``` 17 | 18 | Step 3. Execute your test suite (make sure to import your package file!) 19 | ```bash 20 | py.test --package-file contracts.json tests/ 21 | ``` 22 | 23 | --- 24 | 25 | # Guidelines 26 | 27 | 1. This plugin is *opinionated* 28 | * There should only be *one way* to do something 29 | * Support for special needs is possible, but undesireable 30 | 2. This plugin is *intuitive* 31 | * It should be VERY clear how to use it 32 | * It should not get in the way of smart contract testing 33 | * It should remove the complexities of a production environment 34 | 3. This plugin is *concise* 35 | * Fixture API is simple and expressive 36 | * Write high quality tests quickly and easily 37 | 38 | --- 39 | 40 | # Contributing 41 | 42 | Rules: 43 | 1. Test cases should be grep'd from documentation 44 | * Unless they are uninteresting corner cases 45 | 2. Test cases should be well explained 46 | 3. Follow the Guidelines! 47 | -------------------------------------------------------------------------------- /example/contracts.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.4.19+commit.c4cbbb05.Linux.g++", 3 | "contracts": { 4 | "path/to/Owned.sol:Owned": { 5 | "bin-runtime": "60606040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680638da5cb5b14610051578063a6f9dae1146100a6575b600080fd5b341561005c57600080fd5b6100646100df565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100b157600080fd5b6100dd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610104565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561015f57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505600a165627a7a72305820880a4056fab249ea33a384814995ed65839292e7edf737e2082462ab370b372a0029", 6 | "abi": "[{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"changeOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", 7 | "bin": "6060604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550341561004f57600080fd5b6101ce8061005e6000396000f30060606040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680638da5cb5b14610051578063a6f9dae1146100a6575b600080fd5b341561005c57600080fd5b6100646100df565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100b157600080fd5b6100dd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610104565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561015f57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505600a165627a7a72305820880a4056fab249ea33a384814995ed65839292e7edf737e2082462ab370b372a0029" 8 | }, 9 | "path/to/Token.sol:Token": { 10 | "bin-runtime": "6060604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100bf578063095ea7b31461014d57806318160ddd146101a757806323b872dd146101d057806327e235e314610249578063313ce5671461029657806370a08231146102c55780638da5cb5b1461031257806395d89b4114610367578063a6f9dae1146103f5578063a9059cbb1461042e578063dd62ed3e14610488575b600080fd5b34156100ca57600080fd5b6100d26104f4565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101125780820151818401526020810190506100f7565b50505050905090810190601f16801561013f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015857600080fd5b61018d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610592565b604051808215151515815260200191505060405180910390f35b34156101b257600080fd5b6101ba610684565b6040518082815260200191505060405180910390f35b34156101db57600080fd5b61022f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068e565b604051808215151515815260200191505060405180910390f35b341561025457600080fd5b610280600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610995565b6040518082815260200191505060405180910390f35b34156102a157600080fd5b6102a96109ad565b604051808260ff1660ff16815260200191505060405180910390f35b34156102d057600080fd5b6102fc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109c0565b6040518082815260200191505060405180910390f35b341561031d57600080fd5b610325610a09565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561037257600080fd5b61037a610a2e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103ba57808201518184015260208101905061039f565b50505050905090810190601f1680156103e75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561040057600080fd5b61042c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610acc565b005b341561043957600080fd5b61046e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610b6a565b604051808215151515815260200191505060405180910390f35b341561049357600080fd5b6104de600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d5e565b6040518082815260200191505060405180910390f35b60028054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561058a5780601f1061055f5761010080835404028352916020019161058a565b820191906000526020600020905b81548152906001019060200180831161056d57829003601f168201915b505050505081565b600081600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600354905090565b600081600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015801561075b575081600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b80156107675750600082115b80156107f25750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401115b156109895781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905061098e565b600090505b9392505050565b60046020528060005260406000206000915090505481565b600660009054906101000a900460ff1681565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ac45780601f10610a9957610100808354040283529160200191610ac4565b820191906000526020600020905b815481529060010190602001808311610aa757829003601f168201915b505050505081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b2757600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410158015610bbb5750600082115b8015610c465750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401115b15610d535781600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360019050610d58565b600090505b92915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050929150505600a165627a7a7230582050b3bfaccbeb1c92ad4a7b5f5396a2650ec833b1988ebf78bd5a8e68d41330890029", 11 | "abi": "[{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"changeOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"remaining\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_symbol\",\"type\":\"string\"},{\"name\":\"_name\",\"type\":\"string\"},{\"name\":\"_decimals\",\"type\":\"uint8\"},{\"name\":\"initialSupply\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"}]", 12 | "bin": "6060604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550341561004f57600080fd5b60405161101c38038061101c8339810160405280805182019190602001805182019190602001805190602001909190805190602001909190505083838360ff16600a0a830282600190805190602001906100aa929190610157565b5081600290805190602001906100c1929190610157565b5080600381905550600354600460008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505081600660006101000a81548160ff021916908360ff160217905550505050506101fc565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061019857805160ff19168380011785556101c6565b828001600101855582156101c6579182015b828111156101c55782518255916020019190600101906101aa565b5b5090506101d391906101d7565b5090565b6101f991905b808211156101f55760008160009055506001016101dd565b5090565b90565b610e118061020b6000396000f3006060604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100bf578063095ea7b31461014d57806318160ddd146101a757806323b872dd146101d057806327e235e314610249578063313ce5671461029657806370a08231146102c55780638da5cb5b1461031257806395d89b4114610367578063a6f9dae1146103f5578063a9059cbb1461042e578063dd62ed3e14610488575b600080fd5b34156100ca57600080fd5b6100d26104f4565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101125780820151818401526020810190506100f7565b50505050905090810190601f16801561013f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015857600080fd5b61018d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610592565b604051808215151515815260200191505060405180910390f35b34156101b257600080fd5b6101ba610684565b6040518082815260200191505060405180910390f35b34156101db57600080fd5b61022f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068e565b604051808215151515815260200191505060405180910390f35b341561025457600080fd5b610280600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610995565b6040518082815260200191505060405180910390f35b34156102a157600080fd5b6102a96109ad565b604051808260ff1660ff16815260200191505060405180910390f35b34156102d057600080fd5b6102fc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109c0565b6040518082815260200191505060405180910390f35b341561031d57600080fd5b610325610a09565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561037257600080fd5b61037a610a2e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103ba57808201518184015260208101905061039f565b50505050905090810190601f1680156103e75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561040057600080fd5b61042c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610acc565b005b341561043957600080fd5b61046e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610b6a565b604051808215151515815260200191505060405180910390f35b341561049357600080fd5b6104de600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d5e565b6040518082815260200191505060405180910390f35b60028054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561058a5780601f1061055f5761010080835404028352916020019161058a565b820191906000526020600020905b81548152906001019060200180831161056d57829003601f168201915b505050505081565b600081600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600354905090565b600081600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015801561075b575081600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b80156107675750600082115b80156107f25750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401115b156109895781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905061098e565b600090505b9392505050565b60046020528060005260406000206000915090505481565b600660009054906101000a900460ff1681565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ac45780601f10610a9957610100808354040283529160200191610ac4565b820191906000526020600020905b815481529060010190602001808311610aa757829003601f168201915b505050505081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b2757600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410158015610bbb5750600082115b8015610c465750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401115b15610d535781600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360019050610d58565b600090505b92915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050929150505600a165627a7a7230582050b3bfaccbeb1c92ad4a7b5f5396a2650ec833b1988ebf78bd5a8e68d41330890029" 13 | }, 14 | "path/to/TimeLimited.sol:TestTimeLimited": { 15 | "bin-runtime": "60606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630fb5a6b414610093578063753899e9146100bc57806383197ef0146100e95780638da5cb5b146100fe578063a56fa76c14610153578063a6f9dae114610168578063bef4876b146101a1578063d8270dce146101ce575b600080fd5b341561009e57600080fd5b6100a66101f7565b6040518082815260200191505060405180910390f35b34156100c757600080fd5b6100cf6101fd565b604051808215151515815260200191505060405180910390f35b34156100f457600080fd5b6100fc610242565b005b341561010957600080fd5b610111610276565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b61016661029b565b005b341561017357600080fd5b61019f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610328565b005b34156101ac57600080fd5b6101b46103c6565b604051808215151515815260200191505060405180910390f35b34156101d957600080fd5b6101e16103d9565b6040518082815260200191505060405180910390f35b60025481565b6000600360009054906101000a900460ff1615151561021b57600080fd5b600254600154014210801561023d5750600360009054906101000a900460ff16155b905090565b600360009054906101000a900460ff16151561025d57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16ff5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102f657600080fd5b60025460015401421015151561030b57600080fd5b6001600360006101000a81548160ff021916908315150217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561038357600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900460ff1681565b600154815600a165627a7a72305820cfa24f8534068ff9caf1fc94dda21bbaf586fa7b501b0712c37a18549b783ff90029", 16 | "abi": "[{\"constant\":true,\"inputs\":[],\"name\":\"duration\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"alive\",\"outputs\":[{\"name\":\"_stuff\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"destroy\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"setExpired\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"changeOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"finished\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"creationTime\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_duration\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]", 17 | "bin": "6060604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600155341561005357600080fd5b604051602080610493833981016040528080519060200190919050508080600281905550505061040b806100886000396000f30060606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630fb5a6b414610093578063753899e9146100bc57806383197ef0146100e95780638da5cb5b146100fe578063a56fa76c14610153578063a6f9dae114610168578063bef4876b146101a1578063d8270dce146101ce575b600080fd5b341561009e57600080fd5b6100a66101f7565b6040518082815260200191505060405180910390f35b34156100c757600080fd5b6100cf6101fd565b604051808215151515815260200191505060405180910390f35b34156100f457600080fd5b6100fc610242565b005b341561010957600080fd5b610111610276565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b61016661029b565b005b341561017357600080fd5b61019f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610328565b005b34156101ac57600080fd5b6101b46103c6565b604051808215151515815260200191505060405180910390f35b34156101d957600080fd5b6101e16103d9565b6040518082815260200191505060405180910390f35b60025481565b6000600360009054906101000a900460ff1615151561021b57600080fd5b600254600154014210801561023d5750600360009054906101000a900460ff16155b905090565b600360009054906101000a900460ff16151561025d57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16ff5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102f657600080fd5b60025460015401421015151561030b57600080fd5b6001600360006101000a81548160ff021916908315150217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561038357600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900460ff1681565b600154815600a165627a7a72305820cfa24f8534068ff9caf1fc94dda21bbaf586fa7b501b0712c37a18549b783ff90029" 18 | }, 19 | "path/to/ICO.sol:ICO": { 20 | "bin-runtime": "606060405260043610610133576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806302c7e7af146101385780630b5e89f4146101615780630fb5a6b41461018e578063144fa6d7146101b75780632b9edee9146101f05780635cb732be1461021d578063676c0d77146102325780637f94bc31146102555780637fa8c158146102825780637ff9b596146102975780638da5cb5b146102c0578063906a26e0146103155780639762f8021461033e5780639850d32b1461036b578063a12ee7ba146103c0578063a1e5c3ed146103f9578063a48217191461040e578063a6f9dae114610418578063d07165c714610451578063d8270dce14610466578063fb42b01a1461048f578063fb86a404146104a4578063fc0c546a146104cd575b600080fd5b341561014357600080fd5b61014b610522565b6040518082815260200191505060405180910390f35b341561016c57600080fd5b610174610528565b604051808215151515815260200191505060405180910390f35b341561019957600080fd5b6101a161053b565b6040518082815260200191505060405180910390f35b34156101c257600080fd5b6101ee600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610541565b005b34156101fb57600080fd5b6102036105e1565b604051808215151515815260200191505060405180910390f35b341561022857600080fd5b6102306105f0565b005b341561023d57600080fd5b61025360048080359060200190919050506107a2565b005b341561026057600080fd5b61026861083b565b604051808215151515815260200191505060405180910390f35b341561028d57600080fd5b61029561084e565b005b34156102a257600080fd5b6102aa610901565b6040518082815260200191505060405180910390f35b34156102cb57600080fd5b6102d3610907565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561032057600080fd5b61032861092c565b6040518082815260200191505060405180910390f35b341561034957600080fd5b610351610932565b604051808215151515815260200191505060405180910390f35b341561037657600080fd5b61037e610941565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103cb57600080fd5b6103f7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610967565b005b341561040457600080fd5b61040c610a07565b005b610416610ac4565b005b341561042357600080fd5b61044f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c8d565b005b341561045c57600080fd5b610464610d2b565b005b341561047157600080fd5b610479610e28565b6040518082815260200191505060405180910390f35b341561049a57600080fd5b6104a2610e2e565b005b34156104af57600080fd5b6104b7610f1f565b6040518082815260200191505060405180910390f35b34156104d857600080fd5b6104e0610f25565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60085481565b600a60009054906101000a900460ff1681565b60075481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561059d57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006005546008541015905090565b600080600a60019054906101000a900460ff16151561060e57600080fd5b61061733610f4b565b915060008211151561062857600080fd5b610654336000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611034565b81600860008282540392505081905550600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f47bc8b296a721ead4262b15df1a3123f2c4eed6afa70823038a3c34d60d478f2338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a13373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561079e57600080fd5b5050565b600a60009054906101000a900460ff1680156107cb5750600a60019054906101000a900460ff16155b15156107d657600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561083157600080fd5b8060038190555050565b600a60019054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108a957600080fd5b6004546108d76000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff163061117c565b101515156108e457600080fd5b6001600a60006101000a81548160ff021916908315150217905550565b60035481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b60006004546008541015905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109c357600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60019054906101000a900460ff161515610a2257600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a7d57600080fd5b60006008541415610ac2576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b565b600080600a60009054906101000a900460ff168015610af05750600a60019054906101000a900460ff16155b1515610afb57600080fd5b610b03610932565b151515610b0f57600080fd5b60035434811515610b1c57fe5b049150600082111515610b2b57fe5b60035482023403905060035481101515610b4157fe5b816008600082825401925050819055506003548202600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550610bce6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff163384611034565b7f97b1cd3307803802ff5e5152505de2a9e850e59c5e8d05b69c592abf2aa8ae8c33348484604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390a13373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610c8957600080fd5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ce857600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60009054906101000a900460ff168015610d545750600a60019054906101000a900460ff16155b1515610d5f57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610dba57600080fd5b610dc2610932565b80610de35750610dd06105e1565b8015610de25750600754600654014210155b5b1515610dee57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b60065481565b600a60009054906101000a900460ff168015610e575750600a60019054906101000a900460ff16155b1515610e6257600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ebd57600080fd5b600a60019054906101000a900460ff16151515610ed957600080fd5b610ee16105e1565b151515610eed57600080fd5b600754600654014210151515610f0257600080fd5b6001600a60016101000a81548160ff021916908315150217905550565b60045481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561101257600080fd5b6102c65a03f1151561102357600080fd5b505050604051805190509050919050565b8061103f843061117c565b1015151561104957fe5b600081111561117757600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8484846000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561115357600080fd5b6102c65a03f1151561116457600080fd5b50505060405180519050151561117657fe5b5b505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561127757600080fd5b6102c65a03f1151561128857600080fd5b505050604051805190509050929150505600a165627a7a7230582031d7c9b9225ce274184c008ec434a43930693c3f34633f89e067d7c2a54cd2760029", 21 | "abi": "[{\"constant\":true,\"inputs\":[],\"name\":\"sold\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"icoStarted\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"duration\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"setToken\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"softCapReached\",\"outputs\":[{\"name\":\"isReached\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"refundToken\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_tokenPrice\",\"type\":\"uint256\"}],\"name\":\"updateTokenPrice\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"icoFailed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"startICO\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"tokenPrice\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"softCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"hardCapReached\",\"outputs\":[{\"name\":\"isReached\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"maintainer\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newMaintainer\",\"type\":\"address\"}],\"name\":\"changeMaintainer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"failedICO\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"buyToken\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"changeOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"successfulICO\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"creationTime\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"declareFailure\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"hardCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_tokenPrice\",\"type\":\"uint256\"},{\"name\":\"_hardCap\",\"type\":\"uint256\"},{\"name\":\"_softCap\",\"type\":\"uint256\"},{\"name\":\"_duration\",\"type\":\"uint256\"},{\"name\":\"_token\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"valueSent\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"tokensBought\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"refund\",\"type\":\"uint256\"}],\"name\":\"TokenBuy\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tokensReturned\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"refund\",\"type\":\"uint256\"}],\"name\":\"TokenRefund\",\"type\":\"event\"}]", 22 | "bin": "6060604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260065560006008556000600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff02191690831515021790555034156100cf57600080fd5b60405160a080611448833981016040528080519060200190919080519060200190919080519060200190919080519060200190919080519060200190919050508080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508460038190555083600481905550826005819055508160078190555050505050506112c6806101826000396000f300606060405260043610610133576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806302c7e7af146101385780630b5e89f4146101615780630fb5a6b41461018e578063144fa6d7146101b75780632b9edee9146101f05780635cb732be1461021d578063676c0d77146102325780637f94bc31146102555780637fa8c158146102825780637ff9b596146102975780638da5cb5b146102c0578063906a26e0146103155780639762f8021461033e5780639850d32b1461036b578063a12ee7ba146103c0578063a1e5c3ed146103f9578063a48217191461040e578063a6f9dae114610418578063d07165c714610451578063d8270dce14610466578063fb42b01a1461048f578063fb86a404146104a4578063fc0c546a146104cd575b600080fd5b341561014357600080fd5b61014b610522565b6040518082815260200191505060405180910390f35b341561016c57600080fd5b610174610528565b604051808215151515815260200191505060405180910390f35b341561019957600080fd5b6101a161053b565b6040518082815260200191505060405180910390f35b34156101c257600080fd5b6101ee600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610541565b005b34156101fb57600080fd5b6102036105e1565b604051808215151515815260200191505060405180910390f35b341561022857600080fd5b6102306105f0565b005b341561023d57600080fd5b61025360048080359060200190919050506107a2565b005b341561026057600080fd5b61026861083b565b604051808215151515815260200191505060405180910390f35b341561028d57600080fd5b61029561084e565b005b34156102a257600080fd5b6102aa610901565b6040518082815260200191505060405180910390f35b34156102cb57600080fd5b6102d3610907565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561032057600080fd5b61032861092c565b6040518082815260200191505060405180910390f35b341561034957600080fd5b610351610932565b604051808215151515815260200191505060405180910390f35b341561037657600080fd5b61037e610941565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103cb57600080fd5b6103f7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610967565b005b341561040457600080fd5b61040c610a07565b005b610416610ac4565b005b341561042357600080fd5b61044f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c8d565b005b341561045c57600080fd5b610464610d2b565b005b341561047157600080fd5b610479610e28565b6040518082815260200191505060405180910390f35b341561049a57600080fd5b6104a2610e2e565b005b34156104af57600080fd5b6104b7610f1f565b6040518082815260200191505060405180910390f35b34156104d857600080fd5b6104e0610f25565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60085481565b600a60009054906101000a900460ff1681565b60075481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561059d57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006005546008541015905090565b600080600a60019054906101000a900460ff16151561060e57600080fd5b61061733610f4b565b915060008211151561062857600080fd5b610654336000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611034565b81600860008282540392505081905550600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f47bc8b296a721ead4262b15df1a3123f2c4eed6afa70823038a3c34d60d478f2338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a13373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561079e57600080fd5b5050565b600a60009054906101000a900460ff1680156107cb5750600a60019054906101000a900460ff16155b15156107d657600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561083157600080fd5b8060038190555050565b600a60019054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108a957600080fd5b6004546108d76000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff163061117c565b101515156108e457600080fd5b6001600a60006101000a81548160ff021916908315150217905550565b60035481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b60006004546008541015905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109c357600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60019054906101000a900460ff161515610a2257600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a7d57600080fd5b60006008541415610ac2576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b565b600080600a60009054906101000a900460ff168015610af05750600a60019054906101000a900460ff16155b1515610afb57600080fd5b610b03610932565b151515610b0f57600080fd5b60035434811515610b1c57fe5b049150600082111515610b2b57fe5b60035482023403905060035481101515610b4157fe5b816008600082825401925050819055506003548202600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550610bce6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff163384611034565b7f97b1cd3307803802ff5e5152505de2a9e850e59c5e8d05b69c592abf2aa8ae8c33348484604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390a13373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610c8957600080fd5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ce857600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60009054906101000a900460ff168015610d545750600a60019054906101000a900460ff16155b1515610d5f57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610dba57600080fd5b610dc2610932565b80610de35750610dd06105e1565b8015610de25750600754600654014210155b5b1515610dee57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b60065481565b600a60009054906101000a900460ff168015610e575750600a60019054906101000a900460ff16155b1515610e6257600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ebd57600080fd5b600a60019054906101000a900460ff16151515610ed957600080fd5b610ee16105e1565b151515610eed57600080fd5b600754600654014210151515610f0257600080fd5b6001600a60016101000a81548160ff021916908315150217905550565b60045481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561101257600080fd5b6102c65a03f1151561102357600080fd5b505050604051805190509050919050565b8061103f843061117c565b1015151561104957fe5b600081111561117757600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8484846000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561115357600080fd5b6102c65a03f1151561116457600080fd5b50505060405180519050151561117657fe5b5b505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561127757600080fd5b6102c65a03f1151561128857600080fd5b505050604051805190509050929150505600a165627a7a7230582031d7c9b9225ce274184c008ec434a43930693c3f34633f89e067d7c2a54cd2760029" 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /example/test_example.py: -------------------------------------------------------------------------------- 1 | # Just use the 'tester' fixture in your pytest_ethereum-enabled tests 2 | def test_stuff(tester): 3 | 4 | # Get contracts via name from your assets file (e.g. 'contracts.json') 5 | # NOTE: When no contract from file is selected, 6 | # uses file basename e.g. 'path/to/Owned.sol:Owned' 7 | owned = tester.contracts('path/to/Owned.sol')() 8 | 9 | # You can specify a specific contract from the file 10 | timelimited_factory = tester.contracts('path/to/TimeLimited.sol:TestTimeLimited') 11 | # You must specify the deployment args if they exist 12 | # NOTE: must be supplied in abi order 13 | timelimited = timelimited_factory(10) # arg1: 10 blocks 14 | 15 | # You can also load and deploy a contract ad-hoc via a contract interface 16 | # Requires interface={'abi': [...], 'bytecode': '0x...', 'bytecode_runtime': '0x...'} 17 | adhoc_interface = {'abi': [], 'bytecode': '0x0', 'bytecode_runtime': '0x0'} 18 | ad_hoc_factory = tester.new_contract(adhoc_interface) 19 | 20 | # You can deploy from any contract factory multiple times 21 | one = ad_hoc_factory() 22 | another = ad_hoc_factory() 23 | 24 | # Can supply transact={...} to change deployment transaction params 25 | ad_hoc_a1 = ad_hoc_factory(transact={'from': tester.accounts[1]}) 26 | 27 | # All contracts (generated or ad-hoc) have an address 28 | print("Ad-Hoc Adress is:", ad_hoc_a1.address) 29 | 30 | # Use normal assert syntax for testing 31 | # pure/view/constant functions call by default 32 | assert owned.owner() == tester.accounts[0] # Doesn't mine a block! 33 | 34 | # non-'constant' functions transact by default 35 | # NOTE: Transactions auto-mine (see eth-tester) 36 | owned.changeOwner(tester.accounts[1]) # Transaction auto-mined into block 37 | assert owned.owner() == tester.accounts[1] # No transaction here 38 | 39 | # Use this for asserting when a failed transaction should occur 40 | starting_balance = tester.accounts[0].balance 41 | with tester.tx_fails: 42 | owned.changeOwner(tester.accounts[0]) # account 0 is no longer the owner! 43 | # We can do multiple failures in here... 44 | with tester.tx_fails: 45 | owned.changeOwner(tester.accounts[2]) # account 2 isn't either 46 | 47 | # No transactions were committed for these failures 48 | assert starting_balance == tester.accounts[0].balance 49 | 50 | # You can supply optional transaction params 51 | owned.changeOwner(tester.accounts[0], 52 | transact={ 53 | 'from': tester.accounts[1], # from a different sender 54 | #'value': 100, # send 100 wei in this transaction 55 | # You can also do other things... see web3.py for more info! 56 | } 57 | ) 58 | assert owned.owner() == tester.accounts[0] # account[0] is the owner again! 59 | 60 | # You can mine an empty block if you want 61 | while timelimited.alive(): # This makes a call, so no transaction occurs 62 | tester.mine_blocks() # mines an empty block 63 | 64 | # You can check the current timestamp 65 | assert tester.now() >= timelimited.creationTime() + timelimited.duration() 66 | timelimited.setExpired() 67 | # You can check to see if a contract still has code 68 | # NOTE: Implicitly calls address.codesize != 0 69 | assert timelimited.hascode 70 | timelimited.destroy() # Calls selfdestruct opcode, removing code 71 | assert not timelimited.hascode 72 | 73 | # Get Ether balance of any address 74 | print("Account 0 has", tester.accounts[0].balance, "Wei") 75 | print("Account 1 has", tester.accounts[1].balance, "Wei") 76 | print("Contract 'timelimited' has", timelimited.balance, "Wei") 77 | 78 | # Send any address Ether 79 | print("Account 2 has", tester.accounts[2].balance, "Wei") 80 | tester.accounts[1].transfer(tester.accounts[2], 100) # send 100 wei to address 2 81 | print("Account 2 now has", tester.accounts[2].balance, "Wei") 82 | 83 | 84 | import pytest 85 | 86 | 87 | # Constants for Token 88 | SYMBOL = 'TEST' 89 | NAME = 'Test Token' 90 | DECIMALS = 0 91 | INITIAL_SUPPLY = 100 92 | 93 | # You can also create your own fixtures! 94 | @pytest.fixture 95 | def Token(t): 96 | # t is an alias for tester 97 | args = [SYMBOL, NAME, DECIMALS, INITIAL_SUPPLY] # for convienence 98 | # t.c is an alias for tester.contracts 99 | return t.c('path/to/Token.sol')(*args) 100 | 101 | 102 | def test_token(t, Token): 103 | # You can do all of these with the your own fixtures too! 104 | 105 | # Test Token.transfer() 106 | # t.a is an alias for tester.accounts 107 | assert Token.balanceOf(t.a[0]) == INITIAL_SUPPLY 108 | assert Token.balanceOf(t.a[1]) == 0 109 | Token.transfer(t.a[1], 10) # Creates a log 110 | assert Token.balanceOf(t.a[0]) == INITIAL_SUPPLY - 10 111 | assert Token.balanceOf(t.a[1]) == 10 112 | 113 | # Create a Transfer log to check against 114 | expected_log = Token.Transfer( 115 | # Below is all the members of the event 116 | {'_from': t.a[0], '_to': t.a[1], '_value': 10} 117 | ) 118 | # Test transfer's event against the expected value 119 | assert Token.logs[-1] == expected_log 120 | 121 | # You can also check individual fields 122 | Token.approve(t.a[2], 10) 123 | Approval = Token.logs[-1] 124 | assert Approval['_owner'] == t.a[0] 125 | assert Approval['_spender'] == t.a[2] 126 | assert Approval['_value'] == 10 127 | 128 | # Constants for ICO 129 | TOKEN_PRICE = 1000 # 100 wei/token 130 | HARDCAP = INITIAL_SUPPLY # Max tokens for sale 131 | SOFTCAP = 10 # Min tokens for successful sale 132 | DURATION = 100 # active blocks 133 | 134 | @pytest.fixture 135 | def ICO(tester, Token): 136 | # If you need to link fixtures together, you can! 137 | args = [TOKEN_PRICE, HARDCAP, SOFTCAP, DURATION, Token.address] 138 | return tester.contracts('path/to/ICO.sol')(*args) 139 | 140 | import random 141 | def test_ico(tester, Token, ICO): 142 | # NOTE: Token is not the same deployment as the one in test_token! 143 | assert Token.balanceOf(tester.accounts[0]) == INITIAL_SUPPLY 144 | 145 | Token.approve(ICO.address, ICO.hardCap()) 146 | ICO.startICO() # Let's get this party started! 147 | 148 | # You can create very powerful tests with this library 149 | tp = ICO.tokenPrice() 150 | sold = 0 # use this later 151 | while not ICO.hardCapReached(): 152 | # Every round, buyer buys an amount of tokens between [1, softCap) 153 | buyer = random.choice(tester.accounts[1:]) 154 | amount = tp*min(random.randrange(1, ICO.softCap()),ICO.hardCap()-sold) 155 | ICO.buyToken(transact={'from':buyer, 'value':amount}) 156 | print(buyer, "bought", ICO.sold()-sold, "tokens this round!") 157 | sold = ICO.sold() # Update for next round 158 | -------------------------------------------------------------------------------- /pytest_ethereum/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fubuloubu/pytest-ethereum-old/717f7efd4762ee2fa739c2e3370c39ebd0d238c8/pytest_ethereum/__init__.py -------------------------------------------------------------------------------- /pytest_ethereum/account.py: -------------------------------------------------------------------------------- 1 | from web3 import Web3 2 | 3 | 4 | class Account(str): 5 | def __new__(cls, w3: Web3, address): 6 | obj = super().__new__(cls, address) 7 | obj._w3 = w3 8 | obj._address = address 9 | return obj 10 | 11 | # Send Ether 12 | def transfer(self, address, amount): 13 | self._w3.eth.sendTransaction({'to': address, 'from': self._address, 'value': amount}) 14 | 15 | @property 16 | def balance(self): 17 | return self._w3.eth.getBalance(self._address) 18 | -------------------------------------------------------------------------------- /pytest_ethereum/contract.py: -------------------------------------------------------------------------------- 1 | from web3 import Web3 2 | from web3.contract import ImplicitContract 3 | 4 | from .log import Log 5 | from .utils import ( 6 | clean_modifiers, 7 | get_event_processors, 8 | get_event_signatures, 9 | ) 10 | 11 | 12 | class ContractInstance: 13 | """Deployed instance of a contract""" 14 | 15 | def __init__(self, w3: Web3, address, interface): 16 | self.__w3 = w3 17 | self.__address = address 18 | self.__instance = ImplicitContract(self.__w3.eth.contract(self.__address, **interface)) 19 | # Register new filter to watch for logs from this instance's address 20 | self.__filter = self.__w3.eth.filter({ 21 | # Include events from the deployment stage 22 | 'fromBlock': self.__w3.eth.blockNumber - 1, 23 | 'address': self.__address 24 | }) 25 | 26 | self.__event_signatures = get_event_signatures(interface['abi']) 27 | self.__event_processors = get_event_processors(interface['abi']) 28 | 29 | def __getattr__(self, name): 30 | """Delegates to either specialized methods or instance ABI""" 31 | if name in dir(self): 32 | # Specialized testing methods 33 | return getattr(self, name) 34 | elif name in self._events: 35 | return self._gen_log(name) 36 | else: 37 | # Method call of contract instance 38 | return getattr(self.__instance, name) 39 | 40 | @property 41 | def _events(self): 42 | return self.__event_signatures.keys() 43 | 44 | def _gen_log(self, name): 45 | return lambda v: Log(name, v) 46 | 47 | @property 48 | def address(self): 49 | """This contract's address""" 50 | return self.__address 51 | 52 | @property 53 | def balance(self): 54 | """Ether balance of this contract (in wei)""" 55 | return self.__w3.eth.getBalance(self.__address) 56 | 57 | @property 58 | def codesize(self): 59 | """Codesize of this contract (in bytes)""" 60 | return len(self.__w3.eth.getCode(self.__address)[2:])/2 61 | 62 | @property 63 | def hascode(self): 64 | """Check if this contract currently has code (usually indicating suicide)""" 65 | return self.codesize != 0 66 | 67 | def _process_logs(self, logs): 68 | processed_logs = [] 69 | for log in logs: 70 | log_signature = log['topics'][0] 71 | if log_signature in self.__event_processors.keys(): 72 | p_log = self.__event_processors[log_signature](log) 73 | processed_logs.append(Log(p_log['event'], p_log['args'])) 74 | return processed_logs 75 | 76 | @property 77 | def logs(self): 78 | """Returns all the event logs ever added for this contract""" 79 | return self._process_logs(self.__filter.get_all_entries()) 80 | 81 | 82 | class ContractFactory: 83 | """Factory (prototype) of a contract""" 84 | def __init__(self, w3: Web3, interface): 85 | self.__w3 = w3 86 | self.__interface = interface 87 | self.__contract_factory = self.__w3.eth.contract(**self.__interface) 88 | 89 | def __call__(self, *args, **kwargs): 90 | """Deploy a new instance of this contract""" 91 | 92 | # Our encapsulating classes need to be evaluated here 93 | # in order to avoid bugs when web3 processes our modifiers 94 | kwargs = clean_modifiers(kwargs) 95 | 96 | # NOTE This is hacky, filing bug 97 | if 'transact' in kwargs.keys(): 98 | kwargs['transaction'] = kwargs['transact'] 99 | del kwargs['transact'] 100 | 101 | tx_hash = self.__contract_factory.constructor(*args).transact(**kwargs) 102 | address = self.__w3.eth.getTransactionReceipt(tx_hash)['contractAddress'] 103 | return ContractInstance(self.__w3, address, self.__interface) 104 | 105 | def __getattr__(self, name): 106 | return getattr(self.__contract_factory, name) 107 | -------------------------------------------------------------------------------- /pytest_ethereum/log.py: -------------------------------------------------------------------------------- 1 | from collections import Mapping 2 | 3 | class Log(Mapping): 4 | def __new__(cls, event, args): 5 | obj = super().__new__(cls) 6 | obj._event = event 7 | obj._args = args 8 | return obj 9 | 10 | def __eq__(self, other): 11 | if not isinstance(other, Log): 12 | return False 13 | if self._event != other._event: 14 | return False 15 | return self._args == other._args 16 | 17 | def __iter__(self): 18 | return iter(self._args) 19 | 20 | def __len__(self): 21 | return len(self._args) 22 | 23 | def __getitem__(self, key): 24 | return self._args[key] 25 | -------------------------------------------------------------------------------- /pytest_ethereum/package.py: -------------------------------------------------------------------------------- 1 | import json 2 | from os.path import isfile as file_exists 3 | 4 | 5 | def load_package(filename): 6 | 7 | assert file_exists(filename), \ 8 | "Filename '{}' doesn't exist!".format(filename) 9 | with open(filename, 'r') as f: 10 | compiled_interfaces = json.loads(f.read())['contracts'] 11 | 12 | # compiled JSON package object should be structured like: 13 | # 'contracts' : { 14 | # 'Contract1' : { 15 | # 'abi' : ..., 16 | # 'bytecode' : ..., 17 | # 'bytecode_runtime' : ... 18 | # }, 19 | # 'Contract2' : ... 20 | # } 21 | required_members = ['abi', 'bytecode', 'bytecode_runtime'] 22 | 23 | for name, interface in compiled_interfaces.items(): 24 | # Filter out stuff we don't need 25 | filtered_interface = dict() 26 | for member in interface.keys(): 27 | if member == 'abi': 28 | abi = interface[member] 29 | if isinstance(abi, str): 30 | abi = json.loads(abi) # No idea why solidity does this... 31 | filtered_interface['abi'] = abi 32 | # Standardize names to Web3.py expected interfaces 33 | if member == 'bin' or member == 'bytecode': 34 | filtered_interface['bytecode'] = interface[member] 35 | if member == 'bin-runtime' or member == 'bytecode_runtime': 36 | filtered_interface['bytecode_runtime'] = interface[member] 37 | 38 | # Check for required interfaces 39 | for member in required_members: 40 | assert member in filtered_interface.keys(), \ 41 | "Contract '{}' doesn't have '{}'!".format(name, member) 42 | 43 | # Result is now exactly what we were looking for 44 | compiled_interfaces[name] = filtered_interface 45 | 46 | return compiled_interfaces 47 | -------------------------------------------------------------------------------- /pytest_ethereum/plugin.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | from .package import load_package 4 | from .tester import Tester 5 | 6 | 7 | # User can specify these options through execution flags 8 | def pytest_addoption(parser): 9 | """Add options for contract assets file handling""" 10 | 11 | group = parser.getgroup('ethereum', 'ethereum testing support') 12 | group.addoption('--package-file', action='store', default=None, metavar='path', 13 | help='ERC190 Package Filename, default: none') 14 | 15 | 16 | # Load assets file into memory 17 | @pytest.fixture(scope='session') 18 | def package(pytestconfig): 19 | package = {} 20 | package_file = pytestconfig.option.package_file 21 | if package_file: 22 | package = load_package(package_file) 23 | return package 24 | 25 | 26 | # Fixture is initialized from default for every test 27 | @pytest.fixture 28 | def tester(package): 29 | return Tester(package) 30 | 31 | # alias fixture 32 | @pytest.fixture 33 | def t(tester): 34 | return tester 35 | -------------------------------------------------------------------------------- /pytest_ethereum/tester.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | from web3 import Web3 4 | from web3.providers.eth_tester import EthereumTesterProvider 5 | 6 | from eth_tester import EthereumTester 7 | from eth_tester.exceptions import TransactionFailed 8 | 9 | from .account import Account 10 | from .contract import ContractFactory 11 | 12 | 13 | class Tester: 14 | def __init__(self, compiled_interfaces={}): 15 | self.__t = EthereumTester() 16 | self.__w3 = Web3(EthereumTesterProvider(self.__t)) 17 | 18 | # No gas costs for transactions 19 | def zero_gas_price_strategy(web3, transaction_params=None): 20 | return 0 # zero gas price makes testing simpler. 21 | self.__w3.eth.setGasPriceStrategy(zero_gas_price_strategy) 22 | 23 | # Empty by default, but can be set on initialization 24 | self.__compiled_interfaces = compiled_interfaces 25 | 26 | def contracts(self, name): 27 | if ':' not in name: 28 | # If you don't specify which contract in file, use filebase 29 | name += ':{}'.format(name.split('/')[-1].split('.')[0]) 30 | interface = self.__compiled_interfaces[name] 31 | return self.new_contract(interface) 32 | 33 | # alias 34 | def c(self, name): 35 | return self.contracts(name) 36 | 37 | def new_contract(self, interface): 38 | return ContractFactory(self.__w3, interface) 39 | 40 | @property 41 | def accounts(self): 42 | return [Account(self.__w3, a) for a in self.__t.get_accounts()] 43 | 44 | # Alias 45 | @property 46 | def a(self): 47 | return self.accounts 48 | 49 | @property 50 | def tx_fails(self): 51 | return FailureHandler(self.__t) 52 | 53 | def mine_blocks(self, number=1): 54 | self.__t.mine_blocks(number) 55 | 56 | def now(self): 57 | # TODO Get this from the Ethereum block timestamp 58 | return self.__w3.eth.getBlock('pending')['timestamp'] 59 | 60 | @property 61 | def eth(self): 62 | # Return the w3 eth API 63 | return self.__w3.eth 64 | 65 | class FailureHandler: 66 | def __init__(self, eth_tester): 67 | self._t = eth_tester 68 | 69 | def __enter__(self): 70 | self._snapshot_id = self._t.take_snapshot() 71 | return self._snapshot_id 72 | 73 | def __exit__(self, *args): 74 | assert len(args) > 0 and \ 75 | args[0] is TransactionFailed, \ 76 | "Didn't revert transaction." 77 | self._t.revert_to_snapshot(self._snapshot_id) 78 | return True # return 'all good' from context 79 | -------------------------------------------------------------------------------- /pytest_ethereum/utils.py: -------------------------------------------------------------------------------- 1 | from eth_utils import event_abi_to_log_topic 2 | from web3.utils.events import get_event_data 3 | from functools import partial as partial_fn 4 | 5 | 6 | def clean_modifiers(modifiers): 7 | cleaned_modifiers = modifiers.copy() 8 | for name, modifier in modifiers.items(): 9 | for key, value in modifier.items(): 10 | if not isinstance(value, str) or not isinstance(value, int): 11 | cleaned_modifiers[name][key] = str(value) 12 | return cleaned_modifiers 13 | 14 | 15 | def get_event_signatures(abi_list): 16 | signatures = dict() 17 | for abi in abi_list: 18 | if abi['type'] == 'event': 19 | signatures[abi['name']] = event_abi_to_log_topic(abi) 20 | return signatures 21 | 22 | 23 | def get_event_processors(abi_list): 24 | processors = dict() 25 | for abi in abi_list: 26 | if abi['type'] == 'event': 27 | processors[event_abi_to_log_topic(abi)] = partial_fn(get_event_data, abi) 28 | return processors 29 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup 2 | 3 | setup( 4 | name="pytest-ethereum", 5 | version='0.1.0a21', 6 | description='py.test plugin for testing Ethereum smart contracts', 7 | long_description='TODO', 8 | license='MIT', 9 | author='Bryant Eisenbach', 10 | author_email='bryant@dappdevs.org', 11 | url='https://github.com/fubuloubu/pytest-ethereum', 12 | python_requires='>=3.6', 13 | packages = ['pytest_ethereum'], 14 | install_requires=[ 15 | 'pytest>=3.6.1,<4.0.0', 16 | 'eth-tester[py-evm]==0.1.0-beta.32', 17 | 'web3==4.7.1', 18 | ], 19 | 20 | # the following makes a plugin available to pytest 21 | entry_points = { 22 | 'pytest11': [ 23 | 'name_of_plugin = pytest_ethereum.plugin', 24 | ] 25 | }, 26 | 27 | classifiers=[ 28 | "Development Status :: 3 - Alpha", 29 | "License :: OSI Approved :: MIT License", 30 | 'Programming Language :: Python :: 3.6', 31 | # custom PyPI classifier for pytest plugins 32 | "Framework :: Pytest", 33 | ], 34 | ) 35 | -------------------------------------------------------------------------------- /tests/api/accounts/test_account.py: -------------------------------------------------------------------------------- 1 | def test_init(t): 2 | for acct in t.accounts: 3 | assert acct.balance > 0 4 | assert acct not in filter(lambda a: a != acct, t.accounts) 5 | 6 | def test_transfer(t): 7 | """ 8 | Ether transfers work 9 | """ 10 | starting_balance = t.a[0].balance 11 | assert t.a[1].balance == starting_balance 12 | 13 | t.a[0].transfer(t.a[1], 100) 14 | assert t.a[0].balance == starting_balance - 100 15 | assert t.a[1].balance == starting_balance + 100 16 | 17 | t.a[1].transfer(t.a[0], 100) 18 | assert t.a[0].balance == t.a[1].balance == starting_balance 19 | -------------------------------------------------------------------------------- /tests/api/conftest.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | from pytest_ethereum.tester import Tester 3 | 4 | @pytest.fixture 5 | def t(): 6 | return Tester() 7 | -------------------------------------------------------------------------------- /tests/api/contracts/Faucet.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | contract Faucet 4 | { 5 | function withdraw(uint amount) public { 6 | msg.sender.transfer(amount); 7 | } 8 | 9 | function () public payable { } 10 | } 11 | -------------------------------------------------------------------------------- /tests/api/contracts/conftest.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | from pytest_ethereum.package import load_package 4 | from pytest_ethereum.tester import Tester 5 | 6 | 7 | package = { 8 | "path/to/Owned.sol:Owned": { 9 | "bytecode_runtime": "60606040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680638da5cb5b14610051578063a6f9dae1146100a6575b600080fd5b341561005c57600080fd5b6100646100df565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100b157600080fd5b6100dd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610104565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561015f57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505600a165627a7a72305820880a4056fab249ea33a384814995ed65839292e7edf737e2082462ab370b372a0029", 10 | "abi": [{"constant":True,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":False,"inputs":[{"name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"payable":False,"stateMutability":"nonpayable","type":"function"}], 11 | "bytecode": "6060604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550341561004f57600080fd5b6101ce8061005e6000396000f30060606040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680638da5cb5b14610051578063a6f9dae1146100a6575b600080fd5b341561005c57600080fd5b6100646100df565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100b157600080fd5b6100dd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610104565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561015f57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505600a165627a7a72305820880a4056fab249ea33a384814995ed65839292e7edf737e2082462ab370b372a0029" 12 | }, 13 | "path/to/Token.sol:Token": { 14 | "bytecode_runtime": "6060604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100bf578063095ea7b31461014d57806318160ddd146101a757806323b872dd146101d057806327e235e314610249578063313ce5671461029657806370a08231146102c55780638da5cb5b1461031257806395d89b4114610367578063a6f9dae1146103f5578063a9059cbb1461042e578063dd62ed3e14610488575b600080fd5b34156100ca57600080fd5b6100d26104f4565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101125780820151818401526020810190506100f7565b50505050905090810190601f16801561013f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015857600080fd5b61018d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610592565b604051808215151515815260200191505060405180910390f35b34156101b257600080fd5b6101ba610684565b6040518082815260200191505060405180910390f35b34156101db57600080fd5b61022f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068e565b604051808215151515815260200191505060405180910390f35b341561025457600080fd5b610280600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610995565b6040518082815260200191505060405180910390f35b34156102a157600080fd5b6102a96109ad565b604051808260ff1660ff16815260200191505060405180910390f35b34156102d057600080fd5b6102fc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109c0565b6040518082815260200191505060405180910390f35b341561031d57600080fd5b610325610a09565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561037257600080fd5b61037a610a2e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103ba57808201518184015260208101905061039f565b50505050905090810190601f1680156103e75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561040057600080fd5b61042c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610acc565b005b341561043957600080fd5b61046e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610b6a565b604051808215151515815260200191505060405180910390f35b341561049357600080fd5b6104de600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d5e565b6040518082815260200191505060405180910390f35b60028054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561058a5780601f1061055f5761010080835404028352916020019161058a565b820191906000526020600020905b81548152906001019060200180831161056d57829003601f168201915b505050505081565b600081600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600354905090565b600081600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015801561075b575081600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b80156107675750600082115b80156107f25750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401115b156109895781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905061098e565b600090505b9392505050565b60046020528060005260406000206000915090505481565b600660009054906101000a900460ff1681565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ac45780601f10610a9957610100808354040283529160200191610ac4565b820191906000526020600020905b815481529060010190602001808311610aa757829003601f168201915b505050505081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b2757600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410158015610bbb5750600082115b8015610c465750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401115b15610d535781600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360019050610d58565b600090505b92915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050929150505600a165627a7a7230582050b3bfaccbeb1c92ad4a7b5f5396a2650ec833b1988ebf78bd5a8e68d41330890029", 15 | "abi": [{"constant":True,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":False,"inputs":[{"name":"_spender","type":"address"},{"name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":False,"stateMutability":"nonpayable","type":"function"},{"constant":True,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":False,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":False,"stateMutability":"nonpayable","type":"function"},{"constant":True,"inputs":[{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":True,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":True,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":True,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":True,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":False,"inputs":[{"name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"payable":False,"stateMutability":"nonpayable","type":"function"},{"constant":False,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":False,"stateMutability":"nonpayable","type":"function"},{"constant":True,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":False,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_symbol","type":"string"},{"name":"_name","type":"string"},{"name":"_decimals","type":"uint8"},{"name":"initialSupply","type":"uint256"}],"payable":False,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":False,"inputs":[{"indexed":True,"name":"_from","type":"address"},{"indexed":True,"name":"_to","type":"address"},{"indexed":False,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":False,"inputs":[{"indexed":True,"name":"_owner","type":"address"},{"indexed":True,"name":"_spender","type":"address"},{"indexed":False,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"}], 16 | "bytecode": "6060604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550341561004f57600080fd5b60405161101c38038061101c8339810160405280805182019190602001805182019190602001805190602001909190805190602001909190505083838360ff16600a0a830282600190805190602001906100aa929190610157565b5081600290805190602001906100c1929190610157565b5080600381905550600354600460008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505081600660006101000a81548160ff021916908360ff160217905550505050506101fc565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061019857805160ff19168380011785556101c6565b828001600101855582156101c6579182015b828111156101c55782518255916020019190600101906101aa565b5b5090506101d391906101d7565b5090565b6101f991905b808211156101f55760008160009055506001016101dd565b5090565b90565b610e118061020b6000396000f3006060604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100bf578063095ea7b31461014d57806318160ddd146101a757806323b872dd146101d057806327e235e314610249578063313ce5671461029657806370a08231146102c55780638da5cb5b1461031257806395d89b4114610367578063a6f9dae1146103f5578063a9059cbb1461042e578063dd62ed3e14610488575b600080fd5b34156100ca57600080fd5b6100d26104f4565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101125780820151818401526020810190506100f7565b50505050905090810190601f16801561013f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015857600080fd5b61018d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610592565b604051808215151515815260200191505060405180910390f35b34156101b257600080fd5b6101ba610684565b6040518082815260200191505060405180910390f35b34156101db57600080fd5b61022f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068e565b604051808215151515815260200191505060405180910390f35b341561025457600080fd5b610280600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610995565b6040518082815260200191505060405180910390f35b34156102a157600080fd5b6102a96109ad565b604051808260ff1660ff16815260200191505060405180910390f35b34156102d057600080fd5b6102fc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109c0565b6040518082815260200191505060405180910390f35b341561031d57600080fd5b610325610a09565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561037257600080fd5b61037a610a2e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103ba57808201518184015260208101905061039f565b50505050905090810190601f1680156103e75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561040057600080fd5b61042c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610acc565b005b341561043957600080fd5b61046e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610b6a565b604051808215151515815260200191505060405180910390f35b341561049357600080fd5b6104de600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d5e565b6040518082815260200191505060405180910390f35b60028054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561058a5780601f1061055f5761010080835404028352916020019161058a565b820191906000526020600020905b81548152906001019060200180831161056d57829003601f168201915b505050505081565b600081600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600354905090565b600081600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015801561075b575081600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b80156107675750600082115b80156107f25750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401115b156109895781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905061098e565b600090505b9392505050565b60046020528060005260406000206000915090505481565b600660009054906101000a900460ff1681565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ac45780601f10610a9957610100808354040283529160200191610ac4565b820191906000526020600020905b815481529060010190602001808311610aa757829003601f168201915b505050505081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b2757600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410158015610bbb5750600082115b8015610c465750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401115b15610d535781600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360019050610d58565b600090505b92915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050929150505600a165627a7a7230582050b3bfaccbeb1c92ad4a7b5f5396a2650ec833b1988ebf78bd5a8e68d41330890029" 17 | }, 18 | "path/to/TimeLimited.sol:TestTimeLimited": { 19 | "bytecode_runtime": "60606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630fb5a6b414610093578063753899e9146100bc57806383197ef0146100e95780638da5cb5b146100fe578063a56fa76c14610153578063a6f9dae114610168578063bef4876b146101a1578063d8270dce146101ce575b600080fd5b341561009e57600080fd5b6100a66101f7565b6040518082815260200191505060405180910390f35b34156100c757600080fd5b6100cf6101fd565b604051808215151515815260200191505060405180910390f35b34156100f457600080fd5b6100fc610242565b005b341561010957600080fd5b610111610276565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b61016661029b565b005b341561017357600080fd5b61019f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610328565b005b34156101ac57600080fd5b6101b46103c6565b604051808215151515815260200191505060405180910390f35b34156101d957600080fd5b6101e16103d9565b6040518082815260200191505060405180910390f35b60025481565b6000600360009054906101000a900460ff1615151561021b57600080fd5b600254600154014210801561023d5750600360009054906101000a900460ff16155b905090565b600360009054906101000a900460ff16151561025d57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16ff5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102f657600080fd5b60025460015401421015151561030b57600080fd5b6001600360006101000a81548160ff021916908315150217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561038357600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900460ff1681565b600154815600a165627a7a72305820cfa24f8534068ff9caf1fc94dda21bbaf586fa7b501b0712c37a18549b783ff90029", 20 | "abi": [{"constant":True,"inputs":[],"name":"duration","outputs":[{"name":"","type":"uint256"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":True,"inputs":[],"name":"alive","outputs":[{"name":"_stuff","type":"bool"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":False,"inputs":[],"name":"destroy","outputs":[],"payable":False,"stateMutability":"nonpayable","type":"function"},{"constant":True,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":False,"inputs":[],"name":"setExpired","outputs":[],"payable":False,"stateMutability":"nonpayable","type":"function"},{"constant":False,"inputs":[{"name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"payable":False,"stateMutability":"nonpayable","type":"function"},{"constant":True,"inputs":[],"name":"finished","outputs":[{"name":"","type":"bool"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":True,"inputs":[],"name":"creationTime","outputs":[{"name":"","type":"uint256"}],"payable":False,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_duration","type":"uint256"}],"payable":False,"stateMutability":"nonpayable","type":"constructor"}], 21 | "bytecode": "6060604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600155341561005357600080fd5b604051602080610493833981016040528080519060200190919050508080600281905550505061040b806100886000396000f30060606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630fb5a6b414610093578063753899e9146100bc57806383197ef0146100e95780638da5cb5b146100fe578063a56fa76c14610153578063a6f9dae114610168578063bef4876b146101a1578063d8270dce146101ce575b600080fd5b341561009e57600080fd5b6100a66101f7565b6040518082815260200191505060405180910390f35b34156100c757600080fd5b6100cf6101fd565b604051808215151515815260200191505060405180910390f35b34156100f457600080fd5b6100fc610242565b005b341561010957600080fd5b610111610276565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b61016661029b565b005b341561017357600080fd5b61019f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610328565b005b34156101ac57600080fd5b6101b46103c6565b604051808215151515815260200191505060405180910390f35b34156101d957600080fd5b6101e16103d9565b6040518082815260200191505060405180910390f35b60025481565b6000600360009054906101000a900460ff1615151561021b57600080fd5b600254600154014210801561023d5750600360009054906101000a900460ff16155b905090565b600360009054906101000a900460ff16151561025d57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16ff5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102f657600080fd5b60025460015401421015151561030b57600080fd5b6001600360006101000a81548160ff021916908315150217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561038357600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900460ff1681565b600154815600a165627a7a72305820cfa24f8534068ff9caf1fc94dda21bbaf586fa7b501b0712c37a18549b783ff90029" 22 | }, 23 | "path/to/ICO.sol:ICO": { 24 | "bytecode_runtime": "606060405260043610610133576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806302c7e7af146101385780630b5e89f4146101615780630fb5a6b41461018e578063144fa6d7146101b75780632b9edee9146101f05780635cb732be1461021d578063676c0d77146102325780637f94bc31146102555780637fa8c158146102825780637ff9b596146102975780638da5cb5b146102c0578063906a26e0146103155780639762f8021461033e5780639850d32b1461036b578063a12ee7ba146103c0578063a1e5c3ed146103f9578063a48217191461040e578063a6f9dae114610418578063d07165c714610451578063d8270dce14610466578063fb42b01a1461048f578063fb86a404146104a4578063fc0c546a146104cd575b600080fd5b341561014357600080fd5b61014b610522565b6040518082815260200191505060405180910390f35b341561016c57600080fd5b610174610528565b604051808215151515815260200191505060405180910390f35b341561019957600080fd5b6101a161053b565b6040518082815260200191505060405180910390f35b34156101c257600080fd5b6101ee600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610541565b005b34156101fb57600080fd5b6102036105e1565b604051808215151515815260200191505060405180910390f35b341561022857600080fd5b6102306105f0565b005b341561023d57600080fd5b61025360048080359060200190919050506107a2565b005b341561026057600080fd5b61026861083b565b604051808215151515815260200191505060405180910390f35b341561028d57600080fd5b61029561084e565b005b34156102a257600080fd5b6102aa610901565b6040518082815260200191505060405180910390f35b34156102cb57600080fd5b6102d3610907565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561032057600080fd5b61032861092c565b6040518082815260200191505060405180910390f35b341561034957600080fd5b610351610932565b604051808215151515815260200191505060405180910390f35b341561037657600080fd5b61037e610941565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103cb57600080fd5b6103f7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610967565b005b341561040457600080fd5b61040c610a07565b005b610416610ac4565b005b341561042357600080fd5b61044f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c8d565b005b341561045c57600080fd5b610464610d2b565b005b341561047157600080fd5b610479610e28565b6040518082815260200191505060405180910390f35b341561049a57600080fd5b6104a2610e2e565b005b34156104af57600080fd5b6104b7610f1f565b6040518082815260200191505060405180910390f35b34156104d857600080fd5b6104e0610f25565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60085481565b600a60009054906101000a900460ff1681565b60075481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561059d57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006005546008541015905090565b600080600a60019054906101000a900460ff16151561060e57600080fd5b61061733610f4b565b915060008211151561062857600080fd5b610654336000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611034565b81600860008282540392505081905550600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f47bc8b296a721ead4262b15df1a3123f2c4eed6afa70823038a3c34d60d478f2338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a13373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561079e57600080fd5b5050565b600a60009054906101000a900460ff1680156107cb5750600a60019054906101000a900460ff16155b15156107d657600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561083157600080fd5b8060038190555050565b600a60019054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108a957600080fd5b6004546108d76000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff163061117c565b101515156108e457600080fd5b6001600a60006101000a81548160ff021916908315150217905550565b60035481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b60006004546008541015905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109c357600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60019054906101000a900460ff161515610a2257600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a7d57600080fd5b60006008541415610ac2576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b565b600080600a60009054906101000a900460ff168015610af05750600a60019054906101000a900460ff16155b1515610afb57600080fd5b610b03610932565b151515610b0f57600080fd5b60035434811515610b1c57fe5b049150600082111515610b2b57fe5b60035482023403905060035481101515610b4157fe5b816008600082825401925050819055506003548202600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550610bce6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff163384611034565b7f97b1cd3307803802ff5e5152505de2a9e850e59c5e8d05b69c592abf2aa8ae8c33348484604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390a13373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610c8957600080fd5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ce857600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60009054906101000a900460ff168015610d545750600a60019054906101000a900460ff16155b1515610d5f57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610dba57600080fd5b610dc2610932565b80610de35750610dd06105e1565b8015610de25750600754600654014210155b5b1515610dee57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b60065481565b600a60009054906101000a900460ff168015610e575750600a60019054906101000a900460ff16155b1515610e6257600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ebd57600080fd5b600a60019054906101000a900460ff16151515610ed957600080fd5b610ee16105e1565b151515610eed57600080fd5b600754600654014210151515610f0257600080fd5b6001600a60016101000a81548160ff021916908315150217905550565b60045481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561101257600080fd5b6102c65a03f1151561102357600080fd5b505050604051805190509050919050565b8061103f843061117c565b1015151561104957fe5b600081111561117757600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8484846000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561115357600080fd5b6102c65a03f1151561116457600080fd5b50505060405180519050151561117657fe5b5b505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561127757600080fd5b6102c65a03f1151561128857600080fd5b505050604051805190509050929150505600a165627a7a7230582031d7c9b9225ce274184c008ec434a43930693c3f34633f89e067d7c2a54cd2760029", 25 | "abi": [{"constant":True,"inputs":[],"name":"sold","outputs":[{"name":"","type":"uint256"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":True,"inputs":[],"name":"icoStarted","outputs":[{"name":"","type":"bool"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":True,"inputs":[],"name":"duration","outputs":[{"name":"","type":"uint256"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":False,"inputs":[{"name":"_token","type":"address"}],"name":"setToken","outputs":[],"payable":False,"stateMutability":"nonpayable","type":"function"},{"constant":True,"inputs":[],"name":"softCapReached","outputs":[{"name":"isReached","type":"bool"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":False,"inputs":[],"name":"refundToken","outputs":[],"payable":False,"stateMutability":"nonpayable","type":"function"},{"constant":False,"inputs":[{"name":"_tokenPrice","type":"uint256"}],"name":"updateTokenPrice","outputs":[],"payable":False,"stateMutability":"nonpayable","type":"function"},{"constant":True,"inputs":[],"name":"icoFailed","outputs":[{"name":"","type":"bool"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":False,"inputs":[],"name":"startICO","outputs":[],"payable":False,"stateMutability":"nonpayable","type":"function"},{"constant":True,"inputs":[],"name":"tokenPrice","outputs":[{"name":"","type":"uint256"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":True,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":True,"inputs":[],"name":"softCap","outputs":[{"name":"","type":"uint256"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":True,"inputs":[],"name":"hardCapReached","outputs":[{"name":"isReached","type":"bool"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":True,"inputs":[],"name":"maintainer","outputs":[{"name":"","type":"address"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":False,"inputs":[{"name":"newMaintainer","type":"address"}],"name":"changeMaintainer","outputs":[],"payable":False,"stateMutability":"nonpayable","type":"function"},{"constant":False,"inputs":[],"name":"failedICO","outputs":[],"payable":False,"stateMutability":"nonpayable","type":"function"},{"constant":False,"inputs":[],"name":"buyToken","outputs":[],"payable":True,"stateMutability":"payable","type":"function"},{"constant":False,"inputs":[{"name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"payable":False,"stateMutability":"nonpayable","type":"function"},{"constant":False,"inputs":[],"name":"successfulICO","outputs":[],"payable":False,"stateMutability":"nonpayable","type":"function"},{"constant":True,"inputs":[],"name":"creationTime","outputs":[{"name":"","type":"uint256"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":False,"inputs":[],"name":"declareFailure","outputs":[],"payable":False,"stateMutability":"nonpayable","type":"function"},{"constant":True,"inputs":[],"name":"hardCap","outputs":[{"name":"","type":"uint256"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":True,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":False,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_tokenPrice","type":"uint256"},{"name":"_hardCap","type":"uint256"},{"name":"_softCap","type":"uint256"},{"name":"_duration","type":"uint256"},{"name":"_token","type":"address"}],"payable":False,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":False,"inputs":[{"indexed":False,"name":"account","type":"address"},{"indexed":False,"name":"valueSent","type":"uint256"},{"indexed":False,"name":"tokensBought","type":"uint256"},{"indexed":False,"name":"refund","type":"uint256"}],"name":"TokenBuy","type":"event"},{"anonymous":False,"inputs":[{"indexed":False,"name":"account","type":"address"},{"indexed":False,"name":"tokensReturned","type":"uint256"},{"indexed":False,"name":"refund","type":"uint256"}],"name":"TokenRefund","type":"event"}], 26 | "bytecode": "6060604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260065560006008556000600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff02191690831515021790555034156100cf57600080fd5b60405160a080611448833981016040528080519060200190919080519060200190919080519060200190919080519060200190919080519060200190919050508080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508460038190555083600481905550826005819055508160078190555050505050506112c6806101826000396000f300606060405260043610610133576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806302c7e7af146101385780630b5e89f4146101615780630fb5a6b41461018e578063144fa6d7146101b75780632b9edee9146101f05780635cb732be1461021d578063676c0d77146102325780637f94bc31146102555780637fa8c158146102825780637ff9b596146102975780638da5cb5b146102c0578063906a26e0146103155780639762f8021461033e5780639850d32b1461036b578063a12ee7ba146103c0578063a1e5c3ed146103f9578063a48217191461040e578063a6f9dae114610418578063d07165c714610451578063d8270dce14610466578063fb42b01a1461048f578063fb86a404146104a4578063fc0c546a146104cd575b600080fd5b341561014357600080fd5b61014b610522565b6040518082815260200191505060405180910390f35b341561016c57600080fd5b610174610528565b604051808215151515815260200191505060405180910390f35b341561019957600080fd5b6101a161053b565b6040518082815260200191505060405180910390f35b34156101c257600080fd5b6101ee600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610541565b005b34156101fb57600080fd5b6102036105e1565b604051808215151515815260200191505060405180910390f35b341561022857600080fd5b6102306105f0565b005b341561023d57600080fd5b61025360048080359060200190919050506107a2565b005b341561026057600080fd5b61026861083b565b604051808215151515815260200191505060405180910390f35b341561028d57600080fd5b61029561084e565b005b34156102a257600080fd5b6102aa610901565b6040518082815260200191505060405180910390f35b34156102cb57600080fd5b6102d3610907565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561032057600080fd5b61032861092c565b6040518082815260200191505060405180910390f35b341561034957600080fd5b610351610932565b604051808215151515815260200191505060405180910390f35b341561037657600080fd5b61037e610941565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103cb57600080fd5b6103f7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610967565b005b341561040457600080fd5b61040c610a07565b005b610416610ac4565b005b341561042357600080fd5b61044f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c8d565b005b341561045c57600080fd5b610464610d2b565b005b341561047157600080fd5b610479610e28565b6040518082815260200191505060405180910390f35b341561049a57600080fd5b6104a2610e2e565b005b34156104af57600080fd5b6104b7610f1f565b6040518082815260200191505060405180910390f35b34156104d857600080fd5b6104e0610f25565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60085481565b600a60009054906101000a900460ff1681565b60075481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561059d57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006005546008541015905090565b600080600a60019054906101000a900460ff16151561060e57600080fd5b61061733610f4b565b915060008211151561062857600080fd5b610654336000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611034565b81600860008282540392505081905550600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f47bc8b296a721ead4262b15df1a3123f2c4eed6afa70823038a3c34d60d478f2338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a13373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561079e57600080fd5b5050565b600a60009054906101000a900460ff1680156107cb5750600a60019054906101000a900460ff16155b15156107d657600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561083157600080fd5b8060038190555050565b600a60019054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108a957600080fd5b6004546108d76000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff163061117c565b101515156108e457600080fd5b6001600a60006101000a81548160ff021916908315150217905550565b60035481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b60006004546008541015905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109c357600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60019054906101000a900460ff161515610a2257600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a7d57600080fd5b60006008541415610ac2576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b565b600080600a60009054906101000a900460ff168015610af05750600a60019054906101000a900460ff16155b1515610afb57600080fd5b610b03610932565b151515610b0f57600080fd5b60035434811515610b1c57fe5b049150600082111515610b2b57fe5b60035482023403905060035481101515610b4157fe5b816008600082825401925050819055506003548202600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550610bce6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff163384611034565b7f97b1cd3307803802ff5e5152505de2a9e850e59c5e8d05b69c592abf2aa8ae8c33348484604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390a13373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610c8957600080fd5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ce857600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60009054906101000a900460ff168015610d545750600a60019054906101000a900460ff16155b1515610d5f57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610dba57600080fd5b610dc2610932565b80610de35750610dd06105e1565b8015610de25750600754600654014210155b5b1515610dee57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b60065481565b600a60009054906101000a900460ff168015610e575750600a60019054906101000a900460ff16155b1515610e6257600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ebd57600080fd5b600a60019054906101000a900460ff16151515610ed957600080fd5b610ee16105e1565b151515610eed57600080fd5b600754600654014210151515610f0257600080fd5b6001600a60016101000a81548160ff021916908315150217905550565b60045481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561101257600080fd5b6102c65a03f1151561102357600080fd5b505050604051805190509050919050565b8061103f843061117c565b1015151561104957fe5b600081111561117757600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8484846000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561115357600080fd5b6102c65a03f1151561116457600080fd5b50505060405180519050151561117657fe5b5b505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561127757600080fd5b6102c65a03f1151561128857600080fd5b505050604051805190509050929150505600a165627a7a7230582031d7c9b9225ce274184c008ec434a43930693c3f34633f89e067d7c2a54cd2760029" 27 | } 28 | } 29 | 30 | 31 | @pytest.fixture 32 | def t(): 33 | return Tester(package) 34 | -------------------------------------------------------------------------------- /tests/api/contracts/test_basic.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | 4 | @pytest.fixture 5 | def Faucet(t): 6 | interface = { 7 | "bytecode": 8 | "0x608060405234801561001057600080fd5b5060e08061001f6000396000f3006" 9 | "08060405260043610603f576000357c0100000000000000000000000000000000" 10 | "000000000000000000000000900463ffffffff1680632e1a7d4d146041575b005" 11 | "b348015604c57600080fd5b506069600480360381019080803590602001909291" 12 | "90505050606b565b005b3373ffffffffffffffffffffffffffffffffffffffff1" 13 | "66108fc829081150290604051600060405180830381858888f193505050501580" 14 | "1560b0573d6000803e3d6000fd5b50505600a165627a7a72305820672298c662a" 15 | "abd49d65f686862bea2edb3b885edf4605abaab6124a2a2d58f090029", 16 | "bytecode_runtime": 17 | "0x608060405260043610603f576000357c0100000000000000000000000000000" 18 | "000000000000000000000000000900463ffffffff1680632e1a7d4d146041575b" 19 | "005b348015604c57600080fd5b506069600480360381019080803590602001909" 20 | "29190505050606b565b005b3373ffffffffffffffffffffffffffffffffffffff" 21 | "ff166108fc829081150290604051600060405180830381858888f193505050501" 22 | "5801560b0573d6000803e3d6000fd5b50505600a165627a7a72305820672298c6" 23 | "62aabd49d65f686862bea2edb3b885edf4605abaab6124a2a2d58f090029", 24 | "abi": [ 25 | { 26 | "constant":False, 27 | "inputs":[{"name":"amount","type":"uint256"}], 28 | "name":"withdraw", 29 | "outputs":[], 30 | "payable":False, 31 | "stateMutability":"nonpayable", 32 | "type":"function" 33 | }, 34 | { 35 | "payable":True, 36 | "stateMutability":"payable", 37 | "type":"fallback" 38 | } 39 | ] 40 | } 41 | return t.new_contract(interface)() 42 | 43 | 44 | def test_transfer(t, Faucet): 45 | starting_balance = t.a[0].balance 46 | assert Faucet.balance == 0 47 | t.a[0].transfer(Faucet.address, 100) 48 | assert t.a[0].balance == starting_balance - 100 49 | assert Faucet.balance == 100 50 | Faucet.withdraw(100) 51 | assert Faucet.balance == 0 52 | assert t.a[0].balance == starting_balance 53 | -------------------------------------------------------------------------------- /tests/api/contracts/test_factory.py: -------------------------------------------------------------------------------- 1 | from hexbytes import HexBytes 2 | 3 | def test_CreateFactoryFromInterface(t): 4 | _interface = {'abi': [], 'bytecode': '0x', 'bytecode_runtime': '0x'} 5 | # Factory class has the same interface that we gave it 6 | # NOTE: Names are changed to work with Web3.py API 7 | _factory = t.new_contract(_interface) 8 | assert _factory.abi == _interface['abi'] 9 | assert _factory.bytecode == HexBytes(_interface['bytecode']) 10 | assert _factory.bytecode_runtime == HexBytes(_interface['bytecode_runtime']) 11 | # Factory instances are unique 12 | assert _factory() is not _factory() 13 | -------------------------------------------------------------------------------- /tests/api/contracts/test_owned.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | 4 | @pytest.fixture 5 | def Owned(t): 6 | interface = { 7 | "bytecode": 8 | "0x6060604052336000806101000a81548173ffffffffffffffffffffffffffffff" 9 | "ffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602" 10 | "17905550341561004f57600080fd5b6101ce8061005e6000396000f30060606040" 11 | "526004361061004c576000357c0100000000000000000000000000000000000000" 12 | "000000000000000000900463ffffffff1680638da5cb5b14610051578063a6f9da" 13 | "e1146100a6575b600080fd5b341561005c57600080fd5b6100646100df565b6040" 14 | "51808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffff" 15 | "ffffffffffffffffffffffffff16815260200191505060405180910390f35b3415" 16 | "6100b157600080fd5b6100dd600480803573ffffffffffffffffffffffffffffff" 17 | "ffffffffff16906020019091905050610104565b005b6000809054906101000a90" 18 | "0473ffffffffffffffffffffffffffffffffffffffff1681565b60008090549061" 19 | "01000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffff" 20 | "ffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffff" 21 | "ffffffffff1614151561015f57600080fd5b806000806101000a81548173ffffff" 22 | "ffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffff" 23 | "ffffffffffffffffffff160217905550505600a165627a7a72305820880a4056fa" 24 | "b249ea33a384814995ed65839292e7edf737e2082462ab370b372a0029", 25 | "bytecode_runtime": 26 | "0x60606040526004361061004c576000357c010000000000000000000000000000" 27 | "0000000000000000000000000000900463ffffffff1680638da5cb5b1461005157" 28 | "8063a6f9dae1146100a6575b600080fd5b341561005c57600080fd5b6100646100" 29 | "df565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffff" 30 | "ffffffffffffffffffffffffffffffffffff168152602001915050604051809103" 31 | "90f35b34156100b157600080fd5b6100dd600480803573ffffffffffffffffffff" 32 | "ffffffffffffffffffff16906020019091905050610104565b005b600080905490" 33 | "6101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000" 34 | "809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673" 35 | "ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffff" 36 | "ffffffffffffffffffff1614151561015f57600080fd5b806000806101000a8154" 37 | "8173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffff" 38 | "ffffffffffffffffffffffffffffff160217905550505600a165627a7a72305820" 39 | "880a4056fab249ea33a384814995ed65839292e7edf737e2082462ab370b372a00" 40 | "29", 41 | "abi": [ 42 | { 43 | "constant": True, 44 | "inputs": [], 45 | "name":"owner", 46 | "outputs":[ 47 | { 48 | "name": "", 49 | "type": "address" 50 | } 51 | ], 52 | "payable": False, 53 | "stateMutability": "view", 54 | "type": "function" 55 | }, 56 | { 57 | "constant": False, 58 | "inputs":[ 59 | { 60 | "name": "newOwner", 61 | "type": "address" 62 | } 63 | ], 64 | "name": "changeOwner", 65 | "outputs": [], 66 | "payable": False, 67 | "stateMutability": "nonpayable", 68 | "type": "function" 69 | } 70 | ] 71 | } 72 | #return t.new_contract(interface)() 73 | return t.c('path/to/Owned.sol')() 74 | 75 | def test_transfer_ownership(t, Owned): 76 | assert Owned.owner() == t.a[0] 77 | with t.tx_fails: 78 | Owned.changeOwner(t.a[1], transact={'from': t.a[1]}) 79 | Owned.changeOwner(t.a[1], transact={'from': t.a[0]}) 80 | assert Owned.owner() == t.a[1] 81 | with t.tx_fails: 82 | Owned.changeOwner(t.a[2], transact={'from': t.a[0]}) 83 | Owned.changeOwner(t.a[0], transact={'from': t.a[1]}) 84 | assert Owned.owner() == t.a[0] 85 | -------------------------------------------------------------------------------- /tests/api/tester/test_tester.py: -------------------------------------------------------------------------------- 1 | def test_mining(t): 2 | """ 3 | Mining blocks works 4 | """ 5 | starting_block = t.eth.blockNumber 6 | # Mining a block mines exactly one block 7 | t.mine_blocks() 8 | assert t.eth.blockNumber == starting_block + 1 9 | # Mining N blocks mines exactly N blocks 10 | t.mine_blocks(10) 11 | assert t.eth.blockNumber == starting_block + 11 12 | 13 | 14 | def test_time(t): 15 | """ 16 | t.now() gets the current time 17 | This should match the mined block time 18 | when the block is mined 19 | """ 20 | # Check pending block time is returned 21 | # NOTE: pending block time is at creation 22 | start_time = t.now() 23 | start_block = t.eth.getBlock('pending')['number'] 24 | assert start_time == t.now() # Returns the same number if no mining 25 | # Mine a block, timestamps should match 26 | t.mine_blocks() 27 | assert t.eth.getBlock('latest')['timestamp'] == start_time 28 | assert t.now() > start_time 29 | # Mine another block, timestamps should still match 30 | t.mine_blocks() 31 | assert t.eth.getBlock(start_block)['timestamp'] == start_time 32 | 33 | 34 | from eth_tester.exceptions import TransactionFailed 35 | 36 | 37 | def test_exception(t): 38 | """ 39 | Can call as many transaction failures in a row as you need 40 | """ 41 | failures = 0 42 | with t.tx_fails: 43 | raise TransactionFailed 44 | failures += 1 45 | with t.tx_fails: 46 | raise TransactionFailed 47 | failures += 1 48 | with t.tx_fails: 49 | raise TransactionFailed 50 | failures += 1 51 | assert failures == 3 52 | -------------------------------------------------------------------------------- /tests/plugin/conftest.py: -------------------------------------------------------------------------------- 1 | # So we can test our plugin 2 | pytest_plugins = ["pytester"] 3 | -------------------------------------------------------------------------------- /tests/plugin/test_assetfile.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | import json 3 | 4 | 5 | @pytest.fixture 6 | def testcase(): 7 | return """ 8 | def test_MyTest(tester): 9 | assert tester is not None 10 | """ 11 | 12 | 13 | @pytest.mark.xfail 14 | def test_NoPackage(testdir): 15 | testdir.makepyfile(testcase) 16 | # Works without one 17 | result = testdir.runpytest() 18 | result.assert_outcomes(passed=1) # No failures 19 | 20 | 21 | @pytest.mark.xfail 22 | def test_BadReference(testdir, testcase): 23 | testdir.makepyfile(testcase) 24 | # If provided a file that does not exist, should fail 25 | testdir.parseconfig('--package-file', 'does-not-exist.json') 26 | result = testdir.runpytest() 27 | result.assert_outcomes(error=1) 28 | 29 | 30 | @pytest.fixture 31 | def run_packagefile(testdir, testcase): 32 | def run_packagefile(package=None): 33 | testdir.makepyfile(testcase) 34 | package_file = testdir.makefile('.json', contracts=json.dumps(package)) 35 | return testdir.runpytest(package_file=package_file) 36 | 37 | # Return function as fixture 38 | return run_packagefile 39 | 40 | 41 | @pytest.mark.xfail 42 | def test_BadPackageFile(run_packagefile): 43 | # Cannot supply a badly formatted file 44 | result = run_packagefile({ 45 | 'badkey': [0, 1] 46 | }) 47 | result.assert_outcomes(failed=1) 48 | 49 | 50 | @pytest.mark.xfail 51 | def test_GoodPackageFile(run_packagefile): 52 | # Works with a well-formatted one 53 | result = run_packagefile({ 54 | 'contracts': { 55 | 'A': { 56 | 'abi': [], 57 | 'bin': '0x', 58 | 'bin-runtime': '0x' 59 | } 60 | } 61 | }) 62 | result.assert_outcomes(passed=1) # No failures 63 | --------------------------------------------------------------------------------