diff --git a/.gitignore b/.gitignore index 3be1400..2b0bb64 100644 --- a/.gitignore +++ b/.gitignore @@ -1,68 +1,5 @@ -# IDEA -.idea/ - -# Contracts cache -.cache - -# tsc generated files -*.map +# Compiled JS *.js -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - # Dependency directories node_modules/ -jspm_packages/ - -# Typescript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env diff --git a/bin/seed.ts b/bin/seed.ts index d43a205..d576aab 100755 --- a/bin/seed.ts +++ b/bin/seed.ts @@ -1,17 +1,36 @@ #!/usr/bin/env node import { join } from 'path'; +import { Logger, transports } from 'winston'; + +import { promisify } from '../utils'; -import * as Web3 from 'web3'; -import * as Config from 'truffle-config'; import * as TestRPC from 'ethereumjs-testrpc'; -import * as Migrate from 'truffle-migrate'; -import * as Resolver from 'truffle-resolver'; +import * as mkdirp from 'mkdirp'; import * as Artifactor from 'truffle-artifactor'; import * as Compile from 'truffle-compile'; -import * as mkdirp from 'mkdirp'; +import * as Config from 'truffle-config'; +import * as Migrate from 'truffle-migrate'; +import * as Resolver from 'truffle-resolver'; +import * as Web3 from 'web3'; -(async function() { +const logger = new Logger({ + colors: { + error: 'red', + info: 'blue', + verbose: 'grey', + warn: 'yellow' + }, + transports: [ + new transports.Console({ + colorize: true, + prettyPrint: true, + timestamp: true + }) + ] +}); + +(async () => { const config = configure(); await compileContracts(config); @@ -21,7 +40,7 @@ import * as mkdirp from 'mkdirp'; await setupNetwork(config, deployer); await migrate(config); })().catch(err => { - console.error(err); + logger.error(err); process.exit(1); }); @@ -46,7 +65,7 @@ function configure(): Config { } async function compileContracts(config: Config) { - logStep(`Compiling contracts: ${config.contracts_directory}`); + logger.info(`Compiling contracts: ${config.contracts_directory}`); const contracts = await promisify(cb => Compile.all(config, cb) @@ -55,29 +74,29 @@ async function compileContracts(config: Config) { await promisify(cb => mkdirp(config.contracts_build_directory, cb)); await config.artifactor.saveAll(contracts); - console.log(`Saved to: ${config.contracts_build_directory}`); + logger.verbose(`Saved to: ${config.contracts_build_directory}`); } async function startTestRPC(port: number): Promise { - logStep(`Starting TestRPC on port ${port}`); + logger.info(`Starting TestRPC on port ${port}`); const options = { - secure: false, + logger: console, mnemonic: 'try exile adapt shed width laugh similar duty neglect kick rug require', - logger: console + secure: false }; const server = TestRPC.server(options); const state = await promisify(cb => server.listen(port, cb)); - console.log(`Account mnemonic: ${options.mnemonic}`); + logger.verbose(`Account mnemonic: ${options.mnemonic}`); return state; } async function setupNetwork(config: Config, deployer: Address) { - logStep(`Setting up network ${config.network}`); + logger.info(`Setting up network ${config.network}`); const web3 = new Web3(config.provider); const networkId = await promisify(cb => web3.version.getNetwork(cb)); @@ -86,33 +105,14 @@ async function setupNetwork(config: Config, deployer: Address) { networkConfig.network_id = networkId; networkConfig.from = deployer; - console.log(`Using network: ${config.network} (${networkId})`); - console.log(`Using deployer: ${deployer}`); + logger.verbose(`Using network: ${config.network} (${networkId})`); + logger.verbose(`Using deployer: ${deployer}`); } async function migrate(config: Config) { - logStep(`Running migrations: ${config.migrations_directory}`); + logger.info(`Running migrations: ${config.migrations_directory}`); await promisify(cb => Migrate.run(config, cb)); - logStep('Migrations completed'); -} - -function promisify(fn: (cb: Callback) => void) { - return new Promise((resolve, reject) => - fn((err: Error | null, res: T) => { - if (err) { - return reject(err); - } - - return resolve(res); - }) - ); -} - -function logStep(description: string) { - console.log(); - console.log(Array(79).join('-')); - console.log(description); - console.log(Array(79).join('-')); + logger.info('Migrations completed'); } diff --git a/build/contracts/AddressSet.json b/build/contracts/AddressSet.json index 16a05cd..dc61c30 100644 --- a/build/contracts/AddressSet.json +++ b/build/contracts/AddressSet.json @@ -390,7 +390,7 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 692, + "referencedDeclaration": 1501, "type": "function (bool) pure", "value": "require" }, @@ -1390,7 +1390,7 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 692, + "referencedDeclaration": 1501, "type": "function (bool) pure", "value": "require" }, @@ -4149,7 +4149,7 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 680, + "referencedDeclaration": 1489, "type": "function (bool) pure", "value": "assert" }, @@ -4443,7 +4443,7 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 680, + "referencedDeclaration": 1489, "type": "function (bool) pure", "value": "assert" }, @@ -4610,5 +4610,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2017-11-16T23:38:29.113Z" + "updatedAt": "2017-12-09T23:00:14.493Z" } \ No newline at end of file diff --git a/build/contracts/Migrations.json b/build/contracts/Migrations.json index 7c47325..38db0a5 100644 --- a/build/contracts/Migrations.json +++ b/build/contracts/Migrations.json @@ -219,7 +219,7 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 689, + "referencedDeclaration": 1498, "type": "msg", "value": "msg" }, @@ -363,7 +363,7 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 689, + "referencedDeclaration": 1498, "type": "msg", "value": "msg" }, @@ -823,5 +823,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2017-11-16T23:38:29.962Z" -} + "updatedAt": "2017-12-09T23:00:14.494Z" +} \ No newline at end of file diff --git a/build/contracts/MultiSig.json b/build/contracts/MultiSig.json new file mode 100644 index 0000000..c1a3310 --- /dev/null +++ b/build/contracts/MultiSig.json @@ -0,0 +1,3185 @@ +{ + "contractName": "MultiSig", + "abi": [ + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + } + ], + "name": "owners", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "nonce", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "listOwners", + "outputs": [ + { + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "v", + "type": "uint8[]" + }, + { + "name": "r", + "type": "bytes32[]" + }, + { + "name": "s", + "type": "bytes32[]" + }, + { + "name": "destination", + "type": "address" + }, + { + "name": "value", + "type": "uint256" + }, + { + "name": "data", + "type": "bytes" + } + ], + "name": "execute", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "name": "_owners", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "payable": true, + "stateMutability": "payable", + "type": "fallback" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Deposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "destination", + "type": "address" + }, + { + "indexed": false, + "name": "nonce", + "type": "uint256" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "name": "data", + "type": "bytes" + } + ], + "name": "Executed", + "type": "event" + } + ], + "bytecode": "0x6060604052341561000f57600080fd5b604051610a7b380380610a7b83398101604052808051820191905050806000815111151561003c57600080fd5b816001908051906020019061005292919061005a565b505050610127565b8280548282559060005260206000209081019282156100d3579160200282015b828111156100d25782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019061007a565b5b5090506100e091906100e4565b5090565b61012491905b8082111561012057600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506001016100ea565b5090565b90565b610945806101366000396000f300606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c27146100bc578063affed0e01461011f578063ed60c0fc14610148578063f12d394f146101b2575b60003411156100ba573373ffffffffffffffffffffffffffffffffffffffff167f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4346040518082815260200191505060405180910390a25b005b34156100c757600080fd5b6100dd60048080359060200190919050506102f7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561012a57600080fd5b610132610336565b6040518082815260200191505060405180910390f35b341561015357600080fd5b61015b61033c565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561019e578082015181840152602081019050610183565b505050509050019250505060405180910390f35b34156101bd57600080fd5b6102f5600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506103d0565b005b60018181548110151561030657fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b610344610905565b60018054806020026020016040519081016040528092919081815260200182805480156103c657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161037c575b5050505050905090565b85858560197f01000000000000000000000000000000000000000000000000000000000000000260007f0100000000000000000000000000000000000000000000000000000000000000023088888860005460405180887effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101877effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140184815260200183805190602001908083835b602083101515610573578051825260208201915060208101905060208303925061054e565b6001836020036101000a038019825116818451168082178552505050505050905001828152602001975050505050505050604051809103902060008060018054905086511480156105c957506001805490508551145b80156105da57506001805490508451145b15156105e557600080fd5b8260405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01826000191660001916815260200191505060405180910390209150600090505b60018054905081101561078b5760018181548110151561064e57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660018388848151811015156106a157fe5b9060200190602002015188858151811015156106b957fe5b9060200190602002015188868151811015156106d157fe5b90602001906020020151604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561075357600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff1614151561077e57600080fd5b8080600101915050610632565b8873ffffffffffffffffffffffffffffffffffffffff167f30dc9a249e121dc7ec74559d42f94e60bb91eb25e06df470ed1be2a02a9d7a046000548a8a6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156108145780820151818401526020810190506107f9565b50505050905090810190601f1680156108415780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a28873ffffffffffffffffffffffffffffffffffffffff16888860405180828051906020019080838360005b8381101561089657808201518184015260208101905061087b565b50505050905090810190601f1680156108c35780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876187965a03f19250505015156108e757600080fd5b60016000808282540192505081905550505050505050505050505050565b6020604051908101604052806000815250905600a165627a7a72305820f284ee89273a389e64bccb9e9bbccbf438ab5eddfcf56ab8fad8bdd69733f0be0029", + "deployedBytecode": "0x606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c27146100bc578063affed0e01461011f578063ed60c0fc14610148578063f12d394f146101b2575b60003411156100ba573373ffffffffffffffffffffffffffffffffffffffff167f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4346040518082815260200191505060405180910390a25b005b34156100c757600080fd5b6100dd60048080359060200190919050506102f7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561012a57600080fd5b610132610336565b6040518082815260200191505060405180910390f35b341561015357600080fd5b61015b61033c565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561019e578082015181840152602081019050610183565b505050509050019250505060405180910390f35b34156101bd57600080fd5b6102f5600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506103d0565b005b60018181548110151561030657fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b610344610905565b60018054806020026020016040519081016040528092919081815260200182805480156103c657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161037c575b5050505050905090565b85858560197f01000000000000000000000000000000000000000000000000000000000000000260007f0100000000000000000000000000000000000000000000000000000000000000023088888860005460405180887effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101877effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140184815260200183805190602001908083835b602083101515610573578051825260208201915060208101905060208303925061054e565b6001836020036101000a038019825116818451168082178552505050505050905001828152602001975050505050505050604051809103902060008060018054905086511480156105c957506001805490508551145b80156105da57506001805490508451145b15156105e557600080fd5b8260405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01826000191660001916815260200191505060405180910390209150600090505b60018054905081101561078b5760018181548110151561064e57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660018388848151811015156106a157fe5b9060200190602002015188858151811015156106b957fe5b9060200190602002015188868151811015156106d157fe5b90602001906020020151604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561075357600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff1614151561077e57600080fd5b8080600101915050610632565b8873ffffffffffffffffffffffffffffffffffffffff167f30dc9a249e121dc7ec74559d42f94e60bb91eb25e06df470ed1be2a02a9d7a046000548a8a6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156108145780820151818401526020810190506107f9565b50505050905090810190601f1680156108415780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a28873ffffffffffffffffffffffffffffffffffffffff16888860405180828051906020019080838360005b8381101561089657808201518184015260208101905061087b565b50505050905090810190601f1680156108c35780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876187965a03f19250505015156108e757600080fd5b60016000808282540192505081905550505050505050505050505050565b6020604051908101604052806000815250905600a165627a7a72305820f284ee89273a389e64bccb9e9bbccbf438ab5eddfcf56ab8fad8bdd69733f0be0029", + "sourceMap": "26:1655:2:-;;;107:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;180:7;959:1;940:9;:16;:20;932:29;;;;;;;;212:7;203:6;:16;;;;;;;;;;;;:::i;:::-;;107:119;;26:1655;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", + "deployedSourceMap": "26:1655:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1037:1;1025:9;:13;1021:76;;;1064:10;1054:32;;;1076:9;1054:32;;;;;;;;;;;;;;;;;;1021:76;26:1655;77:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1109:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;1199:480:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51:20::-;;;;:::o;1109:84::-;1152:9;;:::i;:::-;1180:6;1173:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1109:84;:::o;1199:480::-;1389:1;1392;1395;1413:4;1408:10;;1425:1;1420:7;;1429:4;1435:11;1448:5;1455:4;1461:5;;1398:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;618:20:2;707:9;497:6;:13;;;;485:1;:8;:25;484:70;;;;;540:6;:13;;;;528:1;:8;:25;484:70;:113;;;;;583:6;:13;;;;571:1;:8;:25;484:113;463:144;;;;;;;;687:4;641:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;618:74;;719:1;707:13;;702:132;726:6;:13;;;;722:1;:17;702:132;;;813:6;820:1;813:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;768:54;;:41;778:12;792:1;794;792:4;;;;;;;;;;;;;;;;;;798:1;800;798:4;;;;;;;;;;;;;;;;;;804:1;806;804:4;;;;;;;;;;;;;;;;;;768:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:54;;;760:63;;;;;;;;741:3;;;;;;;702:132;;;1492:11;1483:41;;;1505:5;;1512;1519:4;1483:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1590:11:2;:16;;1613:5;1620:4;1590:35;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1582:44:2;;;;;;;;865:1;856:5;;:10;;;;;;;;;;;1199:480;;;;;;;;;;;;:::o;26:1655::-;;;;;;;;;;;;;;;:::o", + "source": "pragma solidity 0.4.18;\n\n\ncontract MultiSig {\n\n uint256 public nonce;\n address[] public owners;\n\n function MultiSig(address[] _owners)\n public\n onlyNotEmpty(_owners)\n {\n owners = _owners;\n }\n\n event Deposited(address indexed from, uint256 value);\n event Executed(address indexed destination, uint256 nonce, uint256 value, bytes data);\n\n modifier onlySigned(uint8[] v, bytes32[] r, bytes32[] s, bytes32 hash) {\n require(\n (v.length == owners.length) &&\n (r.length == owners.length) &&\n (s.length == owners.length)\n );\n\n bytes32 prefixedHash = keccak256(\"\\x19Ethereum Signed Message:\\n32\", hash);\n for (uint256 i = 0; i < owners.length; i++) {\n require(ecrecover(prefixedHash, v[i], r[i], s[i]) == owners[i]);\n }\n\n _;\n\n nonce += 1;\n }\n\n modifier onlyNotEmpty(address[] addresses) {\n require(addresses.length > 0);\n _;\n }\n\n function() public payable {\n if (msg.value > 0) {\n Deposited(msg.sender, msg.value);\n }\n }\n\n function listOwners() public view returns (address[]) {\n return owners;\n }\n\n function execute(\n uint8[] v,\n bytes32[] r,\n bytes32[] s,\n address destination,\n uint256 value,\n bytes data\n )\n public\n onlySigned(v, r, s, keccak256(byte(0x19), byte(0), this, destination, value, data, nonce))\n {\n Executed(destination, nonce, value, data);\n\n /* solhint-disable avoid-call-value */\n require(destination.call.value(value)(data));\n /* solhint-enable avoid-call-value */\n }\n}\n", + "sourcePath": "/home/js/Projects/js/signhash/signhash-contracts/contracts/MultiSig/MultiSig.sol", + "ast": { + "attributes": { + "absolutePath": "/home/js/Projects/js/signhash/signhash-contracts/contracts/MultiSig/MultiSig.sol", + "exportedSymbols": { + "MultiSig": [ + 606 + ] + } + }, + "children": [ + { + "attributes": { + "literals": [ + "solidity", + "0.4", + ".18" + ] + }, + "id": 395, + "name": "PragmaDirective", + "src": "0:23:2" + }, + { + "attributes": { + "baseContracts": [ + null + ], + "contractDependencies": [ + null + ], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "linearizedBaseContracts": [ + 606 + ], + "name": "MultiSig", + "scope": 607 + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "nonce", + "scope": 606, + "stateVariable": true, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 396, + "name": "ElementaryTypeName", + "src": "51:7:2" + } + ], + "id": 397, + "name": "VariableDeclaration", + "src": "51:20:2" + }, + { + "attributes": { + "constant": false, + "name": "owners", + "scope": 606, + "stateVariable": true, + "storageLocation": "default", + "type": "address[] storage ref", + "value": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "address[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 398, + "name": "ElementaryTypeName", + "src": "77:7:2" + } + ], + "id": 399, + "name": "ArrayTypeName", + "src": "77:9:2" + } + ], + "id": 400, + "name": "VariableDeclaration", + "src": "77:23:2" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": true, + "name": "MultiSig", + "payable": false, + "scope": 606, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "_owners", + "scope": 414, + "stateVariable": false, + "storageLocation": "default", + "type": "address[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "address[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 401, + "name": "ElementaryTypeName", + "src": "125:7:2" + } + ], + "id": 402, + "name": "ArrayTypeName", + "src": "125:9:2" + } + ], + "id": 403, + "name": "VariableDeclaration", + "src": "125:17:2" + } + ], + "id": 404, + "name": "ParameterList", + "src": "124:19:2" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 408, + "name": "ParameterList", + "src": "193:0:2" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 525, + "type": "modifier (address[] memory)", + "value": "onlyNotEmpty" + }, + "id": 405, + "name": "Identifier", + "src": "167:12:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 403, + "type": "address[] memory", + "value": "_owners" + }, + "id": 406, + "name": "Identifier", + "src": "180:7:2" + } + ], + "id": 407, + "name": "ModifierInvocation", + "src": "167:21:2" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "address[] storage ref" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 400, + "type": "address[] storage ref", + "value": "owners" + }, + "id": 409, + "name": "Identifier", + "src": "203:6:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 403, + "type": "address[] memory", + "value": "_owners" + }, + "id": 410, + "name": "Identifier", + "src": "212:7:2" + } + ], + "id": 411, + "name": "Assignment", + "src": "203:16:2" + } + ], + "id": 412, + "name": "ExpressionStatement", + "src": "203:16:2" + } + ], + "id": 413, + "name": "Block", + "src": "193:33:2" + } + ], + "id": 414, + "name": "FunctionDefinition", + "src": "107:119:2" + }, + { + "attributes": { + "anonymous": false, + "name": "Deposited" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "indexed": true, + "name": "from", + "scope": 420, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 415, + "name": "ElementaryTypeName", + "src": "248:7:2" + } + ], + "id": 416, + "name": "VariableDeclaration", + "src": "248:20:2" + }, + { + "attributes": { + "constant": false, + "indexed": false, + "name": "value", + "scope": 420, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 417, + "name": "ElementaryTypeName", + "src": "270:7:2" + } + ], + "id": 418, + "name": "VariableDeclaration", + "src": "270:13:2" + } + ], + "id": 419, + "name": "ParameterList", + "src": "247:37:2" + } + ], + "id": 420, + "name": "EventDefinition", + "src": "232:53:2" + }, + { + "attributes": { + "anonymous": false, + "name": "Executed" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "indexed": true, + "name": "destination", + "scope": 430, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 421, + "name": "ElementaryTypeName", + "src": "305:7:2" + } + ], + "id": 422, + "name": "VariableDeclaration", + "src": "305:27:2" + }, + { + "attributes": { + "constant": false, + "indexed": false, + "name": "nonce", + "scope": 430, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 423, + "name": "ElementaryTypeName", + "src": "334:7:2" + } + ], + "id": 424, + "name": "VariableDeclaration", + "src": "334:13:2" + }, + { + "attributes": { + "constant": false, + "indexed": false, + "name": "value", + "scope": 430, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 425, + "name": "ElementaryTypeName", + "src": "349:7:2" + } + ], + "id": 426, + "name": "VariableDeclaration", + "src": "349:13:2" + }, + { + "attributes": { + "constant": false, + "indexed": false, + "name": "data", + "scope": 430, + "stateVariable": false, + "storageLocation": "default", + "type": "bytes memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "bytes", + "type": "bytes storage pointer" + }, + "id": 427, + "name": "ElementaryTypeName", + "src": "364:5:2" + } + ], + "id": 428, + "name": "VariableDeclaration", + "src": "364:10:2" + } + ], + "id": 429, + "name": "ParameterList", + "src": "304:71:2" + } + ], + "id": 430, + "name": "EventDefinition", + "src": "290:86:2" + }, + { + "attributes": { + "name": "onlySigned", + "visibility": "internal" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "v", + "scope": 511, + "stateVariable": false, + "storageLocation": "default", + "type": "uint8[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "uint8[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "uint8", + "type": "uint8" + }, + "id": 431, + "name": "ElementaryTypeName", + "src": "402:5:2" + } + ], + "id": 432, + "name": "ArrayTypeName", + "src": "402:7:2" + } + ], + "id": 433, + "name": "VariableDeclaration", + "src": "402:9:2" + }, + { + "attributes": { + "constant": false, + "name": "r", + "scope": 511, + "stateVariable": false, + "storageLocation": "default", + "type": "bytes32[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "bytes32[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "bytes32", + "type": "bytes32" + }, + "id": 434, + "name": "ElementaryTypeName", + "src": "413:7:2" + } + ], + "id": 435, + "name": "ArrayTypeName", + "src": "413:9:2" + } + ], + "id": 436, + "name": "VariableDeclaration", + "src": "413:11:2" + }, + { + "attributes": { + "constant": false, + "name": "s", + "scope": 511, + "stateVariable": false, + "storageLocation": "default", + "type": "bytes32[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "bytes32[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "bytes32", + "type": "bytes32" + }, + "id": 437, + "name": "ElementaryTypeName", + "src": "426:7:2" + } + ], + "id": 438, + "name": "ArrayTypeName", + "src": "426:9:2" + } + ], + "id": 439, + "name": "VariableDeclaration", + "src": "426:11:2" + }, + { + "attributes": { + "constant": false, + "name": "hash", + "scope": 511, + "stateVariable": false, + "storageLocation": "default", + "type": "bytes32", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "bytes32", + "type": "bytes32" + }, + "id": 440, + "name": "ElementaryTypeName", + "src": "439:7:2" + } + ], + "id": 441, + "name": "VariableDeclaration", + "src": "439:12:2" + } + ], + "id": 442, + "name": "ParameterList", + "src": "401:51:2" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1501, + "type": "function (bool) pure", + "value": "require" + }, + "id": 443, + "name": "Identifier", + "src": "463:7:2" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "&&", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "&&", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "==", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "length", + "referencedDeclaration": null, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 433, + "type": "uint8[] memory", + "value": "v" + }, + "id": 444, + "name": "Identifier", + "src": "485:1:2" + } + ], + "id": 445, + "name": "MemberAccess", + "src": "485:8:2" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "member_name": "length", + "referencedDeclaration": null, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 400, + "type": "address[] storage ref", + "value": "owners" + }, + "id": 446, + "name": "Identifier", + "src": "497:6:2" + } + ], + "id": 447, + "name": "MemberAccess", + "src": "497:13:2" + } + ], + "id": 448, + "name": "BinaryOperation", + "src": "485:25:2" + } + ], + "id": 449, + "name": "TupleExpression", + "src": "484:27:2" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "==", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "length", + "referencedDeclaration": null, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 436, + "type": "bytes32[] memory", + "value": "r" + }, + "id": 450, + "name": "Identifier", + "src": "528:1:2" + } + ], + "id": 451, + "name": "MemberAccess", + "src": "528:8:2" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "member_name": "length", + "referencedDeclaration": null, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 400, + "type": "address[] storage ref", + "value": "owners" + }, + "id": 452, + "name": "Identifier", + "src": "540:6:2" + } + ], + "id": 453, + "name": "MemberAccess", + "src": "540:13:2" + } + ], + "id": 454, + "name": "BinaryOperation", + "src": "528:25:2" + } + ], + "id": 455, + "name": "TupleExpression", + "src": "527:27:2" + } + ], + "id": 456, + "name": "BinaryOperation", + "src": "484:70:2" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "==", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "length", + "referencedDeclaration": null, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 439, + "type": "bytes32[] memory", + "value": "s" + }, + "id": 457, + "name": "Identifier", + "src": "571:1:2" + } + ], + "id": 458, + "name": "MemberAccess", + "src": "571:8:2" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "member_name": "length", + "referencedDeclaration": null, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 400, + "type": "address[] storage ref", + "value": "owners" + }, + "id": 459, + "name": "Identifier", + "src": "583:6:2" + } + ], + "id": 460, + "name": "MemberAccess", + "src": "583:13:2" + } + ], + "id": 461, + "name": "BinaryOperation", + "src": "571:25:2" + } + ], + "id": 462, + "name": "TupleExpression", + "src": "570:27:2" + } + ], + "id": 463, + "name": "BinaryOperation", + "src": "484:113:2" + } + ], + "id": 464, + "name": "FunctionCall", + "src": "463:144:2" + } + ], + "id": 465, + "name": "ExpressionStatement", + "src": "463:144:2" + }, + { + "attributes": { + "assignments": [ + 467 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "prefixedHash", + "scope": 511, + "stateVariable": false, + "storageLocation": "default", + "type": "bytes32", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "bytes32", + "type": "bytes32" + }, + "id": 466, + "name": "ElementaryTypeName", + "src": "618:7:2" + } + ], + "id": 467, + "name": "VariableDeclaration", + "src": "618:20:2" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "bytes32", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73", + "typeString": "literal_string \"\u0019Ethereum Signed Message:\n32\"" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1492, + "type": "function () pure returns (bytes32)", + "value": "keccak256" + }, + "id": 468, + "name": "Identifier", + "src": "641:9:2" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "19457468657265756d205369676e6564204d6573736167653a0a3332", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "string", + "type": "literal_string \"\u0019Ethereum Signed Message:\n32\"", + "value": "\u0019Ethereum Signed Message:\n32" + }, + "id": 469, + "name": "Literal", + "src": "651:34:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 441, + "type": "bytes32", + "value": "hash" + }, + "id": 470, + "name": "Identifier", + "src": "687:4:2" + } + ], + "id": 471, + "name": "FunctionCall", + "src": "641:51:2" + } + ], + "id": 472, + "name": "VariableDeclarationStatement", + "src": "618:74:2" + }, + { + "children": [ + { + "attributes": { + "assignments": [ + 474 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "i", + "scope": 511, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 473, + "name": "ElementaryTypeName", + "src": "707:7:2" + } + ], + "id": 474, + "name": "VariableDeclaration", + "src": "707:9:2" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 475, + "name": "Literal", + "src": "719:1:2" + } + ], + "id": 476, + "name": "VariableDeclarationStatement", + "src": "707:13:2" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "<", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 474, + "type": "uint256", + "value": "i" + }, + "id": 477, + "name": "Identifier", + "src": "722:1:2" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "member_name": "length", + "referencedDeclaration": null, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 400, + "type": "address[] storage ref", + "value": "owners" + }, + "id": 478, + "name": "Identifier", + "src": "726:6:2" + } + ], + "id": 479, + "name": "MemberAccess", + "src": "726:13:2" + } + ], + "id": 480, + "name": "BinaryOperation", + "src": "722:17:2" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "++", + "prefix": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 474, + "type": "uint256", + "value": "i" + }, + "id": 481, + "name": "Identifier", + "src": "741:1:2" + } + ], + "id": 482, + "name": "UnaryOperation", + "src": "741:3:2" + } + ], + "id": 483, + "name": "ExpressionStatement", + "src": "741:3:2" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1501, + "type": "function (bool) pure", + "value": "require" + }, + "id": 484, + "name": "Identifier", + "src": "760:7:2" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "==", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "address", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1491, + "type": "function (bytes32,uint8,bytes32,bytes32) pure returns (address)", + "value": "ecrecover" + }, + "id": 485, + "name": "Identifier", + "src": "768:9:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 467, + "type": "bytes32", + "value": "prefixedHash" + }, + "id": 486, + "name": "Identifier", + "src": "778:12:2" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint8" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 433, + "type": "uint8[] memory", + "value": "v" + }, + "id": 487, + "name": "Identifier", + "src": "792:1:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 474, + "type": "uint256", + "value": "i" + }, + "id": 488, + "name": "Identifier", + "src": "794:1:2" + } + ], + "id": 489, + "name": "IndexAccess", + "src": "792:4:2" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "bytes32" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 436, + "type": "bytes32[] memory", + "value": "r" + }, + "id": 490, + "name": "Identifier", + "src": "798:1:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 474, + "type": "uint256", + "value": "i" + }, + "id": 491, + "name": "Identifier", + "src": "800:1:2" + } + ], + "id": 492, + "name": "IndexAccess", + "src": "798:4:2" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "bytes32" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 439, + "type": "bytes32[] memory", + "value": "s" + }, + "id": 493, + "name": "Identifier", + "src": "804:1:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 474, + "type": "uint256", + "value": "i" + }, + "id": 494, + "name": "Identifier", + "src": "806:1:2" + } + ], + "id": 495, + "name": "IndexAccess", + "src": "804:4:2" + } + ], + "id": 496, + "name": "FunctionCall", + "src": "768:41:2" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 400, + "type": "address[] storage ref", + "value": "owners" + }, + "id": 497, + "name": "Identifier", + "src": "813:6:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 474, + "type": "uint256", + "value": "i" + }, + "id": 498, + "name": "Identifier", + "src": "820:1:2" + } + ], + "id": 499, + "name": "IndexAccess", + "src": "813:9:2" + } + ], + "id": 500, + "name": "BinaryOperation", + "src": "768:54:2" + } + ], + "id": 501, + "name": "FunctionCall", + "src": "760:63:2" + } + ], + "id": 502, + "name": "ExpressionStatement", + "src": "760:63:2" + } + ], + "id": 503, + "name": "Block", + "src": "746:88:2" + } + ], + "id": 504, + "name": "ForStatement", + "src": "702:132:2" + }, + { + "id": 505, + "name": "PlaceholderStatement", + "src": "844:1:2" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "+=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 397, + "type": "uint256", + "value": "nonce" + }, + "id": 506, + "name": "Identifier", + "src": "856:5:2" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "31", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 1", + "value": "1" + }, + "id": 507, + "name": "Literal", + "src": "865:1:2" + } + ], + "id": 508, + "name": "Assignment", + "src": "856:10:2" + } + ], + "id": 509, + "name": "ExpressionStatement", + "src": "856:10:2" + } + ], + "id": 510, + "name": "Block", + "src": "453:420:2" + } + ], + "id": 511, + "name": "ModifierDefinition", + "src": "382:491:2" + }, + { + "attributes": { + "name": "onlyNotEmpty", + "visibility": "internal" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "addresses", + "scope": 525, + "stateVariable": false, + "storageLocation": "default", + "type": "address[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "address[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 512, + "name": "ElementaryTypeName", + "src": "901:7:2" + } + ], + "id": 513, + "name": "ArrayTypeName", + "src": "901:9:2" + } + ], + "id": 514, + "name": "VariableDeclaration", + "src": "901:19:2" + } + ], + "id": 515, + "name": "ParameterList", + "src": "900:21:2" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1501, + "type": "function (bool) pure", + "value": "require" + }, + "id": 516, + "name": "Identifier", + "src": "932:7:2" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": ">", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "length", + "referencedDeclaration": null, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 514, + "type": "address[] memory", + "value": "addresses" + }, + "id": 517, + "name": "Identifier", + "src": "940:9:2" + } + ], + "id": 518, + "name": "MemberAccess", + "src": "940:16:2" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 519, + "name": "Literal", + "src": "959:1:2" + } + ], + "id": 520, + "name": "BinaryOperation", + "src": "940:20:2" + } + ], + "id": 521, + "name": "FunctionCall", + "src": "932:29:2" + } + ], + "id": 522, + "name": "ExpressionStatement", + "src": "932:29:2" + }, + { + "id": 523, + "name": "PlaceholderStatement", + "src": "971:1:2" + } + ], + "id": 524, + "name": "Block", + "src": "922:57:2" + } + ], + "id": 525, + "name": "ModifierDefinition", + "src": "879:100:2" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "", + "payable": true, + "scope": 606, + "stateMutability": "payable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 526, + "name": "ParameterList", + "src": "993:2:2" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 527, + "name": "ParameterList", + "src": "1011:0:2" + }, + { + "children": [ + { + "attributes": { + "falseBody": null + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": ">", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "value", + "referencedDeclaration": null, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1498, + "type": "msg", + "value": "msg" + }, + "id": 528, + "name": "Identifier", + "src": "1025:3:2" + } + ], + "id": 529, + "name": "MemberAccess", + "src": "1025:9:2" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 530, + "name": "Literal", + "src": "1037:1:2" + } + ], + "id": 531, + "name": "BinaryOperation", + "src": "1025:13:2" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 420, + "type": "function (address,uint256)", + "value": "Deposited" + }, + "id": 532, + "name": "Identifier", + "src": "1054:9:2" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1498, + "type": "msg", + "value": "msg" + }, + "id": 533, + "name": "Identifier", + "src": "1064:3:2" + } + ], + "id": 534, + "name": "MemberAccess", + "src": "1064:10:2" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "value", + "referencedDeclaration": null, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1498, + "type": "msg", + "value": "msg" + }, + "id": 535, + "name": "Identifier", + "src": "1076:3:2" + } + ], + "id": 536, + "name": "MemberAccess", + "src": "1076:9:2" + } + ], + "id": 537, + "name": "FunctionCall", + "src": "1054:32:2" + } + ], + "id": 538, + "name": "ExpressionStatement", + "src": "1054:32:2" + } + ], + "id": 539, + "name": "Block", + "src": "1040:57:2" + } + ], + "id": 540, + "name": "IfStatement", + "src": "1021:76:2" + } + ], + "id": 541, + "name": "Block", + "src": "1011:92:2" + } + ], + "id": 542, + "name": "FunctionDefinition", + "src": "985:118:2" + }, + { + "attributes": { + "constant": true, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "listOwners", + "payable": false, + "scope": 606, + "stateMutability": "view", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 543, + "name": "ParameterList", + "src": "1128:2:2" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 551, + "stateVariable": false, + "storageLocation": "default", + "type": "address[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "address[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 544, + "name": "ElementaryTypeName", + "src": "1152:7:2" + } + ], + "id": 545, + "name": "ArrayTypeName", + "src": "1152:9:2" + } + ], + "id": 546, + "name": "VariableDeclaration", + "src": "1152:9:2" + } + ], + "id": 547, + "name": "ParameterList", + "src": "1151:11:2" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 547 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 400, + "type": "address[] storage ref", + "value": "owners" + }, + "id": 548, + "name": "Identifier", + "src": "1180:6:2" + } + ], + "id": 549, + "name": "Return", + "src": "1173:13:2" + } + ], + "id": 550, + "name": "Block", + "src": "1163:30:2" + } + ], + "id": 551, + "name": "FunctionDefinition", + "src": "1109:84:2" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "execute", + "payable": false, + "scope": 606, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "v", + "scope": 605, + "stateVariable": false, + "storageLocation": "default", + "type": "uint8[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "uint8[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "uint8", + "type": "uint8" + }, + "id": 552, + "name": "ElementaryTypeName", + "src": "1225:5:2" + } + ], + "id": 553, + "name": "ArrayTypeName", + "src": "1225:7:2" + } + ], + "id": 554, + "name": "VariableDeclaration", + "src": "1225:9:2" + }, + { + "attributes": { + "constant": false, + "name": "r", + "scope": 605, + "stateVariable": false, + "storageLocation": "default", + "type": "bytes32[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "bytes32[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "bytes32", + "type": "bytes32" + }, + "id": 555, + "name": "ElementaryTypeName", + "src": "1244:7:2" + } + ], + "id": 556, + "name": "ArrayTypeName", + "src": "1244:9:2" + } + ], + "id": 557, + "name": "VariableDeclaration", + "src": "1244:11:2" + }, + { + "attributes": { + "constant": false, + "name": "s", + "scope": 605, + "stateVariable": false, + "storageLocation": "default", + "type": "bytes32[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "bytes32[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "bytes32", + "type": "bytes32" + }, + "id": 558, + "name": "ElementaryTypeName", + "src": "1265:7:2" + } + ], + "id": 559, + "name": "ArrayTypeName", + "src": "1265:9:2" + } + ], + "id": 560, + "name": "VariableDeclaration", + "src": "1265:11:2" + }, + { + "attributes": { + "constant": false, + "name": "destination", + "scope": 605, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 561, + "name": "ElementaryTypeName", + "src": "1286:7:2" + } + ], + "id": 562, + "name": "VariableDeclaration", + "src": "1286:19:2" + }, + { + "attributes": { + "constant": false, + "name": "value", + "scope": 605, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 563, + "name": "ElementaryTypeName", + "src": "1315:7:2" + } + ], + "id": 564, + "name": "VariableDeclaration", + "src": "1315:13:2" + }, + { + "attributes": { + "constant": false, + "name": "data", + "scope": 605, + "stateVariable": false, + "storageLocation": "default", + "type": "bytes memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "bytes", + "type": "bytes storage pointer" + }, + "id": 565, + "name": "ElementaryTypeName", + "src": "1338:5:2" + } + ], + "id": 566, + "name": "VariableDeclaration", + "src": "1338:10:2" + } + ], + "id": 567, + "name": "ParameterList", + "src": "1215:139:2" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 586, + "name": "ParameterList", + "src": "1473:0:2" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 511, + "type": "modifier (uint8[] memory,bytes32[] memory,bytes32[] memory,bytes32)", + "value": "onlySigned" + }, + "id": 568, + "name": "Identifier", + "src": "1378:10:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 554, + "type": "uint8[] memory", + "value": "v" + }, + "id": 569, + "name": "Identifier", + "src": "1389:1:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 557, + "type": "bytes32[] memory", + "value": "r" + }, + "id": 570, + "name": "Identifier", + "src": "1392:1:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 560, + "type": "bytes32[] memory", + "value": "s" + }, + "id": 571, + "name": "Identifier", + "src": "1395:1:2" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "bytes32", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + { + "typeIdentifier": "t_contract$_MultiSig_$606", + "typeString": "contract MultiSig" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1492, + "type": "function () pure returns (bytes32)", + "value": "keccak256" + }, + "id": 572, + "name": "Identifier", + "src": "1398:9:2" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": true, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "bytes1", + "type_conversion": true + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_25_by_1", + "typeString": "int_const 25" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "type": "type(bytes1)", + "value": "byte" + }, + "id": 573, + "name": "ElementaryTypeNameExpression", + "src": "1408:4:2" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30783139", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 25", + "value": "0x19" + }, + "id": 574, + "name": "Literal", + "src": "1413:4:2" + } + ], + "id": 575, + "name": "FunctionCall", + "src": "1408:10:2" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": true, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "bytes1", + "type_conversion": true + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "type": "type(bytes1)", + "value": "byte" + }, + "id": 576, + "name": "ElementaryTypeNameExpression", + "src": "1420:4:2" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 577, + "name": "Literal", + "src": "1425:1:2" + } + ], + "id": 578, + "name": "FunctionCall", + "src": "1420:7:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1513, + "type": "contract MultiSig", + "value": "this" + }, + "id": 579, + "name": "Identifier", + "src": "1429:4:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 562, + "type": "address", + "value": "destination" + }, + "id": 580, + "name": "Identifier", + "src": "1435:11:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 564, + "type": "uint256", + "value": "value" + }, + "id": 581, + "name": "Identifier", + "src": "1448:5:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 566, + "type": "bytes memory", + "value": "data" + }, + "id": 582, + "name": "Identifier", + "src": "1455:4:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 397, + "type": "uint256", + "value": "nonce" + }, + "id": 583, + "name": "Identifier", + "src": "1461:5:2" + } + ], + "id": 584, + "name": "FunctionCall", + "src": "1398:69:2" + } + ], + "id": 585, + "name": "ModifierInvocation", + "src": "1378:90:2" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 430, + "type": "function (address,uint256,uint256,bytes memory)", + "value": "Executed" + }, + "id": 587, + "name": "Identifier", + "src": "1483:8:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 562, + "type": "address", + "value": "destination" + }, + "id": 588, + "name": "Identifier", + "src": "1492:11:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 397, + "type": "uint256", + "value": "nonce" + }, + "id": 589, + "name": "Identifier", + "src": "1505:5:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 564, + "type": "uint256", + "value": "value" + }, + "id": 590, + "name": "Identifier", + "src": "1512:5:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 566, + "type": "bytes memory", + "value": "data" + }, + "id": 591, + "name": "Identifier", + "src": "1519:4:2" + } + ], + "id": 592, + "name": "FunctionCall", + "src": "1483:41:2" + } + ], + "id": 593, + "name": "ExpressionStatement", + "src": "1483:41:2" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1501, + "type": "function (bool) pure", + "value": "require" + }, + "id": 594, + "name": "Identifier", + "src": "1582:7:2" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "bool", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "function () payable returns (bool)", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "value", + "referencedDeclaration": null, + "type": "function (uint256) returns (function () payable returns (bool))" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "call", + "referencedDeclaration": null, + "type": "function () payable returns (bool)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 562, + "type": "address", + "value": "destination" + }, + "id": 595, + "name": "Identifier", + "src": "1590:11:2" + } + ], + "id": 596, + "name": "MemberAccess", + "src": "1590:16:2" + } + ], + "id": 597, + "name": "MemberAccess", + "src": "1590:22:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 564, + "type": "uint256", + "value": "value" + }, + "id": 598, + "name": "Identifier", + "src": "1613:5:2" + } + ], + "id": 599, + "name": "FunctionCall", + "src": "1590:29:2" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 566, + "type": "bytes memory", + "value": "data" + }, + "id": 600, + "name": "Identifier", + "src": "1620:4:2" + } + ], + "id": 601, + "name": "FunctionCall", + "src": "1590:35:2" + } + ], + "id": 602, + "name": "FunctionCall", + "src": "1582:44:2" + } + ], + "id": 603, + "name": "ExpressionStatement", + "src": "1582:44:2" + } + ], + "id": 604, + "name": "Block", + "src": "1473:206:2" + } + ], + "id": 605, + "name": "FunctionDefinition", + "src": "1199:480:2" + } + ], + "id": 606, + "name": "ContractDefinition", + "src": "26:1655:2" + } + ], + "id": 607, + "name": "SourceUnit", + "src": "0:1682:2" + }, + "compiler": { + "name": "solc", + "version": "0.4.18+commit.9cf6e910.Emscripten.clang" + }, + "networks": {}, + "schemaVersion": "1.0.1", + "updatedAt": "2017-12-09T23:00:14.495Z" +} \ No newline at end of file diff --git a/build/contracts/RecoverableMultiSig.json b/build/contracts/RecoverableMultiSig.json new file mode 100644 index 0000000..48857fa --- /dev/null +++ b/build/contracts/RecoverableMultiSig.json @@ -0,0 +1,3146 @@ +{ + "contractName": "RecoverableMultiSig", + "abi": [ + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + } + ], + "name": "owners", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "cancelRecovery", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "account", + "type": "address" + } + ], + "name": "isOwner", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "newOwners", + "type": "address[]" + } + ], + "name": "confirmRecovery", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "recoveryHash", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "recoveryBlock", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "recoveryBlockOffset", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "nonce", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "newOwners", + "type": "address[]" + } + ], + "name": "startRecovery", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "listOwners", + "outputs": [ + { + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "v", + "type": "uint8[]" + }, + { + "name": "r", + "type": "bytes32[]" + }, + { + "name": "s", + "type": "bytes32[]" + }, + { + "name": "destination", + "type": "address" + }, + { + "name": "value", + "type": "uint256" + }, + { + "name": "data", + "type": "bytes" + } + ], + "name": "execute", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "name": "_owners", + "type": "address[]" + }, + { + "name": "_recoveryBlockOffset", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "payable": true, + "stateMutability": "payable", + "type": "fallback" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": false, + "name": "newOwners", + "type": "address[]" + } + ], + "name": "RecoveryStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + } + ], + "name": "RecoveryCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": false, + "name": "newOwners", + "type": "address[]" + } + ], + "name": "RecoveryConfirmed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Deposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "destination", + "type": "address" + }, + { + "indexed": false, + "name": "nonce", + "type": "uint256" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "name": "data", + "type": "bytes" + } + ], + "name": "Executed", + "type": "event" + } + ], + "bytecode": "0x6060604052341561000f57600080fd5b6040516110d13803806110d18339810160405280805182019190602001805190602001909190505081806000815111151561004957600080fd5b816001908051906020019061005f929190610070565b50505080600281905550505061013d565b8280548282559060005260206000209081019282156100e9579160200282015b828111156100e85782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190610090565b5b5090506100f691906100fa565b5090565b61013a91905b8082111561013657600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101610100565b5090565b90565b610f858061014c6000396000f3006060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c27146101095780630ba234d61461016c5780632f54bf6e1461018157806352f2aeac146101d25780636102495c1461022c578063794ee3d91461025d5780637a7c1e5214610286578063affed0e0146102af578063b1b3a744146102d8578063ed60c0fc14610332578063f12d394f1461039c575b6000341115610107573373ffffffffffffffffffffffffffffffffffffffff167f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4346040518082815260200191505060405180910390a25b005b341561011457600080fd5b61012a60048080359060200190919050506104e1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561017757600080fd5b61017f610520565b005b341561018c57600080fd5b6101b8600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610592565b604051808215151515815260200191505060405180910390f35b34156101dd57600080fd5b61022a600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050610636565b005b341561023757600080fd5b61023f61077d565b60405180826000191660001916815260200191505060405180910390f35b341561026857600080fd5b610270610783565b6040518082815260200191505060405180910390f35b341561029157600080fd5b610299610789565b6040518082815260200191505060405180910390f35b34156102ba57600080fd5b6102c261078f565b6040518082815260200191505060405180910390f35b34156102e357600080fd5b610330600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050610795565b005b341561033d57600080fd5b6103456108a1565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561038857808201518184015260208101905061036d565b505050509050019250505060405180910390f35b34156103a757600080fd5b6104df600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610935565b005b6001818154811015156104f057fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61052933610592565b151561053457600080fd5b600060035411151561054557600080fd5b61054d610e6a565b3373ffffffffffffffffffffffffffffffffffffffff167f8154b6c5e1fc90d44b49808ef93f9739148d0821411890f8cd684385e24b9f1e60405160405180910390a2565b600080600090505b60018054905081101561062b576001818154811015156105b657fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561061e5760019150610630565b808060010191505061059a565b600091505b50919050565b61063f33610592565b151561064a57600080fd5b600060035411151561065b57600080fd5b60025460035401431015151561067057600080fd5b80600454600019168160405180828051906020019060200280838360005b838110156106a957808201518184015260208101905061068e565b505050509050019150506040518091039020600019161415156106cb57600080fd5b81600190805190602001906106e1929190610e78565b506106ea610e6a565b3373ffffffffffffffffffffffffffffffffffffffff167fbb05e5746c88b170afb20d94797c3645f9822720fc2601b59137820c2fa5c984836040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561076657808201518184015260208101905061074b565b505050509050019250505060405180910390a25050565b60045481565b60035481565b60025481565b60005481565b61079e33610592565b15156107a957600080fd5b80600081511115156107ba57600080fd5b436003819055508160405180828051906020019060200280838360005b838110156107f25780820151818401526020810190506107d7565b505050509050019150506040518091039020600481600019169055503373ffffffffffffffffffffffffffffffffffffffff167fb1b6ebc5dd19ea5b01feac6392231a6142251ad4951bdb0491c58485dffc2883836040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561088a57808201518184015260208101905061086f565b505050509050019250505060405180910390a25050565b6108a9610f02565b600180548060200260200160405190810160405280929190818152602001828054801561092b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116108e1575b5050505050905090565b85858560197f01000000000000000000000000000000000000000000000000000000000000000260007f0100000000000000000000000000000000000000000000000000000000000000023088888860005460405180887effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101877effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140184815260200183805190602001908083835b602083101515610ad85780518252602082019150602081019050602083039250610ab3565b6001836020036101000a03801982511681845116808217855250505050505090500182815260200197505050505050505060405180910390206000806001805490508651148015610b2e57506001805490508551145b8015610b3f57506001805490508451145b1515610b4a57600080fd5b8260405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01826000191660001916815260200191505060405180910390209150600090505b600180549050811015610cf057600181815481101515610bb357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166001838884815181101515610c0657fe5b906020019060200201518885815181101515610c1e57fe5b906020019060200201518886815181101515610c3657fe5b90602001906020020151604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f11515610cb857600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff16141515610ce357600080fd5b8080600101915050610b97565b8873ffffffffffffffffffffffffffffffffffffffff167f30dc9a249e121dc7ec74559d42f94e60bb91eb25e06df470ed1be2a02a9d7a046000548a8a6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610d79578082015181840152602081019050610d5e565b50505050905090810190601f168015610da65780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a28873ffffffffffffffffffffffffffffffffffffffff16888860405180828051906020019080838360005b83811015610dfb578082015181840152602081019050610de0565b50505050905090810190601f168015610e285780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876187965a03f1925050501515610e4c57600080fd5b60016000808282540192505081905550505050505050505050505050565b600360009055600460009055565b828054828255906000526020600020908101928215610ef1579160200282015b82811115610ef05782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190610e98565b5b509050610efe9190610f16565b5090565b602060405190810160405280600081525090565b610f5691905b80821115610f5257600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101610f1c565b5090565b905600a165627a7a7230582056bce8acba4434b768daa9b36557a7572b36d20ca2640c8e0eb7f00602a50ec10029", + "deployedBytecode": "0x6060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c27146101095780630ba234d61461016c5780632f54bf6e1461018157806352f2aeac146101d25780636102495c1461022c578063794ee3d91461025d5780637a7c1e5214610286578063affed0e0146102af578063b1b3a744146102d8578063ed60c0fc14610332578063f12d394f1461039c575b6000341115610107573373ffffffffffffffffffffffffffffffffffffffff167f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4346040518082815260200191505060405180910390a25b005b341561011457600080fd5b61012a60048080359060200190919050506104e1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561017757600080fd5b61017f610520565b005b341561018c57600080fd5b6101b8600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610592565b604051808215151515815260200191505060405180910390f35b34156101dd57600080fd5b61022a600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050610636565b005b341561023757600080fd5b61023f61077d565b60405180826000191660001916815260200191505060405180910390f35b341561026857600080fd5b610270610783565b6040518082815260200191505060405180910390f35b341561029157600080fd5b610299610789565b6040518082815260200191505060405180910390f35b34156102ba57600080fd5b6102c261078f565b6040518082815260200191505060405180910390f35b34156102e357600080fd5b610330600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050610795565b005b341561033d57600080fd5b6103456108a1565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561038857808201518184015260208101905061036d565b505050509050019250505060405180910390f35b34156103a757600080fd5b6104df600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610935565b005b6001818154811015156104f057fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61052933610592565b151561053457600080fd5b600060035411151561054557600080fd5b61054d610e6a565b3373ffffffffffffffffffffffffffffffffffffffff167f8154b6c5e1fc90d44b49808ef93f9739148d0821411890f8cd684385e24b9f1e60405160405180910390a2565b600080600090505b60018054905081101561062b576001818154811015156105b657fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561061e5760019150610630565b808060010191505061059a565b600091505b50919050565b61063f33610592565b151561064a57600080fd5b600060035411151561065b57600080fd5b60025460035401431015151561067057600080fd5b80600454600019168160405180828051906020019060200280838360005b838110156106a957808201518184015260208101905061068e565b505050509050019150506040518091039020600019161415156106cb57600080fd5b81600190805190602001906106e1929190610e78565b506106ea610e6a565b3373ffffffffffffffffffffffffffffffffffffffff167fbb05e5746c88b170afb20d94797c3645f9822720fc2601b59137820c2fa5c984836040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561076657808201518184015260208101905061074b565b505050509050019250505060405180910390a25050565b60045481565b60035481565b60025481565b60005481565b61079e33610592565b15156107a957600080fd5b80600081511115156107ba57600080fd5b436003819055508160405180828051906020019060200280838360005b838110156107f25780820151818401526020810190506107d7565b505050509050019150506040518091039020600481600019169055503373ffffffffffffffffffffffffffffffffffffffff167fb1b6ebc5dd19ea5b01feac6392231a6142251ad4951bdb0491c58485dffc2883836040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561088a57808201518184015260208101905061086f565b505050509050019250505060405180910390a25050565b6108a9610f02565b600180548060200260200160405190810160405280929190818152602001828054801561092b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116108e1575b5050505050905090565b85858560197f01000000000000000000000000000000000000000000000000000000000000000260007f0100000000000000000000000000000000000000000000000000000000000000023088888860005460405180887effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101877effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140184815260200183805190602001908083835b602083101515610ad85780518252602082019150602081019050602083039250610ab3565b6001836020036101000a03801982511681845116808217855250505050505090500182815260200197505050505050505060405180910390206000806001805490508651148015610b2e57506001805490508551145b8015610b3f57506001805490508451145b1515610b4a57600080fd5b8260405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01826000191660001916815260200191505060405180910390209150600090505b600180549050811015610cf057600181815481101515610bb357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166001838884815181101515610c0657fe5b906020019060200201518885815181101515610c1e57fe5b906020019060200201518886815181101515610c3657fe5b90602001906020020151604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f11515610cb857600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff16141515610ce357600080fd5b8080600101915050610b97565b8873ffffffffffffffffffffffffffffffffffffffff167f30dc9a249e121dc7ec74559d42f94e60bb91eb25e06df470ed1be2a02a9d7a046000548a8a6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610d79578082015181840152602081019050610d5e565b50505050905090810190601f168015610da65780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a28873ffffffffffffffffffffffffffffffffffffffff16888860405180828051906020019080838360005b83811015610dfb578082015181840152602081019050610de0565b50505050905090810190601f168015610e285780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876187965a03f1925050501515610e4c57600080fd5b60016000808282540192505081905550505050505050505050505050565b600360009055600460009055565b828054828255906000526020600020908101928215610ef1579160200282015b82811115610ef05782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190610e98565b5b509050610efe9190610f16565b5090565b602060405190810160405280600081525090565b610f5691905b80821115610f5257600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101610f1c565b5090565b905600a165627a7a7230582056bce8acba4434b768daa9b36557a7572b36d20ca2640c8e0eb7f00602a50ec10029", + "sourceMap": "52:2040:3:-;;;208:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;318:7;180::2;959:1;940:9;:16;:20;932:29;;;;;;;;212:7;203:6;:16;;;;;;;;;;;;:::i;:::-;;107:119;;363:20:3;341:19;:42;;;;208:182;;52:2040;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", + "deployedSourceMap": "52:2040:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1037:1:2;1025:9;:13;1021:76;;;1064:10;1054:32;;;1076:9;1054:32;;;;;;;;;;;;;;;;;;1021:76;52:2040:3;77:23:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1311:163:3;;;;;;;;;;;;;;1747:238;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1480:261;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;174:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;140:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51:20:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1053:252:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1109:84:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;1199:480:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1311:163:3:-;629:19;637:10;629:7;:19::i;:::-;621:28;;;;;;;;738:1;722:13;;:17;714:26;;;;;;;;1412:15;:13;:15::i;:::-;1456:10;1438:29;;;;;;;;;;;;1311:163::o;1747:238::-;1802:4;1823:9;1835:1;1823:13;;1818:138;1842:6;:13;;;;1838:1;:17;1818:138;;;1891:6;1898:1;1891:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;1880:20;;:7;:20;;;1876:70;;;1927:4;1920:11;;;;1876:70;1857:3;;;;;;;1818:138;;;1973:5;1966:12;;1747:238;;;;;:::o;1480:261::-;629:19;637:10;629:7;:19::i;:::-;621:28;;;;;;;;828:1;812:13;;:17;804:26;;;;;;;;880:19;;864:13;;:35;848:12;:51;;840:60;;;;;;;;1614:9;1016:12;;992:36;;;1002:9;992:20;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;992:36:3;;;;984:45;;;;;;;;1648:9;1639:6;:18;;;;;;;;;;;;:::i;:::-;;1668:15;:13;:15::i;:::-;1712:10;1694:40;;;1724:9;1694:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;910:1:3;1480:261;:::o;174:27::-;;;;:::o;140:28::-;;;;:::o;100:34::-;;;;:::o;51:20:2:-;;;;:::o;1053:252:3:-;629:19;637:10;629:7;:19::i;:::-;621:28;;;;;;;;1151:9;959:1:2;940:9;:16;:20;932:29;;;;;;;;1192:12:3;1176:13;:28;;;;1239:9;1229:20;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;1214:12:3;:35;;;;;;;1276:10;1260:38;;;1288:9;1260:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;659:1:3;1053:252;:::o;1109:84:2:-;1152:9;;:::i;:::-;1180:6;1173:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1109:84;:::o;1199:480::-;1389:1;1392;1395;1413:4;1408:10;;1425:1;1420:7;;1429:4;1435:11;1448:5;1455:4;1461:5;;1398:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;618:20:2;707:9;497:6;:13;;;;485:1;:8;:25;484:70;;;;;540:6;:13;;;;528:1;:8;:25;484:70;:113;;;;;583:6;:13;;;;571:1;:8;:25;484:113;463:144;;;;;;;;687:4;641:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;618:74;;719:1;707:13;;702:132;726:6;:13;;;;722:1;:17;702:132;;;813:6;820:1;813:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;768:54;;:41;778:12;792:1;794;792:4;;;;;;;;;;;;;;;;;;798:1;800;798:4;;;;;;;;;;;;;;;;;;804:1;806;804:4;;;;;;;;;;;;;;;;;;768:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:54;;;760:63;;;;;;;;741:3;;;;;;;702:132;;;1492:11;1483:41;;;1505:5;;1512;1519:4;1483:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1590:11:2;:16;;1613:5;1620:4;1590:35;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1582:44:2;;;;;;;;865:1;856:5;;:10;;;;;;;;;;;1199:480;;;;;;;;;;;;:::o;1991:99:3:-;2041:13;2034:20;;;2071:12;2064:19;;;1991:99::o;52:2040::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", + "source": "pragma solidity 0.4.18;\n\nimport \"./MultiSig.sol\";\n\n\ncontract RecoverableMultiSig is MultiSig {\n\n uint256 public recoveryBlockOffset;\n uint256 public recoveryBlock;\n bytes32 public recoveryHash;\n\n function RecoverableMultiSig(address[] _owners, uint256 _recoveryBlockOffset)\n public\n MultiSig(_owners)\n {\n recoveryBlockOffset = _recoveryBlockOffset;\n }\n\n event RecoveryStarted(address indexed from, address[] newOwners);\n event RecoveryCancelled(address indexed from);\n event RecoveryConfirmed(address indexed from, address[] newOwners);\n\n modifier onlyOwner() {\n require(isOwner(msg.sender));\n _;\n }\n\n modifier onlyRecoveryStarted() {\n require(recoveryBlock > 0);\n _;\n }\n\n modifier onlyRecoveryPassed() {\n require(recoveryBlock > 0);\n require(block.number >= recoveryBlock + recoveryBlockOffset);\n _;\n }\n\n modifier onlyRecoveryMatches(address[] newOwners) {\n require(keccak256(newOwners) == recoveryHash);\n _;\n }\n\n function startRecovery(address[] newOwners)\n public\n onlyOwner\n onlyNotEmpty(newOwners)\n {\n recoveryBlock = block.number;\n recoveryHash = keccak256(newOwners);\n\n RecoveryStarted(msg.sender, newOwners);\n }\n\n function cancelRecovery()\n public\n onlyOwner\n onlyRecoveryStarted\n {\n clearRecovery();\n\n RecoveryCancelled(msg.sender);\n }\n\n function confirmRecovery(address[] newOwners)\n public\n onlyOwner\n onlyRecoveryPassed\n onlyRecoveryMatches(newOwners)\n {\n owners = newOwners;\n\n clearRecovery();\n\n RecoveryConfirmed(msg.sender, newOwners);\n }\n\n function isOwner(address account) public view returns (bool) {\n for (uint256 i = 0; i < owners.length; i++) {\n if (account == owners[i]) {\n return true;\n }\n }\n\n return false;\n }\n\n function clearRecovery() private {\n delete recoveryBlock;\n delete recoveryHash;\n }\n}\n", + "sourcePath": "/home/js/Projects/js/signhash/signhash-contracts/contracts/MultiSig/RecoverableMultiSig.sol", + "ast": { + "attributes": { + "absolutePath": "/home/js/Projects/js/signhash/signhash-contracts/contracts/MultiSig/RecoverableMultiSig.sol", + "exportedSymbols": { + "RecoverableMultiSig": [ + 821 + ] + } + }, + "children": [ + { + "attributes": { + "literals": [ + "solidity", + "0.4", + ".18" + ] + }, + "id": 608, + "name": "PragmaDirective", + "src": "0:23:3" + }, + { + "attributes": { + "SourceUnit": 607, + "absolutePath": "/home/js/Projects/js/signhash/signhash-contracts/contracts/MultiSig/MultiSig.sol", + "file": "./MultiSig.sol", + "scope": 822, + "symbolAliases": [ + null + ], + "unitAlias": "" + }, + "id": 609, + "name": "ImportDirective", + "src": "25:24:3" + }, + { + "attributes": { + "contractDependencies": [ + 606 + ], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "linearizedBaseContracts": [ + 821, + 606 + ], + "name": "RecoverableMultiSig", + "scope": 822 + }, + "children": [ + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "contractScope": null, + "name": "MultiSig", + "referencedDeclaration": 606, + "type": "contract MultiSig" + }, + "id": 610, + "name": "UserDefinedTypeName", + "src": "84:8:3" + } + ], + "id": 611, + "name": "InheritanceSpecifier", + "src": "84:8:3" + }, + { + "attributes": { + "constant": false, + "name": "recoveryBlockOffset", + "scope": 821, + "stateVariable": true, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 612, + "name": "ElementaryTypeName", + "src": "100:7:3" + } + ], + "id": 613, + "name": "VariableDeclaration", + "src": "100:34:3" + }, + { + "attributes": { + "constant": false, + "name": "recoveryBlock", + "scope": 821, + "stateVariable": true, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 614, + "name": "ElementaryTypeName", + "src": "140:7:3" + } + ], + "id": 615, + "name": "VariableDeclaration", + "src": "140:28:3" + }, + { + "attributes": { + "constant": false, + "name": "recoveryHash", + "scope": 821, + "stateVariable": true, + "storageLocation": "default", + "type": "bytes32", + "value": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "bytes32", + "type": "bytes32" + }, + "id": 616, + "name": "ElementaryTypeName", + "src": "174:7:3" + } + ], + "id": 617, + "name": "VariableDeclaration", + "src": "174:27:3" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": true, + "name": "RecoverableMultiSig", + "payable": false, + "scope": 821, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "_owners", + "scope": 633, + "stateVariable": false, + "storageLocation": "default", + "type": "address[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "address[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 618, + "name": "ElementaryTypeName", + "src": "237:7:3" + } + ], + "id": 619, + "name": "ArrayTypeName", + "src": "237:9:3" + } + ], + "id": 620, + "name": "VariableDeclaration", + "src": "237:17:3" + }, + { + "attributes": { + "constant": false, + "name": "_recoveryBlockOffset", + "scope": 633, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 621, + "name": "ElementaryTypeName", + "src": "256:7:3" + } + ], + "id": 622, + "name": "VariableDeclaration", + "src": "256:28:3" + } + ], + "id": 623, + "name": "ParameterList", + "src": "236:49:3" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 627, + "name": "ParameterList", + "src": "331:0:3" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 606, + "type": "type(contract MultiSig)", + "value": "MultiSig" + }, + "id": 624, + "name": "Identifier", + "src": "309:8:3" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 620, + "type": "address[] memory", + "value": "_owners" + }, + "id": 625, + "name": "Identifier", + "src": "318:7:3" + } + ], + "id": 626, + "name": "ModifierInvocation", + "src": "309:17:3" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 613, + "type": "uint256", + "value": "recoveryBlockOffset" + }, + "id": 628, + "name": "Identifier", + "src": "341:19:3" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 622, + "type": "uint256", + "value": "_recoveryBlockOffset" + }, + "id": 629, + "name": "Identifier", + "src": "363:20:3" + } + ], + "id": 630, + "name": "Assignment", + "src": "341:42:3" + } + ], + "id": 631, + "name": "ExpressionStatement", + "src": "341:42:3" + } + ], + "id": 632, + "name": "Block", + "src": "331:59:3" + } + ], + "id": 633, + "name": "FunctionDefinition", + "src": "208:182:3" + }, + { + "attributes": { + "anonymous": false, + "name": "RecoveryStarted" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "indexed": true, + "name": "from", + "scope": 640, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 634, + "name": "ElementaryTypeName", + "src": "418:7:3" + } + ], + "id": 635, + "name": "VariableDeclaration", + "src": "418:20:3" + }, + { + "attributes": { + "constant": false, + "indexed": false, + "name": "newOwners", + "scope": 640, + "stateVariable": false, + "storageLocation": "default", + "type": "address[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "address[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 636, + "name": "ElementaryTypeName", + "src": "440:7:3" + } + ], + "id": 637, + "name": "ArrayTypeName", + "src": "440:9:3" + } + ], + "id": 638, + "name": "VariableDeclaration", + "src": "440:19:3" + } + ], + "id": 639, + "name": "ParameterList", + "src": "417:43:3" + } + ], + "id": 640, + "name": "EventDefinition", + "src": "396:65:3" + }, + { + "attributes": { + "anonymous": false, + "name": "RecoveryCancelled" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "indexed": true, + "name": "from", + "scope": 644, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 641, + "name": "ElementaryTypeName", + "src": "490:7:3" + } + ], + "id": 642, + "name": "VariableDeclaration", + "src": "490:20:3" + } + ], + "id": 643, + "name": "ParameterList", + "src": "489:22:3" + } + ], + "id": 644, + "name": "EventDefinition", + "src": "466:46:3" + }, + { + "attributes": { + "anonymous": false, + "name": "RecoveryConfirmed" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "indexed": true, + "name": "from", + "scope": 651, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 645, + "name": "ElementaryTypeName", + "src": "541:7:3" + } + ], + "id": 646, + "name": "VariableDeclaration", + "src": "541:20:3" + }, + { + "attributes": { + "constant": false, + "indexed": false, + "name": "newOwners", + "scope": 651, + "stateVariable": false, + "storageLocation": "default", + "type": "address[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "address[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 647, + "name": "ElementaryTypeName", + "src": "563:7:3" + } + ], + "id": 648, + "name": "ArrayTypeName", + "src": "563:9:3" + } + ], + "id": 649, + "name": "VariableDeclaration", + "src": "563:19:3" + } + ], + "id": 650, + "name": "ParameterList", + "src": "540:43:3" + } + ], + "id": 651, + "name": "EventDefinition", + "src": "517:67:3" + }, + { + "attributes": { + "name": "onlyOwner", + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 652, + "name": "ParameterList", + "src": "608:2:3" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1501, + "type": "function (bool) pure", + "value": "require" + }, + "id": 653, + "name": "Identifier", + "src": "621:7:3" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "bool", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 810, + "type": "function (address) view returns (bool)", + "value": "isOwner" + }, + "id": 654, + "name": "Identifier", + "src": "629:7:3" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1498, + "type": "msg", + "value": "msg" + }, + "id": 655, + "name": "Identifier", + "src": "637:3:3" + } + ], + "id": 656, + "name": "MemberAccess", + "src": "637:10:3" + } + ], + "id": 657, + "name": "FunctionCall", + "src": "629:19:3" + } + ], + "id": 658, + "name": "FunctionCall", + "src": "621:28:3" + } + ], + "id": 659, + "name": "ExpressionStatement", + "src": "621:28:3" + }, + { + "id": 660, + "name": "PlaceholderStatement", + "src": "659:1:3" + } + ], + "id": 661, + "name": "Block", + "src": "611:56:3" + } + ], + "id": 662, + "name": "ModifierDefinition", + "src": "590:77:3" + }, + { + "attributes": { + "name": "onlyRecoveryStarted", + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 663, + "name": "ParameterList", + "src": "701:2:3" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1501, + "type": "function (bool) pure", + "value": "require" + }, + "id": 664, + "name": "Identifier", + "src": "714:7:3" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": ">", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 615, + "type": "uint256", + "value": "recoveryBlock" + }, + "id": 665, + "name": "Identifier", + "src": "722:13:3" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 666, + "name": "Literal", + "src": "738:1:3" + } + ], + "id": 667, + "name": "BinaryOperation", + "src": "722:17:3" + } + ], + "id": 668, + "name": "FunctionCall", + "src": "714:26:3" + } + ], + "id": 669, + "name": "ExpressionStatement", + "src": "714:26:3" + }, + { + "id": 670, + "name": "PlaceholderStatement", + "src": "750:1:3" + } + ], + "id": 671, + "name": "Block", + "src": "704:54:3" + } + ], + "id": 672, + "name": "ModifierDefinition", + "src": "673:85:3" + }, + { + "attributes": { + "name": "onlyRecoveryPassed", + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 673, + "name": "ParameterList", + "src": "791:2:3" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1501, + "type": "function (bool) pure", + "value": "require" + }, + "id": 674, + "name": "Identifier", + "src": "804:7:3" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": ">", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 615, + "type": "uint256", + "value": "recoveryBlock" + }, + "id": 675, + "name": "Identifier", + "src": "812:13:3" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 676, + "name": "Literal", + "src": "828:1:3" + } + ], + "id": 677, + "name": "BinaryOperation", + "src": "812:17:3" + } + ], + "id": 678, + "name": "FunctionCall", + "src": "804:26:3" + } + ], + "id": 679, + "name": "ExpressionStatement", + "src": "804:26:3" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1501, + "type": "function (bool) pure", + "value": "require" + }, + "id": 680, + "name": "Identifier", + "src": "840:7:3" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": ">=", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "number", + "referencedDeclaration": null, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1490, + "type": "block", + "value": "block" + }, + "id": 681, + "name": "Identifier", + "src": "848:5:3" + } + ], + "id": 682, + "name": "MemberAccess", + "src": "848:12:3" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "+", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 615, + "type": "uint256", + "value": "recoveryBlock" + }, + "id": 683, + "name": "Identifier", + "src": "864:13:3" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 613, + "type": "uint256", + "value": "recoveryBlockOffset" + }, + "id": 684, + "name": "Identifier", + "src": "880:19:3" + } + ], + "id": 685, + "name": "BinaryOperation", + "src": "864:35:3" + } + ], + "id": 686, + "name": "BinaryOperation", + "src": "848:51:3" + } + ], + "id": 687, + "name": "FunctionCall", + "src": "840:60:3" + } + ], + "id": 688, + "name": "ExpressionStatement", + "src": "840:60:3" + }, + { + "id": 689, + "name": "PlaceholderStatement", + "src": "910:1:3" + } + ], + "id": 690, + "name": "Block", + "src": "794:124:3" + } + ], + "id": 691, + "name": "ModifierDefinition", + "src": "764:154:3" + }, + { + "attributes": { + "name": "onlyRecoveryMatches", + "visibility": "internal" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "newOwners", + "scope": 706, + "stateVariable": false, + "storageLocation": "default", + "type": "address[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "address[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 692, + "name": "ElementaryTypeName", + "src": "953:7:3" + } + ], + "id": 693, + "name": "ArrayTypeName", + "src": "953:9:3" + } + ], + "id": 694, + "name": "VariableDeclaration", + "src": "953:19:3" + } + ], + "id": 695, + "name": "ParameterList", + "src": "952:21:3" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1501, + "type": "function (bool) pure", + "value": "require" + }, + "id": 696, + "name": "Identifier", + "src": "984:7:3" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "==", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "bytes32", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", + "typeString": "address[] memory" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1492, + "type": "function () pure returns (bytes32)", + "value": "keccak256" + }, + "id": 697, + "name": "Identifier", + "src": "992:9:3" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 694, + "type": "address[] memory", + "value": "newOwners" + }, + "id": 698, + "name": "Identifier", + "src": "1002:9:3" + } + ], + "id": 699, + "name": "FunctionCall", + "src": "992:20:3" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 617, + "type": "bytes32", + "value": "recoveryHash" + }, + "id": 700, + "name": "Identifier", + "src": "1016:12:3" + } + ], + "id": 701, + "name": "BinaryOperation", + "src": "992:36:3" + } + ], + "id": 702, + "name": "FunctionCall", + "src": "984:45:3" + } + ], + "id": 703, + "name": "ExpressionStatement", + "src": "984:45:3" + }, + { + "id": 704, + "name": "PlaceholderStatement", + "src": "1039:1:3" + } + ], + "id": 705, + "name": "Block", + "src": "974:73:3" + } + ], + "id": 706, + "name": "ModifierDefinition", + "src": "924:123:3" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "startRecovery", + "payable": false, + "scope": 821, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "newOwners", + "scope": 735, + "stateVariable": false, + "storageLocation": "default", + "type": "address[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "address[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 707, + "name": "ElementaryTypeName", + "src": "1076:7:3" + } + ], + "id": 708, + "name": "ArrayTypeName", + "src": "1076:9:3" + } + ], + "id": 709, + "name": "VariableDeclaration", + "src": "1076:19:3" + } + ], + "id": 710, + "name": "ParameterList", + "src": "1075:21:3" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 716, + "name": "ParameterList", + "src": "1166:0:3" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 662, + "type": "modifier ()", + "value": "onlyOwner" + }, + "id": 711, + "name": "Identifier", + "src": "1120:9:3" + } + ], + "id": 712, + "name": "ModifierInvocation", + "src": "1120:9:3" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 525, + "type": "modifier (address[] memory)", + "value": "onlyNotEmpty" + }, + "id": 713, + "name": "Identifier", + "src": "1138:12:3" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 709, + "type": "address[] memory", + "value": "newOwners" + }, + "id": 714, + "name": "Identifier", + "src": "1151:9:3" + } + ], + "id": 715, + "name": "ModifierInvocation", + "src": "1138:23:3" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 615, + "type": "uint256", + "value": "recoveryBlock" + }, + "id": 717, + "name": "Identifier", + "src": "1176:13:3" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "number", + "referencedDeclaration": null, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1490, + "type": "block", + "value": "block" + }, + "id": 718, + "name": "Identifier", + "src": "1192:5:3" + } + ], + "id": 719, + "name": "MemberAccess", + "src": "1192:12:3" + } + ], + "id": 720, + "name": "Assignment", + "src": "1176:28:3" + } + ], + "id": 721, + "name": "ExpressionStatement", + "src": "1176:28:3" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "bytes32" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 617, + "type": "bytes32", + "value": "recoveryHash" + }, + "id": 722, + "name": "Identifier", + "src": "1214:12:3" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "bytes32", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", + "typeString": "address[] memory" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1492, + "type": "function () pure returns (bytes32)", + "value": "keccak256" + }, + "id": 723, + "name": "Identifier", + "src": "1229:9:3" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 709, + "type": "address[] memory", + "value": "newOwners" + }, + "id": 724, + "name": "Identifier", + "src": "1239:9:3" + } + ], + "id": 725, + "name": "FunctionCall", + "src": "1229:20:3" + } + ], + "id": 726, + "name": "Assignment", + "src": "1214:35:3" + } + ], + "id": 727, + "name": "ExpressionStatement", + "src": "1214:35:3" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", + "typeString": "address[] memory" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 640, + "type": "function (address,address[] memory)", + "value": "RecoveryStarted" + }, + "id": 728, + "name": "Identifier", + "src": "1260:15:3" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1498, + "type": "msg", + "value": "msg" + }, + "id": 729, + "name": "Identifier", + "src": "1276:3:3" + } + ], + "id": 730, + "name": "MemberAccess", + "src": "1276:10:3" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 709, + "type": "address[] memory", + "value": "newOwners" + }, + "id": 731, + "name": "Identifier", + "src": "1288:9:3" + } + ], + "id": 732, + "name": "FunctionCall", + "src": "1260:38:3" + } + ], + "id": 733, + "name": "ExpressionStatement", + "src": "1260:38:3" + } + ], + "id": 734, + "name": "Block", + "src": "1166:139:3" + } + ], + "id": 735, + "name": "FunctionDefinition", + "src": "1053:252:3" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "cancelRecovery", + "payable": false, + "scope": 821, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 736, + "name": "ParameterList", + "src": "1334:2:3" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 741, + "name": "ParameterList", + "src": "1402:0:3" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 662, + "type": "modifier ()", + "value": "onlyOwner" + }, + "id": 737, + "name": "Identifier", + "src": "1360:9:3" + } + ], + "id": 738, + "name": "ModifierInvocation", + "src": "1360:9:3" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 672, + "type": "modifier ()", + "value": "onlyRecoveryStarted" + }, + "id": 739, + "name": "Identifier", + "src": "1378:19:3" + } + ], + "id": 740, + "name": "ModifierInvocation", + "src": "1378:19:3" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "arguments": [ + null + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + null + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 820, + "type": "function ()", + "value": "clearRecovery" + }, + "id": 742, + "name": "Identifier", + "src": "1412:13:3" + } + ], + "id": 743, + "name": "FunctionCall", + "src": "1412:15:3" + } + ], + "id": 744, + "name": "ExpressionStatement", + "src": "1412:15:3" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 644, + "type": "function (address)", + "value": "RecoveryCancelled" + }, + "id": 745, + "name": "Identifier", + "src": "1438:17:3" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1498, + "type": "msg", + "value": "msg" + }, + "id": 746, + "name": "Identifier", + "src": "1456:3:3" + } + ], + "id": 747, + "name": "MemberAccess", + "src": "1456:10:3" + } + ], + "id": 748, + "name": "FunctionCall", + "src": "1438:29:3" + } + ], + "id": 749, + "name": "ExpressionStatement", + "src": "1438:29:3" + } + ], + "id": 750, + "name": "Block", + "src": "1402:72:3" + } + ], + "id": 751, + "name": "FunctionDefinition", + "src": "1311:163:3" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "confirmRecovery", + "payable": false, + "scope": 821, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "newOwners", + "scope": 778, + "stateVariable": false, + "storageLocation": "default", + "type": "address[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "address[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 752, + "name": "ElementaryTypeName", + "src": "1505:7:3" + } + ], + "id": 753, + "name": "ArrayTypeName", + "src": "1505:9:3" + } + ], + "id": 754, + "name": "VariableDeclaration", + "src": "1505:19:3" + } + ], + "id": 755, + "name": "ParameterList", + "src": "1504:21:3" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 763, + "name": "ParameterList", + "src": "1629:0:3" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 662, + "type": "modifier ()", + "value": "onlyOwner" + }, + "id": 756, + "name": "Identifier", + "src": "1549:9:3" + } + ], + "id": 757, + "name": "ModifierInvocation", + "src": "1549:9:3" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 691, + "type": "modifier ()", + "value": "onlyRecoveryPassed" + }, + "id": 758, + "name": "Identifier", + "src": "1567:18:3" + } + ], + "id": 759, + "name": "ModifierInvocation", + "src": "1567:18:3" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 706, + "type": "modifier (address[] memory)", + "value": "onlyRecoveryMatches" + }, + "id": 760, + "name": "Identifier", + "src": "1594:19:3" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 754, + "type": "address[] memory", + "value": "newOwners" + }, + "id": 761, + "name": "Identifier", + "src": "1614:9:3" + } + ], + "id": 762, + "name": "ModifierInvocation", + "src": "1594:30:3" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "address[] storage ref" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 400, + "type": "address[] storage ref", + "value": "owners" + }, + "id": 764, + "name": "Identifier", + "src": "1639:6:3" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 754, + "type": "address[] memory", + "value": "newOwners" + }, + "id": 765, + "name": "Identifier", + "src": "1648:9:3" + } + ], + "id": 766, + "name": "Assignment", + "src": "1639:18:3" + } + ], + "id": 767, + "name": "ExpressionStatement", + "src": "1639:18:3" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "arguments": [ + null + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + null + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 820, + "type": "function ()", + "value": "clearRecovery" + }, + "id": 768, + "name": "Identifier", + "src": "1668:13:3" + } + ], + "id": 769, + "name": "FunctionCall", + "src": "1668:15:3" + } + ], + "id": 770, + "name": "ExpressionStatement", + "src": "1668:15:3" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", + "typeString": "address[] memory" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 651, + "type": "function (address,address[] memory)", + "value": "RecoveryConfirmed" + }, + "id": 771, + "name": "Identifier", + "src": "1694:17:3" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1498, + "type": "msg", + "value": "msg" + }, + "id": 772, + "name": "Identifier", + "src": "1712:3:3" + } + ], + "id": 773, + "name": "MemberAccess", + "src": "1712:10:3" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 754, + "type": "address[] memory", + "value": "newOwners" + }, + "id": 774, + "name": "Identifier", + "src": "1724:9:3" + } + ], + "id": 775, + "name": "FunctionCall", + "src": "1694:40:3" + } + ], + "id": 776, + "name": "ExpressionStatement", + "src": "1694:40:3" + } + ], + "id": 777, + "name": "Block", + "src": "1629:112:3" + } + ], + "id": 778, + "name": "FunctionDefinition", + "src": "1480:261:3" + }, + { + "attributes": { + "constant": true, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "isOwner", + "payable": false, + "scope": 821, + "stateMutability": "view", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "account", + "scope": 810, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 779, + "name": "ElementaryTypeName", + "src": "1764:7:3" + } + ], + "id": 780, + "name": "VariableDeclaration", + "src": "1764:15:3" + } + ], + "id": 781, + "name": "ParameterList", + "src": "1763:17:3" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 810, + "stateVariable": false, + "storageLocation": "default", + "type": "bool", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "bool", + "type": "bool" + }, + "id": 782, + "name": "ElementaryTypeName", + "src": "1802:4:3" + } + ], + "id": 783, + "name": "VariableDeclaration", + "src": "1802:4:3" + } + ], + "id": 784, + "name": "ParameterList", + "src": "1801:6:3" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "assignments": [ + 786 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "i", + "scope": 810, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 785, + "name": "ElementaryTypeName", + "src": "1823:7:3" + } + ], + "id": 786, + "name": "VariableDeclaration", + "src": "1823:9:3" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 787, + "name": "Literal", + "src": "1835:1:3" + } + ], + "id": 788, + "name": "VariableDeclarationStatement", + "src": "1823:13:3" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "<", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 786, + "type": "uint256", + "value": "i" + }, + "id": 789, + "name": "Identifier", + "src": "1838:1:3" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "member_name": "length", + "referencedDeclaration": null, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 400, + "type": "address[] storage ref", + "value": "owners" + }, + "id": 790, + "name": "Identifier", + "src": "1842:6:3" + } + ], + "id": 791, + "name": "MemberAccess", + "src": "1842:13:3" + } + ], + "id": 792, + "name": "BinaryOperation", + "src": "1838:17:3" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "++", + "prefix": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 786, + "type": "uint256", + "value": "i" + }, + "id": 793, + "name": "Identifier", + "src": "1857:1:3" + } + ], + "id": 794, + "name": "UnaryOperation", + "src": "1857:3:3" + } + ], + "id": 795, + "name": "ExpressionStatement", + "src": "1857:3:3" + }, + { + "children": [ + { + "attributes": { + "falseBody": null + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "==", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 780, + "type": "address", + "value": "account" + }, + "id": 796, + "name": "Identifier", + "src": "1880:7:3" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 400, + "type": "address[] storage ref", + "value": "owners" + }, + "id": 797, + "name": "Identifier", + "src": "1891:6:3" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 786, + "type": "uint256", + "value": "i" + }, + "id": 798, + "name": "Identifier", + "src": "1898:1:3" + } + ], + "id": 799, + "name": "IndexAccess", + "src": "1891:9:3" + } + ], + "id": 800, + "name": "BinaryOperation", + "src": "1880:20:3" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 784 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "hexvalue": "74727565", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "bool", + "type": "bool", + "value": "true" + }, + "id": 801, + "name": "Literal", + "src": "1927:4:3" + } + ], + "id": 802, + "name": "Return", + "src": "1920:11:3" + } + ], + "id": 803, + "name": "Block", + "src": "1902:44:3" + } + ], + "id": 804, + "name": "IfStatement", + "src": "1876:70:3" + } + ], + "id": 805, + "name": "Block", + "src": "1862:94:3" + } + ], + "id": 806, + "name": "ForStatement", + "src": "1818:138:3" + }, + { + "attributes": { + "functionReturnParameters": 784 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "hexvalue": "66616c7365", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "bool", + "type": "bool", + "value": "false" + }, + "id": 807, + "name": "Literal", + "src": "1973:5:3" + } + ], + "id": 808, + "name": "Return", + "src": "1966:12:3" + } + ], + "id": 809, + "name": "Block", + "src": "1808:177:3" + } + ], + "id": 810, + "name": "FunctionDefinition", + "src": "1747:238:3" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "clearRecovery", + "payable": false, + "scope": 821, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "private" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 811, + "name": "ParameterList", + "src": "2013:2:3" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 812, + "name": "ParameterList", + "src": "2024:0:3" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "delete", + "prefix": true, + "type": "tuple()" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 615, + "type": "uint256", + "value": "recoveryBlock" + }, + "id": 813, + "name": "Identifier", + "src": "2041:13:3" + } + ], + "id": 814, + "name": "UnaryOperation", + "src": "2034:20:3" + } + ], + "id": 815, + "name": "ExpressionStatement", + "src": "2034:20:3" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "delete", + "prefix": true, + "type": "tuple()" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 617, + "type": "bytes32", + "value": "recoveryHash" + }, + "id": 816, + "name": "Identifier", + "src": "2071:12:3" + } + ], + "id": 817, + "name": "UnaryOperation", + "src": "2064:19:3" + } + ], + "id": 818, + "name": "ExpressionStatement", + "src": "2064:19:3" + } + ], + "id": 819, + "name": "Block", + "src": "2024:66:3" + } + ], + "id": 820, + "name": "FunctionDefinition", + "src": "1991:99:3" + } + ], + "id": 821, + "name": "ContractDefinition", + "src": "52:2040:3" + } + ], + "id": 822, + "name": "SourceUnit", + "src": "0:2093:3" + }, + "compiler": { + "name": "solc", + "version": "0.4.18+commit.9cf6e910.Emscripten.clang" + }, + "networks": {}, + "schemaVersion": "1.0.1", + "updatedAt": "2017-12-09T23:00:14.495Z" +} \ No newline at end of file diff --git a/build/contracts/SignHash.json b/build/contracts/SignHash.json index 0031419..c4df42c 100644 --- a/build/contracts/SignHash.json +++ b/build/contracts/SignHash.json @@ -181,18 +181,18 @@ "type": "event" } ], - "bytecode": "0x6060604052341561000f57600080fd5b6115918061001e6000396000f300606060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806330a1a80b1461007d57806343d9421a14610102578063799cd333146101f75780637bb0350c1461021e5780637c07e2fc146102be578063b75c7dc61461031b575b600080fd5b341561008857600080fd5b6100ab600480803560001916906020019091908035906020019091905050610342565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156100ee5780820151818401526020810190506100d3565b505050509050019250505060405180910390f35b341561010d57600080fd5b61017c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061047c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101bc5780820151818401526020810190506101a1565b50505050905090810190601f1680156101e95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561020257600080fd5b61021c6004808035600019169060200190919050506105cd565b005b341561022957600080fd5b6102bc600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610660565b005b34156102c957600080fd5b610319600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610861565b005b341561032657600080fd5b610340600480803560001916906020019091905050610aab565b005b61034a611450565b6000806000806000876000191660001916815260200190815260200160002092506000836002015411156104735782600201548510156103aa57846040518059106103925750595b908082528060200260200182016040525093506103d0565b82600201546040518059106103bc5750595b908082528060200260200182016040525093505b8260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150600090505b83518110156104725781848281518110151561041457fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506104638284610b3e90919063ffffffff16565b915080806001019150506103fc565b5b50505092915050565b610484611464565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020826040518082805190602001908083835b6020831015156104f957805182526020820191506020810190506020830392506104d4565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105c05780601f10610595576101008083540402835291602001916105c0565b820191906000526020600020905b8154815290600101906020018083116105a357829003601f168201915b5050505050905092915050565b6000600102600019168160001916141515156105e857600080fd5b610614336000808460001916600019168152602001908152602001600020610bad90919063ffffffff16565b503373ffffffffffffffffffffffffffffffffffffffff1681600019167fdc9da68bd73c4161c8f5bc195573e6649390acdb7090a16542862b767eacac5a60405160405180910390a350565b6000825111151561067057600080fd5b6000815111151561068057600080fd5b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020836040518082805190602001908083835b6020831015156106f657805182526020820191506020810190506020830392506106d1565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020908051906020019061073c929190611478565b503373ffffffffffffffffffffffffffffffffffffffff167f967a81fb8dbc39bdd0222a448199b528519dace7cf245030352b06219110cac48383604051808060200180602001838103835285818151815260200191508051906020019080838360005b838110156107bb5780820151818401526020810190506107a0565b50505050905090810190601f1680156107e85780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015610821578082015181840152602081019050610806565b50505050905090810190601f16801561084e5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a25050565b600080825111151561087257600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020826040518082805190602001908083835b6020831015156108e757805182526020820191506020810190506020830392506108c2565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020905060008180546001816001161561010002031660029004905011151561094057600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020826040518082805190602001908083835b6020831015156109b55780518252602082019150602081019050602083039250610990565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006109f491906114f8565b3373ffffffffffffffffffffffffffffffffffffffff167f35ac935e2145a5d2057eb6e277a38dcb4e0bad1c7d5941d397be2bcb0c7cc74b836040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a6d578082015181840152602081019050610a52565b50505050905090810190601f168015610a9a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b600060010260001916816000191614151515610ac657600080fd5b610af2336000808460001916600019168152602001908152602001600020610e4f90919063ffffffff16565b503373ffffffffffffffffffffffffffffffffffffffff1681600019167f5bc2baf870c5baf189838b5e0b0e3b04a3263e2df5d305d1c15f3e6022f5dc4560405160405180910390a350565b60008260030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610bea57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c8b57818360000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610df8565b610c958383611302565b1515610dee57818360030160008560010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610df7565b60009050610e49565b5b818360010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e44836113fb565b600190505b92915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610e8e57600080fd5b8360030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610ffb578060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460030160008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506110c9565b8360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110bf578060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506110c8565b600091506112fb565b5b600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156111f3578060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460030160008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061125b565b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b61126484611428565b8360030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050600191505b5092915050565b60008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806113f35750600073ffffffffffffffffffffffffffffffffffffffff168360030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b905092915050565b8060020154600182600201540111151561141157fe5b806002016000815480929190600101919050555050565b6000816002015411151561143857fe5b80600201600081548092919060019003919050555050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106114b957805160ff19168380011785556114e7565b828001600101855582156114e7579182015b828111156114e65782518255916020019190600101906114cb565b5b5090506114f49190611540565b5090565b50805460018160011615610100020316600290046000825580601f1061151e575061153d565b601f01602090049060005260206000209081019061153c9190611540565b5b50565b61156291905b8082111561155e576000816000905550600101611546565b5090565b905600a165627a7a72305820afb7052b09611c7a3938a431ceeb6b3d26c782c19ac6862c3c3058f4d8489a5a0029", - "deployedBytecode": "0x606060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806330a1a80b1461007d57806343d9421a14610102578063799cd333146101f75780637bb0350c1461021e5780637c07e2fc146102be578063b75c7dc61461031b575b600080fd5b341561008857600080fd5b6100ab600480803560001916906020019091908035906020019091905050610342565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156100ee5780820151818401526020810190506100d3565b505050509050019250505060405180910390f35b341561010d57600080fd5b61017c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061047c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101bc5780820151818401526020810190506101a1565b50505050905090810190601f1680156101e95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561020257600080fd5b61021c6004808035600019169060200190919050506105cd565b005b341561022957600080fd5b6102bc600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610660565b005b34156102c957600080fd5b610319600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610861565b005b341561032657600080fd5b610340600480803560001916906020019091905050610aab565b005b61034a611450565b6000806000806000876000191660001916815260200190815260200160002092506000836002015411156104735782600201548510156103aa57846040518059106103925750595b908082528060200260200182016040525093506103d0565b82600201546040518059106103bc5750595b908082528060200260200182016040525093505b8260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150600090505b83518110156104725781848281518110151561041457fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506104638284610b3e90919063ffffffff16565b915080806001019150506103fc565b5b50505092915050565b610484611464565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020826040518082805190602001908083835b6020831015156104f957805182526020820191506020810190506020830392506104d4565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105c05780601f10610595576101008083540402835291602001916105c0565b820191906000526020600020905b8154815290600101906020018083116105a357829003601f168201915b5050505050905092915050565b6000600102600019168160001916141515156105e857600080fd5b610614336000808460001916600019168152602001908152602001600020610bad90919063ffffffff16565b503373ffffffffffffffffffffffffffffffffffffffff1681600019167fdc9da68bd73c4161c8f5bc195573e6649390acdb7090a16542862b767eacac5a60405160405180910390a350565b6000825111151561067057600080fd5b6000815111151561068057600080fd5b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020836040518082805190602001908083835b6020831015156106f657805182526020820191506020810190506020830392506106d1565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020908051906020019061073c929190611478565b503373ffffffffffffffffffffffffffffffffffffffff167f967a81fb8dbc39bdd0222a448199b528519dace7cf245030352b06219110cac48383604051808060200180602001838103835285818151815260200191508051906020019080838360005b838110156107bb5780820151818401526020810190506107a0565b50505050905090810190601f1680156107e85780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015610821578082015181840152602081019050610806565b50505050905090810190601f16801561084e5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a25050565b600080825111151561087257600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020826040518082805190602001908083835b6020831015156108e757805182526020820191506020810190506020830392506108c2565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020905060008180546001816001161561010002031660029004905011151561094057600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020826040518082805190602001908083835b6020831015156109b55780518252602082019150602081019050602083039250610990565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006109f491906114f8565b3373ffffffffffffffffffffffffffffffffffffffff167f35ac935e2145a5d2057eb6e277a38dcb4e0bad1c7d5941d397be2bcb0c7cc74b836040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a6d578082015181840152602081019050610a52565b50505050905090810190601f168015610a9a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b600060010260001916816000191614151515610ac657600080fd5b610af2336000808460001916600019168152602001908152602001600020610e4f90919063ffffffff16565b503373ffffffffffffffffffffffffffffffffffffffff1681600019167f5bc2baf870c5baf189838b5e0b0e3b04a3263e2df5d305d1c15f3e6022f5dc4560405160405180910390a350565b60008260030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610bea57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c8b57818360000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610df8565b610c958383611302565b1515610dee57818360030160008560010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610df7565b60009050610e49565b5b818360010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e44836113fb565b600190505b92915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610e8e57600080fd5b8360030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610ffb578060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460030160008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506110c9565b8360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110bf578060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506110c8565b600091506112fb565b5b600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156111f3578060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460030160008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061125b565b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b61126484611428565b8360030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050600191505b5092915050565b60008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806113f35750600073ffffffffffffffffffffffffffffffffffffffff168360030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b905092915050565b8060020154600182600201540111151561141157fe5b806002016000815480929190600101919050555050565b6000816002015411151561143857fe5b80600201600081548092919060019003919050555050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106114b957805160ff19168380011785556114e7565b828001600101855582156114e7579182015b828111156114e65782518255916020019190600101906114cb565b5b5090506114f49190611540565b5090565b50805460018160011615610100020316600290046000825580601f1061151e575061153d565b601f01602090049060005260206000209081019061153c9190611540565b5b50565b61156291905b8082111561155e576000816000905550600101611546565b5090565b905600a165627a7a72305820afb7052b09611c7a3938a431ceeb6b3d26c782c19ac6862c3c3058f4d8489a5a0029", - "sourceMap": "54:2317:2:-;;;;;;;;;;;;;;;;;", - "deployedSourceMap": "54:2317:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1571:640;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;2217:152:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;676:154:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1002:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1247:282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;836:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1571:640;1668:16;;:::i;:::-;1700:35;1995:15;2048:9;1738:7;:13;1746:4;1738:13;;;;;;;;;;;;;;;;;1700:51;;1785:1;1765:11;:17;;;:21;1761:444;;;1817:11;:17;;;1806:8;:28;1802:179;;;1877:8;1863:23;;;;;;;;;;;;;;;;;;;;;;;;1854:32;;1802:179;;;1948:11;:17;;;1934:32;;;;;;;;;;;;;;;;;;;;;;;;1925:41;;1802:179;2013:11;:16;;;;;;;;;;;;1995:34;;2060:1;2048:13;;2043:152;2067:6;:13;2063:1;:17;2043:152;;;2117:7;2105:6;2112:1;2105:9;;;;;;;;;;;;;;;;;:19;;;;;;;;;;;2152:28;2172:7;2152:11;:19;;:28;;;;:::i;:::-;2142:38;;2082:3;;;;;;;2043:152;;;1761:444;1571:640;;;;;;;:::o;2217:152::-;2311:6;;:::i;:::-;2340;:14;2347:6;2340:14;;;;;;;;;;;;;;;2355:6;2340:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2333:29:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2217:152;;;;:::o;676:154::-;745:1;737:10;;729:18;;;:4;:18;;;;;721:27;;;;;;;;759:29;777:10;759:7;:13;767:4;759:13;;;;;;;;;;;;;;;;;:17;;:29;;;;:::i;:::-;;812:10;799:24;;806:4;799:24;;;;;;;;;;;;;676:154;:::o;1002:239::-;1097:1;1080:6;1074:20;:24;1066:33;;;;;;;;1139:1;1123:5;1117:19;:23;1109:32;;;;;;;;1181:5;1152:6;:18;1159:10;1152:18;;;;;;;;;;;;;;;1171:6;1152:26;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1152:34:2;;;;;;;;;;;;:::i;:::-;;1208:10;1197:37;;;1220:6;1228:5;1197:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1002:239:2;;:::o;1247:282::-;1344:20;1331:1;1314:6;1308:20;:24;1300:33;;;;;;;;1367:6;:18;1374:10;1367:18;;;;;;;;;;;;;;;1386:6;1367:26;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1344:49:2;;1433:1;1417:5;1411:19;;;;;;;;;;;;;;;;:23;1403:32;;;;;;;;1453:6;:18;1460:10;1453:18;;;;;;;;;;;;;;;1472:6;1453:26;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;1446:33:2;;;;:::i;:::-;1503:10;1490:32;;;1515:6;1490:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1247:282:2;;:::o;836:160::-;907:1;899:10;;891:18;;;:4;:18;;;;;883:27;;;;;;;;921:32;942:10;921:7;:13;929:4;921:13;;;;;;;;;;;;;;;;;:20;;:32;;;;:::i;:::-;;978:10;964:25;;972:4;964:25;;;;;;;;;;;;;836:160;:::o;2009:183:0:-;2131:7;2161:4;:10;;:19;2172:7;2161:19;;;;;;;;;;;;;;;:24;;;;;;;;;;;;2154:31;;2009:183;;;;:::o;315:563::-;420:4;467:1;448:21;;:7;:21;;;;440:30;;;;;;;;506:1;485:23;;:4;:9;;;;;;;;;;;;:23;;;481:310;;;550:7;538:4;:9;;;:19;;;;;;;;;;;;;;;;;;481:310;;;579:23;588:4;594:7;579:8;:23::i;:::-;578:24;574:217;;;663:7;634:4;:10;;:21;645:4;:9;;;;;;;;;;;;634:21;;;;;;;;;;;;;;;:26;;;:36;;;;;;;;;;;;;;;;;;715:4;:9;;;;;;;;;;;;684:4;:10;;:19;695:7;684:19;;;;;;;;;;;;;;;:28;;;:40;;;;;;;;;;;;;;;;;;574:217;;;775:5;768:12;;;;574:217;481:310;813:7;801:4;:9;;;:19;;;;;;;;;;;;;;;;;;830;844:4;830:13;:19::i;:::-;867:4;860:11;;315:563;;;;;:::o;884:742::-;992:4;1053:17;1039:1;1020:21;;:7;:21;;;;1012:30;;;;;;;;1073:4;:10;;:19;1084:7;1073:19;;;;;;;;;;;;;;;1053:39;;1132:1;1107:27;;:4;:13;;;;;;;;;;;;:27;;;;1103:263;;;1201:4;:9;;;;;;;;;;;;1168:4;:10;;:25;1179:4;:13;;;;;;;;;;;;1168:25;;;;;;;;;;;;;;;:30;;;:42;;;;;;;;;;;;;;;;;;1103:263;;;1242:4;:9;;;;;;;;;;;;1231:20;;:7;:20;;;1227:139;;;1287:4;:9;;;;;;;;;;;;1275:4;:9;;;:21;;;;;;;;;;;;;;;;;;1227:139;;;1350:5;1343:12;;;;1227:139;1103:263;1401:1;1380:23;;:4;:9;;;;;;;;;;;;:23;;;;1376:156;;;1452:4;:13;;;;;;;;;;;;1419:4;:10;;:21;1430:4;:9;;;;;;;;;;;;1419:21;;;;;;;;;;;;;;;:30;;;:46;;;;;;;;;;;;;;;;;;1376:156;;;1508:4;:13;;;;;;;;;;;;1496:4;:9;;;:25;;;;;;;;;;;;;;;;;;1376:156;1542:19;1556:4;1542:13;:19::i;:::-;1578:4;:10;;:19;1589:7;1578:19;;;;;;;;;;;;;;;;1571:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1615:4;1608:11;;884:742;;;;;;:::o;2395:235::-;2518:4;2556;:9;;;;;;;;;;;;2545:20;;:7;:20;;;:78;;;;2621:1;2581:42;;:4;:10;;:19;2592:7;2581:19;;;;;;;;;;;;;;;:28;;;;;;;;;;;;:42;;;;2545:78;2538:85;;2395:235;;;;:::o;2672:124::-;2756:4;:10;;;2752:1;2739:4;:10;;;:14;:27;2732:35;;;;;;2777:4;:10;;;:12;;;;;;;;;;;;;2672:124;:::o;2802:111::-;2882:1;2869:4;:10;;;:14;2862:22;;;;;;2894:4;:10;;;:12;;;;;;;;;;;;;;2802:111;:::o;54:2317:2:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", - "source": "pragma solidity 0.4.18;\n\nimport \"./AddressSet.sol\";\n\n\ncontract SignHash {\n\n //--- Definitions\n using AddressSet for AddressSet.Data;\n\n //--- Storage\n // hash to signers\n mapping (bytes32 => AddressSet.Data) private signers;\n\n // signer to proofs (method to value)\n mapping (address => mapping (string => string)) private proofs;\n\n //--- Events\n event Signed(bytes32 indexed hash, address indexed signer);\n event Revoked(bytes32 indexed hash, address indexed signer);\n\n event ProofAdded(address indexed signer, string method, string value);\n event ProofRemoved(address indexed signer, string method);\n\n //--- Public mutable functions\n function sign(bytes32 hash) public {\n require(hash != bytes32(0));\n\n signers[hash].add(msg.sender);\n\n Signed(hash, msg.sender);\n }\n\n function revoke(bytes32 hash) public {\n require(hash != bytes32(0));\n\n signers[hash].remove(msg.sender);\n\n Revoked(hash, msg.sender);\n }\n\n function addProof(string method, string value) public {\n require(bytes(method).length > 0);\n require(bytes(value).length > 0);\n\n proofs[msg.sender][method] = value;\n\n ProofAdded(msg.sender, method, value);\n }\n\n function removeProof(string method) public {\n require(bytes(method).length > 0);\n\n string storage value = proofs[msg.sender][method];\n require(bytes(value).length > 0);\n\n delete proofs[msg.sender][method];\n\n ProofRemoved(msg.sender, method);\n }\n\n //--- Public constant functions\n function getSigners(bytes32 hash, uint256 maxCount)\n public\n view\n returns (address[] result)\n {\n AddressSet.Data storage hashSigners = signers[hash];\n if (hashSigners.count > 0) {\n if (maxCount < hashSigners.count) {\n result = new address[](maxCount);\n } else {\n result = new address[](hashSigners.count);\n }\n\n address current = hashSigners.head;\n for (uint256 i = 0; i < result.length; i++) {\n result[i] = current;\n current = hashSigners.getNext(current);\n }\n }\n }\n\n function getProof(address signer, string method)\n public\n view\n returns (string)\n {\n return proofs[signer][method];\n }\n}\n", + "bytecode": "0x6060604052341561000f57600080fd5b6115918061001e6000396000f300606060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806330a1a80b1461007d57806343d9421a14610102578063799cd333146101f75780637bb0350c1461021e5780637c07e2fc146102be578063b75c7dc61461031b575b600080fd5b341561008857600080fd5b6100ab600480803560001916906020019091908035906020019091905050610342565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156100ee5780820151818401526020810190506100d3565b505050509050019250505060405180910390f35b341561010d57600080fd5b61017c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061047c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101bc5780820151818401526020810190506101a1565b50505050905090810190601f1680156101e95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561020257600080fd5b61021c6004808035600019169060200190919050506105cd565b005b341561022957600080fd5b6102bc600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610660565b005b34156102c957600080fd5b610319600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610861565b005b341561032657600080fd5b610340600480803560001916906020019091905050610aab565b005b61034a611450565b6000806000806000876000191660001916815260200190815260200160002092506000836002015411156104735782600201548510156103aa57846040518059106103925750595b908082528060200260200182016040525093506103d0565b82600201546040518059106103bc5750595b908082528060200260200182016040525093505b8260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150600090505b83518110156104725781848281518110151561041457fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506104638284610b3e90919063ffffffff16565b915080806001019150506103fc565b5b50505092915050565b610484611464565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020826040518082805190602001908083835b6020831015156104f957805182526020820191506020810190506020830392506104d4565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105c05780601f10610595576101008083540402835291602001916105c0565b820191906000526020600020905b8154815290600101906020018083116105a357829003601f168201915b5050505050905092915050565b6000600102600019168160001916141515156105e857600080fd5b610614336000808460001916600019168152602001908152602001600020610bad90919063ffffffff16565b503373ffffffffffffffffffffffffffffffffffffffff1681600019167fdc9da68bd73c4161c8f5bc195573e6649390acdb7090a16542862b767eacac5a60405160405180910390a350565b6000825111151561067057600080fd5b6000815111151561068057600080fd5b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020836040518082805190602001908083835b6020831015156106f657805182526020820191506020810190506020830392506106d1565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020908051906020019061073c929190611478565b503373ffffffffffffffffffffffffffffffffffffffff167f967a81fb8dbc39bdd0222a448199b528519dace7cf245030352b06219110cac48383604051808060200180602001838103835285818151815260200191508051906020019080838360005b838110156107bb5780820151818401526020810190506107a0565b50505050905090810190601f1680156107e85780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015610821578082015181840152602081019050610806565b50505050905090810190601f16801561084e5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a25050565b600080825111151561087257600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020826040518082805190602001908083835b6020831015156108e757805182526020820191506020810190506020830392506108c2565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020905060008180546001816001161561010002031660029004905011151561094057600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020826040518082805190602001908083835b6020831015156109b55780518252602082019150602081019050602083039250610990565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006109f491906114f8565b3373ffffffffffffffffffffffffffffffffffffffff167f35ac935e2145a5d2057eb6e277a38dcb4e0bad1c7d5941d397be2bcb0c7cc74b836040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a6d578082015181840152602081019050610a52565b50505050905090810190601f168015610a9a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b600060010260001916816000191614151515610ac657600080fd5b610af2336000808460001916600019168152602001908152602001600020610e4f90919063ffffffff16565b503373ffffffffffffffffffffffffffffffffffffffff1681600019167f5bc2baf870c5baf189838b5e0b0e3b04a3263e2df5d305d1c15f3e6022f5dc4560405160405180910390a350565b60008260030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610bea57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c8b57818360000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610df8565b610c958383611302565b1515610dee57818360030160008560010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610df7565b60009050610e49565b5b818360010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e44836113fb565b600190505b92915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610e8e57600080fd5b8360030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610ffb578060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460030160008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506110c9565b8360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110bf578060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506110c8565b600091506112fb565b5b600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156111f3578060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460030160008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061125b565b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b61126484611428565b8360030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050600191505b5092915050565b60008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806113f35750600073ffffffffffffffffffffffffffffffffffffffff168360030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b905092915050565b8060020154600182600201540111151561141157fe5b806002016000815480929190600101919050555050565b6000816002015411151561143857fe5b80600201600081548092919060019003919050555050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106114b957805160ff19168380011785556114e7565b828001600101855582156114e7579182015b828111156114e65782518255916020019190600101906114cb565b5b5090506114f49190611540565b5090565b50805460018160011615610100020316600290046000825580601f1061151e575061153d565b601f01602090049060005260206000209081019061153c9190611540565b5b50565b61156291905b8082111561155e576000816000905550600101611546565b5090565b905600a165627a7a7230582047d5051d6eb01b6ef9676b2ed4520cf36a36e56ad2565ad025f6f885a25d38840029", + "deployedBytecode": "0x606060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806330a1a80b1461007d57806343d9421a14610102578063799cd333146101f75780637bb0350c1461021e5780637c07e2fc146102be578063b75c7dc61461031b575b600080fd5b341561008857600080fd5b6100ab600480803560001916906020019091908035906020019091905050610342565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156100ee5780820151818401526020810190506100d3565b505050509050019250505060405180910390f35b341561010d57600080fd5b61017c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061047c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101bc5780820151818401526020810190506101a1565b50505050905090810190601f1680156101e95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561020257600080fd5b61021c6004808035600019169060200190919050506105cd565b005b341561022957600080fd5b6102bc600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610660565b005b34156102c957600080fd5b610319600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610861565b005b341561032657600080fd5b610340600480803560001916906020019091905050610aab565b005b61034a611450565b6000806000806000876000191660001916815260200190815260200160002092506000836002015411156104735782600201548510156103aa57846040518059106103925750595b908082528060200260200182016040525093506103d0565b82600201546040518059106103bc5750595b908082528060200260200182016040525093505b8260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150600090505b83518110156104725781848281518110151561041457fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506104638284610b3e90919063ffffffff16565b915080806001019150506103fc565b5b50505092915050565b610484611464565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020826040518082805190602001908083835b6020831015156104f957805182526020820191506020810190506020830392506104d4565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105c05780601f10610595576101008083540402835291602001916105c0565b820191906000526020600020905b8154815290600101906020018083116105a357829003601f168201915b5050505050905092915050565b6000600102600019168160001916141515156105e857600080fd5b610614336000808460001916600019168152602001908152602001600020610bad90919063ffffffff16565b503373ffffffffffffffffffffffffffffffffffffffff1681600019167fdc9da68bd73c4161c8f5bc195573e6649390acdb7090a16542862b767eacac5a60405160405180910390a350565b6000825111151561067057600080fd5b6000815111151561068057600080fd5b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020836040518082805190602001908083835b6020831015156106f657805182526020820191506020810190506020830392506106d1565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020908051906020019061073c929190611478565b503373ffffffffffffffffffffffffffffffffffffffff167f967a81fb8dbc39bdd0222a448199b528519dace7cf245030352b06219110cac48383604051808060200180602001838103835285818151815260200191508051906020019080838360005b838110156107bb5780820151818401526020810190506107a0565b50505050905090810190601f1680156107e85780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015610821578082015181840152602081019050610806565b50505050905090810190601f16801561084e5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a25050565b600080825111151561087257600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020826040518082805190602001908083835b6020831015156108e757805182526020820191506020810190506020830392506108c2565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020905060008180546001816001161561010002031660029004905011151561094057600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020826040518082805190602001908083835b6020831015156109b55780518252602082019150602081019050602083039250610990565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006109f491906114f8565b3373ffffffffffffffffffffffffffffffffffffffff167f35ac935e2145a5d2057eb6e277a38dcb4e0bad1c7d5941d397be2bcb0c7cc74b836040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a6d578082015181840152602081019050610a52565b50505050905090810190601f168015610a9a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b600060010260001916816000191614151515610ac657600080fd5b610af2336000808460001916600019168152602001908152602001600020610e4f90919063ffffffff16565b503373ffffffffffffffffffffffffffffffffffffffff1681600019167f5bc2baf870c5baf189838b5e0b0e3b04a3263e2df5d305d1c15f3e6022f5dc4560405160405180910390a350565b60008260030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610bea57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c8b57818360000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610df8565b610c958383611302565b1515610dee57818360030160008560010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610df7565b60009050610e49565b5b818360010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e44836113fb565b600190505b92915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610e8e57600080fd5b8360030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610ffb578060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460030160008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506110c9565b8360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110bf578060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506110c8565b600091506112fb565b5b600073ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156111f3578060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460030160008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061125b565b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b61126484611428565b8360030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050600191505b5092915050565b60008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806113f35750600073ffffffffffffffffffffffffffffffffffffffff168360030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b905092915050565b8060020154600182600201540111151561141157fe5b806002016000815480929190600101919050555050565b6000816002015411151561143857fe5b80600201600081548092919060019003919050555050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106114b957805160ff19168380011785556114e7565b828001600101855582156114e7579182015b828111156114e65782518255916020019190600101906114cb565b5b5090506114f49190611540565b5090565b50805460018160011615610100020316600290046000825580601f1061151e575061153d565b601f01602090049060005260206000209081019061153c9190611540565b5b50565b61156291905b8082111561155e576000816000905550600101611546565b5090565b905600a165627a7a7230582047d5051d6eb01b6ef9676b2ed4520cf36a36e56ad2565ad025f6f885a25d38840029", + "sourceMap": "54:2189:5:-;;;;;;;;;;;;;;;;;", + "deployedSourceMap": "54:2189:5:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1443:640;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;2089:152:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;584:154:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1155:282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;744:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1443:640;1540:16;;:::i;:::-;1572:35;1867:15;1920:9;1610:7;:13;1618:4;1610:13;;;;;;;;;;;;;;;;;1572:51;;1657:1;1637:11;:17;;;:21;1633:444;;;1689:11;:17;;;1678:8;:28;1674:179;;;1749:8;1735:23;;;;;;;;;;;;;;;;;;;;;;;;1726:32;;1674:179;;;1820:11;:17;;;1806:32;;;;;;;;;;;;;;;;;;;;;;;;1797:41;;1674:179;1885:11;:16;;;;;;;;;;;;1867:34;;1932:1;1920:13;;1915:152;1939:6;:13;1935:1;:17;1915:152;;;1989:7;1977:6;1984:1;1977:9;;;;;;;;;;;;;;;;;:19;;;;;;;;;;;2024:28;2044:7;2024:11;:19;;:28;;;;:::i;:::-;2014:38;;1954:3;;;;;;;1915:152;;;1633:444;1443:640;;;;;;;:::o;2089:152::-;2183:6;;:::i;:::-;2212;:14;2219:6;2212:14;;;;;;;;;;;;;;;2227:6;2212:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2205:29:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2089:152;;;;:::o;584:154::-;653:1;645:10;;637:18;;;:4;:18;;;;;629:27;;;;;;;;667:29;685:10;667:7;:13;675:4;667:13;;;;;;;;;;;;;;;;;:17;;:29;;;;:::i;:::-;;720:10;707:24;;714:4;707:24;;;;;;;;;;;;;584:154;:::o;910:239::-;1005:1;988:6;982:20;:24;974:33;;;;;;;;1047:1;1031:5;1025:19;:23;1017:32;;;;;;;;1089:5;1060:6;:18;1067:10;1060:18;;;;;;;;;;;;;;;1079:6;1060:26;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1060:34:5;;;;;;;;;;;;:::i;:::-;;1116:10;1105:37;;;1128:6;1136:5;1105:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:239:5;;:::o;1155:282::-;1252:20;1239:1;1222:6;1216:20;:24;1208:33;;;;;;;;1275:6;:18;1282:10;1275:18;;;;;;;;;;;;;;;1294:6;1275:26;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1252:49:5;;1341:1;1325:5;1319:19;;;;;;;;;;;;;;;;:23;1311:32;;;;;;;;1361:6;:18;1368:10;1361:18;;;;;;;;;;;;;;;1380:6;1361:26;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;1354:33:5;;;;:::i;:::-;1411:10;1398:32;;;1423:6;1398:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1155:282:5;;:::o;744:160::-;815:1;807:10;;799:18;;;:4;:18;;;;;791:27;;;;;;;;829:32;850:10;829:7;:13;837:4;829:13;;;;;;;;;;;;;;;;;:20;;:32;;;;:::i;:::-;;886:10;872:25;;880:4;872:25;;;;;;;;;;;;;744:160;:::o;2009:183:0:-;2131:7;2161:4;:10;;:19;2172:7;2161:19;;;;;;;;;;;;;;;:24;;;;;;;;;;;;2154:31;;2009:183;;;;:::o;315:563::-;420:4;467:1;448:21;;:7;:21;;;;440:30;;;;;;;;506:1;485:23;;:4;:9;;;;;;;;;;;;:23;;;481:310;;;550:7;538:4;:9;;;:19;;;;;;;;;;;;;;;;;;481:310;;;579:23;588:4;594:7;579:8;:23::i;:::-;578:24;574:217;;;663:7;634:4;:10;;:21;645:4;:9;;;;;;;;;;;;634:21;;;;;;;;;;;;;;;:26;;;:36;;;;;;;;;;;;;;;;;;715:4;:9;;;;;;;;;;;;684:4;:10;;:19;695:7;684:19;;;;;;;;;;;;;;;:28;;;:40;;;;;;;;;;;;;;;;;;574:217;;;775:5;768:12;;;;574:217;481:310;813:7;801:4;:9;;;:19;;;;;;;;;;;;;;;;;;830;844:4;830:13;:19::i;:::-;867:4;860:11;;315:563;;;;;:::o;884:742::-;992:4;1053:17;1039:1;1020:21;;:7;:21;;;;1012:30;;;;;;;;1073:4;:10;;:19;1084:7;1073:19;;;;;;;;;;;;;;;1053:39;;1132:1;1107:27;;:4;:13;;;;;;;;;;;;:27;;;;1103:263;;;1201:4;:9;;;;;;;;;;;;1168:4;:10;;:25;1179:4;:13;;;;;;;;;;;;1168:25;;;;;;;;;;;;;;;:30;;;:42;;;;;;;;;;;;;;;;;;1103:263;;;1242:4;:9;;;;;;;;;;;;1231:20;;:7;:20;;;1227:139;;;1287:4;:9;;;;;;;;;;;;1275:4;:9;;;:21;;;;;;;;;;;;;;;;;;1227:139;;;1350:5;1343:12;;;;1227:139;1103:263;1401:1;1380:23;;:4;:9;;;;;;;;;;;;:23;;;;1376:156;;;1452:4;:13;;;;;;;;;;;;1419:4;:10;;:21;1430:4;:9;;;;;;;;;;;;1419:21;;;;;;;;;;;;;;;:30;;;:46;;;;;;;;;;;;;;;;;;1376:156;;;1508:4;:13;;;;;;;;;;;;1496:4;:9;;;:25;;;;;;;;;;;;;;;;;;1376:156;1542:19;1556:4;1542:13;:19::i;:::-;1578:4;:10;;:19;1589:7;1578:19;;;;;;;;;;;;;;;;1571:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1615:4;1608:11;;884:742;;;;;;:::o;2395:235::-;2518:4;2556;:9;;;;;;;;;;;;2545:20;;:7;:20;;;:78;;;;2621:1;2581:42;;:4;:10;;:19;2592:7;2581:19;;;;;;;;;;;;;;;:28;;;;;;;;;;;;:42;;;;2545:78;2538:85;;2395:235;;;;:::o;2672:124::-;2756:4;:10;;;2752:1;2739:4;:10;;;:14;:27;2732:35;;;;;;2777:4;:10;;;:12;;;;;;;;;;;;;2672:124;:::o;2802:111::-;2882:1;2869:4;:10;;;:14;2862:22;;;;;;2894:4;:10;;;:12;;;;;;;;;;;;;;2802:111;:::o;54:2189:5:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", + "source": "pragma solidity 0.4.18;\n\nimport \"./AddressSet.sol\";\n\n\ncontract SignHash {\n\n using AddressSet for AddressSet.Data;\n\n // hash to signers\n mapping (bytes32 => AddressSet.Data) private signers;\n\n // signer to proofs (method to value)\n mapping (address => mapping (string => string)) private proofs;\n\n event Signed(bytes32 indexed hash, address indexed signer);\n event Revoked(bytes32 indexed hash, address indexed signer);\n\n event ProofAdded(address indexed signer, string method, string value);\n event ProofRemoved(address indexed signer, string method);\n\n function sign(bytes32 hash) public {\n require(hash != bytes32(0));\n\n signers[hash].add(msg.sender);\n\n Signed(hash, msg.sender);\n }\n\n function revoke(bytes32 hash) public {\n require(hash != bytes32(0));\n\n signers[hash].remove(msg.sender);\n\n Revoked(hash, msg.sender);\n }\n\n function addProof(string method, string value) public {\n require(bytes(method).length > 0);\n require(bytes(value).length > 0);\n\n proofs[msg.sender][method] = value;\n\n ProofAdded(msg.sender, method, value);\n }\n\n function removeProof(string method) public {\n require(bytes(method).length > 0);\n\n string storage value = proofs[msg.sender][method];\n require(bytes(value).length > 0);\n\n delete proofs[msg.sender][method];\n\n ProofRemoved(msg.sender, method);\n }\n\n function getSigners(bytes32 hash, uint256 maxCount)\n public\n view\n returns (address[] result)\n {\n AddressSet.Data storage hashSigners = signers[hash];\n if (hashSigners.count > 0) {\n if (maxCount < hashSigners.count) {\n result = new address[](maxCount);\n } else {\n result = new address[](hashSigners.count);\n }\n\n address current = hashSigners.head;\n for (uint256 i = 0; i < result.length; i++) {\n result[i] = current;\n current = hashSigners.getNext(current);\n }\n }\n }\n\n function getProof(address signer, string method)\n public\n view\n returns (string)\n {\n return proofs[signer][method];\n }\n}\n", "sourcePath": "/home/js/Projects/js/signhash/signhash-contracts/contracts/SignHash.sol", "ast": { "attributes": { "absolutePath": "/home/js/Projects/js/signhash/signhash-contracts/contracts/SignHash.sol", "exportedSymbols": { "SignHash": [ - 677 + 1173 ] } }, @@ -205,24 +205,24 @@ ".18" ] }, - "id": 395, + "id": 891, "name": "PragmaDirective", - "src": "0:23:2" + "src": "0:23:5" }, { "attributes": { "SourceUnit": 336, "absolutePath": "/home/js/Projects/js/signhash/signhash-contracts/contracts/AddressSet.sol", "file": "./AddressSet.sol", - "scope": 678, + "scope": 1174, "symbolAliases": [ null ], "unitAlias": "" }, - "id": 396, + "id": 892, "name": "ImportDirective", - "src": "25:26:2" + "src": "25:26:5" }, { "attributes": { @@ -236,10 +236,10 @@ "documentation": null, "fullyImplemented": true, "linearizedBaseContracts": [ - 677 + 1173 ], "name": "SignHash", - "scope": 678 + "scope": 1174 }, "children": [ { @@ -251,9 +251,9 @@ "referencedDeclaration": 335, "type": "library AddressSet" }, - "id": 397, + "id": 893, "name": "UserDefinedTypeName", - "src": "107:10:2" + "src": "85:10:5" }, { "attributes": { @@ -262,20 +262,20 @@ "referencedDeclaration": 17, "type": "struct AddressSet.Data storage pointer" }, - "id": 398, + "id": 894, "name": "UserDefinedTypeName", - "src": "122:15:2" + "src": "100:15:5" } ], - "id": 399, + "id": 895, "name": "UsingForDirective", - "src": "101:37:2" + "src": "79:37:5" }, { "attributes": { "constant": false, "name": "signers", - "scope": 677, + "scope": 1173, "stateVariable": true, "storageLocation": "default", "type": "mapping(bytes32 => struct AddressSet.Data storage ref)", @@ -293,9 +293,9 @@ "name": "bytes32", "type": "bytes32" }, - "id": 400, + "id": 896, "name": "ElementaryTypeName", - "src": "194:7:2" + "src": "154:7:5" }, { "attributes": { @@ -304,25 +304,25 @@ "referencedDeclaration": 17, "type": "struct AddressSet.Data storage pointer" }, - "id": 401, + "id": 897, "name": "UserDefinedTypeName", - "src": "205:15:2" + "src": "165:15:5" } ], - "id": 402, + "id": 898, "name": "Mapping", - "src": "185:36:2" + "src": "145:36:5" } ], - "id": 403, + "id": 899, "name": "VariableDeclaration", - "src": "185:52:2" + "src": "145:52:5" }, { "attributes": { "constant": false, "name": "proofs", - "scope": 677, + "scope": 1173, "stateVariable": true, "storageLocation": "default", "type": "mapping(address => mapping(string memory => string storage ref))", @@ -340,9 +340,9 @@ "name": "address", "type": "address" }, - "id": 404, + "id": 900, "name": "ElementaryTypeName", - "src": "295:7:2" + "src": "255:7:5" }, { "attributes": { @@ -354,33 +354,33 @@ "name": "string", "type": "string storage pointer" }, - "id": 405, + "id": 901, "name": "ElementaryTypeName", - "src": "315:6:2" + "src": "275:6:5" }, { "attributes": { "name": "string", "type": "string storage pointer" }, - "id": 406, + "id": 902, "name": "ElementaryTypeName", - "src": "325:6:2" + "src": "285:6:5" } ], - "id": 407, + "id": 903, "name": "Mapping", - "src": "306:26:2" + "src": "266:26:5" } ], - "id": 408, + "id": 904, "name": "Mapping", - "src": "286:47:2" + "src": "246:47:5" } ], - "id": 409, + "id": 905, "name": "VariableDeclaration", - "src": "286:62:2" + "src": "246:62:5" }, { "attributes": { @@ -395,7 +395,7 @@ "constant": false, "indexed": true, "name": "hash", - "scope": 415, + "scope": 911, "stateVariable": false, "storageLocation": "default", "type": "bytes32", @@ -408,21 +408,21 @@ "name": "bytes32", "type": "bytes32" }, - "id": 410, + "id": 906, "name": "ElementaryTypeName", - "src": "385:7:2" + "src": "328:7:5" } ], - "id": 411, + "id": 907, "name": "VariableDeclaration", - "src": "385:20:2" + "src": "328:20:5" }, { "attributes": { "constant": false, "indexed": true, "name": "signer", - "scope": 415, + "scope": 911, "stateVariable": false, "storageLocation": "default", "type": "address", @@ -435,24 +435,24 @@ "name": "address", "type": "address" }, - "id": 412, + "id": 908, "name": "ElementaryTypeName", - "src": "407:7:2" + "src": "350:7:5" } ], - "id": 413, + "id": 909, "name": "VariableDeclaration", - "src": "407:22:2" + "src": "350:22:5" } ], - "id": 414, + "id": 910, "name": "ParameterList", - "src": "384:46:2" + "src": "327:46:5" } ], - "id": 415, + "id": 911, "name": "EventDefinition", - "src": "372:59:2" + "src": "315:59:5" }, { "attributes": { @@ -467,7 +467,7 @@ "constant": false, "indexed": true, "name": "hash", - "scope": 421, + "scope": 917, "stateVariable": false, "storageLocation": "default", "type": "bytes32", @@ -480,21 +480,21 @@ "name": "bytes32", "type": "bytes32" }, - "id": 416, + "id": 912, "name": "ElementaryTypeName", - "src": "450:7:2" + "src": "393:7:5" } ], - "id": 417, + "id": 913, "name": "VariableDeclaration", - "src": "450:20:2" + "src": "393:20:5" }, { "attributes": { "constant": false, "indexed": true, "name": "signer", - "scope": 421, + "scope": 917, "stateVariable": false, "storageLocation": "default", "type": "address", @@ -507,24 +507,24 @@ "name": "address", "type": "address" }, - "id": 418, + "id": 914, "name": "ElementaryTypeName", - "src": "472:7:2" + "src": "415:7:5" } ], - "id": 419, + "id": 915, "name": "VariableDeclaration", - "src": "472:22:2" + "src": "415:22:5" } ], - "id": 420, + "id": 916, "name": "ParameterList", - "src": "449:46:2" + "src": "392:46:5" } ], - "id": 421, + "id": 917, "name": "EventDefinition", - "src": "436:60:2" + "src": "379:60:5" }, { "attributes": { @@ -539,7 +539,7 @@ "constant": false, "indexed": true, "name": "signer", - "scope": 429, + "scope": 925, "stateVariable": false, "storageLocation": "default", "type": "address", @@ -552,21 +552,21 @@ "name": "address", "type": "address" }, - "id": 422, + "id": 918, "name": "ElementaryTypeName", - "src": "519:7:2" + "src": "462:7:5" } ], - "id": 423, + "id": 919, "name": "VariableDeclaration", - "src": "519:22:2" + "src": "462:22:5" }, { "attributes": { "constant": false, "indexed": false, "name": "method", - "scope": 429, + "scope": 925, "stateVariable": false, "storageLocation": "default", "type": "string memory", @@ -579,21 +579,21 @@ "name": "string", "type": "string storage pointer" }, - "id": 424, + "id": 920, "name": "ElementaryTypeName", - "src": "543:6:2" + "src": "486:6:5" } ], - "id": 425, + "id": 921, "name": "VariableDeclaration", - "src": "543:13:2" + "src": "486:13:5" }, { "attributes": { "constant": false, "indexed": false, "name": "value", - "scope": 429, + "scope": 925, "stateVariable": false, "storageLocation": "default", "type": "string memory", @@ -606,24 +606,24 @@ "name": "string", "type": "string storage pointer" }, - "id": 426, + "id": 922, "name": "ElementaryTypeName", - "src": "558:6:2" + "src": "501:6:5" } ], - "id": 427, + "id": 923, "name": "VariableDeclaration", - "src": "558:12:2" + "src": "501:12:5" } ], - "id": 428, + "id": 924, "name": "ParameterList", - "src": "518:53:2" + "src": "461:53:5" } ], - "id": 429, + "id": 925, "name": "EventDefinition", - "src": "502:70:2" + "src": "445:70:5" }, { "attributes": { @@ -638,7 +638,7 @@ "constant": false, "indexed": true, "name": "signer", - "scope": 435, + "scope": 931, "stateVariable": false, "storageLocation": "default", "type": "address", @@ -651,21 +651,21 @@ "name": "address", "type": "address" }, - "id": 430, + "id": 926, "name": "ElementaryTypeName", - "src": "596:7:2" + "src": "539:7:5" } ], - "id": 431, + "id": 927, "name": "VariableDeclaration", - "src": "596:22:2" + "src": "539:22:5" }, { "attributes": { "constant": false, "indexed": false, "name": "method", - "scope": 435, + "scope": 931, "stateVariable": false, "storageLocation": "default", "type": "string memory", @@ -678,24 +678,24 @@ "name": "string", "type": "string storage pointer" }, - "id": 432, + "id": 928, "name": "ElementaryTypeName", - "src": "620:6:2" + "src": "563:6:5" } ], - "id": 433, + "id": 929, "name": "VariableDeclaration", - "src": "620:13:2" + "src": "563:13:5" } ], - "id": 434, + "id": 930, "name": "ParameterList", - "src": "595:39:2" + "src": "538:39:5" } ], - "id": 435, + "id": 931, "name": "EventDefinition", - "src": "577:58:2" + "src": "520:58:5" }, { "attributes": { @@ -707,7 +707,7 @@ ], "name": "sign", "payable": false, - "scope": 677, + "scope": 1173, "stateMutability": "nonpayable", "superFunction": null, "visibility": "public" @@ -719,7 +719,7 @@ "attributes": { "constant": false, "name": "hash", - "scope": 463, + "scope": 959, "stateVariable": false, "storageLocation": "default", "type": "bytes32", @@ -732,19 +732,19 @@ "name": "bytes32", "type": "bytes32" }, - "id": 436, + "id": 932, "name": "ElementaryTypeName", - "src": "690:7:2" + "src": "598:7:5" } ], - "id": 437, + "id": 933, "name": "VariableDeclaration", - "src": "690:12:2" + "src": "598:12:5" } ], - "id": 438, + "id": 934, "name": "ParameterList", - "src": "689:14:2" + "src": "597:14:5" }, { "attributes": { @@ -753,9 +753,9 @@ ] }, "children": [], - "id": 439, + "id": 935, "name": "ParameterList", - "src": "711:0:2" + "src": "619:0:5" }, { "children": [ @@ -787,13 +787,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 692, + "referencedDeclaration": 1501, "type": "function (bool) pure", "value": "require" }, - "id": 440, + "id": 936, "name": "Identifier", - "src": "721:7:2" + "src": "629:7:5" }, { "attributes": { @@ -816,13 +816,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 437, + "referencedDeclaration": 933, "type": "bytes32", "value": "hash" }, - "id": 441, + "id": 937, "name": "Identifier", - "src": "729:4:2" + "src": "637:4:5" }, { "attributes": { @@ -854,9 +854,9 @@ "type": "type(bytes32)", "value": "bytes32" }, - "id": 442, + "id": 938, "name": "ElementaryTypeNameExpression", - "src": "737:7:2" + "src": "645:7:5" }, { "attributes": { @@ -871,29 +871,29 @@ "type": "int_const 0", "value": "0" }, - "id": 443, + "id": 939, "name": "Literal", - "src": "745:1:2" + "src": "653:1:5" } ], - "id": 444, + "id": 940, "name": "FunctionCall", - "src": "737:10:2" + "src": "645:10:5" } ], - "id": 445, + "id": 941, "name": "BinaryOperation", - "src": "729:18:2" + "src": "637:18:5" } ], - "id": 446, + "id": 942, "name": "FunctionCall", - "src": "721:27:2" + "src": "629:27:5" } ], - "id": 447, + "id": 943, "name": "ExpressionStatement", - "src": "721:27:2" + "src": "629:27:5" }, { "children": [ @@ -945,13 +945,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 403, + "referencedDeclaration": 899, "type": "mapping(bytes32 => struct AddressSet.Data storage ref)", "value": "signers" }, - "id": 448, + "id": 944, "name": "Identifier", - "src": "759:7:2" + "src": "667:7:5" }, { "attributes": { @@ -959,23 +959,23 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 437, + "referencedDeclaration": 933, "type": "bytes32", "value": "hash" }, - "id": 449, + "id": 945, "name": "Identifier", - "src": "767:4:2" + "src": "675:4:5" } ], - "id": 450, + "id": 946, "name": "IndexAccess", - "src": "759:13:2" + "src": "667:13:5" } ], - "id": 451, + "id": 947, "name": "MemberAccess", - "src": "759:17:2" + "src": "667:17:5" }, { "attributes": { @@ -995,28 +995,28 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 689, + "referencedDeclaration": 1498, "type": "msg", "value": "msg" }, - "id": 452, + "id": 948, "name": "Identifier", - "src": "777:3:2" + "src": "685:3:5" } ], - "id": 453, + "id": 949, "name": "MemberAccess", - "src": "777:10:2" + "src": "685:10:5" } ], - "id": 454, + "id": 950, "name": "FunctionCall", - "src": "759:29:2" + "src": "667:29:5" } ], - "id": 455, + "id": 951, "name": "ExpressionStatement", - "src": "759:29:2" + "src": "667:29:5" }, { "children": [ @@ -1050,13 +1050,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 415, + "referencedDeclaration": 911, "type": "function (bytes32,address)", "value": "Signed" }, - "id": 456, + "id": 952, "name": "Identifier", - "src": "799:6:2" + "src": "707:6:5" }, { "attributes": { @@ -1064,13 +1064,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 437, + "referencedDeclaration": 933, "type": "bytes32", "value": "hash" }, - "id": 457, + "id": 953, "name": "Identifier", - "src": "806:4:2" + "src": "714:4:5" }, { "attributes": { @@ -1090,38 +1090,38 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 689, + "referencedDeclaration": 1498, "type": "msg", "value": "msg" }, - "id": 458, + "id": 954, "name": "Identifier", - "src": "812:3:2" + "src": "720:3:5" } ], - "id": 459, + "id": 955, "name": "MemberAccess", - "src": "812:10:2" + "src": "720:10:5" } ], - "id": 460, + "id": 956, "name": "FunctionCall", - "src": "799:24:2" + "src": "707:24:5" } ], - "id": 461, + "id": 957, "name": "ExpressionStatement", - "src": "799:24:2" + "src": "707:24:5" } ], - "id": 462, + "id": 958, "name": "Block", - "src": "711:119:2" + "src": "619:119:5" } ], - "id": 463, + "id": 959, "name": "FunctionDefinition", - "src": "676:154:2" + "src": "584:154:5" }, { "attributes": { @@ -1133,7 +1133,7 @@ ], "name": "revoke", "payable": false, - "scope": 677, + "scope": 1173, "stateMutability": "nonpayable", "superFunction": null, "visibility": "public" @@ -1145,7 +1145,7 @@ "attributes": { "constant": false, "name": "hash", - "scope": 491, + "scope": 987, "stateVariable": false, "storageLocation": "default", "type": "bytes32", @@ -1158,19 +1158,19 @@ "name": "bytes32", "type": "bytes32" }, - "id": 464, + "id": 960, "name": "ElementaryTypeName", - "src": "852:7:2" + "src": "760:7:5" } ], - "id": 465, + "id": 961, "name": "VariableDeclaration", - "src": "852:12:2" + "src": "760:12:5" } ], - "id": 466, + "id": 962, "name": "ParameterList", - "src": "851:14:2" + "src": "759:14:5" }, { "attributes": { @@ -1179,9 +1179,9 @@ ] }, "children": [], - "id": 467, + "id": 963, "name": "ParameterList", - "src": "873:0:2" + "src": "781:0:5" }, { "children": [ @@ -1213,13 +1213,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 692, + "referencedDeclaration": 1501, "type": "function (bool) pure", "value": "require" }, - "id": 468, + "id": 964, "name": "Identifier", - "src": "883:7:2" + "src": "791:7:5" }, { "attributes": { @@ -1242,13 +1242,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 465, + "referencedDeclaration": 961, "type": "bytes32", "value": "hash" }, - "id": 469, + "id": 965, "name": "Identifier", - "src": "891:4:2" + "src": "799:4:5" }, { "attributes": { @@ -1280,9 +1280,9 @@ "type": "type(bytes32)", "value": "bytes32" }, - "id": 470, + "id": 966, "name": "ElementaryTypeNameExpression", - "src": "899:7:2" + "src": "807:7:5" }, { "attributes": { @@ -1297,29 +1297,29 @@ "type": "int_const 0", "value": "0" }, - "id": 471, + "id": 967, "name": "Literal", - "src": "907:1:2" + "src": "815:1:5" } ], - "id": 472, + "id": 968, "name": "FunctionCall", - "src": "899:10:2" + "src": "807:10:5" } ], - "id": 473, + "id": 969, "name": "BinaryOperation", - "src": "891:18:2" + "src": "799:18:5" } ], - "id": 474, + "id": 970, "name": "FunctionCall", - "src": "883:27:2" + "src": "791:27:5" } ], - "id": 475, + "id": 971, "name": "ExpressionStatement", - "src": "883:27:2" + "src": "791:27:5" }, { "children": [ @@ -1371,13 +1371,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 403, + "referencedDeclaration": 899, "type": "mapping(bytes32 => struct AddressSet.Data storage ref)", "value": "signers" }, - "id": 476, + "id": 972, "name": "Identifier", - "src": "921:7:2" + "src": "829:7:5" }, { "attributes": { @@ -1385,23 +1385,23 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 465, + "referencedDeclaration": 961, "type": "bytes32", "value": "hash" }, - "id": 477, + "id": 973, "name": "Identifier", - "src": "929:4:2" + "src": "837:4:5" } ], - "id": 478, + "id": 974, "name": "IndexAccess", - "src": "921:13:2" + "src": "829:13:5" } ], - "id": 479, + "id": 975, "name": "MemberAccess", - "src": "921:20:2" + "src": "829:20:5" }, { "attributes": { @@ -1421,28 +1421,28 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 689, + "referencedDeclaration": 1498, "type": "msg", "value": "msg" }, - "id": 480, + "id": 976, "name": "Identifier", - "src": "942:3:2" + "src": "850:3:5" } ], - "id": 481, + "id": 977, "name": "MemberAccess", - "src": "942:10:2" + "src": "850:10:5" } ], - "id": 482, + "id": 978, "name": "FunctionCall", - "src": "921:32:2" + "src": "829:32:5" } ], - "id": 483, + "id": 979, "name": "ExpressionStatement", - "src": "921:32:2" + "src": "829:32:5" }, { "children": [ @@ -1476,13 +1476,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 421, + "referencedDeclaration": 917, "type": "function (bytes32,address)", "value": "Revoked" }, - "id": 484, + "id": 980, "name": "Identifier", - "src": "964:7:2" + "src": "872:7:5" }, { "attributes": { @@ -1490,13 +1490,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 465, + "referencedDeclaration": 961, "type": "bytes32", "value": "hash" }, - "id": 485, + "id": 981, "name": "Identifier", - "src": "972:4:2" + "src": "880:4:5" }, { "attributes": { @@ -1516,38 +1516,38 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 689, + "referencedDeclaration": 1498, "type": "msg", "value": "msg" }, - "id": 486, + "id": 982, "name": "Identifier", - "src": "978:3:2" + "src": "886:3:5" } ], - "id": 487, + "id": 983, "name": "MemberAccess", - "src": "978:10:2" + "src": "886:10:5" } ], - "id": 488, + "id": 984, "name": "FunctionCall", - "src": "964:25:2" + "src": "872:25:5" } ], - "id": 489, + "id": 985, "name": "ExpressionStatement", - "src": "964:25:2" + "src": "872:25:5" } ], - "id": 490, + "id": 986, "name": "Block", - "src": "873:123:2" + "src": "781:123:5" } ], - "id": 491, + "id": 987, "name": "FunctionDefinition", - "src": "836:160:2" + "src": "744:160:5" }, { "attributes": { @@ -1559,7 +1559,7 @@ ], "name": "addProof", "payable": false, - "scope": 677, + "scope": 1173, "stateMutability": "nonpayable", "superFunction": null, "visibility": "public" @@ -1571,7 +1571,7 @@ "attributes": { "constant": false, "name": "method", - "scope": 533, + "scope": 1029, "stateVariable": false, "storageLocation": "default", "type": "string memory", @@ -1584,20 +1584,20 @@ "name": "string", "type": "string storage pointer" }, - "id": 492, + "id": 988, "name": "ElementaryTypeName", - "src": "1020:6:2" + "src": "928:6:5" } ], - "id": 493, + "id": 989, "name": "VariableDeclaration", - "src": "1020:13:2" + "src": "928:13:5" }, { "attributes": { "constant": false, "name": "value", - "scope": 533, + "scope": 1029, "stateVariable": false, "storageLocation": "default", "type": "string memory", @@ -1610,19 +1610,19 @@ "name": "string", "type": "string storage pointer" }, - "id": 494, + "id": 990, "name": "ElementaryTypeName", - "src": "1035:6:2" + "src": "943:6:5" } ], - "id": 495, + "id": 991, "name": "VariableDeclaration", - "src": "1035:12:2" + "src": "943:12:5" } ], - "id": 496, + "id": 992, "name": "ParameterList", - "src": "1019:29:2" + "src": "927:29:5" }, { "attributes": { @@ -1631,9 +1631,9 @@ ] }, "children": [], - "id": 497, + "id": 993, "name": "ParameterList", - "src": "1056:0:2" + "src": "964:0:5" }, { "children": [ @@ -1665,13 +1665,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 692, + "referencedDeclaration": 1501, "type": "function (bool) pure", "value": "require" }, - "id": 498, + "id": 994, "name": "Identifier", - "src": "1066:7:2" + "src": "974:7:5" }, { "attributes": { @@ -1730,9 +1730,9 @@ "type": "type(bytes storage pointer)", "value": "bytes" }, - "id": 499, + "id": 995, "name": "ElementaryTypeNameExpression", - "src": "1074:5:2" + "src": "982:5:5" }, { "attributes": { @@ -1740,23 +1740,23 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 493, + "referencedDeclaration": 989, "type": "string memory", "value": "method" }, - "id": 500, + "id": 996, "name": "Identifier", - "src": "1080:6:2" + "src": "988:6:5" } ], - "id": 501, + "id": 997, "name": "FunctionCall", - "src": "1074:13:2" + "src": "982:13:5" } ], - "id": 502, + "id": 998, "name": "MemberAccess", - "src": "1074:20:2" + "src": "982:20:5" }, { "attributes": { @@ -1771,24 +1771,24 @@ "type": "int_const 0", "value": "0" }, - "id": 503, + "id": 999, "name": "Literal", - "src": "1097:1:2" + "src": "1005:1:5" } ], - "id": 504, + "id": 1000, "name": "BinaryOperation", - "src": "1074:24:2" + "src": "982:24:5" } ], - "id": 505, + "id": 1001, "name": "FunctionCall", - "src": "1066:33:2" + "src": "974:33:5" } ], - "id": 506, + "id": 1002, "name": "ExpressionStatement", - "src": "1066:33:2" + "src": "974:33:5" }, { "children": [ @@ -1818,13 +1818,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 692, + "referencedDeclaration": 1501, "type": "function (bool) pure", "value": "require" }, - "id": 507, + "id": 1003, "name": "Identifier", - "src": "1109:7:2" + "src": "1017:7:5" }, { "attributes": { @@ -1883,9 +1883,9 @@ "type": "type(bytes storage pointer)", "value": "bytes" }, - "id": 508, + "id": 1004, "name": "ElementaryTypeNameExpression", - "src": "1117:5:2" + "src": "1025:5:5" }, { "attributes": { @@ -1893,23 +1893,23 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 495, + "referencedDeclaration": 991, "type": "string memory", "value": "value" }, - "id": 509, + "id": 1005, "name": "Identifier", - "src": "1123:5:2" + "src": "1031:5:5" } ], - "id": 510, + "id": 1006, "name": "FunctionCall", - "src": "1117:12:2" + "src": "1025:12:5" } ], - "id": 511, + "id": 1007, "name": "MemberAccess", - "src": "1117:19:2" + "src": "1025:19:5" }, { "attributes": { @@ -1924,24 +1924,24 @@ "type": "int_const 0", "value": "0" }, - "id": 512, + "id": 1008, "name": "Literal", - "src": "1139:1:2" + "src": "1047:1:5" } ], - "id": 513, + "id": 1009, "name": "BinaryOperation", - "src": "1117:23:2" + "src": "1025:23:5" } ], - "id": 514, + "id": 1010, "name": "FunctionCall", - "src": "1109:32:2" + "src": "1017:32:5" } ], - "id": 515, + "id": 1011, "name": "ExpressionStatement", - "src": "1109:32:2" + "src": "1017:32:5" }, { "children": [ @@ -1982,13 +1982,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 409, + "referencedDeclaration": 905, "type": "mapping(address => mapping(string memory => string storage ref))", "value": "proofs" }, - "id": 516, + "id": 1012, "name": "Identifier", - "src": "1152:6:2" + "src": "1060:6:5" }, { "attributes": { @@ -2008,23 +2008,23 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 689, + "referencedDeclaration": 1498, "type": "msg", "value": "msg" }, - "id": 517, + "id": 1013, "name": "Identifier", - "src": "1159:3:2" + "src": "1067:3:5" } ], - "id": 518, + "id": 1014, "name": "MemberAccess", - "src": "1159:10:2" + "src": "1067:10:5" } ], - "id": 520, + "id": 1016, "name": "IndexAccess", - "src": "1152:18:2" + "src": "1060:18:5" }, { "attributes": { @@ -2032,18 +2032,18 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 493, + "referencedDeclaration": 989, "type": "string memory", "value": "method" }, - "id": 519, + "id": 1015, "name": "Identifier", - "src": "1171:6:2" + "src": "1079:6:5" } ], - "id": 521, + "id": 1017, "name": "IndexAccess", - "src": "1152:26:2" + "src": "1060:26:5" }, { "attributes": { @@ -2051,23 +2051,23 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 495, + "referencedDeclaration": 991, "type": "string memory", "value": "value" }, - "id": 522, + "id": 1018, "name": "Identifier", - "src": "1181:5:2" + "src": "1089:5:5" } ], - "id": 523, + "id": 1019, "name": "Assignment", - "src": "1152:34:2" + "src": "1060:34:5" } ], - "id": 524, + "id": 1020, "name": "ExpressionStatement", - "src": "1152:34:2" + "src": "1060:34:5" }, { "children": [ @@ -2105,13 +2105,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 429, + "referencedDeclaration": 925, "type": "function (address,string memory,string memory)", "value": "ProofAdded" }, - "id": 525, + "id": 1021, "name": "Identifier", - "src": "1197:10:2" + "src": "1105:10:5" }, { "attributes": { @@ -2131,18 +2131,18 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 689, + "referencedDeclaration": 1498, "type": "msg", "value": "msg" }, - "id": 526, + "id": 1022, "name": "Identifier", - "src": "1208:3:2" + "src": "1116:3:5" } ], - "id": 527, + "id": 1023, "name": "MemberAccess", - "src": "1208:10:2" + "src": "1116:10:5" }, { "attributes": { @@ -2150,13 +2150,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 493, + "referencedDeclaration": 989, "type": "string memory", "value": "method" }, - "id": 528, + "id": 1024, "name": "Identifier", - "src": "1220:6:2" + "src": "1128:6:5" }, { "attributes": { @@ -2164,33 +2164,33 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 495, + "referencedDeclaration": 991, "type": "string memory", "value": "value" }, - "id": 529, + "id": 1025, "name": "Identifier", - "src": "1228:5:2" + "src": "1136:5:5" } ], - "id": 530, + "id": 1026, "name": "FunctionCall", - "src": "1197:37:2" + "src": "1105:37:5" } ], - "id": 531, + "id": 1027, "name": "ExpressionStatement", - "src": "1197:37:2" + "src": "1105:37:5" } ], - "id": 532, + "id": 1028, "name": "Block", - "src": "1056:185:2" + "src": "964:185:5" } ], - "id": 533, + "id": 1029, "name": "FunctionDefinition", - "src": "1002:239:2" + "src": "910:239:5" }, { "attributes": { @@ -2202,7 +2202,7 @@ ], "name": "removeProof", "payable": false, - "scope": 677, + "scope": 1173, "stateMutability": "nonpayable", "superFunction": null, "visibility": "public" @@ -2214,7 +2214,7 @@ "attributes": { "constant": false, "name": "method", - "scope": 580, + "scope": 1076, "stateVariable": false, "storageLocation": "default", "type": "string memory", @@ -2227,19 +2227,19 @@ "name": "string", "type": "string storage pointer" }, - "id": 534, + "id": 1030, "name": "ElementaryTypeName", - "src": "1268:6:2" + "src": "1176:6:5" } ], - "id": 535, + "id": 1031, "name": "VariableDeclaration", - "src": "1268:13:2" + "src": "1176:13:5" } ], - "id": 536, + "id": 1032, "name": "ParameterList", - "src": "1267:15:2" + "src": "1175:15:5" }, { "attributes": { @@ -2248,9 +2248,9 @@ ] }, "children": [], - "id": 537, + "id": 1033, "name": "ParameterList", - "src": "1290:0:2" + "src": "1198:0:5" }, { "children": [ @@ -2282,13 +2282,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 692, + "referencedDeclaration": 1501, "type": "function (bool) pure", "value": "require" }, - "id": 538, + "id": 1034, "name": "Identifier", - "src": "1300:7:2" + "src": "1208:7:5" }, { "attributes": { @@ -2347,9 +2347,9 @@ "type": "type(bytes storage pointer)", "value": "bytes" }, - "id": 539, + "id": 1035, "name": "ElementaryTypeNameExpression", - "src": "1308:5:2" + "src": "1216:5:5" }, { "attributes": { @@ -2357,23 +2357,23 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 535, + "referencedDeclaration": 1031, "type": "string memory", "value": "method" }, - "id": 540, + "id": 1036, "name": "Identifier", - "src": "1314:6:2" + "src": "1222:6:5" } ], - "id": 541, + "id": 1037, "name": "FunctionCall", - "src": "1308:13:2" + "src": "1216:13:5" } ], - "id": 542, + "id": 1038, "name": "MemberAccess", - "src": "1308:20:2" + "src": "1216:20:5" }, { "attributes": { @@ -2388,29 +2388,29 @@ "type": "int_const 0", "value": "0" }, - "id": 543, + "id": 1039, "name": "Literal", - "src": "1331:1:2" + "src": "1239:1:5" } ], - "id": 544, + "id": 1040, "name": "BinaryOperation", - "src": "1308:24:2" + "src": "1216:24:5" } ], - "id": 545, + "id": 1041, "name": "FunctionCall", - "src": "1300:33:2" + "src": "1208:33:5" } ], - "id": 546, + "id": 1042, "name": "ExpressionStatement", - "src": "1300:33:2" + "src": "1208:33:5" }, { "attributes": { "assignments": [ - 548 + 1044 ] }, "children": [ @@ -2418,7 +2418,7 @@ "attributes": { "constant": false, "name": "value", - "scope": 580, + "scope": 1076, "stateVariable": false, "storageLocation": "storage", "type": "string storage pointer", @@ -2431,14 +2431,14 @@ "name": "string", "type": "string storage pointer" }, - "id": 547, + "id": 1043, "name": "ElementaryTypeName", - "src": "1344:6:2" + "src": "1252:6:5" } ], - "id": 548, + "id": 1044, "name": "VariableDeclaration", - "src": "1344:20:2" + "src": "1252:20:5" }, { "attributes": { @@ -2466,13 +2466,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 409, + "referencedDeclaration": 905, "type": "mapping(address => mapping(string memory => string storage ref))", "value": "proofs" }, - "id": 549, + "id": 1045, "name": "Identifier", - "src": "1367:6:2" + "src": "1275:6:5" }, { "attributes": { @@ -2492,23 +2492,23 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 689, + "referencedDeclaration": 1498, "type": "msg", "value": "msg" }, - "id": 550, + "id": 1046, "name": "Identifier", - "src": "1374:3:2" + "src": "1282:3:5" } ], - "id": 551, + "id": 1047, "name": "MemberAccess", - "src": "1374:10:2" + "src": "1282:10:5" } ], - "id": 552, + "id": 1048, "name": "IndexAccess", - "src": "1367:18:2" + "src": "1275:18:5" }, { "attributes": { @@ -2516,23 +2516,23 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 535, + "referencedDeclaration": 1031, "type": "string memory", "value": "method" }, - "id": 553, + "id": 1049, "name": "Identifier", - "src": "1386:6:2" + "src": "1294:6:5" } ], - "id": 554, + "id": 1050, "name": "IndexAccess", - "src": "1367:26:2" + "src": "1275:26:5" } ], - "id": 555, + "id": 1051, "name": "VariableDeclarationStatement", - "src": "1344:49:2" + "src": "1252:49:5" }, { "children": [ @@ -2562,13 +2562,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 692, + "referencedDeclaration": 1501, "type": "function (bool) pure", "value": "require" }, - "id": 556, + "id": 1052, "name": "Identifier", - "src": "1403:7:2" + "src": "1311:7:5" }, { "attributes": { @@ -2627,9 +2627,9 @@ "type": "type(bytes storage pointer)", "value": "bytes" }, - "id": 557, + "id": 1053, "name": "ElementaryTypeNameExpression", - "src": "1411:5:2" + "src": "1319:5:5" }, { "attributes": { @@ -2637,23 +2637,23 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 548, + "referencedDeclaration": 1044, "type": "string storage pointer", "value": "value" }, - "id": 558, + "id": 1054, "name": "Identifier", - "src": "1417:5:2" + "src": "1325:5:5" } ], - "id": 559, + "id": 1055, "name": "FunctionCall", - "src": "1411:12:2" + "src": "1319:12:5" } ], - "id": 560, + "id": 1056, "name": "MemberAccess", - "src": "1411:19:2" + "src": "1319:19:5" }, { "attributes": { @@ -2668,24 +2668,24 @@ "type": "int_const 0", "value": "0" }, - "id": 561, + "id": 1057, "name": "Literal", - "src": "1433:1:2" + "src": "1341:1:5" } ], - "id": 562, + "id": 1058, "name": "BinaryOperation", - "src": "1411:23:2" + "src": "1319:23:5" } ], - "id": 563, + "id": 1059, "name": "FunctionCall", - "src": "1403:32:2" + "src": "1311:32:5" } ], - "id": 564, + "id": 1060, "name": "ExpressionStatement", - "src": "1403:32:2" + "src": "1311:32:5" }, { "children": [ @@ -2727,13 +2727,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 409, + "referencedDeclaration": 905, "type": "mapping(address => mapping(string memory => string storage ref))", "value": "proofs" }, - "id": 565, + "id": 1061, "name": "Identifier", - "src": "1453:6:2" + "src": "1361:6:5" }, { "attributes": { @@ -2753,23 +2753,23 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 689, + "referencedDeclaration": 1498, "type": "msg", "value": "msg" }, - "id": 566, + "id": 1062, "name": "Identifier", - "src": "1460:3:2" + "src": "1368:3:5" } ], - "id": 567, + "id": 1063, "name": "MemberAccess", - "src": "1460:10:2" + "src": "1368:10:5" } ], - "id": 568, + "id": 1064, "name": "IndexAccess", - "src": "1453:18:2" + "src": "1361:18:5" }, { "attributes": { @@ -2777,28 +2777,28 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 535, + "referencedDeclaration": 1031, "type": "string memory", "value": "method" }, - "id": 569, + "id": 1065, "name": "Identifier", - "src": "1472:6:2" + "src": "1380:6:5" } ], - "id": 570, + "id": 1066, "name": "IndexAccess", - "src": "1453:26:2" + "src": "1361:26:5" } ], - "id": 571, + "id": 1067, "name": "UnaryOperation", - "src": "1446:33:2" + "src": "1354:33:5" } ], - "id": 572, + "id": 1068, "name": "ExpressionStatement", - "src": "1446:33:2" + "src": "1354:33:5" }, { "children": [ @@ -2832,13 +2832,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 435, + "referencedDeclaration": 931, "type": "function (address,string memory)", "value": "ProofRemoved" }, - "id": 573, + "id": 1069, "name": "Identifier", - "src": "1490:12:2" + "src": "1398:12:5" }, { "attributes": { @@ -2858,18 +2858,18 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 689, + "referencedDeclaration": 1498, "type": "msg", "value": "msg" }, - "id": 574, + "id": 1070, "name": "Identifier", - "src": "1503:3:2" + "src": "1411:3:5" } ], - "id": 575, + "id": 1071, "name": "MemberAccess", - "src": "1503:10:2" + "src": "1411:10:5" }, { "attributes": { @@ -2877,33 +2877,33 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 535, + "referencedDeclaration": 1031, "type": "string memory", "value": "method" }, - "id": 576, + "id": 1072, "name": "Identifier", - "src": "1515:6:2" + "src": "1423:6:5" } ], - "id": 577, + "id": 1073, "name": "FunctionCall", - "src": "1490:32:2" + "src": "1398:32:5" } ], - "id": 578, + "id": 1074, "name": "ExpressionStatement", - "src": "1490:32:2" + "src": "1398:32:5" } ], - "id": 579, + "id": 1075, "name": "Block", - "src": "1290:239:2" + "src": "1198:239:5" } ], - "id": 580, + "id": 1076, "name": "FunctionDefinition", - "src": "1247:282:2" + "src": "1155:282:5" }, { "attributes": { @@ -2915,7 +2915,7 @@ ], "name": "getSigners", "payable": false, - "scope": 677, + "scope": 1173, "stateMutability": "view", "superFunction": null, "visibility": "public" @@ -2927,7 +2927,7 @@ "attributes": { "constant": false, "name": "hash", - "scope": 660, + "scope": 1156, "stateVariable": false, "storageLocation": "default", "type": "bytes32", @@ -2940,20 +2940,20 @@ "name": "bytes32", "type": "bytes32" }, - "id": 581, + "id": 1077, "name": "ElementaryTypeName", - "src": "1591:7:2" + "src": "1463:7:5" } ], - "id": 582, + "id": 1078, "name": "VariableDeclaration", - "src": "1591:12:2" + "src": "1463:12:5" }, { "attributes": { "constant": false, "name": "maxCount", - "scope": 660, + "scope": 1156, "stateVariable": false, "storageLocation": "default", "type": "uint256", @@ -2966,19 +2966,19 @@ "name": "uint256", "type": "uint256" }, - "id": 583, + "id": 1079, "name": "ElementaryTypeName", - "src": "1605:7:2" + "src": "1477:7:5" } ], - "id": 584, + "id": 1080, "name": "VariableDeclaration", - "src": "1605:16:2" + "src": "1477:16:5" } ], - "id": 585, + "id": 1081, "name": "ParameterList", - "src": "1590:32:2" + "src": "1462:32:5" }, { "children": [ @@ -2986,7 +2986,7 @@ "attributes": { "constant": false, "name": "result", - "scope": 660, + "scope": 1156, "stateVariable": false, "storageLocation": "default", "type": "address[] memory", @@ -3005,31 +3005,31 @@ "name": "address", "type": "address" }, - "id": 586, + "id": 1082, "name": "ElementaryTypeName", - "src": "1668:7:2" + "src": "1540:7:5" } ], - "id": 587, + "id": 1083, "name": "ArrayTypeName", - "src": "1668:9:2" + "src": "1540:9:5" } ], - "id": 588, + "id": 1084, "name": "VariableDeclaration", - "src": "1668:16:2" + "src": "1540:16:5" } ], - "id": 589, + "id": 1085, "name": "ParameterList", - "src": "1667:18:2" + "src": "1539:18:5" }, { "children": [ { "attributes": { "assignments": [ - 593 + 1089 ] }, "children": [ @@ -3037,7 +3037,7 @@ "attributes": { "constant": false, "name": "hashSigners", - "scope": 660, + "scope": 1156, "stateVariable": false, "storageLocation": "storage", "type": "struct AddressSet.Data storage pointer", @@ -3052,14 +3052,14 @@ "referencedDeclaration": 17, "type": "struct AddressSet.Data storage pointer" }, - "id": 592, + "id": 1088, "name": "UserDefinedTypeName", - "src": "1700:15:2" + "src": "1572:15:5" } ], - "id": 593, + "id": 1089, "name": "VariableDeclaration", - "src": "1700:35:2" + "src": "1572:35:5" }, { "attributes": { @@ -3077,13 +3077,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 403, + "referencedDeclaration": 899, "type": "mapping(bytes32 => struct AddressSet.Data storage ref)", "value": "signers" }, - "id": 594, + "id": 1090, "name": "Identifier", - "src": "1738:7:2" + "src": "1610:7:5" }, { "attributes": { @@ -3091,23 +3091,23 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 582, + "referencedDeclaration": 1078, "type": "bytes32", "value": "hash" }, - "id": 595, + "id": 1091, "name": "Identifier", - "src": "1746:4:2" + "src": "1618:4:5" } ], - "id": 596, + "id": 1092, "name": "IndexAccess", - "src": "1738:13:2" + "src": "1610:13:5" } ], - "id": 597, + "id": 1093, "name": "VariableDeclarationStatement", - "src": "1700:51:2" + "src": "1572:51:5" }, { "attributes": { @@ -3147,18 +3147,18 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 593, + "referencedDeclaration": 1089, "type": "struct AddressSet.Data storage pointer", "value": "hashSigners" }, - "id": 598, + "id": 1094, "name": "Identifier", - "src": "1765:11:2" + "src": "1637:11:5" } ], - "id": 599, + "id": 1095, "name": "MemberAccess", - "src": "1765:17:2" + "src": "1637:17:5" }, { "attributes": { @@ -3173,14 +3173,14 @@ "type": "int_const 0", "value": "0" }, - "id": 600, + "id": 1096, "name": "Literal", - "src": "1785:1:2" + "src": "1657:1:5" } ], - "id": 601, + "id": 1097, "name": "BinaryOperation", - "src": "1765:21:2" + "src": "1637:21:5" }, { "children": [ @@ -3207,13 +3207,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 584, + "referencedDeclaration": 1080, "type": "uint256", "value": "maxCount" }, - "id": 602, + "id": 1098, "name": "Identifier", - "src": "1806:8:2" + "src": "1678:8:5" }, { "attributes": { @@ -3233,23 +3233,23 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 593, + "referencedDeclaration": 1089, "type": "struct AddressSet.Data storage pointer", "value": "hashSigners" }, - "id": 603, + "id": 1099, "name": "Identifier", - "src": "1817:11:2" + "src": "1689:11:5" } ], - "id": 604, + "id": 1100, "name": "MemberAccess", - "src": "1817:17:2" + "src": "1689:17:5" } ], - "id": 605, + "id": 1101, "name": "BinaryOperation", - "src": "1806:28:2" + "src": "1678:28:5" }, { "children": [ @@ -3272,13 +3272,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 588, + "referencedDeclaration": 1084, "type": "address[] memory", "value": "result" }, - "id": 606, + "id": 1102, "name": "Identifier", - "src": "1854:6:2" + "src": "1726:6:5" }, { "attributes": { @@ -3321,19 +3321,19 @@ "name": "address", "type": "address" }, - "id": 607, + "id": 1103, "name": "ElementaryTypeName", - "src": "1867:7:2" + "src": "1739:7:5" } ], - "id": 608, + "id": 1104, "name": "ArrayTypeName", - "src": "1867:9:2" + "src": "1739:9:5" } ], - "id": 609, + "id": 1105, "name": "NewExpression", - "src": "1863:13:2" + "src": "1735:13:5" }, { "attributes": { @@ -3341,33 +3341,33 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 584, + "referencedDeclaration": 1080, "type": "uint256", "value": "maxCount" }, - "id": 610, + "id": 1106, "name": "Identifier", - "src": "1877:8:2" + "src": "1749:8:5" } ], - "id": 611, + "id": 1107, "name": "FunctionCall", - "src": "1863:23:2" + "src": "1735:23:5" } ], - "id": 612, + "id": 1108, "name": "Assignment", - "src": "1854:32:2" + "src": "1726:32:5" } ], - "id": 613, + "id": 1109, "name": "ExpressionStatement", - "src": "1854:32:2" + "src": "1726:32:5" } ], - "id": 614, + "id": 1110, "name": "Block", - "src": "1836:65:2" + "src": "1708:65:5" }, { "children": [ @@ -3390,13 +3390,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 588, + "referencedDeclaration": 1084, "type": "address[] memory", "value": "result" }, - "id": 615, + "id": 1111, "name": "Identifier", - "src": "1925:6:2" + "src": "1797:6:5" }, { "attributes": { @@ -3439,19 +3439,19 @@ "name": "address", "type": "address" }, - "id": 616, + "id": 1112, "name": "ElementaryTypeName", - "src": "1938:7:2" + "src": "1810:7:5" } ], - "id": 617, + "id": 1113, "name": "ArrayTypeName", - "src": "1938:9:2" + "src": "1810:9:5" } ], - "id": 618, + "id": 1114, "name": "NewExpression", - "src": "1934:13:2" + "src": "1806:13:5" }, { "attributes": { @@ -3471,48 +3471,48 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 593, + "referencedDeclaration": 1089, "type": "struct AddressSet.Data storage pointer", "value": "hashSigners" }, - "id": 619, + "id": 1115, "name": "Identifier", - "src": "1948:11:2" + "src": "1820:11:5" } ], - "id": 620, + "id": 1116, "name": "MemberAccess", - "src": "1948:17:2" + "src": "1820:17:5" } ], - "id": 621, + "id": 1117, "name": "FunctionCall", - "src": "1934:32:2" + "src": "1806:32:5" } ], - "id": 622, + "id": 1118, "name": "Assignment", - "src": "1925:41:2" + "src": "1797:41:5" } ], - "id": 623, + "id": 1119, "name": "ExpressionStatement", - "src": "1925:41:2" + "src": "1797:41:5" } ], - "id": 624, + "id": 1120, "name": "Block", - "src": "1907:74:2" + "src": "1779:74:5" } ], - "id": 625, + "id": 1121, "name": "IfStatement", - "src": "1802:179:2" + "src": "1674:179:5" }, { "attributes": { "assignments": [ - 627 + 1123 ] }, "children": [ @@ -3520,7 +3520,7 @@ "attributes": { "constant": false, "name": "current", - "scope": 660, + "scope": 1156, "stateVariable": false, "storageLocation": "default", "type": "address", @@ -3533,14 +3533,14 @@ "name": "address", "type": "address" }, - "id": 626, + "id": 1122, "name": "ElementaryTypeName", - "src": "1995:7:2" + "src": "1867:7:5" } ], - "id": 627, + "id": 1123, "name": "VariableDeclaration", - "src": "1995:15:2" + "src": "1867:15:5" }, { "attributes": { @@ -3560,30 +3560,30 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 593, + "referencedDeclaration": 1089, "type": "struct AddressSet.Data storage pointer", "value": "hashSigners" }, - "id": 628, + "id": 1124, "name": "Identifier", - "src": "2013:11:2" + "src": "1885:11:5" } ], - "id": 629, + "id": 1125, "name": "MemberAccess", - "src": "2013:16:2" + "src": "1885:16:5" } ], - "id": 630, + "id": 1126, "name": "VariableDeclarationStatement", - "src": "1995:34:2" + "src": "1867:34:5" }, { "children": [ { "attributes": { "assignments": [ - 632 + 1128 ] }, "children": [ @@ -3591,7 +3591,7 @@ "attributes": { "constant": false, "name": "i", - "scope": 660, + "scope": 1156, "stateVariable": false, "storageLocation": "default", "type": "uint256", @@ -3604,14 +3604,14 @@ "name": "uint256", "type": "uint256" }, - "id": 631, + "id": 1127, "name": "ElementaryTypeName", - "src": "2048:7:2" + "src": "1920:7:5" } ], - "id": 632, + "id": 1128, "name": "VariableDeclaration", - "src": "2048:9:2" + "src": "1920:9:5" }, { "attributes": { @@ -3626,14 +3626,14 @@ "type": "int_const 0", "value": "0" }, - "id": 633, + "id": 1129, "name": "Literal", - "src": "2060:1:2" + "src": "1932:1:5" } ], - "id": 634, + "id": 1130, "name": "VariableDeclarationStatement", - "src": "2048:13:2" + "src": "1920:13:5" }, { "attributes": { @@ -3656,13 +3656,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 632, + "referencedDeclaration": 1128, "type": "uint256", "value": "i" }, - "id": 635, + "id": 1131, "name": "Identifier", - "src": "2063:1:2" + "src": "1935:1:5" }, { "attributes": { @@ -3682,23 +3682,23 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 588, + "referencedDeclaration": 1084, "type": "address[] memory", "value": "result" }, - "id": 636, + "id": 1132, "name": "Identifier", - "src": "2067:6:2" + "src": "1939:6:5" } ], - "id": 637, + "id": 1133, "name": "MemberAccess", - "src": "2067:13:2" + "src": "1939:13:5" } ], - "id": 638, + "id": 1134, "name": "BinaryOperation", - "src": "2063:17:2" + "src": "1935:17:5" }, { "children": [ @@ -3720,23 +3720,23 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 632, + "referencedDeclaration": 1128, "type": "uint256", "value": "i" }, - "id": 639, + "id": 1135, "name": "Identifier", - "src": "2082:1:2" + "src": "1954:1:5" } ], - "id": 640, + "id": 1136, "name": "UnaryOperation", - "src": "2082:3:2" + "src": "1954:3:5" } ], - "id": 641, + "id": 1137, "name": "ExpressionStatement", - "src": "2082:3:2" + "src": "1954:3:5" }, { "children": [ @@ -3769,13 +3769,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 588, + "referencedDeclaration": 1084, "type": "address[] memory", "value": "result" }, - "id": 642, + "id": 1138, "name": "Identifier", - "src": "2105:6:2" + "src": "1977:6:5" }, { "attributes": { @@ -3783,18 +3783,18 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 632, + "referencedDeclaration": 1128, "type": "uint256", "value": "i" }, - "id": 643, + "id": 1139, "name": "Identifier", - "src": "2112:1:2" + "src": "1984:1:5" } ], - "id": 644, + "id": 1140, "name": "IndexAccess", - "src": "2105:9:2" + "src": "1977:9:5" }, { "attributes": { @@ -3802,23 +3802,23 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 627, + "referencedDeclaration": 1123, "type": "address", "value": "current" }, - "id": 645, + "id": 1141, "name": "Identifier", - "src": "2117:7:2" + "src": "1989:7:5" } ], - "id": 646, + "id": 1142, "name": "Assignment", - "src": "2105:19:2" + "src": "1977:19:5" } ], - "id": 647, + "id": 1143, "name": "ExpressionStatement", - "src": "2105:19:2" + "src": "1977:19:5" }, { "children": [ @@ -3839,13 +3839,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 627, + "referencedDeclaration": 1123, "type": "address", "value": "current" }, - "id": 648, + "id": 1144, "name": "Identifier", - "src": "2142:7:2" + "src": "2014:7:5" }, { "attributes": { @@ -3885,18 +3885,18 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 593, + "referencedDeclaration": 1089, "type": "struct AddressSet.Data storage pointer", "value": "hashSigners" }, - "id": 649, + "id": 1145, "name": "Identifier", - "src": "2152:11:2" + "src": "2024:11:5" } ], - "id": 650, + "id": 1146, "name": "MemberAccess", - "src": "2152:19:2" + "src": "2024:19:5" }, { "attributes": { @@ -3904,58 +3904,58 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 627, + "referencedDeclaration": 1123, "type": "address", "value": "current" }, - "id": 651, + "id": 1147, "name": "Identifier", - "src": "2172:7:2" + "src": "2044:7:5" } ], - "id": 652, + "id": 1148, "name": "FunctionCall", - "src": "2152:28:2" + "src": "2024:28:5" } ], - "id": 653, + "id": 1149, "name": "Assignment", - "src": "2142:38:2" + "src": "2014:38:5" } ], - "id": 654, + "id": 1150, "name": "ExpressionStatement", - "src": "2142:38:2" + "src": "2014:38:5" } ], - "id": 655, + "id": 1151, "name": "Block", - "src": "2087:108:2" + "src": "1959:108:5" } ], - "id": 656, + "id": 1152, "name": "ForStatement", - "src": "2043:152:2" + "src": "1915:152:5" } ], - "id": 657, + "id": 1153, "name": "Block", - "src": "1788:417:2" + "src": "1660:417:5" } ], - "id": 658, + "id": 1154, "name": "IfStatement", - "src": "1761:444:2" + "src": "1633:444:5" } ], - "id": 659, + "id": 1155, "name": "Block", - "src": "1690:521:2" + "src": "1562:521:5" } ], - "id": 660, + "id": 1156, "name": "FunctionDefinition", - "src": "1571:640:2" + "src": "1443:640:5" }, { "attributes": { @@ -3967,7 +3967,7 @@ ], "name": "getProof", "payable": false, - "scope": 677, + "scope": 1173, "stateMutability": "view", "superFunction": null, "visibility": "public" @@ -3979,7 +3979,7 @@ "attributes": { "constant": false, "name": "signer", - "scope": 676, + "scope": 1172, "stateVariable": false, "storageLocation": "default", "type": "address", @@ -3992,20 +3992,20 @@ "name": "address", "type": "address" }, - "id": 661, + "id": 1157, "name": "ElementaryTypeName", - "src": "2235:7:2" + "src": "2107:7:5" } ], - "id": 662, + "id": 1158, "name": "VariableDeclaration", - "src": "2235:14:2" + "src": "2107:14:5" }, { "attributes": { "constant": false, "name": "method", - "scope": 676, + "scope": 1172, "stateVariable": false, "storageLocation": "default", "type": "string memory", @@ -4018,19 +4018,19 @@ "name": "string", "type": "string storage pointer" }, - "id": 663, + "id": 1159, "name": "ElementaryTypeName", - "src": "2251:6:2" + "src": "2123:6:5" } ], - "id": 664, + "id": 1160, "name": "VariableDeclaration", - "src": "2251:13:2" + "src": "2123:13:5" } ], - "id": 665, + "id": 1161, "name": "ParameterList", - "src": "2234:31:2" + "src": "2106:31:5" }, { "children": [ @@ -4038,7 +4038,7 @@ "attributes": { "constant": false, "name": "", - "scope": 676, + "scope": 1172, "stateVariable": false, "storageLocation": "default", "type": "string memory", @@ -4051,25 +4051,25 @@ "name": "string", "type": "string storage pointer" }, - "id": 666, + "id": 1162, "name": "ElementaryTypeName", - "src": "2311:6:2" + "src": "2183:6:5" } ], - "id": 667, + "id": 1163, "name": "VariableDeclaration", - "src": "2311:6:2" + "src": "2183:6:5" } ], - "id": 668, + "id": 1164, "name": "ParameterList", - "src": "2310:8:2" + "src": "2182:8:5" }, { "children": [ { "attributes": { - "functionReturnParameters": 668 + "functionReturnParameters": 1164 }, "children": [ { @@ -4098,13 +4098,13 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 409, + "referencedDeclaration": 905, "type": "mapping(address => mapping(string memory => string storage ref))", "value": "proofs" }, - "id": 669, + "id": 1165, "name": "Identifier", - "src": "2340:6:2" + "src": "2212:6:5" }, { "attributes": { @@ -4112,18 +4112,18 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 662, + "referencedDeclaration": 1158, "type": "address", "value": "signer" }, - "id": 670, + "id": 1166, "name": "Identifier", - "src": "2347:6:2" + "src": "2219:6:5" } ], - "id": 671, + "id": 1167, "name": "IndexAccess", - "src": "2340:14:2" + "src": "2212:14:5" }, { "attributes": { @@ -4131,43 +4131,43 @@ "overloadedDeclarations": [ null ], - "referencedDeclaration": 664, + "referencedDeclaration": 1160, "type": "string memory", "value": "method" }, - "id": 672, + "id": 1168, "name": "Identifier", - "src": "2355:6:2" + "src": "2227:6:5" } ], - "id": 673, + "id": 1169, "name": "IndexAccess", - "src": "2340:22:2" + "src": "2212:22:5" } ], - "id": 674, + "id": 1170, "name": "Return", - "src": "2333:29:2" + "src": "2205:29:5" } ], - "id": 675, + "id": 1171, "name": "Block", - "src": "2323:46:2" + "src": "2195:46:5" } ], - "id": 676, + "id": 1172, "name": "FunctionDefinition", - "src": "2217:152:2" + "src": "2089:152:5" } ], - "id": 677, + "id": 1173, "name": "ContractDefinition", - "src": "54:2317:2" + "src": "54:2189:5" } ], - "id": 678, + "id": 1174, "name": "SourceUnit", - "src": "0:2372:2" + "src": "0:2244:5" }, "compiler": { "name": "solc", @@ -4175,5 +4175,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2017-11-16T23:38:29.958Z" -} + "updatedAt": "2017-12-09T23:00:14.497Z" +} \ No newline at end of file diff --git a/build/contracts/TestERC20Token.json b/build/contracts/TestERC20Token.json new file mode 100644 index 0000000..b3c2840 --- /dev/null +++ b/build/contracts/TestERC20Token.json @@ -0,0 +1,4176 @@ +{ + "contractName": "TestERC20Token", + "abi": [ + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "spender", + "type": "address" + }, + { + "name": "value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "name": "", + "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": "value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "balance", + "type": "uint256" + } + ], + "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": "to", + "type": "address" + }, + { + "name": "value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "name": "", + "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": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "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" + }, + { + "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" + } + ], + "bytecode": "0x60606040526040805190810160405280600981526020017f54657374455243323000000000000000000000000000000000000000000000008152506000908051906020019061004f929190610107565b506040805190810160405280600481526020017f54455354000000000000000000000000000000000000000000000000000000008152506001908051906020019061009b929190610107565b50601260025534156100ac57600080fd5b600254600a0a61271002600381905550600354600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506101ac565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061014857805160ff1916838001178555610176565b82800160010185558215610176579182015b8281111561017557825182559160200191906001019061015a565b5b5090506101839190610187565b5090565b6101a991905b808211156101a557600081600090555060010161018d565b5090565b90565b610bf4806101bb6000396000f300606060405260043610610099576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde031461009e578063095ea7b31461012c57806318160ddd1461018657806323b872dd146101af578063313ce5671461022857806370a082311461025157806395d89b411461029e578063a9059cbb1461032c578063dd62ed3e14610386575b600080fd5b34156100a957600080fd5b6100b16103f2565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100f15780820151818401526020810190506100d6565b50505050905090810190601f16801561011e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561013757600080fd5b61016c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610490565b604051808215151515815260200191505060405180910390f35b341561019157600080fd5b610199610582565b6040518082815260200191505060405180910390f35b34156101ba57600080fd5b61020e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610588565b604051808215151515815260200191505060405180910390f35b341561023357600080fd5b61023b610859565b6040518082815260200191505060405180910390f35b341561025c57600080fd5b610288600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061085f565b6040518082815260200191505060405180910390f35b34156102a957600080fd5b6102b16108a8565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102f15780820151818401526020810190506102d6565b50505050905090810190601f16801561031e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561033757600080fd5b61036c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610946565b604051808215151515815260200191505060405180910390f35b341561039157600080fd5b6103dc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b0a565b6040518082815260200191505060405180910390f35b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104885780601f1061045d57610100808354040283529160200191610488565b820191906000526020600020905b81548152906001019060200180831161046b57829003601f168201915b505050505081565b600081600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60035481565b600080600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515156105c757600080fd5b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061068f600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610b91565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061071b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610baa565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506107688184610b91565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150509392505050565b60025481565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561093e5780601f106109135761010080835404028352916020019161093e565b820191906000526020600020905b81548152906001019060200180831161092157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561098357600080fd5b6109cc600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483610b91565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610a58600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483610baa565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000828211151515610b9f57fe5b818303905092915050565b6000808284019050838110151515610bbe57fe5b80915050929150505600a165627a7a723058206f4fdc6a797afa78d9ae1a6fd2847ab9e4bdc8544ec794830041cd4efb6c2ac50029", + "deployedBytecode": "0x606060405260043610610099576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde031461009e578063095ea7b31461012c57806318160ddd1461018657806323b872dd146101af578063313ce5671461022857806370a082311461025157806395d89b411461029e578063a9059cbb1461032c578063dd62ed3e14610386575b600080fd5b34156100a957600080fd5b6100b16103f2565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100f15780820151818401526020810190506100d6565b50505050905090810190601f16801561011e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561013757600080fd5b61016c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610490565b604051808215151515815260200191505060405180910390f35b341561019157600080fd5b610199610582565b6040518082815260200191505060405180910390f35b34156101ba57600080fd5b61020e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610588565b604051808215151515815260200191505060405180910390f35b341561023357600080fd5b61023b610859565b6040518082815260200191505060405180910390f35b341561025c57600080fd5b610288600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061085f565b6040518082815260200191505060405180910390f35b34156102a957600080fd5b6102b16108a8565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102f15780820151818401526020810190506102d6565b50505050905090810190601f16801561031e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561033757600080fd5b61036c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610946565b604051808215151515815260200191505060405180910390f35b341561039157600080fd5b6103dc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b0a565b6040518082815260200191505060405180910390f35b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104885780601f1061045d57610100808354040283529160200191610488565b820191906000526020600020905b81548152906001019060200180831161046b57829003601f168201915b505050505081565b600081600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60035481565b600080600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515156105c757600080fd5b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061068f600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610b91565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061071b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610baa565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506107688184610b91565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150509392505050565b60025481565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561093e5780601f106109135761010080835404028352916020019161093e565b820191906000526020600020905b81548152906001019060200180831161092157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561098357600080fd5b6109cc600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483610b91565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610a58600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483610baa565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000828211151515610b9f57fe5b818303905092915050565b6000808284019050838110151515610bbe57fe5b80915050929150505600a165627a7a723058206f4fdc6a797afa78d9ae1a6fd2847ab9e4bdc8544ec794830041cd4efb6c2ac50029", + "sourceMap": "26:2155:6:-;;;57:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;95:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;156:2;130:28;;319:132;;;;;;;;391:8;;385:2;:14;376:5;:24;362:11;:38;;;;433:11;;410:8;:20;419:10;410:20;;;;;;;;;;;;;;;:34;;;;26:2155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", + "deployedSourceMap": "26:2155:6:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1445:192:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;164:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1024:415;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;130:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1787:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;670:348:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1643:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1445:192::-;1510:4;1557:5;1526:7;:19;1534:10;1526:19;;;;;;;;;;;;;;;:28;1546:7;1526:28;;;;;;;;;;;;;;;:36;;;;1593:7;1572:36;;1581:10;1572:36;;;1602:5;1572:36;;;;;;;;;;;;;;;;;;1626:4;1619:11;;1445:192;;;;:::o;164:26::-;;;;:::o;1024:415::-;1103:4;1155:17;1141:1;1127:16;;:2;:16;;;;1119:25;;;;;;;;1175:7;:13;1183:4;1175:13;;;;;;;;;;;;;;;:25;1189:10;1175:25;;;;;;;;;;;;;;;;1155:45;;1228:30;1236:8;:14;1245:4;1236:14;;;;;;;;;;;;;;;;1252:5;1228:7;:30::i;:::-;1211:8;:14;1220:4;1211:14;;;;;;;;;;;;;;;:47;;;;1283:28;1291:8;:12;1300:2;1291:12;;;;;;;;;;;;;;;;1305:5;1283:7;:28::i;:::-;1268:8;:12;1277:2;1268:12;;;;;;;;;;;;;;;:43;;;;1349:25;1357:9;1368:5;1349:7;:25::i;:::-;1321:7;:13;1329:4;1321:13;;;;;;;;;;;;;;;:25;1335:10;1321:25;;;;;;;;;;;;;;;:53;;;;1400:2;1385:25;;1394:4;1385:25;;;1404:5;1385:25;;;;;;;;;;;;;;;;;;1428:4;1421:11;;1024:415;;;;;;:::o;130:28::-;;;;:::o;1787:111::-;1842:15;1876:8;:15;1885:5;1876:15;;;;;;;;;;;;;;;;1869:22;;1787:111;;;:::o;95:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;670:348::-;731:4;821:1;807:16;;:2;:16;;;;799:25;;;;;;;;858:36;866:8;:20;875:10;866:20;;;;;;;;;;;;;;;;888:5;858:7;:36::i;:::-;835:8;:20;844:10;835:20;;;;;;;;;;;;;;;:59;;;;919:28;927:8;:12;936:2;927:12;;;;;;;;;;;;;;;;941:5;919:7;:28::i;:::-;904:8;:12;913:2;904:12;;;;;;;;;;;;;;;:43;;;;979:2;958:31;;967:10;958:31;;;983:5;958:31;;;;;;;;;;;;;;;;;;1007:4;1000:11;;670:348;;;;:::o;1643:138::-;1715:17;1751:7;:14;1759:5;1751:14;;;;;;;;;;;;;;;:23;1766:7;1751:23;;;;;;;;;;;;;;;;1744:30;;1643:138;;;;:::o;1904:123::-;1965:7;1996:1;1991;:6;;1984:14;;;;;;2019:1;2015;:5;2008:12;;1904:123;;;;:::o;2033:146::-;2094:7;2113:9;2129:1;2125;:5;2113:17;;2152:1;2147;:6;;2140:14;;;;;;2171:1;2164:8;;2033:146;;;;;:::o", + "source": "pragma solidity 0.4.18;\n\n\ncontract TestERC20Token {\n\n string public name = \"TestERC20\";\n string public symbol = \"TEST\";\n uint256 public decimals = 18;\n uint256 public totalSupply;\n\n mapping(address => uint256) private balances;\n mapping (address => mapping (address => uint256)) private allowed;\n\n function TestERC20Token() public {\n totalSupply = 10000 * (10 ** decimals);\n balances[msg.sender] = totalSupply;\n }\n\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /* solhint-disable no-simple-event-func-name */\n function transfer(address to, uint256 value) public returns (bool) {\n /* solhint-enable no-simple-event-func-name */\n\n require(to != address(0));\n\n balances[msg.sender] = safeSub(balances[msg.sender], value);\n balances[to] = safeAdd(balances[to], value);\n\n Transfer(msg.sender, to, value);\n\n return true;\n }\n\n function transferFrom(address from, address to, uint256 value) public returns (bool) {\n require(to != address(0));\n\n uint256 allowance = allowed[from][msg.sender];\n\n balances[from] = safeSub(balances[from], value);\n balances[to] = safeAdd(balances[to], value);\n allowed[from][msg.sender] = safeSub(allowance, value);\n\n Transfer(from, to, value);\n\n return true;\n }\n\n function approve(address spender, uint256 value) public returns (bool) {\n allowed[msg.sender][spender] = value;\n Approval(msg.sender, spender, value);\n\n return true;\n }\n\n function allowance(address owner, address spender) public view returns (uint256 remaining) {\n return allowed[owner][spender];\n }\n\n function balanceOf(address owner) public view returns (uint256 balance) {\n return balances[owner];\n }\n\n function safeSub(uint256 a, uint256 b) private pure returns (uint256) {\n assert(b <= a);\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b) private pure returns (uint256) {\n uint256 c = a + b;\n assert(c >= a);\n return c;\n }\n}\n", + "sourcePath": "/home/js/Projects/js/signhash/signhash-contracts/contracts/Test/TestERC20Token.sol", + "ast": { + "attributes": { + "absolutePath": "/home/js/Projects/js/signhash/signhash-contracts/contracts/Test/TestERC20Token.sol", + "exportedSymbols": { + "TestERC20Token": [ + 1455 + ] + } + }, + "children": [ + { + "attributes": { + "literals": [ + "solidity", + "0.4", + ".18" + ] + }, + "id": 1175, + "name": "PragmaDirective", + "src": "0:23:6" + }, + { + "attributes": { + "baseContracts": [ + null + ], + "contractDependencies": [ + null + ], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "linearizedBaseContracts": [ + 1455 + ], + "name": "TestERC20Token", + "scope": 1456 + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "name", + "scope": 1455, + "stateVariable": true, + "storageLocation": "default", + "type": "string storage ref", + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "string", + "type": "string storage pointer" + }, + "id": 1176, + "name": "ElementaryTypeName", + "src": "57:6:6" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "546573744552433230", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "string", + "type": "literal_string \"TestERC20\"", + "value": "TestERC20" + }, + "id": 1177, + "name": "Literal", + "src": "78:11:6" + } + ], + "id": 1178, + "name": "VariableDeclaration", + "src": "57:32:6" + }, + { + "attributes": { + "constant": false, + "name": "symbol", + "scope": 1455, + "stateVariable": true, + "storageLocation": "default", + "type": "string storage ref", + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "string", + "type": "string storage pointer" + }, + "id": 1179, + "name": "ElementaryTypeName", + "src": "95:6:6" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "54455354", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "string", + "type": "literal_string \"TEST\"", + "value": "TEST" + }, + "id": 1180, + "name": "Literal", + "src": "118:6:6" + } + ], + "id": 1181, + "name": "VariableDeclaration", + "src": "95:29:6" + }, + { + "attributes": { + "constant": false, + "name": "decimals", + "scope": 1455, + "stateVariable": true, + "storageLocation": "default", + "type": "uint256", + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 1182, + "name": "ElementaryTypeName", + "src": "130:7:6" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "3138", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 18", + "value": "18" + }, + "id": 1183, + "name": "Literal", + "src": "156:2:6" + } + ], + "id": 1184, + "name": "VariableDeclaration", + "src": "130:28:6" + }, + { + "attributes": { + "constant": false, + "name": "totalSupply", + "scope": 1455, + "stateVariable": true, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 1185, + "name": "ElementaryTypeName", + "src": "164:7:6" + } + ], + "id": 1186, + "name": "VariableDeclaration", + "src": "164:26:6" + }, + { + "attributes": { + "constant": false, + "name": "balances", + "scope": 1455, + "stateVariable": true, + "storageLocation": "default", + "type": "mapping(address => uint256)", + "value": null, + "visibility": "private" + }, + "children": [ + { + "attributes": { + "type": "mapping(address => uint256)" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 1187, + "name": "ElementaryTypeName", + "src": "205:7:6" + }, + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 1188, + "name": "ElementaryTypeName", + "src": "216:7:6" + } + ], + "id": 1189, + "name": "Mapping", + "src": "197:27:6" + } + ], + "id": 1190, + "name": "VariableDeclaration", + "src": "197:44:6" + }, + { + "attributes": { + "constant": false, + "name": "allowed", + "scope": 1455, + "stateVariable": true, + "storageLocation": "default", + "type": "mapping(address => mapping(address => uint256))", + "value": null, + "visibility": "private" + }, + "children": [ + { + "attributes": { + "type": "mapping(address => mapping(address => uint256))" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 1191, + "name": "ElementaryTypeName", + "src": "256:7:6" + }, + { + "attributes": { + "type": "mapping(address => uint256)" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 1192, + "name": "ElementaryTypeName", + "src": "276:7:6" + }, + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 1193, + "name": "ElementaryTypeName", + "src": "287:7:6" + } + ], + "id": 1194, + "name": "Mapping", + "src": "267:28:6" + } + ], + "id": 1195, + "name": "Mapping", + "src": "247:49:6" + } + ], + "id": 1196, + "name": "VariableDeclaration", + "src": "247:65:6" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": true, + "modifiers": [ + null + ], + "name": "TestERC20Token", + "payable": false, + "scope": 1455, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 1197, + "name": "ParameterList", + "src": "342:2:6" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 1198, + "name": "ParameterList", + "src": "352:0:6" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1186, + "type": "uint256", + "value": "totalSupply" + }, + "id": 1199, + "name": "Identifier", + "src": "362:11:6" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "*", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "hexvalue": "3130303030", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 10000", + "value": "10000" + }, + "id": 1200, + "name": "Literal", + "src": "376:5:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "**", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "hexvalue": "3130", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 10", + "value": "10" + }, + "id": 1201, + "name": "Literal", + "src": "385:2:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1184, + "type": "uint256", + "value": "decimals" + }, + "id": 1202, + "name": "Identifier", + "src": "391:8:6" + } + ], + "id": 1203, + "name": "BinaryOperation", + "src": "385:14:6" + } + ], + "id": 1204, + "name": "TupleExpression", + "src": "384:16:6" + } + ], + "id": 1205, + "name": "BinaryOperation", + "src": "376:24:6" + } + ], + "id": 1206, + "name": "Assignment", + "src": "362:38:6" + } + ], + "id": 1207, + "name": "ExpressionStatement", + "src": "362:38:6" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1190, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 1208, + "name": "Identifier", + "src": "410:8:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1498, + "type": "msg", + "value": "msg" + }, + "id": 1209, + "name": "Identifier", + "src": "419:3:6" + } + ], + "id": 1210, + "name": "MemberAccess", + "src": "419:10:6" + } + ], + "id": 1211, + "name": "IndexAccess", + "src": "410:20:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1186, + "type": "uint256", + "value": "totalSupply" + }, + "id": 1212, + "name": "Identifier", + "src": "433:11:6" + } + ], + "id": 1213, + "name": "Assignment", + "src": "410:34:6" + } + ], + "id": 1214, + "name": "ExpressionStatement", + "src": "410:34:6" + } + ], + "id": 1215, + "name": "Block", + "src": "352:99:6" + } + ], + "id": 1216, + "name": "FunctionDefinition", + "src": "319:132:6" + }, + { + "attributes": { + "anonymous": false, + "name": "Approval" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "indexed": true, + "name": "owner", + "scope": 1224, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 1217, + "name": "ElementaryTypeName", + "src": "472:7:6" + } + ], + "id": 1218, + "name": "VariableDeclaration", + "src": "472:21:6" + }, + { + "attributes": { + "constant": false, + "indexed": true, + "name": "spender", + "scope": 1224, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 1219, + "name": "ElementaryTypeName", + "src": "495:7:6" + } + ], + "id": 1220, + "name": "VariableDeclaration", + "src": "495:23:6" + }, + { + "attributes": { + "constant": false, + "indexed": false, + "name": "value", + "scope": 1224, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 1221, + "name": "ElementaryTypeName", + "src": "520:7:6" + } + ], + "id": 1222, + "name": "VariableDeclaration", + "src": "520:13:6" + } + ], + "id": 1223, + "name": "ParameterList", + "src": "471:63:6" + } + ], + "id": 1224, + "name": "EventDefinition", + "src": "457:78:6" + }, + { + "attributes": { + "anonymous": false, + "name": "Transfer" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "indexed": true, + "name": "from", + "scope": 1232, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 1225, + "name": "ElementaryTypeName", + "src": "555:7:6" + } + ], + "id": 1226, + "name": "VariableDeclaration", + "src": "555:20:6" + }, + { + "attributes": { + "constant": false, + "indexed": true, + "name": "to", + "scope": 1232, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 1227, + "name": "ElementaryTypeName", + "src": "577:7:6" + } + ], + "id": 1228, + "name": "VariableDeclaration", + "src": "577:18:6" + }, + { + "attributes": { + "constant": false, + "indexed": false, + "name": "value", + "scope": 1232, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 1229, + "name": "ElementaryTypeName", + "src": "597:7:6" + } + ], + "id": 1230, + "name": "VariableDeclaration", + "src": "597:13:6" + } + ], + "id": 1231, + "name": "ParameterList", + "src": "554:57:6" + } + ], + "id": 1232, + "name": "EventDefinition", + "src": "540:72:6" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "transfer", + "payable": false, + "scope": 1455, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "to", + "scope": 1283, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 1233, + "name": "ElementaryTypeName", + "src": "688:7:6" + } + ], + "id": 1234, + "name": "VariableDeclaration", + "src": "688:10:6" + }, + { + "attributes": { + "constant": false, + "name": "value", + "scope": 1283, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 1235, + "name": "ElementaryTypeName", + "src": "700:7:6" + } + ], + "id": 1236, + "name": "VariableDeclaration", + "src": "700:13:6" + } + ], + "id": 1237, + "name": "ParameterList", + "src": "687:27:6" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 1283, + "stateVariable": false, + "storageLocation": "default", + "type": "bool", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "bool", + "type": "bool" + }, + "id": 1238, + "name": "ElementaryTypeName", + "src": "731:4:6" + } + ], + "id": 1239, + "name": "VariableDeclaration", + "src": "731:4:6" + } + ], + "id": 1240, + "name": "ParameterList", + "src": "730:6:6" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1501, + "type": "function (bool) pure", + "value": "require" + }, + "id": 1241, + "name": "Identifier", + "src": "799:7:6" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "!=", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1234, + "type": "address", + "value": "to" + }, + "id": 1242, + "name": "Identifier", + "src": "807:2:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": true, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "address", + "type_conversion": true + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "type": "type(address)", + "value": "address" + }, + "id": 1243, + "name": "ElementaryTypeNameExpression", + "src": "813:7:6" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 1244, + "name": "Literal", + "src": "821:1:6" + } + ], + "id": 1245, + "name": "FunctionCall", + "src": "813:10:6" + } + ], + "id": 1246, + "name": "BinaryOperation", + "src": "807:16:6" + } + ], + "id": 1247, + "name": "FunctionCall", + "src": "799:25:6" + } + ], + "id": 1248, + "name": "ExpressionStatement", + "src": "799:25:6" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1190, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 1249, + "name": "Identifier", + "src": "835:8:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1498, + "type": "msg", + "value": "msg" + }, + "id": 1250, + "name": "Identifier", + "src": "844:3:6" + } + ], + "id": 1251, + "name": "MemberAccess", + "src": "844:10:6" + } + ], + "id": 1252, + "name": "IndexAccess", + "src": "835:20:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1430, + "type": "function (uint256,uint256) pure returns (uint256)", + "value": "safeSub" + }, + "id": 1253, + "name": "Identifier", + "src": "858:7:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1190, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 1254, + "name": "Identifier", + "src": "866:8:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1498, + "type": "msg", + "value": "msg" + }, + "id": 1255, + "name": "Identifier", + "src": "875:3:6" + } + ], + "id": 1256, + "name": "MemberAccess", + "src": "875:10:6" + } + ], + "id": 1257, + "name": "IndexAccess", + "src": "866:20:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1236, + "type": "uint256", + "value": "value" + }, + "id": 1258, + "name": "Identifier", + "src": "888:5:6" + } + ], + "id": 1259, + "name": "FunctionCall", + "src": "858:36:6" + } + ], + "id": 1260, + "name": "Assignment", + "src": "835:59:6" + } + ], + "id": 1261, + "name": "ExpressionStatement", + "src": "835:59:6" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1190, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 1262, + "name": "Identifier", + "src": "904:8:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1234, + "type": "address", + "value": "to" + }, + "id": 1263, + "name": "Identifier", + "src": "913:2:6" + } + ], + "id": 1264, + "name": "IndexAccess", + "src": "904:12:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1454, + "type": "function (uint256,uint256) pure returns (uint256)", + "value": "safeAdd" + }, + "id": 1265, + "name": "Identifier", + "src": "919:7:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1190, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 1266, + "name": "Identifier", + "src": "927:8:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1234, + "type": "address", + "value": "to" + }, + "id": 1267, + "name": "Identifier", + "src": "936:2:6" + } + ], + "id": 1268, + "name": "IndexAccess", + "src": "927:12:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1236, + "type": "uint256", + "value": "value" + }, + "id": 1269, + "name": "Identifier", + "src": "941:5:6" + } + ], + "id": 1270, + "name": "FunctionCall", + "src": "919:28:6" + } + ], + "id": 1271, + "name": "Assignment", + "src": "904:43:6" + } + ], + "id": 1272, + "name": "ExpressionStatement", + "src": "904:43:6" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1232, + "type": "function (address,address,uint256)", + "value": "Transfer" + }, + "id": 1273, + "name": "Identifier", + "src": "958:8:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1498, + "type": "msg", + "value": "msg" + }, + "id": 1274, + "name": "Identifier", + "src": "967:3:6" + } + ], + "id": 1275, + "name": "MemberAccess", + "src": "967:10:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1234, + "type": "address", + "value": "to" + }, + "id": 1276, + "name": "Identifier", + "src": "979:2:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1236, + "type": "uint256", + "value": "value" + }, + "id": 1277, + "name": "Identifier", + "src": "983:5:6" + } + ], + "id": 1278, + "name": "FunctionCall", + "src": "958:31:6" + } + ], + "id": 1279, + "name": "ExpressionStatement", + "src": "958:31:6" + }, + { + "attributes": { + "functionReturnParameters": 1240 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "hexvalue": "74727565", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "bool", + "type": "bool", + "value": "true" + }, + "id": 1280, + "name": "Literal", + "src": "1007:4:6" + } + ], + "id": 1281, + "name": "Return", + "src": "1000:11:6" + } + ], + "id": 1282, + "name": "Block", + "src": "737:281:6" + } + ], + "id": 1283, + "name": "FunctionDefinition", + "src": "670:348:6" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "transferFrom", + "payable": false, + "scope": 1455, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "from", + "scope": 1354, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 1284, + "name": "ElementaryTypeName", + "src": "1046:7:6" + } + ], + "id": 1285, + "name": "VariableDeclaration", + "src": "1046:12:6" + }, + { + "attributes": { + "constant": false, + "name": "to", + "scope": 1354, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 1286, + "name": "ElementaryTypeName", + "src": "1060:7:6" + } + ], + "id": 1287, + "name": "VariableDeclaration", + "src": "1060:10:6" + }, + { + "attributes": { + "constant": false, + "name": "value", + "scope": 1354, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 1288, + "name": "ElementaryTypeName", + "src": "1072:7:6" + } + ], + "id": 1289, + "name": "VariableDeclaration", + "src": "1072:13:6" + } + ], + "id": 1290, + "name": "ParameterList", + "src": "1045:41:6" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 1354, + "stateVariable": false, + "storageLocation": "default", + "type": "bool", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "bool", + "type": "bool" + }, + "id": 1291, + "name": "ElementaryTypeName", + "src": "1103:4:6" + } + ], + "id": 1292, + "name": "VariableDeclaration", + "src": "1103:4:6" + } + ], + "id": 1293, + "name": "ParameterList", + "src": "1102:6:6" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1501, + "type": "function (bool) pure", + "value": "require" + }, + "id": 1294, + "name": "Identifier", + "src": "1119:7:6" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "!=", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1287, + "type": "address", + "value": "to" + }, + "id": 1295, + "name": "Identifier", + "src": "1127:2:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": true, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "address", + "type_conversion": true + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "type": "type(address)", + "value": "address" + }, + "id": 1296, + "name": "ElementaryTypeNameExpression", + "src": "1133:7:6" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 1297, + "name": "Literal", + "src": "1141:1:6" + } + ], + "id": 1298, + "name": "FunctionCall", + "src": "1133:10:6" + } + ], + "id": 1299, + "name": "BinaryOperation", + "src": "1127:16:6" + } + ], + "id": 1300, + "name": "FunctionCall", + "src": "1119:25:6" + } + ], + "id": 1301, + "name": "ExpressionStatement", + "src": "1119:25:6" + }, + { + "attributes": { + "assignments": [ + 1303 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "allowance", + "scope": 1354, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 1302, + "name": "ElementaryTypeName", + "src": "1155:7:6" + } + ], + "id": 1303, + "name": "VariableDeclaration", + "src": "1155:17:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "mapping(address => uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1196, + "type": "mapping(address => mapping(address => uint256))", + "value": "allowed" + }, + "id": 1304, + "name": "Identifier", + "src": "1175:7:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1285, + "type": "address", + "value": "from" + }, + "id": 1305, + "name": "Identifier", + "src": "1183:4:6" + } + ], + "id": 1306, + "name": "IndexAccess", + "src": "1175:13:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1498, + "type": "msg", + "value": "msg" + }, + "id": 1307, + "name": "Identifier", + "src": "1189:3:6" + } + ], + "id": 1308, + "name": "MemberAccess", + "src": "1189:10:6" + } + ], + "id": 1309, + "name": "IndexAccess", + "src": "1175:25:6" + } + ], + "id": 1310, + "name": "VariableDeclarationStatement", + "src": "1155:45:6" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1190, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 1311, + "name": "Identifier", + "src": "1211:8:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1285, + "type": "address", + "value": "from" + }, + "id": 1312, + "name": "Identifier", + "src": "1220:4:6" + } + ], + "id": 1313, + "name": "IndexAccess", + "src": "1211:14:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1430, + "type": "function (uint256,uint256) pure returns (uint256)", + "value": "safeSub" + }, + "id": 1314, + "name": "Identifier", + "src": "1228:7:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1190, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 1315, + "name": "Identifier", + "src": "1236:8:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1285, + "type": "address", + "value": "from" + }, + "id": 1316, + "name": "Identifier", + "src": "1245:4:6" + } + ], + "id": 1317, + "name": "IndexAccess", + "src": "1236:14:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1289, + "type": "uint256", + "value": "value" + }, + "id": 1318, + "name": "Identifier", + "src": "1252:5:6" + } + ], + "id": 1319, + "name": "FunctionCall", + "src": "1228:30:6" + } + ], + "id": 1320, + "name": "Assignment", + "src": "1211:47:6" + } + ], + "id": 1321, + "name": "ExpressionStatement", + "src": "1211:47:6" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1190, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 1322, + "name": "Identifier", + "src": "1268:8:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1287, + "type": "address", + "value": "to" + }, + "id": 1323, + "name": "Identifier", + "src": "1277:2:6" + } + ], + "id": 1324, + "name": "IndexAccess", + "src": "1268:12:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1454, + "type": "function (uint256,uint256) pure returns (uint256)", + "value": "safeAdd" + }, + "id": 1325, + "name": "Identifier", + "src": "1283:7:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1190, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 1326, + "name": "Identifier", + "src": "1291:8:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1287, + "type": "address", + "value": "to" + }, + "id": 1327, + "name": "Identifier", + "src": "1300:2:6" + } + ], + "id": 1328, + "name": "IndexAccess", + "src": "1291:12:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1289, + "type": "uint256", + "value": "value" + }, + "id": 1329, + "name": "Identifier", + "src": "1305:5:6" + } + ], + "id": 1330, + "name": "FunctionCall", + "src": "1283:28:6" + } + ], + "id": 1331, + "name": "Assignment", + "src": "1268:43:6" + } + ], + "id": 1332, + "name": "ExpressionStatement", + "src": "1268:43:6" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "mapping(address => uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1196, + "type": "mapping(address => mapping(address => uint256))", + "value": "allowed" + }, + "id": 1333, + "name": "Identifier", + "src": "1321:7:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1285, + "type": "address", + "value": "from" + }, + "id": 1334, + "name": "Identifier", + "src": "1329:4:6" + } + ], + "id": 1337, + "name": "IndexAccess", + "src": "1321:13:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1498, + "type": "msg", + "value": "msg" + }, + "id": 1335, + "name": "Identifier", + "src": "1335:3:6" + } + ], + "id": 1336, + "name": "MemberAccess", + "src": "1335:10:6" + } + ], + "id": 1338, + "name": "IndexAccess", + "src": "1321:25:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1430, + "type": "function (uint256,uint256) pure returns (uint256)", + "value": "safeSub" + }, + "id": 1339, + "name": "Identifier", + "src": "1349:7:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1303, + "type": "uint256", + "value": "allowance" + }, + "id": 1340, + "name": "Identifier", + "src": "1357:9:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1289, + "type": "uint256", + "value": "value" + }, + "id": 1341, + "name": "Identifier", + "src": "1368:5:6" + } + ], + "id": 1342, + "name": "FunctionCall", + "src": "1349:25:6" + } + ], + "id": 1343, + "name": "Assignment", + "src": "1321:53:6" + } + ], + "id": 1344, + "name": "ExpressionStatement", + "src": "1321:53:6" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1232, + "type": "function (address,address,uint256)", + "value": "Transfer" + }, + "id": 1345, + "name": "Identifier", + "src": "1385:8:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1285, + "type": "address", + "value": "from" + }, + "id": 1346, + "name": "Identifier", + "src": "1394:4:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1287, + "type": "address", + "value": "to" + }, + "id": 1347, + "name": "Identifier", + "src": "1400:2:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1289, + "type": "uint256", + "value": "value" + }, + "id": 1348, + "name": "Identifier", + "src": "1404:5:6" + } + ], + "id": 1349, + "name": "FunctionCall", + "src": "1385:25:6" + } + ], + "id": 1350, + "name": "ExpressionStatement", + "src": "1385:25:6" + }, + { + "attributes": { + "functionReturnParameters": 1293 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "hexvalue": "74727565", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "bool", + "type": "bool", + "value": "true" + }, + "id": 1351, + "name": "Literal", + "src": "1428:4:6" + } + ], + "id": 1352, + "name": "Return", + "src": "1421:11:6" + } + ], + "id": 1353, + "name": "Block", + "src": "1109:330:6" + } + ], + "id": 1354, + "name": "FunctionDefinition", + "src": "1024:415:6" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "approve", + "payable": false, + "scope": 1455, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "spender", + "scope": 1382, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 1355, + "name": "ElementaryTypeName", + "src": "1462:7:6" + } + ], + "id": 1356, + "name": "VariableDeclaration", + "src": "1462:15:6" + }, + { + "attributes": { + "constant": false, + "name": "value", + "scope": 1382, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 1357, + "name": "ElementaryTypeName", + "src": "1479:7:6" + } + ], + "id": 1358, + "name": "VariableDeclaration", + "src": "1479:13:6" + } + ], + "id": 1359, + "name": "ParameterList", + "src": "1461:32:6" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 1382, + "stateVariable": false, + "storageLocation": "default", + "type": "bool", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "bool", + "type": "bool" + }, + "id": 1360, + "name": "ElementaryTypeName", + "src": "1510:4:6" + } + ], + "id": 1361, + "name": "VariableDeclaration", + "src": "1510:4:6" + } + ], + "id": 1362, + "name": "ParameterList", + "src": "1509:6:6" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "mapping(address => uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1196, + "type": "mapping(address => mapping(address => uint256))", + "value": "allowed" + }, + "id": 1363, + "name": "Identifier", + "src": "1526:7:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1498, + "type": "msg", + "value": "msg" + }, + "id": 1364, + "name": "Identifier", + "src": "1534:3:6" + } + ], + "id": 1365, + "name": "MemberAccess", + "src": "1534:10:6" + } + ], + "id": 1367, + "name": "IndexAccess", + "src": "1526:19:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1356, + "type": "address", + "value": "spender" + }, + "id": 1366, + "name": "Identifier", + "src": "1546:7:6" + } + ], + "id": 1368, + "name": "IndexAccess", + "src": "1526:28:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1358, + "type": "uint256", + "value": "value" + }, + "id": 1369, + "name": "Identifier", + "src": "1557:5:6" + } + ], + "id": 1370, + "name": "Assignment", + "src": "1526:36:6" + } + ], + "id": 1371, + "name": "ExpressionStatement", + "src": "1526:36:6" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1224, + "type": "function (address,address,uint256)", + "value": "Approval" + }, + "id": 1372, + "name": "Identifier", + "src": "1572:8:6" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1498, + "type": "msg", + "value": "msg" + }, + "id": 1373, + "name": "Identifier", + "src": "1581:3:6" + } + ], + "id": 1374, + "name": "MemberAccess", + "src": "1581:10:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1356, + "type": "address", + "value": "spender" + }, + "id": 1375, + "name": "Identifier", + "src": "1593:7:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1358, + "type": "uint256", + "value": "value" + }, + "id": 1376, + "name": "Identifier", + "src": "1602:5:6" + } + ], + "id": 1377, + "name": "FunctionCall", + "src": "1572:36:6" + } + ], + "id": 1378, + "name": "ExpressionStatement", + "src": "1572:36:6" + }, + { + "attributes": { + "functionReturnParameters": 1362 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "hexvalue": "74727565", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "bool", + "type": "bool", + "value": "true" + }, + "id": 1379, + "name": "Literal", + "src": "1626:4:6" + } + ], + "id": 1380, + "name": "Return", + "src": "1619:11:6" + } + ], + "id": 1381, + "name": "Block", + "src": "1516:121:6" + } + ], + "id": 1382, + "name": "FunctionDefinition", + "src": "1445:192:6" + }, + { + "attributes": { + "constant": true, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "allowance", + "payable": false, + "scope": 1455, + "stateMutability": "view", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "owner", + "scope": 1398, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 1383, + "name": "ElementaryTypeName", + "src": "1662:7:6" + } + ], + "id": 1384, + "name": "VariableDeclaration", + "src": "1662:13:6" + }, + { + "attributes": { + "constant": false, + "name": "spender", + "scope": 1398, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 1385, + "name": "ElementaryTypeName", + "src": "1677:7:6" + } + ], + "id": 1386, + "name": "VariableDeclaration", + "src": "1677:15:6" + } + ], + "id": 1387, + "name": "ParameterList", + "src": "1661:32:6" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "remaining", + "scope": 1398, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 1388, + "name": "ElementaryTypeName", + "src": "1715:7:6" + } + ], + "id": 1389, + "name": "VariableDeclaration", + "src": "1715:17:6" + } + ], + "id": 1390, + "name": "ParameterList", + "src": "1714:19:6" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 1390 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "mapping(address => uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1196, + "type": "mapping(address => mapping(address => uint256))", + "value": "allowed" + }, + "id": 1391, + "name": "Identifier", + "src": "1751:7:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1384, + "type": "address", + "value": "owner" + }, + "id": 1392, + "name": "Identifier", + "src": "1759:5:6" + } + ], + "id": 1393, + "name": "IndexAccess", + "src": "1751:14:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1386, + "type": "address", + "value": "spender" + }, + "id": 1394, + "name": "Identifier", + "src": "1766:7:6" + } + ], + "id": 1395, + "name": "IndexAccess", + "src": "1751:23:6" + } + ], + "id": 1396, + "name": "Return", + "src": "1744:30:6" + } + ], + "id": 1397, + "name": "Block", + "src": "1734:47:6" + } + ], + "id": 1398, + "name": "FunctionDefinition", + "src": "1643:138:6" + }, + { + "attributes": { + "constant": true, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "balanceOf", + "payable": false, + "scope": 1455, + "stateMutability": "view", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "owner", + "scope": 1410, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 1399, + "name": "ElementaryTypeName", + "src": "1806:7:6" + } + ], + "id": 1400, + "name": "VariableDeclaration", + "src": "1806:13:6" + } + ], + "id": 1401, + "name": "ParameterList", + "src": "1805:15:6" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "balance", + "scope": 1410, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 1402, + "name": "ElementaryTypeName", + "src": "1842:7:6" + } + ], + "id": 1403, + "name": "VariableDeclaration", + "src": "1842:15:6" + } + ], + "id": 1404, + "name": "ParameterList", + "src": "1841:17:6" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 1404 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1190, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 1405, + "name": "Identifier", + "src": "1876:8:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1400, + "type": "address", + "value": "owner" + }, + "id": 1406, + "name": "Identifier", + "src": "1885:5:6" + } + ], + "id": 1407, + "name": "IndexAccess", + "src": "1876:15:6" + } + ], + "id": 1408, + "name": "Return", + "src": "1869:22:6" + } + ], + "id": 1409, + "name": "Block", + "src": "1859:39:6" + } + ], + "id": 1410, + "name": "FunctionDefinition", + "src": "1787:111:6" + }, + { + "attributes": { + "constant": true, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "safeSub", + "payable": false, + "scope": 1455, + "stateMutability": "pure", + "superFunction": null, + "visibility": "private" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "a", + "scope": 1430, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 1411, + "name": "ElementaryTypeName", + "src": "1921:7:6" + } + ], + "id": 1412, + "name": "VariableDeclaration", + "src": "1921:9:6" + }, + { + "attributes": { + "constant": false, + "name": "b", + "scope": 1430, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 1413, + "name": "ElementaryTypeName", + "src": "1932:7:6" + } + ], + "id": 1414, + "name": "VariableDeclaration", + "src": "1932:9:6" + } + ], + "id": 1415, + "name": "ParameterList", + "src": "1920:22:6" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 1430, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 1416, + "name": "ElementaryTypeName", + "src": "1965:7:6" + } + ], + "id": 1417, + "name": "VariableDeclaration", + "src": "1965:7:6" + } + ], + "id": 1418, + "name": "ParameterList", + "src": "1964:9:6" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1489, + "type": "function (bool) pure", + "value": "assert" + }, + "id": 1419, + "name": "Identifier", + "src": "1984:6:6" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "<=", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1414, + "type": "uint256", + "value": "b" + }, + "id": 1420, + "name": "Identifier", + "src": "1991:1:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1412, + "type": "uint256", + "value": "a" + }, + "id": 1421, + "name": "Identifier", + "src": "1996:1:6" + } + ], + "id": 1422, + "name": "BinaryOperation", + "src": "1991:6:6" + } + ], + "id": 1423, + "name": "FunctionCall", + "src": "1984:14:6" + } + ], + "id": 1424, + "name": "ExpressionStatement", + "src": "1984:14:6" + }, + { + "attributes": { + "functionReturnParameters": 1418 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "-", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1412, + "type": "uint256", + "value": "a" + }, + "id": 1425, + "name": "Identifier", + "src": "2015:1:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1414, + "type": "uint256", + "value": "b" + }, + "id": 1426, + "name": "Identifier", + "src": "2019:1:6" + } + ], + "id": 1427, + "name": "BinaryOperation", + "src": "2015:5:6" + } + ], + "id": 1428, + "name": "Return", + "src": "2008:12:6" + } + ], + "id": 1429, + "name": "Block", + "src": "1974:53:6" + } + ], + "id": 1430, + "name": "FunctionDefinition", + "src": "1904:123:6" + }, + { + "attributes": { + "constant": true, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "safeAdd", + "payable": false, + "scope": 1455, + "stateMutability": "pure", + "superFunction": null, + "visibility": "private" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "a", + "scope": 1454, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 1431, + "name": "ElementaryTypeName", + "src": "2050:7:6" + } + ], + "id": 1432, + "name": "VariableDeclaration", + "src": "2050:9:6" + }, + { + "attributes": { + "constant": false, + "name": "b", + "scope": 1454, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 1433, + "name": "ElementaryTypeName", + "src": "2061:7:6" + } + ], + "id": 1434, + "name": "VariableDeclaration", + "src": "2061:9:6" + } + ], + "id": 1435, + "name": "ParameterList", + "src": "2049:22:6" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 1454, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 1436, + "name": "ElementaryTypeName", + "src": "2094:7:6" + } + ], + "id": 1437, + "name": "VariableDeclaration", + "src": "2094:7:6" + } + ], + "id": 1438, + "name": "ParameterList", + "src": "2093:9:6" + }, + { + "children": [ + { + "attributes": { + "assignments": [ + 1440 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "c", + "scope": 1454, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 1439, + "name": "ElementaryTypeName", + "src": "2113:7:6" + } + ], + "id": 1440, + "name": "VariableDeclaration", + "src": "2113:9:6" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "+", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1432, + "type": "uint256", + "value": "a" + }, + "id": 1441, + "name": "Identifier", + "src": "2125:1:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1434, + "type": "uint256", + "value": "b" + }, + "id": 1442, + "name": "Identifier", + "src": "2129:1:6" + } + ], + "id": 1443, + "name": "BinaryOperation", + "src": "2125:5:6" + } + ], + "id": 1444, + "name": "VariableDeclarationStatement", + "src": "2113:17:6" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1489, + "type": "function (bool) pure", + "value": "assert" + }, + "id": 1445, + "name": "Identifier", + "src": "2140:6:6" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": ">=", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1440, + "type": "uint256", + "value": "c" + }, + "id": 1446, + "name": "Identifier", + "src": "2147:1:6" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1432, + "type": "uint256", + "value": "a" + }, + "id": 1447, + "name": "Identifier", + "src": "2152:1:6" + } + ], + "id": 1448, + "name": "BinaryOperation", + "src": "2147:6:6" + } + ], + "id": 1449, + "name": "FunctionCall", + "src": "2140:14:6" + } + ], + "id": 1450, + "name": "ExpressionStatement", + "src": "2140:14:6" + }, + { + "attributes": { + "functionReturnParameters": 1438 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1440, + "type": "uint256", + "value": "c" + }, + "id": 1451, + "name": "Identifier", + "src": "2171:1:6" + } + ], + "id": 1452, + "name": "Return", + "src": "2164:8:6" + } + ], + "id": 1453, + "name": "Block", + "src": "2103:76:6" + } + ], + "id": 1454, + "name": "FunctionDefinition", + "src": "2033:146:6" + } + ], + "id": 1455, + "name": "ContractDefinition", + "src": "26:2155:6" + } + ], + "id": 1456, + "name": "SourceUnit", + "src": "0:2182:6" + }, + "compiler": { + "name": "solc", + "version": "0.4.18+commit.9cf6e910.Emscripten.clang" + }, + "networks": {}, + "schemaVersion": "1.0.1", + "updatedAt": "2017-12-09T23:00:14.498Z" +} \ No newline at end of file diff --git a/build/contracts/TipsWallet.json b/build/contracts/TipsWallet.json new file mode 100644 index 0000000..ccc3283 --- /dev/null +++ b/build/contracts/TipsWallet.json @@ -0,0 +1,745 @@ +{ + "contractName": "TipsWallet", + "abi": [ + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + } + ], + "name": "owners", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "cancelRecovery", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "account", + "type": "address" + } + ], + "name": "isOwner", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "v", + "type": "uint8[]" + }, + { + "name": "r", + "type": "bytes32[]" + }, + { + "name": "s", + "type": "bytes32[]" + }, + { + "name": "newOwners", + "type": "address[]" + } + ], + "name": "transferOwnership", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "newOwners", + "type": "address[]" + } + ], + "name": "confirmRecovery", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "recoveryHash", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "recoveryBlock", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "recoveryBlockOffset", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "nonce", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "newOwners", + "type": "address[]" + } + ], + "name": "startRecovery", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "listOwners", + "outputs": [ + { + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "v", + "type": "uint8[]" + }, + { + "name": "r", + "type": "bytes32[]" + }, + { + "name": "s", + "type": "bytes32[]" + }, + { + "name": "destination", + "type": "address" + }, + { + "name": "value", + "type": "uint256" + }, + { + "name": "data", + "type": "bytes" + } + ], + "name": "execute", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "name": "_owners", + "type": "address[]" + }, + { + "name": "_recoveryBlockOffset", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "payable": true, + "stateMutability": "payable", + "type": "fallback" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": false, + "name": "newOwners", + "type": "address[]" + } + ], + "name": "RecoveryStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + } + ], + "name": "RecoveryCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": false, + "name": "newOwners", + "type": "address[]" + } + ], + "name": "RecoveryConfirmed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "previousOwners", + "type": "address[]" + }, + { + "indexed": false, + "name": "newOwners", + "type": "address[]" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Deposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "destination", + "type": "address" + }, + { + "indexed": false, + "name": "nonce", + "type": "uint256" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "name": "data", + "type": "bytes" + } + ], + "name": "Executed", + "type": "event" + } + ], + "bytecode": "0x606060405234156200001057600080fd5b6040516200169638038062001696833981016040528080518201919060200180519060200190919050508181838480600081511115156200005057600080fd5b8160019080519060200190620000689291906200007d565b50505050806002819055505050505062000152565b828054828255906000526020600020908101928215620000f9579160200282015b82811115620000f85782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906200009e565b5b5090506200010891906200010c565b5090565b6200014f91905b808211156200014b57600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010162000113565b5090565b90565b61153480620001626000396000f3006060604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c27146101145780630ba234d6146101775780632f54bf6e1461018c57806335d9c92d146101dd57806352f2aeac146102f75780636102495c14610351578063794ee3d9146103825780637a7c1e52146103ab578063affed0e0146103d4578063b1b3a744146103fd578063ed60c0fc14610457578063f12d394f146104c1575b6000341115610112573373ffffffffffffffffffffffffffffffffffffffff167f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4346040518082815260200191505060405180910390a25b005b341561011f57600080fd5b6101356004808035906020019091905050610606565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561018257600080fd5b61018a610645565b005b341561019757600080fd5b6101c3600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506106b7565b604051808215151515815260200191505060405180910390f35b34156101e857600080fd5b6102f560048080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190505061075b565b005b341561030257600080fd5b61034f600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050610be5565b005b341561035c57600080fd5b610364610d2c565b60405180826000191660001916815260200191505060405180910390f35b341561038d57600080fd5b610395610d32565b6040518082815260200191505060405180910390f35b34156103b657600080fd5b6103be610d38565b6040518082815260200191505060405180910390f35b34156103df57600080fd5b6103e7610d3e565b6040518082815260200191505060405180910390f35b341561040857600080fd5b610455600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050610d44565b005b341561046257600080fd5b61046a610e50565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104ad578082015181840152602081019050610492565b505050509050019250505060405180910390f35b34156104cc57600080fd5b610604600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610ee4565b005b60018181548110151561061557fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61064e336106b7565b151561065957600080fd5b600060035411151561066a57600080fd5b610672611419565b3373ffffffffffffffffffffffffffffffffffffffff167f8154b6c5e1fc90d44b49808ef93f9739148d0821411890f8cd684385e24b9f1e60405160405180910390a2565b600080600090505b600180549050811015610750576001818154811015156106db57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107435760019150610755565b80806001019150506106bf565b600091505b50919050565b806000815111151561076c57600080fd5b84848460197f01000000000000000000000000000000000000000000000000000000000000000260007f010000000000000000000000000000000000000000000000000000000000000002308760005460405180867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401838051906020019060200280838360005b838110156108c15780820151818401526020810190506108a6565b5050505090500182815260200195505050505050604051809103902060008060018054905086511480156108fa57506001805490508551145b801561090b57506001805490508451145b151561091657600080fd5b8260405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01826000191660001916815260200191505060405180910390209150600090505b600180549050811015610abc5760018181548110151561097f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660018388848151811015156109d257fe5b9060200190602002015188858151811015156109ea57fe5b906020019060200201518886815181101515610a0257fe5b90602001906020020151604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f11515610a8457600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff16141515610aaf57600080fd5b8080600101915050610963565b7fe62c04bb3499d4f432a50e07318d42861c4865afb22ee4cfe403d4f9455070906001896040518080602001806020018381038352858181548152602001915080548015610b5f57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610b15575b5050838103825284818151815260200191508051906020019060200280838360005b83811015610b9c578082015181840152602081019050610b81565b5050505090500194505050505060405180910390a18760019080519060200190610bc7929190611427565b50600160008082825401925050819055505050505050505050505050565b610bee336106b7565b1515610bf957600080fd5b6000600354111515610c0a57600080fd5b600254600354014310151515610c1f57600080fd5b80600454600019168160405180828051906020019060200280838360005b83811015610c58578082015181840152602081019050610c3d565b50505050905001915050604051809103902060001916141515610c7a57600080fd5b8160019080519060200190610c90929190611427565b50610c99611419565b3373ffffffffffffffffffffffffffffffffffffffff167fbb05e5746c88b170afb20d94797c3645f9822720fc2601b59137820c2fa5c984836040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d15578082015181840152602081019050610cfa565b505050509050019250505060405180910390a25050565b60045481565b60035481565b60025481565b60005481565b610d4d336106b7565b1515610d5857600080fd5b8060008151111515610d6957600080fd5b436003819055508160405180828051906020019060200280838360005b83811015610da1578082015181840152602081019050610d86565b505050509050019150506040518091039020600481600019169055503373ffffffffffffffffffffffffffffffffffffffff167fb1b6ebc5dd19ea5b01feac6392231a6142251ad4951bdb0491c58485dffc2883836040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610e39578082015181840152602081019050610e1e565b505050509050019250505060405180910390a25050565b610e586114b1565b6001805480602002602001604051908101604052809291908181526020018280548015610eda57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610e90575b5050505050905090565b85858560197f01000000000000000000000000000000000000000000000000000000000000000260007f0100000000000000000000000000000000000000000000000000000000000000023088888860005460405180887effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101877effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140184815260200183805190602001908083835b6020831015156110875780518252602082019150602081019050602083039250611062565b6001836020036101000a038019825116818451168082178552505050505050905001828152602001975050505050505050604051809103902060008060018054905086511480156110dd57506001805490508551145b80156110ee57506001805490508451145b15156110f957600080fd5b8260405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01826000191660001916815260200191505060405180910390209150600090505b60018054905081101561129f5760018181548110151561116257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660018388848151811015156111b557fe5b9060200190602002015188858151811015156111cd57fe5b9060200190602002015188868151811015156111e557fe5b90602001906020020151604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561126757600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff1614151561129257600080fd5b8080600101915050611146565b8873ffffffffffffffffffffffffffffffffffffffff167f30dc9a249e121dc7ec74559d42f94e60bb91eb25e06df470ed1be2a02a9d7a046000548a8a6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561132857808201518184015260208101905061130d565b50505050905090810190601f1680156113555780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a28873ffffffffffffffffffffffffffffffffffffffff16888860405180828051906020019080838360005b838110156113aa57808201518184015260208101905061138f565b50505050905090810190601f1680156113d75780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876187965a03f19250505015156113fb57600080fd5b60016000808282540192505081905550505050505050505050505050565b600360009055600460009055565b8280548282559060005260206000209081019282156114a0579160200282015b8281111561149f5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190611447565b5b5090506114ad91906114c5565b5090565b602060405190810160405280600081525090565b61150591905b8082111561150157600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506001016114cb565b5090565b905600a165627a7a72305820deaf537190277edfbf6b4105f9ada7de7a3699c4ba74333370866c59f91f3d3a0029", + "deployedBytecode": "0x6060604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c27146101145780630ba234d6146101775780632f54bf6e1461018c57806335d9c92d146101dd57806352f2aeac146102f75780636102495c14610351578063794ee3d9146103825780637a7c1e52146103ab578063affed0e0146103d4578063b1b3a744146103fd578063ed60c0fc14610457578063f12d394f146104c1575b6000341115610112573373ffffffffffffffffffffffffffffffffffffffff167f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4346040518082815260200191505060405180910390a25b005b341561011f57600080fd5b6101356004808035906020019091905050610606565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561018257600080fd5b61018a610645565b005b341561019757600080fd5b6101c3600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506106b7565b604051808215151515815260200191505060405180910390f35b34156101e857600080fd5b6102f560048080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190505061075b565b005b341561030257600080fd5b61034f600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050610be5565b005b341561035c57600080fd5b610364610d2c565b60405180826000191660001916815260200191505060405180910390f35b341561038d57600080fd5b610395610d32565b6040518082815260200191505060405180910390f35b34156103b657600080fd5b6103be610d38565b6040518082815260200191505060405180910390f35b34156103df57600080fd5b6103e7610d3e565b6040518082815260200191505060405180910390f35b341561040857600080fd5b610455600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050610d44565b005b341561046257600080fd5b61046a610e50565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104ad578082015181840152602081019050610492565b505050509050019250505060405180910390f35b34156104cc57600080fd5b610604600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610ee4565b005b60018181548110151561061557fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61064e336106b7565b151561065957600080fd5b600060035411151561066a57600080fd5b610672611419565b3373ffffffffffffffffffffffffffffffffffffffff167f8154b6c5e1fc90d44b49808ef93f9739148d0821411890f8cd684385e24b9f1e60405160405180910390a2565b600080600090505b600180549050811015610750576001818154811015156106db57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107435760019150610755565b80806001019150506106bf565b600091505b50919050565b806000815111151561076c57600080fd5b84848460197f01000000000000000000000000000000000000000000000000000000000000000260007f010000000000000000000000000000000000000000000000000000000000000002308760005460405180867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401838051906020019060200280838360005b838110156108c15780820151818401526020810190506108a6565b5050505090500182815260200195505050505050604051809103902060008060018054905086511480156108fa57506001805490508551145b801561090b57506001805490508451145b151561091657600080fd5b8260405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01826000191660001916815260200191505060405180910390209150600090505b600180549050811015610abc5760018181548110151561097f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660018388848151811015156109d257fe5b9060200190602002015188858151811015156109ea57fe5b906020019060200201518886815181101515610a0257fe5b90602001906020020151604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f11515610a8457600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff16141515610aaf57600080fd5b8080600101915050610963565b7fe62c04bb3499d4f432a50e07318d42861c4865afb22ee4cfe403d4f9455070906001896040518080602001806020018381038352858181548152602001915080548015610b5f57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610b15575b5050838103825284818151815260200191508051906020019060200280838360005b83811015610b9c578082015181840152602081019050610b81565b5050505090500194505050505060405180910390a18760019080519060200190610bc7929190611427565b50600160008082825401925050819055505050505050505050505050565b610bee336106b7565b1515610bf957600080fd5b6000600354111515610c0a57600080fd5b600254600354014310151515610c1f57600080fd5b80600454600019168160405180828051906020019060200280838360005b83811015610c58578082015181840152602081019050610c3d565b50505050905001915050604051809103902060001916141515610c7a57600080fd5b8160019080519060200190610c90929190611427565b50610c99611419565b3373ffffffffffffffffffffffffffffffffffffffff167fbb05e5746c88b170afb20d94797c3645f9822720fc2601b59137820c2fa5c984836040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d15578082015181840152602081019050610cfa565b505050509050019250505060405180910390a25050565b60045481565b60035481565b60025481565b60005481565b610d4d336106b7565b1515610d5857600080fd5b8060008151111515610d6957600080fd5b436003819055508160405180828051906020019060200280838360005b83811015610da1578082015181840152602081019050610d86565b505050509050019150506040518091039020600481600019169055503373ffffffffffffffffffffffffffffffffffffffff167fb1b6ebc5dd19ea5b01feac6392231a6142251ad4951bdb0491c58485dffc2883836040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610e39578082015181840152602081019050610e1e565b505050509050019250505060405180910390a25050565b610e586114b1565b6001805480602002602001604051908101604052809291908181526020018280548015610eda57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610e90575b5050505050905090565b85858560197f01000000000000000000000000000000000000000000000000000000000000000260007f0100000000000000000000000000000000000000000000000000000000000000023088888860005460405180887effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101877effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140184815260200183805190602001908083835b6020831015156110875780518252602082019150602081019050602083039250611062565b6001836020036101000a038019825116818451168082178552505050505050905001828152602001975050505050505050604051809103902060008060018054905086511480156110dd57506001805490508551145b80156110ee57506001805490508451145b15156110f957600080fd5b8260405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01826000191660001916815260200191505060405180910390209150600090505b60018054905081101561129f5760018181548110151561116257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660018388848151811015156111b557fe5b9060200190602002015188858151811015156111cd57fe5b9060200190602002015188868151811015156111e557fe5b90602001906020020151604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561126757600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff1614151561129257600080fd5b8080600101915050611146565b8873ffffffffffffffffffffffffffffffffffffffff167f30dc9a249e121dc7ec74559d42f94e60bb91eb25e06df470ed1be2a02a9d7a046000548a8a6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561132857808201518184015260208101905061130d565b50505050905090810190601f1680156113555780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a28873ffffffffffffffffffffffffffffffffffffffff16888860405180828051906020019080838360005b838110156113aa57808201518184015260208101905061138f565b50505050905090810190601f1680156113d75780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876187965a03f19250505015156113fb57600080fd5b60016000808282540192505081905550505050505050505050505050565b600360009055600460009055565b8280548282559060005260206000209081019282156114a0579160200282015b8281111561149f5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190611447565b5b5090506114ad91906114c5565b5090565b602060405190810160405280600081525090565b61150591905b8082111561150157600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506001016114cb565b5090565b905600a165627a7a72305820deaf537190277edfbf6b4105f9ada7de7a3699c4ba74333370866c59f91f3d3a0029", + "sourceMap": "152:384:7:-;;;275:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;451:7;460:20;414:7;376;180::2;959:1;940:9;:16;:20;932:29;;;;;;;;212:7;203:6;:16;;;;;;;;;;;;:::i;:::-;;107:119;;143:101:4;363:20:3;341:19;:42;;;;208:182;;275:218:7;;152:384;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", + "deployedSourceMap": "152:384:7:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1037:1:2;1025:9;:13;1021:76;;;1064:10;1054:32;;;1076:9;1054:32;;;;;;;;;;;;;;;;;;1021:76;152:384:7;77:23:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1311:163:3;;;;;;;;;;;;;;1747:238;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;371:343:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1480:261:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;174:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;140:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51:20:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1053:252:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1109:84:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;1199:480:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1311:163:3:-;629:19;637:10;629:7;:19::i;:::-;621:28;;;;;;;;738:1;722:13;;:17;714:26;;;;;;;;1412:15;:13;:15::i;:::-;1456:10;1438:29;;;;;;;;;;;;1311:163::o;1747:238::-;1802:4;1823:9;1835:1;1823:13;;1818:138;1842:6;:13;;;;1838:1;:17;1818:138;;;1891:6;1898:1;1891:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;1880:20;;:7;:20;;;1876:70;;;1927:4;1920:11;;;;1876:70;1857:3;;;;;;;1818:138;;;1973:5;1966:12;;1747:238;;;;;:::o;371:343:4:-;530:9;959:1:2;940:9;:16;:20;932:29;;;;;;;;560:1:4;563;566;584:4;579:10;;596:1;591:7;;600:4;606:9;617:5;;569:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;618:20:2;707:9;497:6;:13;;;;485:1;:8;:25;484:70;;;;;540:6;:13;;;;528:1;:8;:25;484:70;:113;;;;;583:6;:13;;;;571:1;:8;:25;484:113;463:144;;;;;;;;687:4;641:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;618:74;;719:1;707:13;;702:132;726:6;:13;;;;722:1;:17;702:132;;;813:6;820:1;813:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;768:54;;:41;778:12;792:1;794;792:4;;;;;;;;;;;;;;;;;;798:1;800;798:4;;;;;;;;;;;;;;;;;;804:1;806;804:4;;;;;;;;;;;;;;;;;;768:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:54;;;760:63;;;;;;;;741:3;;;;;;;702:132;;;639:39:4;660:6;668:9;639:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;698:9:4;689:6;:18;;;;;;;;;;;;:::i;:::-;;865:1:2;856:5;;:10;;;;;;;;;;;971:1;;;;;;371:343:4;;;;;:::o;1480:261:3:-;629:19;637:10;629:7;:19::i;:::-;621:28;;;;;;;;828:1;812:13;;:17;804:26;;;;;;;;880:19;;864:13;;:35;848:12;:51;;840:60;;;;;;;;1614:9;1016:12;;992:36;;;1002:9;992:20;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;992:36:3;;;;984:45;;;;;;;;1648:9;1639:6;:18;;;;;;;;;;;;:::i;:::-;;1668:15;:13;:15::i;:::-;1712:10;1694:40;;;1724:9;1694:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;910:1:3;1480:261;:::o;174:27::-;;;;:::o;140:28::-;;;;:::o;100:34::-;;;;:::o;51:20:2:-;;;;:::o;1053:252:3:-;629:19;637:10;629:7;:19::i;:::-;621:28;;;;;;;;1151:9;959:1:2;940:9;:16;:20;932:29;;;;;;;;1192:12:3;1176:13;:28;;;;1239:9;1229:20;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;1214:12:3;:35;;;;;;;1276:10;1260:38;;;1288:9;1260:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;659:1:3;1053:252;:::o;1109:84:2:-;1152:9;;:::i;:::-;1180:6;1173:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1109:84;:::o;1199:480::-;1389:1;1392;1395;1413:4;1408:10;;1425:1;1420:7;;1429:4;1435:11;1448:5;1455:4;1461:5;;1398:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;618:20:2;707:9;497:6;:13;;;;485:1;:8;:25;484:70;;;;;540:6;:13;;;;528:1;:8;:25;484:70;:113;;;;;583:6;:13;;;;571:1;:8;:25;484:113;463:144;;;;;;;;687:4;641:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;618:74;;719:1;707:13;;702:132;726:6;:13;;;;722:1;:17;702:132;;;813:6;820:1;813:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;768:54;;:41;778:12;792:1;794;792:4;;;;;;;;;;;;;;;;;;798:1;800;798:4;;;;;;;;;;;;;;;;;;804:1;806;804:4;;;;;;;;;;;;;;;;;;768:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:54;;;760:63;;;;;;;;741:3;;;;;;;702:132;;;1492:11;1483:41;;;1505:5;;1512;1519:4;1483:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1590:11:2;:16;;1613:5;1620:4;1590:35;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1582:44:2;;;;;;;;865:1;856:5;;:10;;;;;;;;;;;1199:480;;;;;;;;;;;;:::o;1991:99:3:-;2041:13;2034:20;;;2071:12;2064:19;;;1991:99::o;152:384:7:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", + "source": "pragma solidity 0.4.18;\n\nimport \"./MultiSig/MultiSig.sol\";\nimport \"./MultiSig/TransferableMultiSig.sol\";\nimport \"./MultiSig/RecoverableMultiSig.sol\";\n\n\ncontract TipsWallet is MultiSig, TransferableMultiSig, RecoverableMultiSig {\n /* solhint-disable no-empty-blocks */\n function TipsWallet(address[] _owners, uint256 _recoveryBlockOffset)\n public\n MultiSig(_owners)\n TransferableMultiSig(_owners)\n RecoverableMultiSig(_owners, _recoveryBlockOffset)\n {\n }\n /* solhint-enable no-empty-blocks */\n}\n", + "sourcePath": "/home/js/Projects/js/signhash/signhash-contracts/contracts/TipsWallet.sol", + "ast": { + "attributes": { + "absolutePath": "/home/js/Projects/js/signhash/signhash-contracts/contracts/TipsWallet.sol", + "exportedSymbols": { + "TipsWallet": [ + 1486 + ] + } + }, + "children": [ + { + "attributes": { + "literals": [ + "solidity", + "0.4", + ".18" + ] + }, + "id": 1457, + "name": "PragmaDirective", + "src": "0:23:7" + }, + { + "attributes": { + "SourceUnit": 607, + "absolutePath": "/home/js/Projects/js/signhash/signhash-contracts/contracts/MultiSig/MultiSig.sol", + "file": "./MultiSig/MultiSig.sol", + "scope": 1487, + "symbolAliases": [ + null + ], + "unitAlias": "" + }, + "id": 1458, + "name": "ImportDirective", + "src": "25:33:7" + }, + { + "attributes": { + "SourceUnit": 890, + "absolutePath": "/home/js/Projects/js/signhash/signhash-contracts/contracts/MultiSig/TransferableMultiSig.sol", + "file": "./MultiSig/TransferableMultiSig.sol", + "scope": 1487, + "symbolAliases": [ + null + ], + "unitAlias": "" + }, + "id": 1459, + "name": "ImportDirective", + "src": "59:45:7" + }, + { + "attributes": { + "SourceUnit": 822, + "absolutePath": "/home/js/Projects/js/signhash/signhash-contracts/contracts/MultiSig/RecoverableMultiSig.sol", + "file": "./MultiSig/RecoverableMultiSig.sol", + "scope": 1487, + "symbolAliases": [ + null + ], + "unitAlias": "" + }, + "id": 1460, + "name": "ImportDirective", + "src": "105:44:7" + }, + { + "attributes": { + "contractDependencies": [ + 606, + 821, + 889 + ], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "linearizedBaseContracts": [ + 1486, + 821, + 889, + 606 + ], + "name": "TipsWallet", + "scope": 1487 + }, + "children": [ + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "contractScope": null, + "name": "MultiSig", + "referencedDeclaration": 606, + "type": "contract MultiSig" + }, + "id": 1461, + "name": "UserDefinedTypeName", + "src": "175:8:7" + } + ], + "id": 1462, + "name": "InheritanceSpecifier", + "src": "175:8:7" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "contractScope": null, + "name": "TransferableMultiSig", + "referencedDeclaration": 889, + "type": "contract TransferableMultiSig" + }, + "id": 1463, + "name": "UserDefinedTypeName", + "src": "185:20:7" + } + ], + "id": 1464, + "name": "InheritanceSpecifier", + "src": "185:20:7" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "contractScope": null, + "name": "RecoverableMultiSig", + "referencedDeclaration": 821, + "type": "contract RecoverableMultiSig" + }, + "id": 1465, + "name": "UserDefinedTypeName", + "src": "207:19:7" + } + ], + "id": 1466, + "name": "InheritanceSpecifier", + "src": "207:19:7" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": true, + "name": "TipsWallet", + "payable": false, + "scope": 1486, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "_owners", + "scope": 1485, + "stateVariable": false, + "storageLocation": "default", + "type": "address[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "address[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 1467, + "name": "ElementaryTypeName", + "src": "295:7:7" + } + ], + "id": 1468, + "name": "ArrayTypeName", + "src": "295:9:7" + } + ], + "id": 1469, + "name": "VariableDeclaration", + "src": "295:17:7" + }, + { + "attributes": { + "constant": false, + "name": "_recoveryBlockOffset", + "scope": 1485, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 1470, + "name": "ElementaryTypeName", + "src": "314:7:7" + } + ], + "id": 1471, + "name": "VariableDeclaration", + "src": "314:28:7" + } + ], + "id": 1472, + "name": "ParameterList", + "src": "294:49:7" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 1483, + "name": "ParameterList", + "src": "486:0:7" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 606, + "type": "type(contract MultiSig)", + "value": "MultiSig" + }, + "id": 1473, + "name": "Identifier", + "src": "367:8:7" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1469, + "type": "address[] memory", + "value": "_owners" + }, + "id": 1474, + "name": "Identifier", + "src": "376:7:7" + } + ], + "id": 1475, + "name": "ModifierInvocation", + "src": "367:17:7" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 889, + "type": "type(contract TransferableMultiSig)", + "value": "TransferableMultiSig" + }, + "id": 1476, + "name": "Identifier", + "src": "393:20:7" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1469, + "type": "address[] memory", + "value": "_owners" + }, + "id": 1477, + "name": "Identifier", + "src": "414:7:7" + } + ], + "id": 1478, + "name": "ModifierInvocation", + "src": "393:29:7" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 821, + "type": "type(contract RecoverableMultiSig)", + "value": "RecoverableMultiSig" + }, + "id": 1479, + "name": "Identifier", + "src": "431:19:7" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1469, + "type": "address[] memory", + "value": "_owners" + }, + "id": 1480, + "name": "Identifier", + "src": "451:7:7" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1471, + "type": "uint256", + "value": "_recoveryBlockOffset" + }, + "id": 1481, + "name": "Identifier", + "src": "460:20:7" + } + ], + "id": 1482, + "name": "ModifierInvocation", + "src": "431:50:7" + }, + { + "attributes": { + "statements": [ + null + ] + }, + "children": [], + "id": 1484, + "name": "Block", + "src": "486:7:7" + } + ], + "id": 1485, + "name": "FunctionDefinition", + "src": "275:218:7" + } + ], + "id": 1486, + "name": "ContractDefinition", + "src": "152:384:7" + } + ], + "id": 1487, + "name": "SourceUnit", + "src": "0:537:7" + }, + "compiler": { + "name": "solc", + "version": "0.4.18+commit.9cf6e910.Emscripten.clang" + }, + "networks": {}, + "schemaVersion": "1.0.1", + "updatedAt": "2017-12-09T23:00:14.499Z" +} \ No newline at end of file diff --git a/build/contracts/TransferableMultiSig.json b/build/contracts/TransferableMultiSig.json new file mode 100644 index 0000000..5e370c8 --- /dev/null +++ b/build/contracts/TransferableMultiSig.json @@ -0,0 +1,1128 @@ +{ + "contractName": "TransferableMultiSig", + "abi": [ + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + } + ], + "name": "owners", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "v", + "type": "uint8[]" + }, + { + "name": "r", + "type": "bytes32[]" + }, + { + "name": "s", + "type": "bytes32[]" + }, + { + "name": "newOwners", + "type": "address[]" + } + ], + "name": "transferOwnership", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "nonce", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "listOwners", + "outputs": [ + { + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "v", + "type": "uint8[]" + }, + { + "name": "r", + "type": "bytes32[]" + }, + { + "name": "s", + "type": "bytes32[]" + }, + { + "name": "destination", + "type": "address" + }, + { + "name": "value", + "type": "uint256" + }, + { + "name": "data", + "type": "bytes" + } + ], + "name": "execute", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "name": "_owners", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "payable": true, + "stateMutability": "payable", + "type": "fallback" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "previousOwners", + "type": "address[]" + }, + { + "indexed": false, + "name": "newOwners", + "type": "address[]" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Deposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "destination", + "type": "address" + }, + { + "indexed": false, + "name": "nonce", + "type": "uint256" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "name": "data", + "type": "bytes" + } + ], + "name": "Executed", + "type": "event" + } + ], + "bytecode": "0x6060604052341561000f57600080fd5b6040516110f93803806110f98339810160405280805182019190505080806000815111151561003d57600080fd5b816001908051906020019061005392919061005c565b50505050610129565b8280548282559060005260206000209081019282156100d5579160200282015b828111156100d45782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019061007c565b5b5090506100e291906100e6565b5090565b61012691905b8082111561012257600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506001016100ec565b5090565b90565b610fc1806101386000396000f30060606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c27146100c757806335d9c92d1461012a578063affed0e014610244578063ed60c0fc1461026d578063f12d394f146102d7575b60003411156100c5573373ffffffffffffffffffffffffffffffffffffffff167f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4346040518082815260200191505060405180910390a25b005b34156100d257600080fd5b6100e8600480803590602001909190505061041c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561013557600080fd5b61024260048080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190505061045b565b005b341561024f57600080fd5b6102576108e5565b6040518082815260200191505060405180910390f35b341561027857600080fd5b6102806108eb565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102c35780820151818401526020810190506102a8565b505050509050019250505060405180910390f35b34156102e257600080fd5b61041a600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061097f565b005b60018181548110151561042b57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b806000815111151561046c57600080fd5b84848460197f01000000000000000000000000000000000000000000000000000000000000000260007f010000000000000000000000000000000000000000000000000000000000000002308760005460405180867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401838051906020019060200280838360005b838110156105c15780820151818401526020810190506105a6565b5050505090500182815260200195505050505050604051809103902060008060018054905086511480156105fa57506001805490508551145b801561060b57506001805490508451145b151561061657600080fd5b8260405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01826000191660001916815260200191505060405180910390209150600090505b6001805490508110156107bc5760018181548110151561067f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660018388848151811015156106d257fe5b9060200190602002015188858151811015156106ea57fe5b90602001906020020151888681518110151561070257fe5b90602001906020020151604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561078457600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff161415156107af57600080fd5b8080600101915050610663565b7fe62c04bb3499d4f432a50e07318d42861c4865afb22ee4cfe403d4f945507090600189604051808060200180602001838103835285818154815260200191508054801561085f57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610815575b5050838103825284818151815260200191508051906020019060200280838360005b8381101561089c578082015181840152602081019050610881565b5050505090500194505050505060405180910390a187600190805190602001906108c7929190610eb4565b50600160008082825401925050819055505050505050505050505050565b60005481565b6108f3610f3e565b600180548060200260200160405190810160405280929190818152602001828054801561097557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161092b575b5050505050905090565b85858560197f01000000000000000000000000000000000000000000000000000000000000000260007f0100000000000000000000000000000000000000000000000000000000000000023088888860005460405180887effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101877effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140184815260200183805190602001908083835b602083101515610b225780518252602082019150602081019050602083039250610afd565b6001836020036101000a03801982511681845116808217855250505050505090500182815260200197505050505050505060405180910390206000806001805490508651148015610b7857506001805490508551145b8015610b8957506001805490508451145b1515610b9457600080fd5b8260405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01826000191660001916815260200191505060405180910390209150600090505b600180549050811015610d3a57600181815481101515610bfd57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166001838884815181101515610c5057fe5b906020019060200201518885815181101515610c6857fe5b906020019060200201518886815181101515610c8057fe5b90602001906020020151604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f11515610d0257600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff16141515610d2d57600080fd5b8080600101915050610be1565b8873ffffffffffffffffffffffffffffffffffffffff167f30dc9a249e121dc7ec74559d42f94e60bb91eb25e06df470ed1be2a02a9d7a046000548a8a6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610dc3578082015181840152602081019050610da8565b50505050905090810190601f168015610df05780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a28873ffffffffffffffffffffffffffffffffffffffff16888860405180828051906020019080838360005b83811015610e45578082015181840152602081019050610e2a565b50505050905090810190601f168015610e725780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876187965a03f1925050501515610e9657600080fd5b60016000808282540192505081905550505050505050505050505050565b828054828255906000526020600020908101928215610f2d579160200282015b82811115610f2c5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190610ed4565b5b509050610f3a9190610f52565b5090565b602060405190810160405280600081525090565b610f9291905b80821115610f8e57600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101610f58565b5090565b905600a165627a7a7230582024f6a2c205ff73c284f890b7b6605bab0540211b80a0458d2d0995dfac25e8040029", + "deployedBytecode": "0x60606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c27146100c757806335d9c92d1461012a578063affed0e014610244578063ed60c0fc1461026d578063f12d394f146102d7575b60003411156100c5573373ffffffffffffffffffffffffffffffffffffffff167f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4346040518082815260200191505060405180910390a25b005b34156100d257600080fd5b6100e8600480803590602001909190505061041c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561013557600080fd5b61024260048080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190505061045b565b005b341561024f57600080fd5b6102576108e5565b6040518082815260200191505060405180910390f35b341561027857600080fd5b6102806108eb565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102c35780820151818401526020810190506102a8565b505050509050019250505060405180910390f35b34156102e257600080fd5b61041a600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061097f565b005b60018181548110151561042b57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b806000815111151561046c57600080fd5b84848460197f01000000000000000000000000000000000000000000000000000000000000000260007f010000000000000000000000000000000000000000000000000000000000000002308760005460405180867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401838051906020019060200280838360005b838110156105c15780820151818401526020810190506105a6565b5050505090500182815260200195505050505050604051809103902060008060018054905086511480156105fa57506001805490508551145b801561060b57506001805490508451145b151561061657600080fd5b8260405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01826000191660001916815260200191505060405180910390209150600090505b6001805490508110156107bc5760018181548110151561067f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660018388848151811015156106d257fe5b9060200190602002015188858151811015156106ea57fe5b90602001906020020151888681518110151561070257fe5b90602001906020020151604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561078457600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff161415156107af57600080fd5b8080600101915050610663565b7fe62c04bb3499d4f432a50e07318d42861c4865afb22ee4cfe403d4f945507090600189604051808060200180602001838103835285818154815260200191508054801561085f57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610815575b5050838103825284818151815260200191508051906020019060200280838360005b8381101561089c578082015181840152602081019050610881565b5050505090500194505050505060405180910390a187600190805190602001906108c7929190610eb4565b50600160008082825401925050819055505050505050505050505050565b60005481565b6108f3610f3e565b600180548060200260200160405190810160405280929190818152602001828054801561097557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161092b575b5050505050905090565b85858560197f01000000000000000000000000000000000000000000000000000000000000000260007f0100000000000000000000000000000000000000000000000000000000000000023088888860005460405180887effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101877effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140184815260200183805190602001908083835b602083101515610b225780518252602082019150602081019050602083039250610afd565b6001836020036101000a03801982511681845116808217855250505050505090500182815260200197505050505050505060405180910390206000806001805490508651148015610b7857506001805490508551145b8015610b8957506001805490508451145b1515610b9457600080fd5b8260405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01826000191660001916815260200191505060405180910390209150600090505b600180549050811015610d3a57600181815481101515610bfd57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166001838884815181101515610c5057fe5b906020019060200201518885815181101515610c6857fe5b906020019060200201518886815181101515610c8057fe5b90602001906020020151604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f11515610d0257600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff16141515610d2d57600080fd5b8080600101915050610be1565b8873ffffffffffffffffffffffffffffffffffffffff167f30dc9a249e121dc7ec74559d42f94e60bb91eb25e06df470ed1be2a02a9d7a046000548a8a6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610dc3578082015181840152602081019050610da8565b50505050905090810190601f168015610df05780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a28873ffffffffffffffffffffffffffffffffffffffff16888860405180828051906020019080838360005b83811015610e45578082015181840152602081019050610e2a565b50505050905090810190601f168015610e725780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876187965a03f1925050501515610e9657600080fd5b60016000808282540192505081905550505050505050505050505050565b828054828255906000526020600020908101928215610f2d579160200282015b82811115610f2c5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190610ed4565b5b509050610f3a9190610f52565b5090565b602060405190810160405280600081525090565b610f9291905b80821115610f8e57600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101610f58565b5090565b905600a165627a7a7230582024f6a2c205ff73c284f890b7b6605bab0540211b80a0458d2d0995dfac25e8040029", + "sourceMap": "52:664:4:-;;;143:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;224:7;180::2;959:1;940:9;:16;:20;932:29;;;;;;;;212:7;203:6;:16;;;;;;;;;;;;:::i;:::-;;107:119;;143:101:4;52:664;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", + "deployedSourceMap": "52:664:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1037:1:2;1025:9;:13;1021:76;;;1064:10;1054:32;;;1076:9;1054:32;;;;;;;;;;;;;;;;;;1021:76;52:664:4;77:23:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;371:343:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51:20:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1109:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;1199:480:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;371:343:4:-;530:9;959:1:2;940:9;:16;:20;932:29;;;;;;;;560:1:4;563;566;584:4;579:10;;596:1;591:7;;600:4;606:9;617:5;;569:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;618:20:2;707:9;497:6;:13;;;;485:1;:8;:25;484:70;;;;;540:6;:13;;;;528:1;:8;:25;484:70;:113;;;;;583:6;:13;;;;571:1;:8;:25;484:113;463:144;;;;;;;;687:4;641:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;618:74;;719:1;707:13;;702:132;726:6;:13;;;;722:1;:17;702:132;;;813:6;820:1;813:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;768:54;;:41;778:12;792:1;794;792:4;;;;;;;;;;;;;;;;;;798:1;800;798:4;;;;;;;;;;;;;;;;;;804:1;806;804:4;;;;;;;;;;;;;;;;;;768:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:54;;;760:63;;;;;;;;741:3;;;;;;;702:132;;;639:39:4;660:6;668:9;639:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;698:9:4;689:6;:18;;;;;;;;;;;;:::i;:::-;;865:1:2;856:5;;:10;;;;;;;;;;;971:1;;;;;;371:343:4;;;;;:::o;51:20:2:-;;;;:::o;1109:84::-;1152:9;;:::i;:::-;1180:6;1173:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1109:84;:::o;1199:480::-;1389:1;1392;1395;1413:4;1408:10;;1425:1;1420:7;;1429:4;1435:11;1448:5;1455:4;1461:5;;1398:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;618:20:2;707:9;497:6;:13;;;;485:1;:8;:25;484:70;;;;;540:6;:13;;;;528:1;:8;:25;484:70;:113;;;;;583:6;:13;;;;571:1;:8;:25;484:113;463:144;;;;;;;;687:4;641:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;618:74;;719:1;707:13;;702:132;726:6;:13;;;;722:1;:17;702:132;;;813:6;820:1;813:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;768:54;;:41;778:12;792:1;794;792:4;;;;;;;;;;;;;;;;;;798:1;800;798:4;;;;;;;;;;;;;;;;;;804:1;806;804:4;;;;;;;;;;;;;;;;;;768:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:54;;;760:63;;;;;;;;741:3;;;;;;;702:132;;;1492:11;1483:41;;;1505:5;;1512;1519:4;1483:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1590:11:2;:16;;1613:5;1620:4;1590:35;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1582:44:2;;;;;;;;865:1;856:5;;:10;;;;;;;;;;;1199:480;;;;;;;;;;;;:::o;52:664:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", + "source": "pragma solidity 0.4.18;\n\nimport \"./MultiSig.sol\";\n\n\ncontract TransferableMultiSig is MultiSig {\n\n /* solhint-disable no-empty-blocks */\n function TransferableMultiSig(address[] _owners)\n public\n MultiSig(_owners)\n {\n }\n /* solhint-enable no-empty-blocks */\n\n event OwnershipTransferred(address[] previousOwners, address[] newOwners);\n\n function transferOwnership(\n uint8[] v,\n bytes32[] r,\n bytes32[] s,\n address[] newOwners\n )\n public\n onlyNotEmpty(newOwners)\n onlySigned(v, r, s, keccak256(byte(0x19), byte(0), this, newOwners, nonce))\n {\n OwnershipTransferred(owners, newOwners);\n\n owners = newOwners;\n }\n}\n", + "sourcePath": "/home/js/Projects/js/signhash/signhash-contracts/contracts/MultiSig/TransferableMultiSig.sol", + "ast": { + "attributes": { + "absolutePath": "/home/js/Projects/js/signhash/signhash-contracts/contracts/MultiSig/TransferableMultiSig.sol", + "exportedSymbols": { + "TransferableMultiSig": [ + 889 + ] + } + }, + "children": [ + { + "attributes": { + "literals": [ + "solidity", + "0.4", + ".18" + ] + }, + "id": 823, + "name": "PragmaDirective", + "src": "0:23:4" + }, + { + "attributes": { + "SourceUnit": 607, + "absolutePath": "/home/js/Projects/js/signhash/signhash-contracts/contracts/MultiSig/MultiSig.sol", + "file": "./MultiSig.sol", + "scope": 890, + "symbolAliases": [ + null + ], + "unitAlias": "" + }, + "id": 824, + "name": "ImportDirective", + "src": "25:24:4" + }, + { + "attributes": { + "contractDependencies": [ + 606 + ], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "linearizedBaseContracts": [ + 889, + 606 + ], + "name": "TransferableMultiSig", + "scope": 890 + }, + "children": [ + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "contractScope": null, + "name": "MultiSig", + "referencedDeclaration": 606, + "type": "contract MultiSig" + }, + "id": 825, + "name": "UserDefinedTypeName", + "src": "85:8:4" + } + ], + "id": 826, + "name": "InheritanceSpecifier", + "src": "85:8:4" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": true, + "name": "TransferableMultiSig", + "payable": false, + "scope": 889, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "_owners", + "scope": 836, + "stateVariable": false, + "storageLocation": "default", + "type": "address[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "address[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 827, + "name": "ElementaryTypeName", + "src": "173:7:4" + } + ], + "id": 828, + "name": "ArrayTypeName", + "src": "173:9:4" + } + ], + "id": 829, + "name": "VariableDeclaration", + "src": "173:17:4" + } + ], + "id": 830, + "name": "ParameterList", + "src": "172:19:4" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 834, + "name": "ParameterList", + "src": "237:0:4" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 606, + "type": "type(contract MultiSig)", + "value": "MultiSig" + }, + "id": 831, + "name": "Identifier", + "src": "215:8:4" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 829, + "type": "address[] memory", + "value": "_owners" + }, + "id": 832, + "name": "Identifier", + "src": "224:7:4" + } + ], + "id": 833, + "name": "ModifierInvocation", + "src": "215:17:4" + }, + { + "attributes": { + "statements": [ + null + ] + }, + "children": [], + "id": 835, + "name": "Block", + "src": "237:7:4" + } + ], + "id": 836, + "name": "FunctionDefinition", + "src": "143:101:4" + }, + { + "attributes": { + "anonymous": false, + "name": "OwnershipTransferred" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "indexed": false, + "name": "previousOwners", + "scope": 844, + "stateVariable": false, + "storageLocation": "default", + "type": "address[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "address[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 837, + "name": "ElementaryTypeName", + "src": "318:7:4" + } + ], + "id": 838, + "name": "ArrayTypeName", + "src": "318:9:4" + } + ], + "id": 839, + "name": "VariableDeclaration", + "src": "318:24:4" + }, + { + "attributes": { + "constant": false, + "indexed": false, + "name": "newOwners", + "scope": 844, + "stateVariable": false, + "storageLocation": "default", + "type": "address[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "address[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 840, + "name": "ElementaryTypeName", + "src": "344:7:4" + } + ], + "id": 841, + "name": "ArrayTypeName", + "src": "344:9:4" + } + ], + "id": 842, + "name": "VariableDeclaration", + "src": "344:19:4" + } + ], + "id": 843, + "name": "ParameterList", + "src": "317:47:4" + } + ], + "id": 844, + "name": "EventDefinition", + "src": "291:74:4" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "transferOwnership", + "payable": false, + "scope": 889, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "v", + "scope": 888, + "stateVariable": false, + "storageLocation": "default", + "type": "uint8[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "uint8[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "uint8", + "type": "uint8" + }, + "id": 845, + "name": "ElementaryTypeName", + "src": "407:5:4" + } + ], + "id": 846, + "name": "ArrayTypeName", + "src": "407:7:4" + } + ], + "id": 847, + "name": "VariableDeclaration", + "src": "407:9:4" + }, + { + "attributes": { + "constant": false, + "name": "r", + "scope": 888, + "stateVariable": false, + "storageLocation": "default", + "type": "bytes32[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "bytes32[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "bytes32", + "type": "bytes32" + }, + "id": 848, + "name": "ElementaryTypeName", + "src": "426:7:4" + } + ], + "id": 849, + "name": "ArrayTypeName", + "src": "426:9:4" + } + ], + "id": 850, + "name": "VariableDeclaration", + "src": "426:11:4" + }, + { + "attributes": { + "constant": false, + "name": "s", + "scope": 888, + "stateVariable": false, + "storageLocation": "default", + "type": "bytes32[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "bytes32[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "bytes32", + "type": "bytes32" + }, + "id": 851, + "name": "ElementaryTypeName", + "src": "447:7:4" + } + ], + "id": 852, + "name": "ArrayTypeName", + "src": "447:9:4" + } + ], + "id": 853, + "name": "VariableDeclaration", + "src": "447:11:4" + }, + { + "attributes": { + "constant": false, + "name": "newOwners", + "scope": 888, + "stateVariable": false, + "storageLocation": "default", + "type": "address[] memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "length": null, + "type": "address[] storage pointer" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 854, + "name": "ElementaryTypeName", + "src": "468:7:4" + } + ], + "id": 855, + "name": "ArrayTypeName", + "src": "468:9:4" + } + ], + "id": 856, + "name": "VariableDeclaration", + "src": "468:19:4" + } + ], + "id": 857, + "name": "ParameterList", + "src": "397:96:4" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 877, + "name": "ParameterList", + "src": "629:0:4" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 525, + "type": "modifier (address[] memory)", + "value": "onlyNotEmpty" + }, + "id": 858, + "name": "Identifier", + "src": "517:12:4" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 856, + "type": "address[] memory", + "value": "newOwners" + }, + "id": 859, + "name": "Identifier", + "src": "530:9:4" + } + ], + "id": 860, + "name": "ModifierInvocation", + "src": "517:23:4" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 511, + "type": "modifier (uint8[] memory,bytes32[] memory,bytes32[] memory,bytes32)", + "value": "onlySigned" + }, + "id": 861, + "name": "Identifier", + "src": "549:10:4" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 847, + "type": "uint8[] memory", + "value": "v" + }, + "id": 862, + "name": "Identifier", + "src": "560:1:4" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 850, + "type": "bytes32[] memory", + "value": "r" + }, + "id": 863, + "name": "Identifier", + "src": "563:1:4" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 853, + "type": "bytes32[] memory", + "value": "s" + }, + "id": 864, + "name": "Identifier", + "src": "566:1:4" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "bytes32", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + { + "typeIdentifier": "t_contract$_TransferableMultiSig_$889", + "typeString": "contract TransferableMultiSig" + }, + { + "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", + "typeString": "address[] memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1492, + "type": "function () pure returns (bytes32)", + "value": "keccak256" + }, + "id": 865, + "name": "Identifier", + "src": "569:9:4" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": true, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "bytes1", + "type_conversion": true + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_25_by_1", + "typeString": "int_const 25" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "type": "type(bytes1)", + "value": "byte" + }, + "id": 866, + "name": "ElementaryTypeNameExpression", + "src": "579:4:4" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30783139", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 25", + "value": "0x19" + }, + "id": 867, + "name": "Literal", + "src": "584:4:4" + } + ], + "id": 868, + "name": "FunctionCall", + "src": "579:10:4" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": true, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "bytes1", + "type_conversion": true + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "type": "type(bytes1)", + "value": "byte" + }, + "id": 869, + "name": "ElementaryTypeNameExpression", + "src": "591:4:4" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 870, + "name": "Literal", + "src": "596:1:4" + } + ], + "id": 871, + "name": "FunctionCall", + "src": "591:7:4" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1517, + "type": "contract TransferableMultiSig", + "value": "this" + }, + "id": 872, + "name": "Identifier", + "src": "600:4:4" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 856, + "type": "address[] memory", + "value": "newOwners" + }, + "id": 873, + "name": "Identifier", + "src": "606:9:4" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 397, + "type": "uint256", + "value": "nonce" + }, + "id": 874, + "name": "Identifier", + "src": "617:5:4" + } + ], + "id": 875, + "name": "FunctionCall", + "src": "569:54:4" + } + ], + "id": 876, + "name": "ModifierInvocation", + "src": "549:75:4" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_array$_t_address_$dyn_storage", + "typeString": "address[] storage ref" + }, + { + "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", + "typeString": "address[] memory" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 844, + "type": "function (address[] memory,address[] memory)", + "value": "OwnershipTransferred" + }, + "id": 878, + "name": "Identifier", + "src": "639:20:4" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 400, + "type": "address[] storage ref", + "value": "owners" + }, + "id": 879, + "name": "Identifier", + "src": "660:6:4" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 856, + "type": "address[] memory", + "value": "newOwners" + }, + "id": 880, + "name": "Identifier", + "src": "668:9:4" + } + ], + "id": 881, + "name": "FunctionCall", + "src": "639:39:4" + } + ], + "id": 882, + "name": "ExpressionStatement", + "src": "639:39:4" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "address[] storage ref" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 400, + "type": "address[] storage ref", + "value": "owners" + }, + "id": 883, + "name": "Identifier", + "src": "689:6:4" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 856, + "type": "address[] memory", + "value": "newOwners" + }, + "id": 884, + "name": "Identifier", + "src": "698:9:4" + } + ], + "id": 885, + "name": "Assignment", + "src": "689:18:4" + } + ], + "id": 886, + "name": "ExpressionStatement", + "src": "689:18:4" + } + ], + "id": 887, + "name": "Block", + "src": "629:85:4" + } + ], + "id": 888, + "name": "FunctionDefinition", + "src": "371:343:4" + } + ], + "id": 889, + "name": "ContractDefinition", + "src": "52:664:4" + } + ], + "id": 890, + "name": "SourceUnit", + "src": "0:717:4" + }, + "compiler": { + "name": "solc", + "version": "0.4.18+commit.9cf6e910.Emscripten.clang" + }, + "networks": {}, + "schemaVersion": "1.0.1", + "updatedAt": "2017-12-09T23:00:14.496Z" +} \ No newline at end of file diff --git a/contracts/MultiSig/MultiSig.sol b/contracts/MultiSig/MultiSig.sol new file mode 100644 index 0000000..9f7bfaa --- /dev/null +++ b/contracts/MultiSig/MultiSig.sol @@ -0,0 +1,68 @@ +pragma solidity 0.4.18; + + +contract MultiSig { + + uint256 public nonce; + address[] public owners; + + function MultiSig(address[] _owners) + public + onlyNotEmpty(_owners) + { + owners = _owners; + } + + event Deposited(address indexed from, uint256 value); + event Executed(address indexed destination, uint256 nonce, uint256 value, bytes data); + + modifier onlySigned(uint8[] v, bytes32[] r, bytes32[] s, bytes32 hash) { + require( + (v.length == owners.length) && + (r.length == owners.length) && + (s.length == owners.length) + ); + + bytes32 prefixedHash = keccak256("\x19Ethereum Signed Message:\n32", hash); + for (uint256 i = 0; i < owners.length; i++) { + require(ecrecover(prefixedHash, v[i], r[i], s[i]) == owners[i]); + } + + _; + + nonce += 1; + } + + modifier onlyNotEmpty(address[] addresses) { + require(addresses.length > 0); + _; + } + + function() public payable { + if (msg.value > 0) { + Deposited(msg.sender, msg.value); + } + } + + function listOwners() public view returns (address[]) { + return owners; + } + + function execute( + uint8[] v, + bytes32[] r, + bytes32[] s, + address destination, + uint256 value, + bytes data + ) + public + onlySigned(v, r, s, keccak256(byte(0x19), byte(0), this, destination, value, data, nonce)) + { + Executed(destination, nonce, value, data); + + /* solhint-disable avoid-call-value */ + require(destination.call.value(value)(data)); + /* solhint-enable avoid-call-value */ + } +} diff --git a/contracts/MultiSig/RecoverableMultiSig.sol b/contracts/MultiSig/RecoverableMultiSig.sol new file mode 100644 index 0000000..4e4d08d --- /dev/null +++ b/contracts/MultiSig/RecoverableMultiSig.sol @@ -0,0 +1,92 @@ +pragma solidity 0.4.18; + +import "./MultiSig.sol"; + + +contract RecoverableMultiSig is MultiSig { + + uint256 public recoveryBlockOffset; + uint256 public recoveryBlock; + bytes32 public recoveryHash; + + function RecoverableMultiSig(address[] _owners, uint256 _recoveryBlockOffset) + public + MultiSig(_owners) + { + recoveryBlockOffset = _recoveryBlockOffset; + } + + event RecoveryStarted(address indexed from, address[] newOwners); + event RecoveryCancelled(address indexed from); + event RecoveryConfirmed(address indexed from, address[] newOwners); + + modifier onlyOwner() { + require(isOwner(msg.sender)); + _; + } + + modifier onlyRecoveryStarted() { + require(recoveryBlock > 0); + _; + } + + modifier onlyRecoveryPassed() { + require(recoveryBlock > 0); + require(block.number >= recoveryBlock + recoveryBlockOffset); + _; + } + + modifier onlyRecoveryMatches(address[] newOwners) { + require(keccak256(newOwners) == recoveryHash); + _; + } + + function startRecovery(address[] newOwners) + public + onlyOwner + onlyNotEmpty(newOwners) + { + recoveryBlock = block.number; + recoveryHash = keccak256(newOwners); + + RecoveryStarted(msg.sender, newOwners); + } + + function cancelRecovery() + public + onlyOwner + onlyRecoveryStarted + { + clearRecovery(); + + RecoveryCancelled(msg.sender); + } + + function confirmRecovery(address[] newOwners) + public + onlyOwner + onlyRecoveryPassed + onlyRecoveryMatches(newOwners) + { + owners = newOwners; + + clearRecovery(); + + RecoveryConfirmed(msg.sender, newOwners); + } + + function isOwner(address account) public view returns (bool) { + for (uint256 i = 0; i < owners.length; i++) { + if (account == owners[i]) { + return true; + } + } + + return false; + } + + function clearRecovery() private { + delete recoveryBlock; + delete recoveryHash; + } +} diff --git a/contracts/MultiSig/TransferableMultiSig.sol b/contracts/MultiSig/TransferableMultiSig.sol new file mode 100644 index 0000000..827580d --- /dev/null +++ b/contracts/MultiSig/TransferableMultiSig.sol @@ -0,0 +1,32 @@ +pragma solidity 0.4.18; + +import "./MultiSig.sol"; + + +contract TransferableMultiSig is MultiSig { + + /* solhint-disable no-empty-blocks */ + function TransferableMultiSig(address[] _owners) + public + MultiSig(_owners) + { + } + /* solhint-enable no-empty-blocks */ + + event OwnershipTransferred(address[] previousOwners, address[] newOwners); + + function transferOwnership( + uint8[] v, + bytes32[] r, + bytes32[] s, + address[] newOwners + ) + public + onlyNotEmpty(newOwners) + onlySigned(v, r, s, keccak256(byte(0x19), byte(0), this, newOwners, nonce)) + { + OwnershipTransferred(owners, newOwners); + + owners = newOwners; + } +} diff --git a/contracts/SignHash.sol b/contracts/SignHash.sol index b54e13f..38e9a11 100644 --- a/contracts/SignHash.sol +++ b/contracts/SignHash.sol @@ -5,24 +5,20 @@ import "./AddressSet.sol"; contract SignHash { - //--- Definitions using AddressSet for AddressSet.Data; - //--- Storage // hash to signers mapping (bytes32 => AddressSet.Data) private signers; // signer to proofs (method to value) mapping (address => mapping (string => string)) private proofs; - //--- Events event Signed(bytes32 indexed hash, address indexed signer); event Revoked(bytes32 indexed hash, address indexed signer); event ProofAdded(address indexed signer, string method, string value); event ProofRemoved(address indexed signer, string method); - //--- Public mutable functions function sign(bytes32 hash) public { require(hash != bytes32(0)); @@ -59,7 +55,6 @@ contract SignHash { ProofRemoved(msg.sender, method); } - //--- Public constant functions function getSigners(bytes32 hash, uint256 maxCount) public view diff --git a/contracts/Test/TestERC20Token.sol b/contracts/Test/TestERC20Token.sol new file mode 100644 index 0000000..2df14c6 --- /dev/null +++ b/contracts/Test/TestERC20Token.sol @@ -0,0 +1,75 @@ +pragma solidity 0.4.18; + + +contract TestERC20Token { + + string public name = "TestERC20"; + string public symbol = "TEST"; + uint256 public decimals = 18; + uint256 public totalSupply; + + mapping(address => uint256) private balances; + mapping (address => mapping (address => uint256)) private allowed; + + function TestERC20Token() public { + totalSupply = 10000 * (10 ** decimals); + balances[msg.sender] = totalSupply; + } + + event Approval(address indexed owner, address indexed spender, uint256 value); + event Transfer(address indexed from, address indexed to, uint256 value); + + /* solhint-disable no-simple-event-func-name */ + function transfer(address to, uint256 value) public returns (bool) { + /* solhint-enable no-simple-event-func-name */ + + require(to != address(0)); + + balances[msg.sender] = safeSub(balances[msg.sender], value); + balances[to] = safeAdd(balances[to], value); + + Transfer(msg.sender, to, value); + + return true; + } + + function transferFrom(address from, address to, uint256 value) public returns (bool) { + require(to != address(0)); + + uint256 allowance = allowed[from][msg.sender]; + + balances[from] = safeSub(balances[from], value); + balances[to] = safeAdd(balances[to], value); + allowed[from][msg.sender] = safeSub(allowance, value); + + Transfer(from, to, value); + + return true; + } + + function approve(address spender, uint256 value) public returns (bool) { + allowed[msg.sender][spender] = value; + Approval(msg.sender, spender, value); + + return true; + } + + function allowance(address owner, address spender) public view returns (uint256 remaining) { + return allowed[owner][spender]; + } + + function balanceOf(address owner) public view returns (uint256 balance) { + return balances[owner]; + } + + function safeSub(uint256 a, uint256 b) private pure returns (uint256) { + assert(b <= a); + return a - b; + } + + function safeAdd(uint256 a, uint256 b) private pure returns (uint256) { + uint256 c = a + b; + assert(c >= a); + return c; + } +} diff --git a/contracts/TipsWallet.sol b/contracts/TipsWallet.sol new file mode 100644 index 0000000..89742c1 --- /dev/null +++ b/contracts/TipsWallet.sol @@ -0,0 +1,18 @@ +pragma solidity 0.4.18; + +import "./MultiSig/MultiSig.sol"; +import "./MultiSig/TransferableMultiSig.sol"; +import "./MultiSig/RecoverableMultiSig.sol"; + + +contract TipsWallet is MultiSig, TransferableMultiSig, RecoverableMultiSig { + /* solhint-disable no-empty-blocks */ + function TipsWallet(address[] _owners, uint256 _recoveryBlockOffset) + public + MultiSig(_owners) + TransferableMultiSig(_owners) + RecoverableMultiSig(_owners, _recoveryBlockOffset) + { + } + /* solhint-enable no-empty-blocks */ +} diff --git a/migrations/1_initial_migration.ts b/migrations/1_initial_migration.ts index 4dde022..54e6cbf 100644 --- a/migrations/1_initial_migration.ts +++ b/migrations/1_initial_migration.ts @@ -1,3 +1,8 @@ +import { SignHashArtifacts } from 'signhash'; +import { Deployer } from 'truffle'; + +declare const artifacts: SignHashArtifacts; + const Migrations = artifacts.require('./Migrations.sol'); async function deploy(deployer: Deployer) { diff --git a/migrations/2_deploy_contracts.ts b/migrations/2_deploy_contracts.ts index 46b4a0b..da78ca7 100644 --- a/migrations/2_deploy_contracts.ts +++ b/migrations/2_deploy_contracts.ts @@ -1,10 +1,20 @@ +import { SignHashArtifacts, SignHashDeployer } from 'signhash'; + +declare const artifacts: SignHashArtifacts; + +const TipsWallet = artifacts.require('./TipsWallet.sol'); const SignHash = artifacts.require('./SignHash.sol'); -async function deploy(deployer: Deployer) { +async function deploy(deployer: SignHashDeployer) { + // TODO: change wallet parameters before mainnet deployment + const owners = ['0x4c7989d46daDb29ee494E6c1b87f60de0c1c9372']; + const recoveryBlockOffset = 5 * 1e5; + await deployer.deploy(TipsWallet, owners, recoveryBlockOffset); + await deployer.deploy(SignHash); } -function migrate(deployer: Deployer) { +function migrate(deployer: SignHashDeployer) { deployer.then(() => deploy(deployer)); } diff --git a/multisig/erc20.ts b/multisig/erc20.ts new file mode 100644 index 0000000..bd24154 --- /dev/null +++ b/multisig/erc20.ts @@ -0,0 +1,38 @@ +import { getData, MultiSigExecutor } from './executor'; +import { Signature } from './transaction'; + +import { ERC20, MultiSig } from 'signhash'; +import { TransactionResult } from 'truffle'; + +import * as Web3 from 'web3'; + +export class TransferERC20Command { + private readonly execution: MultiSigExecutor; + + constructor( + private web3: Web3, + private multiSig: MultiSig, + private token: ERC20 + ) { + this.execution = new MultiSigExecutor(web3, multiSig); + } + + public async sign( + signer: Address, + nonce: Web3.AnyNumber, + destination: Address, + amount: Web3.AnyNumber + ): Promise { + const data = await getData(this.token.transfer, destination, amount); + return this.execution.sign(signer, nonce, this.token.address, 0, data); + } + + public async execute( + signatures: Signature[], + destination: Address, + amount: Web3.AnyNumber + ): Promise { + const data = await getData(this.token.transfer, destination, amount); + return this.execution.execute(signatures, this.token.address, 0, data); + } +} diff --git a/multisig/executor.ts b/multisig/executor.ts new file mode 100644 index 0000000..365642f --- /dev/null +++ b/multisig/executor.ts @@ -0,0 +1,51 @@ +import { + groupSignatures, + MultiSigTransaction, + Signature, + stripHex, + toHex +} from './transaction'; + +import { MultiSig } from 'signhash'; +import { Method, TransactionResult } from 'truffle'; + +import * as Web3 from 'web3'; + +export class MultiSigExecutor { + private readonly transaction: MultiSigTransaction; + + constructor(private web3: Web3, private multisig: MultiSig) { + this.transaction = new MultiSigTransaction(web3, multisig.address); + } + + public sign( + signer: Address, + nonce: Web3.AnyNumber, + destination: Address, + value: Web3.AnyNumber, + data: string + ): Signature { + return this.transaction.sign(signer, nonce, [ + stripHex(destination), + toHex(value, 64), + stripHex(data) + ]); + } + + public async execute( + signatures: Signature[], + destination: Address, + value: Web3.AnyNumber, + data: string + ): Promise { + const { v, r, s } = groupSignatures(signatures); + return this.multisig.execute(v, r, s, destination, value, data); + } +} + +export async function getData(func: any, ...args: any[]): Promise { + const method = (func as any) as Method; + const request = await method.request(...args); + const [param] = request.params; + return param.data; +} diff --git a/multisig/index.ts b/multisig/index.ts new file mode 100644 index 0000000..a941fe4 --- /dev/null +++ b/multisig/index.ts @@ -0,0 +1,5 @@ +export * from './erc20'; +export * from './executor'; +export * from './ownership'; +export * from './transaction'; +export * from './transfer'; diff --git a/multisig/ownership.ts b/multisig/ownership.ts new file mode 100644 index 0000000..1fcf63b --- /dev/null +++ b/multisig/ownership.ts @@ -0,0 +1,37 @@ +import { + groupSignatures, + MultiSigTransaction, + Signature, + toHex +} from './transaction'; + +import { TransferableMultiSig } from 'signhash'; +import { TransactionResult } from 'truffle'; + +import * as Web3 from 'web3'; + +export class TransferOwnershipCommand { + private readonly transaction: MultiSigTransaction; + + constructor(private web3: Web3, private multiSig: TransferableMultiSig) { + this.transaction = new MultiSigTransaction(web3, multiSig.address); + } + + public sign( + signer: Address, + nonce: Web3.AnyNumber, + newOwners: Address[] + ): Signature { + return this.transaction.sign(signer, nonce, [ + newOwners.reduce((acc, owner) => acc.concat(toHex(owner, 64)), '') + ]); + } + + public async execute( + signatures: Signature[], + newOwners: Address[] + ): Promise { + const { v, r, s } = groupSignatures(signatures); + return this.multiSig.transferOwnership(v, r, s, newOwners); + } +} diff --git a/multisig/transaction.ts b/multisig/transaction.ts new file mode 100644 index 0000000..f573e78 --- /dev/null +++ b/multisig/transaction.ts @@ -0,0 +1,59 @@ +import { BigNumber } from 'bignumber.js'; + +import * as Web3 from 'web3'; + +export class MultiSigTransaction { + private readonly prefix = 0x19; + private readonly version = 0x0; + + constructor(private web3: Web3, private address: Address) {} + + public sign( + signer: Address, + nonce: Web3.AnyNumber, + parameters: any[] + ): Signature { + const tx = [ + '0x', + toHex(this.prefix, 2), + toHex(this.version, 2), + stripHex(this.address), + ...parameters, + toHex(nonce, 64) + ].join(''); + + const hash = this.web3.sha3(tx, { encoding: 'hex' }); + const sig = stripHex(this.web3.eth.sign(signer, hash)); + + return { + r: `0x${sig.substr(0, 64)}`, + s: `0x${sig.substr(64, 64)}`, + v: this.web3.toDecimal(sig.substr(128, 2)) + 27 + }; + } +} + +export interface Signature { + v: number; + r: string; + s: string; +} + +export function groupSignatures(signatures: Signature[]) { + return { + r: signatures.map(sig => sig.r), + s: signatures.map(sig => sig.s), + v: signatures.map(sig => sig.v) + }; +} + +export function stripHex(hex: string): string { + return hex.startsWith('0x') ? hex.slice(2) : hex; +} + +export function toHex(num: Web3.AnyNumber, len: number): string { + const hex = new BigNumber(num).toString(16); + const padLen = len - hex.length + 1; + const padStr = new Array(padLen).join('0'); + return hex.length < len ? padStr.concat(hex) : hex; +} diff --git a/multisig/transfer.ts b/multisig/transfer.ts new file mode 100644 index 0000000..88bf36e --- /dev/null +++ b/multisig/transfer.ts @@ -0,0 +1,32 @@ +import { MultiSigExecutor } from './executor'; +import { Signature } from './transaction'; + +import { MultiSig } from 'signhash'; +import { TransactionResult } from 'truffle'; + +import * as Web3 from 'web3'; + +export class TransferCommand { + private readonly executor: MultiSigExecutor; + + constructor(private web3: Web3, private multiSig: MultiSig) { + this.executor = new MultiSigExecutor(web3, multiSig); + } + + public sign( + signer: Address, + nonce: Web3.AnyNumber, + destination: Address, + value: Web3.AnyNumber + ): Signature { + return this.executor.sign(signer, nonce, destination, value, '0x'); + } + + public async execute( + signatures: Signature[], + destination: Address, + value: Web3.AnyNumber + ): Promise { + return this.executor.execute(signatures, destination, value, '0x'); + } +} diff --git a/package-lock.json b/package-lock.json index 6d1c26a..6323889 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,10 +4,10 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@types/bignumber.js": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-4.0.3.tgz", - "integrity": "sha512-KoJPKjhlWBry4fk8qcIufXFOU+zcZBfkHQWKbnAMQTMoe2GDeLpjSQHS+22gv+dg7gKdTP2WCjSeCVnfj8e+Gw==", + "@digix/tempo": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@digix/tempo/-/tempo-0.2.0.tgz", + "integrity": "sha1-Xa+RrXiNa1lqGarSLi5mfk7ICKg=", "dev": true }, "@types/chai": { @@ -19,13 +19,13 @@ "@types/es6-promise": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/@types/es6-promise/-/es6-promise-0.0.33.tgz", - "integrity": "sha512-HKJFVLCGrWQ/1unEw8JdaTxu6n3EUxmwTxJ6D0O1x0gD8joCsgoTWxEgevb7fp2XIogNjof3KEd+3bJoGne/nw==", + "integrity": "sha1-KApwfmKxtr7xqGzAhh7GPNBsf/M=", "dev": true }, "@types/mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha512-XA4vNO6GCBz8Smq0hqSRo4yRWMqr4FPQrWjhJt6nKskzly4/p87SfuJMFYGRyYb6jo2WNIQU2FDBsY5r1BibUA==", + "integrity": "sha1-6oh80CT2kcHKZ8ziC3YGsFPkOw8=", "dev": true, "requires": { "@types/node": "8.0.53" @@ -34,25 +34,34 @@ "@types/mocha": { "version": "2.2.44", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.44.tgz", - "integrity": "sha512-k2tWTQU8G4+iSMvqKi0Q9IIsWAp/n8xzdZS4Q4YVIltApoMA00wFBFdlJnmoaK1/z7B0Cy0yPe6GgXteSmdUNw==", + "integrity": "sha1-HUp5jlPzUhL9WtTQQFBiAXHNW14=", "dev": true }, "@types/node": { "version": "8.0.53", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.0.53.tgz", - "integrity": "sha512-54Dm6NwYeiSQmRB1BLXKr5GELi0wFapR1npi8bnZhEcu84d/yQKqnwwXQ56hZ0RUbTG6L5nqDZaN3dgByQXQRQ==", + "integrity": "sha1-OWs1r4JvpmqtRyyMt7jV4nf05tg=", "dev": true }, "@types/ramda": { "version": "0.24.18", "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.24.18.tgz", - "integrity": "sha512-37umDB+zS6tK+3j0YJxsl7O8T4aYHYO6s1UpADJ/nxMHFjmuSd5XRQryC4IXX3HQ4XzstqAqhk/D+cdxwvqtEQ==", + "integrity": "sha1-JRPvzM9HyhPTiNUD8wnfS2S6Uvw=", "dev": true }, + "@types/winston": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.7.tgz", + "integrity": "sha1-LqGLLcdy1Fm2rw9YdEdwTfMa/sI=", + "dev": true, + "requires": { + "@types/node": "8.0.53" + } + }, "acorn": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", - "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==" + "integrity": "sha1-MXrHghgmwixwLWYYmrg1lnXxNdc=" }, "acorn-dynamic-import": { "version": "2.0.2", @@ -126,7 +135,7 @@ "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", "dev": true, "requires": { "color-convert": "1.9.1" @@ -141,7 +150,7 @@ "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", "requires": { "micromatch": "2.3.11", "normalize-path": "2.1.1" @@ -173,7 +182,7 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=" }, "array-filter": { "version": "0.0.1", @@ -222,7 +231,7 @@ "asn1.js": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", - "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", + "integrity": "sha1-gRfvT37YfNj4kES1v/l6wkOhbJo=", "requires": { "bn.js": "4.11.8", "inherits": "2.0.3", @@ -246,7 +255,7 @@ "async": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "integrity": "sha1-YaKau2/MAm/qd+VtHG7FOnlZUfQ=", "requires": { "lodash": "4.17.4" } @@ -302,15 +311,18 @@ "base64-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" + "integrity": "sha1-qRlH2h9KUW6jjltOwOw3c2deCIY=" }, "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" + "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=" }, "bignumber.js": { - "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz", + "integrity": "sha1-228UBnwUC9RmJIFaeRbJLZtsJLE=", + "dev": true }, "binary-extensions": { "version": "1.11.0", @@ -320,7 +332,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=" }, "brace-expansion": { "version": "1.1.8", @@ -354,7 +366,7 @@ "browserify-aes": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", - "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "integrity": "sha1-OLerVe24Bv8tzaGn8WIHc6R3xJ8=", "requires": { "buffer-xor": "1.0.3", "cipher-base": "1.0.4", @@ -410,7 +422,7 @@ "browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", "requires": { "pako": "1.0.6" } @@ -486,7 +498,7 @@ "chalk": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", "dev": true, "requires": { "ansi-styles": "3.2.0", @@ -524,7 +536,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", "requires": { "inherits": "2.0.3", "safe-buffer": "5.1.1" @@ -533,7 +545,7 @@ "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=", "dev": true }, "cli-cursor": { @@ -603,7 +615,7 @@ "color-convert": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=", "dev": true, "requires": { "color-name": "1.1.3" @@ -730,7 +742,7 @@ "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", "requires": { "browserify-cipher": "1.0.0", "browserify-sign": "4.0.4", @@ -750,6 +762,11 @@ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=" }, + "cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" + }, "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", @@ -761,7 +778,7 @@ "date-fns": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", - "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", + "integrity": "sha1-EuYJzcuTUScxHQTTMzTilgoqVOY=", "dev": true }, "date-now": { @@ -785,7 +802,7 @@ "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "integrity": "sha1-38lARACtHI/gI+faHfHBR8S0RN8=", "dev": true, "requires": { "type-detect": "4.0.5" @@ -1107,7 +1124,7 @@ "espree": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", - "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", + "integrity": "sha1-dWrai5eenc/NswqtjRqTBKkF4co=", "dev": true, "requires": { "acorn": "5.2.1", @@ -1117,7 +1134,7 @@ "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=", "dev": true }, "esquery": { @@ -1152,7 +1169,7 @@ "ethereumjs-testrpc": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ethereumjs-testrpc/-/ethereumjs-testrpc-4.1.3.tgz", - "integrity": "sha512-zVipEeZQcBnOzpGQk4ngFbd+VUYJDWASnGpquHthSPta3Kcy33qOwAIx3hXRmDdp4d2zbm8licximJWbpEG1hA==", + "integrity": "sha1-dNuQyQdf36O6JRPwhZW6rDaobH4=", "requires": { "webpack": "3.8.1" } @@ -1206,7 +1223,7 @@ "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", "requires": { "md5.js": "1.3.4", "safe-buffer": "5.1.1" @@ -1267,6 +1284,11 @@ "is-extglob": "1.0.0" } }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" + }, "fast-deep-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", @@ -1383,7 +1405,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", "dev": true }, "functional-red-black-tree": { @@ -1406,7 +1428,7 @@ "get-own-enumerable-property-symbols": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz", - "integrity": "sha512-TtY/sbOemiMKPRUDDanGCSgBYe7Mf0vbRsWnBZ+9yghpZ1MvcpSpuZFjHdEeY/LZjZy0vdLjS77L6HosisFiug==", + "integrity": "sha1-XErYfyg0xLm06EVJ3B4GUPs4wks=", "dev": true }, "get-stream": { @@ -1447,7 +1469,7 @@ "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", "dev": true }, "globby": { @@ -1521,7 +1543,7 @@ "hash.js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "integrity": "sha1-NA3tvmKQGHFRweodd3o0SJNd+EY=", "requires": { "inherits": "2.0.3", "minimalistic-assert": "1.0.0" @@ -1545,7 +1567,7 @@ "hosted-git-info": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" + "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=" }, "https-browserify": { "version": "1.0.0", @@ -1555,7 +1577,7 @@ "husky": { "version": "0.14.3", "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz", - "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==", + "integrity": "sha1-xp7XTi0neXaaF7qDmbVM4LY8EsM=", "dev": true, "requires": { "is-ci": "1.0.10", @@ -1574,7 +1596,7 @@ "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=", "dev": true }, "ieee754": { @@ -1585,7 +1607,7 @@ "ignore": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "integrity": "sha1-YSKJv7PCIOGGpYEYYY1b6MG6sCE=", "dev": true }, "imurmurhash": { @@ -1625,7 +1647,7 @@ "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "integrity": "sha1-ndLyrXZdyrH/BEO0kUQqILoifck=", "dev": true, "requires": { "ansi-escapes": "3.0.0", @@ -1647,7 +1669,7 @@ "ansi-escapes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "integrity": "sha1-7D6LTp+AZPwCw6ybZfHCdb2o75I=", "dev": true }, "ansi-regex": { @@ -1730,7 +1752,7 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" }, "is-builtin-module": { "version": "1.0.0", @@ -1926,16 +1948,21 @@ "isarray": "1.0.0" } }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, "jest-get-type": { "version": "21.2.0", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-21.2.0.tgz", - "integrity": "sha512-y2fFw3C+D0yjNSDp7ab1kcd6NUYfy3waPTlD8yWkAtiocJdBRQqNoRqVfMNxgj+IjT0V5cBIHJO0z9vuSSZ43Q==", + "integrity": "sha1-9jdqudtLYNgeOfMHScbEZvQNSiM=", "dev": true }, "jest-validate": { "version": "21.2.1", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-21.2.1.tgz", - "integrity": "sha512-k4HLI1rZQjlU+EC682RlQ6oZvLrE5SCh3brseQc24vbZTxzT/k/3urar5QMCVgjadmSO7lECeGdc6YxnM3yEGg==", + "integrity": "sha1-zAy8plPNVJN7pPKhEXlndFMN08c=", "dev": true, "requires": { "chalk": "2.3.0", @@ -1958,7 +1985,7 @@ "js-yaml": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "integrity": "sha1-LnhEFka9RoLpY/IrbpKCPDCcYtw=", "dev": true, "requires": { "argparse": "1.0.9", @@ -1974,12 +2001,12 @@ "json-loader": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" + "integrity": "sha1-3KFKcCNf+C8KyaOr62DTN6NlGF0=" }, "json-parse-better-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", - "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==", + "integrity": "sha1-UBg80bLSUnXeBp6ecbRnrJ6rlzo=", "dev": true }, "json-schema-traverse": { @@ -2068,7 +2095,7 @@ "lint-staged": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-4.3.0.tgz", - "integrity": "sha512-C/Zxslg0VRbsxwmCu977iIs+QyrmW2cyRCPUV5NDFYOH/jtRFHH8ch7ua2fH0voI/nVC3Tpg7DykfgMZySliKw==", + "integrity": "sha1-7Qd5rZpCwNxiuzJE5SKHC0ESWHk=", "dev": true, "requires": { "app-root-path": "2.0.1", @@ -2390,7 +2417,7 @@ "log-symbols": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.1.0.tgz", - "integrity": "sha512-zLeLrzMA1A2vRF1e/0Mo+LNINzi6jzBylHj5WqvQ/WK/5WCZt8si9SyN4p9llr/HRYvVR1AoXHRHl4WTHyQAzQ==", + "integrity": "sha1-81+mDieIMrU43E3dy7R4pF0+O+Y=", "dev": true, "requires": { "chalk": "2.3.0" @@ -2414,7 +2441,7 @@ "lru-cache": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" @@ -2491,7 +2518,7 @@ "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", "requires": { "bn.js": "4.11.8", "brorand": "1.1.0" @@ -2515,7 +2542,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "requires": { "brace-expansion": "1.1.8" } @@ -2536,7 +2563,7 @@ "mocha": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "integrity": "sha1-HgSA/jbS2lhY0etqzDhBiybqog0=", "requires": { "browser-stdout": "1.3.0", "commander": "2.9.0", @@ -2624,7 +2651,7 @@ "node-libs-browser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "integrity": "sha1-X5QmPUBPbkR2fXJpAf/wVHjWAN8=", "requires": { "assert": "1.4.1", "browserify-zlib": "0.2.0", @@ -2654,7 +2681,7 @@ "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", "requires": { "hosted-git-info": "2.5.0", "is-builtin-module": "1.0.0", @@ -2682,7 +2709,7 @@ "npm-run-all": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.2.tgz", - "integrity": "sha512-Z2aRlajMK4SQ8u19ZA75NZZu7wupfCNQWdYosIi8S6FgBdGf/8Y6Hgyjdc8zU2cYmIRVCx1nM80tJPkdEd+UYg==", + "integrity": "sha1-kNYtB4eS0gZpE55xhiEYZlbOoFY=", "dev": true, "requires": { "ansi-styles": "3.2.0", @@ -2721,7 +2748,7 @@ "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", "dev": true, "requires": { "pify": "3.0.0" @@ -2900,7 +2927,7 @@ "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=", "requires": { "execa": "0.7.0", "lcid": "1.0.0", @@ -2934,13 +2961,13 @@ "p-map": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=", "dev": true }, "pako": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" + "integrity": "sha1-AQEhG6pwxLykoPY/Igbpe3368lg=" }, "parse-asn1": { "version": "5.1.0", @@ -3031,7 +3058,7 @@ "pbkdf2": { "version": "3.0.14", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "integrity": "sha1-o14TxkeZsGzhUyD0WcIw5o5zut4=", "requires": { "create-hash": "1.1.3", "create-hmac": "1.1.6", @@ -3078,13 +3105,13 @@ "prettier": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.8.2.tgz", - "integrity": "sha512-fHWjCwoRZgjP1rvLP7OGqOznq7xH1sHMQUFLX8qLRO79hI57+6xbc5vB904LxEkCfgFgyr3vv06JkafgCSzoZg==", + "integrity": "sha1-v/g+f9VzkzxgeHXlujq73/uWrrg=", "dev": true }, "pretty-format": { "version": "21.2.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-21.2.1.tgz", - "integrity": "sha512-ZdWPGYAnYfcVP8yKA3zFjCn8s4/17TeYH28MXuC8vTp0o21eXjbFGcOAXZEaDaOFJjc3h2qa7HQNHNshhvoh2A==", + "integrity": "sha1-rlQH888hBmzQEaobpfzntqLt2zY=", "dev": true, "requires": { "ansi-regex": "3.0.0", @@ -3162,15 +3189,15 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, "ramda": { - "version": "0.24.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz", - "integrity": "sha1-w7d1UZfzW43DUCIoJixMkd22uFc=", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", + "integrity": "sha1-j99oIxz/qQvC+UYDkKDLdKKbKak=", "dev": true }, "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", "requires": { "is-number": "3.0.0", "kind-of": "4.0.0" @@ -3207,7 +3234,7 @@ "randombytes": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "integrity": "sha1-3ACaJGuNCaF3tLegrne8Vw9LG3k=", "requires": { "safe-buffer": "5.1.1" } @@ -3215,7 +3242,7 @@ "randomfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", - "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", + "integrity": "sha1-uWt99YfwHdkXJsQY8wVTsUGOPWI=", "requires": { "randombytes": "2.0.5", "safe-buffer": "5.1.1" @@ -3243,7 +3270,7 @@ "readable-stream": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", @@ -3268,7 +3295,7 @@ "regex-cache": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", "requires": { "is-equal-shallow": "0.1.3" } @@ -3325,7 +3352,7 @@ "resolve": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "integrity": "sha1-HwmsznlsmnYlefMbLBzEw83fnzY=", "dev": true, "requires": { "path-parse": "1.0.5" @@ -3358,7 +3385,7 @@ "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", "requires": { "glob": "7.1.2" } @@ -3399,7 +3426,7 @@ "rxjs": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.2.tgz", - "integrity": "sha512-oRYoIKWBU3Ic37fLA5VJu31VqQO4bWubRntcHSJ+cwaDQBwdnZ9x4zmhJfm/nFQ2E82/I4loSioHnACamrKGgA==", + "integrity": "sha1-KNQD8AcRIZZ/GK1mVWMlXVQjasM=", "dev": true, "requires": { "symbol-observable": "1.0.4" @@ -3408,12 +3435,12 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" }, "semver": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=" }, "set-blocking": { "version": "2.0.0", @@ -3433,7 +3460,7 @@ "sha.js": { "version": "2.4.9", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", - "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "integrity": "sha1-mPZIgEdLdPSji42p08Dy0QRjPn0=", "requires": { "inherits": "2.0.3", "safe-buffer": "5.1.1" @@ -3478,7 +3505,7 @@ "solc": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.18.tgz", - "integrity": "sha512-Kq+O3PNF9Pfq7fB+lDYAuoqRdghLmZyfngsg0h1Hj38NKAeVHeGPOGeZasn5KqdPeCzbMFvaGyTySxzGv6aXCg==", + "integrity": "sha1-g6xthx3RapcQ5n27dtrX9hQQBwI=", "requires": { "fs-extra": "0.30.0", "memorystream": "0.3.1", @@ -3656,7 +3683,7 @@ "source-list-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==" + "integrity": "sha1-qqR0A/eyRakvvJfqCPJQ1gh+0IU=" }, "source-map": { "version": "0.5.7", @@ -3696,6 +3723,11 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, "staged-git-files": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/staged-git-files/-/staged-git-files-0.0.4.tgz", @@ -3723,7 +3755,7 @@ "stream-http": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "integrity": "sha1-QKBQ7I3DtTsz2ZCUFcAsC/Gr+60=", "requires": { "builtin-status-codes": "3.0.0", "inherits": "2.0.3", @@ -3741,7 +3773,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -3781,7 +3813,7 @@ "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", "requires": { "safe-buffer": "5.1.1" } @@ -3789,7 +3821,7 @@ "stringify-object": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.2.1.tgz", - "integrity": "sha512-jPcQYw/52HUPP8uOE4kkjxl5bB9LfHkKCTptIk3qw7ozP5XMIMlHMLjt00GGSwW6DJAf/njY5EU6Vpwl4LlBKQ==", + "integrity": "sha1-JyDC7/lAhUyBn27iUqrrWB8wYk0=", "dev": true, "requires": { "get-own-enumerable-property-symbols": "2.0.1", @@ -3852,7 +3884,7 @@ "table": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "integrity": "sha1-ozRHN1OR52atNNNIbm4q7chNLjY=", "dev": true, "requires": { "ajv": "5.3.0", @@ -3872,7 +3904,7 @@ "slice-ansi": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "integrity": "sha1-BE8aSdiEL/MHqta1Be0Xi9lQE00=", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0" @@ -3900,7 +3932,7 @@ "timers-browserify": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", - "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "integrity": "sha1-lspT9LeUpefA4b18yIo3Ipj6AeY=", "requires": { "setimmediate": "1.0.5" } @@ -3908,7 +3940,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", "dev": true, "requires": { "os-tmpdir": "1.0.2" @@ -3922,7 +3954,7 @@ "truffle": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.0.1.tgz", - "integrity": "sha512-PybO+GMq3AvsfCWfEx4sbuaJlDL19iR8Ff20cO0TtP599N5JbMLlhwlffvVInPgFjP+F11vjSOYj3hT8fONs5A==", + "integrity": "sha1-2GYaStemyglLdRfSmxmcYObd5mU=", "requires": { "mocha": "3.5.3", "original-require": "1.0.1", @@ -3932,7 +3964,7 @@ "truffle-artifactor": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/truffle-artifactor/-/truffle-artifactor-3.0.0.tgz", - "integrity": "sha512-lFe9nfcnGBq+rDQF2TWRqvjMTbLA4u3uWfkipHV7RY8Ek17l+33lpbi+3gsU7hwOeyG5y1zOQQMhP1w2coUrUA==", + "integrity": "sha1-gBlrd749JnrpCmPeHt4TJLMJkWI=", "requires": { "async": "1.5.2", "fs-extra": "1.0.0", @@ -3960,7 +3992,7 @@ "truffle-compile": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/truffle-compile/-/truffle-compile-3.0.2.tgz", - "integrity": "sha512-fr5xTSKC4KCvgicjUjZEsBdRjoa+b/mRTLuV/3nz5wIUo8seINwODwyadKgxcXau6BNsjhNjaY939QkawENgpw==", + "integrity": "sha1-0ZM/INERnBlzJEl7mVE9Gbv3nD4=", "requires": { "async": "2.6.0", "colors": "1.1.2", @@ -3976,7 +4008,7 @@ "truffle-config": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/truffle-config/-/truffle-config-1.0.3.tgz", - "integrity": "sha512-UupIHPgaZm/mFpw9D45ELK6S7Lihobm0rCuJOFH0bt/23yC2DxPi+wB7h8lJEXcIO9aOlBs9pYOb8X8tChOcqA==", + "integrity": "sha1-ZzjLniKloZjZBtJyPIZzUD+fDMA=", "requires": { "find-up": "2.1.0", "lodash": "4.17.4", @@ -3988,7 +4020,7 @@ "truffle-contract": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/truffle-contract/-/truffle-contract-3.0.1.tgz", - "integrity": "sha512-uHavvQfKuPRCxk1v+jjbGuxpng0EgyLOF3wASrIrkHHiv2aUZiZr+z0EHyUOSrq4aAKeA8CqpToUyFrGGHXJNA==", + "integrity": "sha1-f9A5VXGwwBGvuAnL1kQdVT55MgE=", "requires": { "ethjs-abi": "0.1.8", "truffle-blockchain-utils": "0.0.3", @@ -3999,7 +4031,7 @@ "truffle-contract-schema": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/truffle-contract-schema/-/truffle-contract-schema-1.0.1.tgz", - "integrity": "sha512-37ZO9FVvmW/PZz/sh00LAz7HN2U4FHERuxI4mCbUR6h3r2cRgZ4YBfzHuAHOnZlrVzM1qx/Dx/1Ng3UyfWseEA==", + "integrity": "sha1-CM6u/nEGKorJq4gad6MP2jdEF24=", "requires": { "ajv": "5.3.0", "crypto-js": "3.1.9-1" @@ -4023,7 +4055,7 @@ "truffle-deployer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/truffle-deployer/-/truffle-deployer-2.0.0.tgz", - "integrity": "sha512-7ckAdmGUordFzUWiE8/p+VXDysUyQFjBGrNbM2WszyF7DAuFjx1nhZLfBD8FeU5mrVBk/A/aH8x5MtJm9OrP5g==", + "integrity": "sha1-y0QvwmN0/Nmyrn7rL84ZuWTt/Zg=", "requires": { "truffle-contract": "3.0.1", "truffle-expect": "0.0.3" @@ -4042,7 +4074,7 @@ "truffle-migrate": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/truffle-migrate/-/truffle-migrate-2.0.0.tgz", - "integrity": "sha512-T8lx/K5O7mogYkDMMI/RyG1GgchisWedcUVv9+q99+ZPklWF60BbE1Qn8ShlHaxHVUsO6S25I6ZiQ679tsxkdw==", + "integrity": "sha1-vH99xyI70Eal7hduf+LhHL/RzMc=", "requires": { "async": "2.6.0", "node-dir": "0.1.17", @@ -4064,7 +4096,7 @@ "bignumber.js": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz", - "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==" + "integrity": "sha1-228UBnwUC9RmJIFaeRbJLZtsJLE=" }, "web3": { "version": "0.19.1", @@ -4099,7 +4131,7 @@ "truffle-resolver": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/truffle-resolver/-/truffle-resolver-4.0.1.tgz", - "integrity": "sha512-WUqZ6LRLlehwSmFE4ek4gF7x8QEOQA8lC/6O1UIrckA0b7rK9tvdZhiAgVPZ1MCa1qDbUIWe01xu28M6/ibTsw==", + "integrity": "sha1-tlxlx7cVimeKplI15TnRG73BWQ8=", "requires": { "async": "2.6.0", "truffle-contract": "3.0.1", @@ -4116,7 +4148,7 @@ "tslib": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.0.tgz", - "integrity": "sha512-ymKWWZJST0/CkgduC2qkzjMOWr4bouhuURNXCn/inEX0L57BnRG6FhX76o7FOnsjHazCjfU2LKeSrlS2sIKQJg==", + "integrity": "sha1-3GBOutZLy/aW1hPabJVKoOfqHrY=", "dev": true }, "tslint": { @@ -4164,7 +4196,7 @@ "type-detect": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.5.tgz", - "integrity": "sha512-N9IvkQslUGYGC24RkJk1ba99foK6TkwC2FHAEBlQFBP0RxQZS8ZpJuAZcwiY/w9ZJHFQb1aOXBI60OdxhTrwEQ==", + "integrity": "sha1-1w5byB223io4G8rKDG4MvcdjXeI=", "dev": true }, "typedarray": { @@ -4296,12 +4328,17 @@ "utf8": "2.1.2", "xhr2": "0.1.4", "xmlhttprequest": "1.8.0" + }, + "dependencies": { + "bignumber.js": { + "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" + } } }, "webpack": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz", - "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==", + "integrity": "sha1-sWloqBEAq+YWCLAVPJFZ74uyvYM=", "requires": { "acorn": "5.2.1", "acorn-dynamic-import": "2.0.2", @@ -4346,7 +4383,7 @@ "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", "requires": { "isexe": "2.0.0" } @@ -4361,6 +4398,31 @@ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" }, + "winston": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz", + "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=", + "requires": { + "async": "1.0.0", + "colors": "1.0.3", + "cycle": "1.0.3", + "eyes": "0.1.8", + "isstream": "0.1.2", + "stack-trace": "0.0.10" + }, + "dependencies": { + "async": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", + "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" + } + } + }, "wordwrap": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", diff --git a/package.json b/package.json index 4b87cdf..4c0682d 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,9 @@ "files": [ "bin/*.js", "build/contracts/*.json", - "contracts/*.sol", + "contracts/**/*.sol", "migrations/*.js", + "utils/*.js", "index.js", "truffle-config.js" ], @@ -18,15 +19,21 @@ "compile": "run-s compile:ts compile:sol", "compile:sol": "truffle compile", "compile:ts": "tsc", - "test": "run-s compile:ts test:truffle", - "test:truffle": "truffle test", + "test": "run-s compile:ts test:js", + "test:js": "truffle test", + "test:addressset": "truffle test test/AddressSet/Test*.sol", + "test:signhash": "run-s compile:ts test:signhash:js", + "test:signhash:js": "truffle test test/signhash.test.js", + "test:tipswallet": "run-s compile:ts test:tipswallet:js", + "test:tipswallet:js": "truffle test test/tipswallet.test.js", "migrate": "truffle migrate --reset --network testrpc", "seed": "run-s compile:ts seed:js", "seed:js": "node bin/seed.js", "lint": "run-p -c --aggregate-output lint:solhint lint:tslint", - "lint:tslint": "tslint *.ts migrations/*.ts test/*.ts", - "lint:solhint": "solhint contracts/*.sol test/*.sol", - "format": "prettier --write *.ts **/*.ts", + "lint:tslint": "tslint --project .", + "lint:tslint:fix": "tslint --fix --project .", + "lint:solhint": "solhint contracts/**/*.sol test/**/*.sol", + "format": "prettier --write *.ts {migrations,multisig,test,types,utils}/**/*.ts", "precommit": "lint-staged", "prepublishOnly": "run-s compile" }, @@ -63,22 +70,25 @@ "truffle-compile": "^3.0.2", "truffle-config": "^1.0.3", "truffle-migrate": "^2.0.0", - "truffle-resolver": "^4.0.1" + "truffle-resolver": "^4.0.1", + "winston": "^2.4.0" }, "devDependencies": { - "@types/bignumber.js": "^4.0.3", + "@digix/tempo": "^0.2.0", "@types/chai": "^4.0.4", "@types/es6-promise": "0.0.33", "@types/mkdirp": "^0.5.1", "@types/mocha": "^2.2.44", "@types/node": "^8.0.51", "@types/ramda": "^0.24.14", + "@types/winston": "^2.3.7", + "bignumber.js": "^4.1.0", "chai": "^4.1.2", "husky": "^0.14.3", "lint-staged": "^4.3.0", "npm-run-all": "^4.1.2", "prettier": "^1.7.0", - "ramda": "^0.24.1", + "ramda": "^0.25.0", "solhint": "^1.1.7", "tslint": "^5.7.0", "typescript": "^2.5.2" diff --git a/test/Helpers.sol b/test/AddressSet/Helpers.sol similarity index 99% rename from test/Helpers.sol rename to test/AddressSet/Helpers.sol index f5da16c..acb80c3 100644 --- a/test/Helpers.sol +++ b/test/AddressSet/Helpers.sol @@ -2,7 +2,7 @@ pragma solidity 0.4.18; import "truffle/Assert.sol"; -import "../contracts/AddressSet.sol"; +import "../../contracts/AddressSet.sol"; library Helpers { diff --git a/test/TestAddressSetAdd.sol b/test/AddressSet/TestAddressSetAdd.sol similarity index 98% rename from test/TestAddressSetAdd.sol rename to test/AddressSet/TestAddressSetAdd.sol index bb89340..39921b4 100644 --- a/test/TestAddressSetAdd.sol +++ b/test/AddressSet/TestAddressSetAdd.sol @@ -2,7 +2,7 @@ pragma solidity 0.4.18; import "truffle/Assert.sol"; -import "../contracts/AddressSet.sol"; +import "../../contracts/AddressSet.sol"; import "./Helpers.sol"; diff --git a/test/TestAddressSetEmpty.sol b/test/AddressSet/TestAddressSetEmpty.sol similarity index 95% rename from test/TestAddressSetEmpty.sol rename to test/AddressSet/TestAddressSetEmpty.sol index 8acfea9..b8cd054 100644 --- a/test/TestAddressSetEmpty.sol +++ b/test/AddressSet/TestAddressSetEmpty.sol @@ -2,7 +2,7 @@ pragma solidity 0.4.18; import "truffle/Assert.sol"; -import "../contracts/AddressSet.sol"; +import "../../contracts/AddressSet.sol"; import "./Helpers.sol"; diff --git a/test/TestAddressSetRemove.sol b/test/AddressSet/TestAddressSetRemove.sol similarity index 98% rename from test/TestAddressSetRemove.sol rename to test/AddressSet/TestAddressSetRemove.sol index a38c572..02e1817 100644 --- a/test/TestAddressSetRemove.sol +++ b/test/AddressSet/TestAddressSetRemove.sol @@ -2,7 +2,7 @@ pragma solidity 0.4.18; import "truffle/Assert.sol"; -import "../contracts/AddressSet.sol"; +import "../../contracts/AddressSet.sol"; import "./Helpers.sol"; diff --git a/test/MultiSig/context.ts b/test/MultiSig/context.ts new file mode 100644 index 0000000..7ffd96d --- /dev/null +++ b/test/MultiSig/context.ts @@ -0,0 +1,7 @@ +import { MultiSig } from 'signhash'; + +export class MultiSigTestContext { + public multisig: T; + + public constructor(public accounts: Address[], public owners: Address[]) {} +} diff --git a/test/MultiSig/multisig.test.ts b/test/MultiSig/multisig.test.ts new file mode 100644 index 0000000..cb696f2 --- /dev/null +++ b/test/MultiSig/multisig.test.ts @@ -0,0 +1,480 @@ +import { assert } from 'chai'; + +import * as Web3 from 'web3'; + +import { + DepositedEvent, + ERC20, + ExecutedEvent, + MultiSig, + SignHashArtifacts +} from 'signhash'; +import { ContractContextDefinition, TransactionResult } from 'truffle'; +import { AnyNumber } from 'web3'; + +import { + getData, + MultiSigExecutor, + Signature, + TransferCommand, + TransferERC20Command +} from '../../multisig'; +import { Web3Utils } from '../../utils'; + +import { + assertEtherEqual, + assertNumberEqual, + assertThrowsInvalidOpcode, + findLastLog +} from '../helpers'; +import { MultiSigTestContext } from './context'; + +declare const web3: Web3; +declare const artifacts: SignHashArtifacts; +declare const contract: ContractContextDefinition; + +const MultiSigContract = artifacts.require('./MultiSig/MultiSig.sol'); +const TestERC20TokenContract = artifacts.require('./Test/TestERC20Token.sol'); + +const utils = new Web3Utils(web3); + +contract('MultiSig', accounts => { + describe('#ctor', () => { + it('should not allow empty list of owners', async () => { + await assertThrowsInvalidOpcode(async () => { + await MultiSigContract.new([]); + }); + }); + }); + + const ownerSets = [[accounts[2]], accounts.slice(1, 3), accounts.slice(2, 6)]; + ownerSets.map(owners => { + context(`When wallet has ${owners.length} owners`, () => { + const ctx = new MultiSigTestContext(accounts, owners); + + beforeEach(async () => { + ctx.multisig = await MultiSigContract.new(owners); + }); + + describe('#listOwners', () => testListOwners(ctx)); + describe('#fallback', () => testFallback(ctx)); + describe('#execute', () => testExecute(ctx)); + }); + }); +}); + +export function testListOwners(ctx: MultiSigTestContext) { + it('should list owners', async () => { + assert.deepEqual(await ctx.multisig.listOwners(), ctx.owners); + }); +} + +export function testFallback(ctx: MultiSigTestContext) { + const defaultAccount = ctx.accounts[9]; + + it('should not consume more than 23000 gas', async () => { + const result = await deposit( + ctx.multisig, + utils.toEther(0.1), + defaultAccount + ); + + assert.isAtMost(result.receipt.gasUsed, 23000); + }); + + it('should increase balance', async () => { + const value = utils.toEther(1); + await deposit(ctx.multisig, value, defaultAccount); + + assertEtherEqual(value, await utils.getBalance(ctx.multisig.address)); + }); + + it('should emit Deposited event when sent value', async () => { + const value = utils.toEther(1); + const tx = await deposit(ctx.multisig, value, defaultAccount); + + const log = findLastLog(tx, 'Deposited'); + assert.isOk(log); + + const event = log.args as DepositedEvent; + assert.isOk(event); + assert.equal(event.from, defaultAccount); + assertEtherEqual(event.value, value); + }); + + it('should not emit Deposited event when not sent value', async () => { + const tx = await deposit(ctx.multisig, 0, defaultAccount); + + const log = findLastLog(tx, 'Deposited'); + assert.isNotOk(log); + }); +} + +export function testExecute(ctx: MultiSigTestContext) { + const defaultAccount = ctx.accounts[9]; + + let dummyCommand: DummyCommand; + + class DummyCommand { + private readonly execution: MultiSigExecutor; + + constructor() { + this.execution = new MultiSigExecutor(web3, ctx.multisig); + } + + public sign(signer: Address, nonce: Web3.AnyNumber): Signature { + return this.execution.sign(signer, nonce, defaultAccount, 0, '0x'); + } + + public async execute(signatures: Signature[]): Promise { + return this.execution.execute(signatures, defaultAccount, 0, '0x'); + } + } + + function assertExecutedEvent( + tx: TransactionResult, + account: Address, + nonce: AnyNumber, + value: AnyNumber, + data: string + ) { + const log = findLastLog(tx, 'Executed'); + assert.isOk(log); + + const event = log.args as ExecutedEvent; + assert.isOk(event); + assert.equal(event.destination, account); + assertNumberEqual(event.nonce, nonce); + assertEtherEqual(event.value, value); + assert.equal(event.data, data); + } + + beforeEach(async () => { + await deposit(ctx.multisig, utils.toEther(1), defaultAccount); + + dummyCommand = new DummyCommand(); + }); + + it('should emit Executed event', async () => { + const nonce = await ctx.multisig.nonce(); + const signatures = await Promise.all( + ctx.owners.map(owner => dummyCommand.sign(owner, nonce)) + ); + const tx = await dummyCommand.execute(signatures); + + assertExecutedEvent(tx, defaultAccount, nonce, 0, '0x'); + }); + + it('should throw when not signed', async () => { + await assertThrowsInvalidOpcode(async () => { + await dummyCommand.execute([]); + }); + }); + + if (ctx.owners.length > 1) { + ctx.owners.map(async (owner, index) => + it(`should throw when signed only by #${index + 1}`, async () => { + const nonce = await ctx.multisig.nonce(); + const signature = await dummyCommand.sign(owner, nonce); + + await assertThrowsInvalidOpcode(async () => { + await dummyCommand.execute([signature]); + }); + }) + ); + } + + it('should throw when signed by other accounts', async () => { + const strangers = ctx.accounts.slice(4, 4 + ctx.owners.length); + assert.notDeepEqual(strangers, ctx.owners); + + const nonce = await ctx.multisig.nonce(); + const signatures = await Promise.all( + strangers.map(owner => dummyCommand.sign(owner, nonce)) + ); + + await assertThrowsInvalidOpcode(async () => { + await dummyCommand.execute(signatures); + }); + }); + + if (ctx.owners.length > 1) { + it('should throw when signed by owners in wrong order', async () => { + const reversed = ctx.owners.reverse(); + const nonce = await ctx.multisig.nonce(); + const signatures = await Promise.all( + reversed.map(owner => dummyCommand.sign(owner, nonce)) + ); + + await assertThrowsInvalidOpcode(async () => { + await dummyCommand.execute(signatures); + }); + }); + } + + it('should throw on replay attack', async () => { + const nonce = await ctx.multisig.nonce(); + const signatures = await Promise.all( + ctx.owners.map(owner => dummyCommand.sign(owner, nonce)) + ); + + await dummyCommand.execute(signatures); + + await assertThrowsInvalidOpcode(async () => { + await dummyCommand.execute(signatures); + }); + }); + + describe('transfer Ether', () => { + let transferCommand: TransferCommand; + + async function transfer(account: Address, value: AnyNumber) { + const nonce = await ctx.multisig.nonce(); + const signatures = ctx.owners.map(owner => + transferCommand.sign(owner, nonce, account, value) + ); + + return await transferCommand.execute(signatures, account, value); + } + + beforeEach(async () => { + await deposit(ctx.multisig, utils.toEther(1), defaultAccount); + + transferCommand = new TransferCommand(web3, ctx.multisig); + }); + + it('should transfer Ether to account', async () => { + const value = utils.toEther(0.1); + const initialBalance = await utils.getBalance(defaultAccount); + const expectedBalance = initialBalance.add(value); + + await transfer(defaultAccount, value); + + assertEtherEqual(await utils.getBalance(defaultAccount), expectedBalance); + }); + + it('should emit Executed event', async () => { + const value = utils.toEther(0.1); + const nonce = await ctx.multisig.nonce(); + + const tx = await transfer(defaultAccount, value); + assertExecutedEvent(tx, defaultAccount, nonce, value, '0x'); + }); + + it('should transfer Ether to account repeatedly', async () => { + const values = [0.1, 0.3, 0.5].map(value => utils.toEther(value)); + const initialBalance = await utils.getBalance(defaultAccount); + const valuesSum = values.reduce((a, b) => a.add(b), utils.toEther(0)); + const expectedBalance = initialBalance.add(valuesSum); + + for (const value of values) { + await transfer(defaultAccount, value); + } + + assertEtherEqual(await utils.getBalance(defaultAccount), expectedBalance); + }); + + it('should transfer Ether to several accounts', async () => { + const value = utils.toEther(0.1); + const destinations = ctx.accounts.slice(5, 9); + + // sign all transfers + const nonce = await ctx.multisig.nonce(); + const specifications = await Promise.all( + destinations.map(async (account, index) => ({ + destination: { + account, + initialBalance: await utils.getBalance(account) + }, + signatures: ctx.owners.map(owner => + transferCommand.sign(owner, nonce.add(index), account, value) + ) + })) + ); + + // execute all transfers + for (const { signatures, destination } of specifications) { + await transferCommand.execute(signatures, destination.account, value); + + const expectedBalance = destination.initialBalance.add(value); + assertEtherEqual( + await utils.getBalance(destination.account), + expectedBalance + ); + } + }); + + it('should throw on nonce reuse', async () => { + const nonce = await ctx.multisig.nonce(); + const value = utils.toEther(0.1); + const tx2Destination = defaultAccount; + const tx2Value = utils.toEther(0.2); + + const tx1Signatures = ctx.owners.map(owner => + transferCommand.sign(owner, nonce, defaultAccount, value) + ); + + const tx2Signatures = ctx.owners.map(owner => + transferCommand.sign( + owner, + nonce, // NOTICE: the same nonce as previously + tx2Destination, + tx2Value + ) + ); + + await transferCommand.execute(tx1Signatures, defaultAccount, value); + + await assertThrowsInvalidOpcode(async () => { + await transferCommand.execute(tx2Signatures, tx2Destination, tx2Value); + }); + }); + }); + + describe('transfer ERC20', () => { + let token: ERC20; + let transferERC20Command: TransferERC20Command; + + async function transferERC20(account: Address, amount: AnyNumber) { + const nonce = await ctx.multisig.nonce(); + + const signatures = await Promise.all( + ctx.owners.map(owner => + transferERC20Command.sign(owner, nonce, account, amount) + ) + ); + + return await transferERC20Command.execute(signatures, account, amount); + } + + beforeEach(async () => { + token = await TestERC20TokenContract.new(); + await token.transfer(ctx.multisig.address, utils.toEther(100)); + transferERC20Command = new TransferERC20Command( + web3, + ctx.multisig, + token + ); + }); + + it('should transfer ERC20 tokens to account', async () => { + const amount = utils.toEther(10); + const initialBalance = await token.balanceOf(defaultAccount); + const expectedBalance = initialBalance.add(amount); + + await transferERC20(defaultAccount, amount); + + assertEtherEqual(await token.balanceOf(defaultAccount), expectedBalance); + }); + + it('should emit Executed event', async () => { + const amount = utils.toEther(10); + const nonce = await ctx.multisig.nonce(); + + const tx = await transferERC20(defaultAccount, amount); + const expectedData = await getData( + token.transfer, + defaultAccount, + amount + ); + + assertExecutedEvent(tx, token.address, nonce, 0, expectedData); + }); + + it('should transfer ERC20 tokens to account repeatedly', async () => { + const amounts = [1, 3, 5].map(amount => utils.toEther(amount)); + const initialBalance = await token.balanceOf(defaultAccount); + const amountsSum = amounts.reduce((a, b) => a.add(b), utils.toEther(0)); + const expectedBalance = initialBalance.add(amountsSum); + + for (const amount of amounts) { + await transferERC20(defaultAccount, amount); + } + + assertEtherEqual(await token.balanceOf(defaultAccount), expectedBalance); + }); + + it('should transfer ERC20 tokens to several accounts', async () => { + const amount = utils.toEther(10); + const destinations = ctx.accounts.slice(5, 9); + + // sign all token transfers + const nonce = await ctx.multisig.nonce(); + const specifications = await Promise.all( + destinations.map(async (account, index) => ({ + destination: { + account, + initialTokenBalance: await token.balanceOf(account) + }, + signatures: await Promise.all( + ctx.owners.map(owner => + transferERC20Command.sign( + owner, + nonce.add(index), + account, + amount + ) + ) + ) + })) + ); + + // execute all token transfers + for (const { signatures, destination } of specifications) { + await transferERC20Command.execute( + signatures, + destination.account, + amount + ); + + const expectedBalance = destination.initialTokenBalance.add(amount); + assertEtherEqual( + await token.balanceOf(destination.account), + expectedBalance + ); + } + }); + + it('should throw on nonce reuse', async () => { + const nonce = await ctx.multisig.nonce(); + const amount = utils.toEther(1); + const tx2Destination = ctx.accounts[6]; + const tx2Amount = utils.toEther(2); + + const tx1Signatures = await Promise.all( + ctx.owners.map(owner => + transferERC20Command.sign(owner, nonce, defaultAccount, amount) + ) + ); + + const tx2Signatures = await Promise.all( + ctx.owners.map(owner => + transferERC20Command.sign( + owner, + nonce, // NOTICE: the same nonce as previously + tx2Destination, + tx2Amount + ) + ) + ); + + await transferERC20Command.execute(tx1Signatures, defaultAccount, amount); + + await assertThrowsInvalidOpcode(async () => { + await transferERC20Command.execute( + tx2Signatures, + tx2Destination, + tx2Amount + ); + }); + }); + }); +} + +async function deposit(multisig: MultiSig, value: AnyNumber, from: Address) { + return await multisig.sendTransaction({ + from, + to: multisig.address, + value + }); +} diff --git a/test/MultiSig/recoverablemultisig.test.ts b/test/MultiSig/recoverablemultisig.test.ts new file mode 100644 index 0000000..cb8634f --- /dev/null +++ b/test/MultiSig/recoverablemultisig.test.ts @@ -0,0 +1,312 @@ +import { BigNumber } from 'bignumber.js'; +import { assert } from 'chai'; + +import * as tempo from '@digix/tempo'; +import * as Web3 from 'web3'; + +import { + RecoverableMultiSig, + RecoveryCancelledEvent, + RecoveryConfirmedEvent, + RecoveryStartedEvent, + SignHashArtifacts +} from 'signhash'; +import { ContractContextDefinition } from 'truffle'; + +import { toHex } from '../../multisig'; + +import { + assertNumberEqual, + assertThrowsInvalidOpcode, + findLastLog +} from '../helpers'; +import { MultiSigTestContext } from './context'; + +declare const web3: Web3; +declare const artifacts: SignHashArtifacts; +declare const contract: ContractContextDefinition; + +const RecoverableMultiSigContract = artifacts.require( + './MultiSig/RecoverableMultiSig.sol' +); + +contract('RecoverableMultiSigContract', accounts => { + describe('#ctor', () => { + it('should not allow empty list of owners', async () => { + await assertThrowsInvalidOpcode(async () => { + await RecoverableMultiSigContract.new([]); + }); + }); + }); + + const ownerSets = [[accounts[2]], accounts.slice(1, 3), accounts.slice(2, 6)]; + ownerSets.map(owners => { + context(`When wallet has ${owners.length} owners`, () => { + const ctx = new MultiSigTestContext( + accounts, + owners + ); + + beforeEach(async () => { + const recoveryBlockOffset = 100; + ctx.multisig = await RecoverableMultiSigContract.new( + owners, + recoveryBlockOffset + ); + }); + + describe('#startRecovery', () => testStartRecovery(ctx)); + describe('#cancelRecovery', () => testCancelRecovery(ctx)); + describe('#confirmRecovery', () => testConfirmRecovery(ctx)); + }); + }); +}); + +export function testStartRecovery( + ctx: MultiSigTestContext +) { + const nonOwner = ctx.accounts[0]; + const newOwners = ctx.accounts.slice(6, 9); + + // preconditions + beforeEach(async () => { + assert.deepEqual(ctx.owners, await ctx.multisig.listOwners()); + assert.notInclude(ctx.owners, nonOwner); + assert.notDeepEqual(newOwners, ctx.owners); + }); + + context(`When called by non-owner`, () => { + it('should throw invalid opcode', async () => { + await assertThrowsInvalidOpcode(async () => { + await ctx.multisig.startRecovery(newOwners, { from: nonOwner }); + }); + }); + }); + + ctx.owners.map((owner, index) => { + context(`When called by #${index + 1} owner`, () => { + it('should set recoveryHash for a single account', async () => { + const singleOwner = [newOwners[0]]; + await ctx.multisig.startRecovery(singleOwner, { from: owner }); + + assert.equal( + await ctx.multisig.recoveryHash(), + hashAddresses(singleOwner) + ); + }); + + it('should set recoveryHash for multiple accounts', async () => { + await ctx.multisig.startRecovery(newOwners, { from: owner }); + + assert.equal( + await ctx.multisig.recoveryHash(), + hashAddresses(newOwners) + ); + }); + + it('should set recoveryBlock to current block', async () => { + await ctx.multisig.startRecovery(newOwners, { from: owner }); + + assertNumberEqual( + await ctx.multisig.recoveryBlock(), + web3.eth.blockNumber + ); + }); + + it('should emit RecoveryStarted event', async () => { + const trans = await ctx.multisig.startRecovery(newOwners, { + from: owner + }); + + const log = findLastLog(trans, 'RecoveryStarted'); + const event: RecoveryStartedEvent = log.args; + + assert.equal(event.from, owner); + assert.deepEqual(event.newOwners, newOwners); + }); + }); + }); +} + +export function testCancelRecovery( + ctx: MultiSigTestContext +) { + const nonOwner = ctx.accounts[0]; + const newOwners = ctx.accounts.slice(6, 9); + + // preconditions + beforeEach(async () => { + assert.deepEqual(ctx.owners, await ctx.multisig.listOwners()); + assert.notInclude(ctx.owners, nonOwner); + assert.notDeepEqual(newOwners, ctx.owners); + }); + + context('When recovery not started', () => { + it('should throw invalid opcode', async () => { + await assertThrowsInvalidOpcode(async () => { + await ctx.multisig.cancelRecovery({ from: ctx.owners[0] }); + }); + }); + }); + + context('When recovery started', () => { + beforeEach(async () => { + await ctx.multisig.startRecovery(newOwners, { from: ctx.owners[0] }); + }); + + context(`When called by non-owner`, () => { + it('should throw invalid opcode', async () => { + await assertThrowsInvalidOpcode(async () => { + await ctx.multisig.cancelRecovery({ from: nonOwner }); + }); + }); + }); + + ctx.owners.map((owner, index) => { + context(`When called by #${index + 1} owner`, () => { + it('should reset recoveryHash', async () => { + await ctx.multisig.cancelRecovery({ from: owner }); + + assert.equal( + await ctx.multisig.recoveryHash(), + `0x${'0'.repeat(64)}` + ); + }); + + it('should reset recoveryBlock', async () => { + await ctx.multisig.cancelRecovery({ from: owner }); + + assertNumberEqual(await ctx.multisig.recoveryBlock(), 0); + }); + + it('should emit RecoveryCancelled event', async () => { + const trans = await ctx.multisig.cancelRecovery({ + from: owner + }); + + const log = findLastLog(trans, 'RecoveryCancelled'); + const event: RecoveryCancelledEvent = log.args; + + assert.equal(event.from, owner); + }); + }); + }); + }); +} + +export function testConfirmRecovery( + ctx: MultiSigTestContext +) { + const nonOwner = ctx.accounts[0]; + const newOwners = ctx.accounts.slice(6, 9); + + // preconditions + beforeEach(async () => { + assert.deepEqual(ctx.owners, await ctx.multisig.listOwners()); + assert.notInclude(ctx.owners, nonOwner); + assert.notDeepEqual(newOwners, ctx.owners); + }); + + context('When recovery not started', () => { + it('should throw invalid opcode', async () => { + await assertThrowsInvalidOpcode(async () => { + await ctx.multisig.cancelRecovery({ from: ctx.owners[0] }); + }); + }); + }); + + context('When recovery started', () => { + const waitUntilBlock = tempo(web3).waitUntilBlock; + + let recoveryPassingBlock: BigNumber; + + beforeEach(async () => { + await ctx.multisig.startRecovery(newOwners, { from: ctx.owners[0] }); + + recoveryPassingBlock = (await ctx.multisig.recoveryBlock()).add( + await ctx.multisig.recoveryBlockOffset() + ); + }); + + context('When recovery just started', () => { + it('should throw invalid opcode', async () => { + await assertThrowsInvalidOpcode(async () => { + await ctx.multisig.confirmRecovery(newOwners, { + from: ctx.owners[0] + }); + }); + }); + }); + + context('When recovery not passed', () => { + it('should throw invalid opcode', async () => { + await waitUntilBlock(100, recoveryPassingBlock.div(2).toNumber()); + + await assertThrowsInvalidOpcode(async () => { + await ctx.multisig.confirmRecovery(newOwners, { + from: ctx.owners[0] + }); + }); + }); + }); + + context('When recovery passed', () => { + beforeEach(async () => { + await waitUntilBlock(100, recoveryPassingBlock.toNumber()); + }); + + context(`When called by non-owner`, () => { + it('should throw invalid opcode', async () => { + await assertThrowsInvalidOpcode(async () => { + await ctx.multisig.confirmRecovery(newOwners, { from: nonOwner }); + }); + }); + }); + + ctx.owners.map((owner, index) => { + context(`When called by #${index + 1} owner`, () => { + it('should change owners', async () => { + await ctx.multisig.confirmRecovery(newOwners, { from: owner }); + + assert.deepEqual(await ctx.multisig.listOwners(), newOwners); + }); + + it('should reset recoveryHash', async () => { + await ctx.multisig.confirmRecovery(newOwners, { from: owner }); + + assert.equal( + await ctx.multisig.recoveryHash(), + `0x${'0'.repeat(64)}` + ); + }); + + it('should reset recoveryBlock', async () => { + await ctx.multisig.confirmRecovery(newOwners, { from: owner }); + + assertNumberEqual(await ctx.multisig.recoveryBlock(), 0); + }); + + it('should emit RecoveryConfirmed event', async () => { + const trans = await ctx.multisig.confirmRecovery(newOwners, { + from: owner + }); + + const log = findLastLog(trans, 'RecoveryConfirmed'); + const event: RecoveryConfirmedEvent = log.args; + + assert.equal(event.from, owner); + assert.deepEqual(event.newOwners, newOwners); + }); + }); + }); + }); + }); +} + +function hashAddresses(addresses: Address[]): string { + const str = addresses.reduce( + (acc, owner) => acc.concat(toHex(owner, 64)), + '' + ); + return web3.sha3(str, { encoding: 'hex' }); +} diff --git a/test/MultiSig/transferablemultisig.test.ts b/test/MultiSig/transferablemultisig.test.ts new file mode 100644 index 0000000..be526a2 --- /dev/null +++ b/test/MultiSig/transferablemultisig.test.ts @@ -0,0 +1,169 @@ +import { assert } from 'chai'; + +import * as Web3 from 'web3'; + +import { SignHashArtifacts, TransferableMultiSig } from 'signhash'; +import { ContractContextDefinition } from 'truffle'; + +import { TransferOwnershipCommand } from '../../multisig'; + +import { assertThrowsInvalidOpcode } from '../helpers'; +import { MultiSigTestContext } from './context'; + +declare const web3: Web3; +declare const artifacts: SignHashArtifacts; +declare const contract: ContractContextDefinition; + +const TransferableMultiSigContract = artifacts.require( + './MultiSig/TransferableMultiSig.sol' +); + +contract('TransferableMultiSigContract', accounts => { + describe('#ctor', () => { + it('should not allow empty list of owners', async () => { + await assertThrowsInvalidOpcode(async () => { + await TransferableMultiSigContract.new([]); + }); + }); + }); + + const ownerSets = [[accounts[2]], accounts.slice(1, 3), accounts.slice(2, 6)]; + ownerSets.map(owners => { + context(`When wallet has ${owners.length} owners`, () => { + const ctx = new MultiSigTestContext( + accounts, + owners + ); + + beforeEach(async () => { + ctx.multisig = await TransferableMultiSigContract.new(owners); + }); + + describe('#transferOwnership', () => testTransferOwnership(ctx)); + }); + }); +}); + +export function testTransferOwnership( + ctx: MultiSigTestContext +) { + const newOwners = ctx.accounts.slice(6, 9); + + let transferOwnershipCommand: TransferOwnershipCommand; + + async function transferOwnership(owners: Address[]) { + const nonce = await ctx.multisig.nonce(); + + const signatures = await Promise.all( + ctx.owners.map(signer => + transferOwnershipCommand.sign(signer, nonce, owners) + ) + ); + + return await transferOwnershipCommand.execute(signatures, owners); + } + + beforeEach(async () => { + transferOwnershipCommand = new TransferOwnershipCommand(web3, ctx.multisig); + + // preconditions + assert.deepEqual(ctx.owners, await ctx.multisig.listOwners()); + assert.notDeepEqual(newOwners, ctx.owners); + }); + + it('should set a single owner', async () => { + const singleOwner = [ctx.accounts[6]]; + await transferOwnership(singleOwner); + + assert.deepEqual(await ctx.multisig.listOwners(), singleOwner); + }); + + it('should set several owners', async () => { + await transferOwnership(newOwners); + + assert.deepEqual(await ctx.multisig.listOwners(), newOwners); + }); + + it('should not allow empty list of owners', async () => { + await assertThrowsInvalidOpcode(async () => { + await transferOwnership([]); + }); + }); + + it('should throw when not signed', async () => { + await assertThrowsInvalidOpcode(async () => { + await transferOwnershipCommand.execute([], newOwners); + }); + }); + + if (ctx.owners.length > 1) { + ctx.owners.map(async (owner, index) => + it(`should throw when signed only by #${index + 1}`, async () => { + const nonce = await ctx.multisig.nonce(); + const signature = await transferOwnershipCommand.sign( + owner, + nonce, + newOwners + ); + + await assertThrowsInvalidOpcode(async () => { + await transferOwnershipCommand.execute([signature], newOwners); + }); + }) + ); + } + + it('should throw when signed by other accounts', async () => { + const strangers = ctx.accounts.slice(4, 4 + ctx.owners.length); + const nonce = await ctx.multisig.nonce(); + const signatures = await Promise.all( + strangers.map(owner => + transferOwnershipCommand.sign(owner, nonce, newOwners) + ) + ); + + await assertThrowsInvalidOpcode(async () => { + await transferOwnershipCommand.execute(signatures, newOwners); + }); + }); + + if (ctx.owners.length > 1) { + it('should throw when signed by owners in wrong order', async () => { + const reversed = ctx.owners.reverse(); + const nonce = await ctx.multisig.nonce(); + const signatures = await Promise.all( + reversed.map(owner => + transferOwnershipCommand.sign(owner, nonce, newOwners) + ) + ); + + await assertThrowsInvalidOpcode(async () => { + await transferOwnershipCommand.execute(signatures, newOwners); + }); + }); + } + + it('should throw on nonce reuse', async () => { + const nonce = await ctx.multisig.nonce(); + const tx1Owners = ctx.accounts.slice(6, 10); + const tx2Owners = ctx.accounts.slice(5, 8); + + const tx1Signatures = ctx.owners.map(owner => + transferOwnershipCommand.sign(owner, nonce, tx1Owners) + ); + + const tx2Signatures = ctx.owners.map(owner => + transferOwnershipCommand.sign( + owner, + nonce, // NOTICE: the same nonce as previously + tx2Owners + ) + ); + + await transferOwnershipCommand.execute(tx1Signatures, tx1Owners); + + await assertThrowsInvalidOpcode(async () => { + await transferOwnershipCommand.execute(tx2Signatures, tx2Owners); + }); + }); +} diff --git a/test/helpers.ts b/test/helpers.ts index e4a88f2..db504e9 100644 --- a/test/helpers.ts +++ b/test/helpers.ts @@ -1,5 +1,14 @@ +import * as Web3 from 'web3'; + +import { BigNumber } from 'bignumber.js'; import { assert } from 'chai'; import { findLast, propEq } from 'ramda'; +import { TransactionLog, TransactionResult } from 'truffle'; + +declare const web3: Web3; + +const ETH_DECIMALS = 18; +const DEFAULT_ACCEPTABLE_ERROR = web3.toWei(5, 'finney'); export async function assertThrowsInvalidOpcode(func: () => void) { try { @@ -25,6 +34,65 @@ export function assertInvalidOpcode(error: { message: string }) { } } +export function assertNumberEqual( + actual: number | string | BigNumber, + expect: number | string | BigNumber, + decimals: number = 0 +) { + const actualNum = new BigNumber(actual); + const expectNum = new BigNumber(expect); + /* solhint-disable no-empty-blocks */ + if (!actualNum.eq(expectNum)) { + const div = decimals ? Math.pow(10, decimals) : 1; + assert.fail( + actualNum.toFixed(), + expectNum.toFixed(), + `${actualNum.div(div).toFixed()} == ${expectNum.div(div).toFixed()}`, + '==' + ); + } +} + +export function assertEtherEqual(actual: any, expect: any) { + return assertNumberEqual(actual, expect, ETH_DECIMALS); +} + +export function assertNumberAlmostEqual( + actual: number | string | BigNumber, + expect: number | string | BigNumber, + epsilon: number | string | BigNumber, + decimals: number +) { + const actualNum = new BigNumber(actual); + const expectNum = new BigNumber(expect); + const epsilonNum = new BigNumber(epsilon); + + if ( + actualNum.lessThan(expectNum.sub(epsilonNum)) || + actualNum.greaterThan(expectNum.add(epsilonNum)) + ) { + const div = decimals ? Math.pow(10, decimals) : 1; + assert.fail( + actualNum.toFixed(), + expectNum.toFixed(), + `${actualNum.div(div).toFixed()} == ${expectNum + .div(div) + .toFixed()} (precision ${epsilonNum.div(div).toFixed()})`, + '==' + ); + } +} + +export function assertEtherAlmostEqual( + actual: number | string | BigNumber, + expect: number | string | BigNumber, + epsilon?: number | string | BigNumber +) { + epsilon = epsilon || DEFAULT_ACCEPTABLE_ERROR; + + return assertNumberAlmostEqual(actual, expect, epsilon, ETH_DECIMALS); +} + export function findLastLog( trans: TransactionResult, event: string diff --git a/test/signhash.ts b/test/signhash.test.ts similarity index 66% rename from test/signhash.ts rename to test/signhash.test.ts index 798dabd..8cb2ba8 100644 --- a/test/signhash.ts +++ b/test/signhash.test.ts @@ -1,7 +1,22 @@ import { assert } from 'chai'; +import * as Web3 from 'web3'; + +import { + ProofAddedEvent, + ProofRemovedEvent, + RevokedEvent, + SignedEvent, + SignHash, + SignHashArtifacts +} from 'signhash'; +import { ContractContextDefinition } from 'truffle'; import { assertThrowsInvalidOpcode, findLastLog } from './helpers'; +declare const web3: Web3; +declare const artifacts: SignHashArtifacts; +declare const contract: ContractContextDefinition; + const SignHashContract = artifacts.require('./SignHash.sol'); contract('SignHash', accounts => { @@ -11,51 +26,51 @@ contract('SignHash', accounts => { const maxCount = accounts.length; const hash = web3.sha3('test'); - let instance: SignHash; + let signHash: SignHash; async function signByMany(hashArg: string, signers: Address[]) { for (const signer of signers) { - await instance.sign(hashArg, { from: signer }); + await signHash.sign(hashArg, { from: signer }); } } beforeEach(async () => { - instance = await SignHashContract.new({ from: deployerAccount }); + signHash = await SignHashContract.new({ from: deployerAccount }); }); describe('#ctor', () => { it('should start with empty list of signers', async () => { - const signers = await instance.getSigners(hash, maxCount); + const signers = await signHash.getSigners(hash, maxCount); assert.deepEqual(signers, []); }); }); describe('#sign', () => { it('should add signer', async () => { - await instance.sign(hash); + await signHash.sign(hash); - const signers = await instance.getSigners(hash, maxCount); + const signers = await signHash.getSigners(hash, maxCount); assert.deepEqual(signers, [defaultAccount]); }); it('should add multiple signers', async () => { await signByMany(hash, accounts); - const signers = await instance.getSigners(hash, maxCount); + const signers = await signHash.getSigners(hash, maxCount); assert.deepEqual(signers, accounts); }); it('should add signer only once', async () => { - await instance.sign(hash); - await instance.sign(hash); + await signHash.sign(hash); + await signHash.sign(hash); - const signers = await instance.getSigners(hash, maxCount); + const signers = await signHash.getSigners(hash, maxCount); assert.deepEqual(signers, [defaultAccount]); }); it('should emit Signed event', async () => { - const trans = await instance.sign(hash); + const trans = await signHash.sign(hash); const log = findLastLog(trans, 'Signed'); - const event: Signed = log.args; + const event: SignedEvent = log.args; assert.equal(event.hash, hash); assert.equal(event.signer, defaultAccount); @@ -63,24 +78,24 @@ contract('SignHash', accounts => { it('should throw when hash is empty', async () => { await assertThrowsInvalidOpcode(async () => { - await instance.sign(''); + await signHash.sign(''); }); }); }); describe('#revoke', () => { it('should remove the only signer', async () => { - await instance.revoke(hash); + await signHash.revoke(hash); - const signers = await instance.getSigners(hash, maxCount); + const signers = await signHash.getSigners(hash, maxCount); assert.deepEqual(signers, []); }); it('should remove one of the signers', async () => { await signByMany(hash, accounts); - await instance.revoke(hash); + await signHash.revoke(hash); - const signers = await instance.getSigners(hash, maxCount); + const signers = await signHash.getSigners(hash, maxCount); const expected = accounts.filter( (account: Address) => account !== defaultAccount ); @@ -89,26 +104,26 @@ contract('SignHash', accounts => { }); it('should not throw when hash is not signed', async () => { - await instance.revoke(hash); + await signHash.revoke(hash); - const signers = await instance.getSigners(hash, maxCount); + const signers = await signHash.getSigners(hash, maxCount); assert.deepEqual(signers, []); }); it('should not throw when revoking account is not signer', async () => { - await instance.sign(hash); - await instance.revoke(hash, { from: otherAccount }); + await signHash.sign(hash); + await signHash.revoke(hash, { from: otherAccount }); - const signers = await instance.getSigners(hash, maxCount); + const signers = await signHash.getSigners(hash, maxCount); assert.deepEqual(signers, [defaultAccount]); }); it('should emit Revoked event', async () => { - await instance.sign(hash); - const trans = await instance.revoke(hash); + await signHash.sign(hash); + const trans = await signHash.revoke(hash); const log = findLastLog(trans, 'Revoked'); - const event: Revoked = log.args; + const event: RevokedEvent = log.args; assert.equal(event.hash, hash); assert.equal(event.signer, defaultAccount); @@ -116,28 +131,28 @@ contract('SignHash', accounts => { it('should throw when hash is empty', async () => { await assertThrowsInvalidOpcode(async () => { - await instance.revoke(''); + await signHash.revoke(''); }); }); }); describe('#getSigners', () => { it('should return empty list when there is no signers', async () => { - const signers = await instance.getSigners(hash, maxCount); + const signers = await signHash.getSigners(hash, maxCount); assert.deepEqual(signers, []); }); it('should return single element list for a single signer', async () => { - await instance.sign(hash); + await signHash.sign(hash); - const signers = await instance.getSigners(hash, maxCount); + const signers = await signHash.getSigners(hash, maxCount); assert.deepEqual(signers, [defaultAccount]); }); it('should return signers in chronological order', async () => { await signByMany(hash, accounts); - const signers = await instance.getSigners(hash, maxCount); + const signers = await signHash.getSigners(hash, maxCount); assert.deepEqual(signers, accounts); }); @@ -145,7 +160,7 @@ contract('SignHash', accounts => { await signByMany(hash, accounts); const reducedCount = maxCount - 1; - const signers = await instance.getSigners(hash, reducedCount); + const signers = await signHash.getSigners(hash, reducedCount); assert.deepEqual(signers, accounts.slice(0, reducedCount)); }); @@ -153,7 +168,7 @@ contract('SignHash', accounts => { await signByMany(hash, accounts); const increasedCount = maxCount + 1; - const signers = await instance.getSigners(hash, increasedCount); + const signers = await signHash.getSigners(hash, increasedCount); assert.deepEqual(signers, accounts); }); @@ -161,7 +176,7 @@ contract('SignHash', accounts => { await signByMany(hash, accounts); const reducedCount = 0; - const signers = await instance.getSigners(hash, reducedCount); + const signers = await signHash.getSigners(hash, reducedCount); assert.deepEqual(signers, []); }); }); @@ -170,9 +185,9 @@ contract('SignHash', accounts => { it('should add proof method', async () => { const method = 'http'; const value = 'example.com'; - await instance.addProof(method, value); + await signHash.addProof(method, value); - const proof = await instance.getProof(defaultAccount, method); + const proof = await signHash.getProof(defaultAccount, method); assert.equal(proof, value); }); @@ -193,14 +208,14 @@ contract('SignHash', accounts => { ]; await Promise.all( - proofs.map(proof => instance.addProof(proof.method, proof.value)) + proofs.map(proof => signHash.addProof(proof.method, proof.value)) ); const readProofs = await Promise.all( proofs.map(async proof => { return { method: proof.method, - value: await instance.getProof(defaultAccount, proof.method) + value: await signHash.getProof(defaultAccount, proof.method) }; }) ); @@ -212,19 +227,19 @@ contract('SignHash', accounts => { const method = 'http'; const value = 'example.com'; const newValue = 'another.com'; - await instance.addProof(method, value); - await instance.addProof(method, newValue); + await signHash.addProof(method, value); + await signHash.addProof(method, newValue); - const proof = await instance.getProof(defaultAccount, method); + const proof = await signHash.getProof(defaultAccount, method); assert.equal(proof, newValue); }); it('should emit ProofAdded event', async () => { const method = 'http'; const value = 'example.com'; - const trans = await instance.addProof(method, value); + const trans = await signHash.addProof(method, value); const log = findLastLog(trans, 'ProofAdded'); - const event: ProofAdded = log.args; + const event: ProofAddedEvent = log.args; assert.equal(event.signer, defaultAccount); assert.equal(event.method, method); @@ -236,7 +251,7 @@ contract('SignHash', accounts => { const value = 'test'; await assertThrowsInvalidOpcode(async () => { - await instance.addProof(method, value); + await signHash.addProof(method, value); }); }); @@ -245,7 +260,7 @@ contract('SignHash', accounts => { const value = ''; await assertThrowsInvalidOpcode(async () => { - await instance.addProof(method, value); + await signHash.addProof(method, value); }); }); }); @@ -254,20 +269,20 @@ contract('SignHash', accounts => { it('should remove proof method', async () => { const method = 'http'; const value = 'example.com'; - await instance.addProof(method, value); + await signHash.addProof(method, value); - await instance.removeProof(method); - const proof = await instance.getProof(defaultAccount, method); + await signHash.removeProof(method); + const proof = await signHash.getProof(defaultAccount, method); assert.equal(proof, ''); }); it('should emit ProofRemoved event', async () => { const method = 'http'; const value = 'example.com'; - await instance.addProof(method, value); - const trans = await instance.removeProof(method); + await signHash.addProof(method, value); + const trans = await signHash.removeProof(method); const log = findLastLog(trans, 'ProofRemoved'); - const event: ProofRemoved = log.args; + const event: ProofRemovedEvent = log.args; assert.equal(event.signer, defaultAccount); assert.equal(event.method, method); @@ -276,10 +291,10 @@ contract('SignHash', accounts => { it('should throw when called by other user', async () => { const method = 'http'; const value = 'example.com'; - await instance.addProof(method, value); + await signHash.addProof(method, value); await assertThrowsInvalidOpcode(async () => { - await instance.removeProof(method, { from: otherAccount }); + await signHash.removeProof(method, { from: otherAccount }); }); }); @@ -287,7 +302,7 @@ contract('SignHash', accounts => { const method = ''; await assertThrowsInvalidOpcode(async () => { - await instance.removeProof(method); + await signHash.removeProof(method); }); }); @@ -295,7 +310,7 @@ contract('SignHash', accounts => { const method = 'doesNotExist'; await assertThrowsInvalidOpcode(async () => { - await instance.removeProof(method); + await signHash.removeProof(method); }); }); }); @@ -304,14 +319,14 @@ contract('SignHash', accounts => { it('should return empty string when proof does not exist', async () => { const method = 'doesNotExist'; - const proof = await instance.getProof(defaultAccount, method); + const proof = await signHash.getProof(defaultAccount, method); assert.equal(proof, ''); }); it('should return empty string when method is empty', async () => { const method = ''; - const proof = await instance.getProof(defaultAccount, method); + const proof = await signHash.getProof(defaultAccount, method); assert.equal(proof, ''); }); }); diff --git a/test/tipswallet.test.ts b/test/tipswallet.test.ts new file mode 100644 index 0000000..e6f01f7 --- /dev/null +++ b/test/tipswallet.test.ts @@ -0,0 +1,59 @@ +import * as Web3 from 'web3'; + +import { SignHashArtifacts, TipsWallet } from 'signhash'; +import { ContractContextDefinition } from 'truffle'; + +import { assertThrowsInvalidOpcode } from './helpers'; +import { MultiSigTestContext } from './MultiSig/context'; +import { + testExecute, + testFallback, + testListOwners +} from './MultiSig/multisig.test'; +import { + testCancelRecovery, + testConfirmRecovery, + testStartRecovery +} from './MultiSig/recoverablemultisig.test'; +import { testTransferOwnership } from './MultiSig/transferablemultisig.test'; + +declare const web3: Web3; +declare const artifacts: SignHashArtifacts; +declare const contract: ContractContextDefinition; + +const TipsWalletContract = artifacts.require('./TipsWallet.sol'); + +contract('TipsWallet', accounts => { + const deployer = accounts[0]; + + describe('#ctor', () => { + it('should not allow empty list of owners', async () => { + await assertThrowsInvalidOpcode(async () => { + await TipsWalletContract.new([], 1000, { from: deployer }); + }); + }); + }); + + const ownerSets = [[accounts[2]], accounts.slice(1, 3), accounts.slice(2, 6)]; + ownerSets.map(owners => { + context(`When wallet has ${owners.length} owners`, () => { + const ctx = new MultiSigTestContext(accounts, owners); + + beforeEach(async () => { + const recoveryBlockOffset = 100; + ctx.multisig = await TipsWalletContract.new( + owners, + recoveryBlockOffset + ); + }); + + describe('#listOwners', () => testListOwners(ctx)); + describe('#fallback', () => testFallback(ctx)); + describe('#execute', () => testExecute(ctx)); + describe('#transferOwnership', () => testTransferOwnership(ctx)); + describe('#startRecovery', () => testStartRecovery(ctx)); + describe('#cancelRecovery', () => testCancelRecovery(ctx)); + describe('#confirmRecovery', () => testConfirmRecovery(ctx)); + }); + }); +}); diff --git a/tsconfig.json b/tsconfig.json index 7dc9e39..159e064 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,11 +11,13 @@ }, "lib": ["es2015"], "include": [ + "bin/**/*.ts", "index.ts", + "migrations/**/*.ts", + "multisig/**/*.ts", + "test/**/*.ts", "truffle-config.ts", - "types/*.ts", - "test/*.ts", - "migrations/*.ts", - "bin/*.ts" + "types/**/*.ts", + "utils/**/*.ts" ] } diff --git a/types/contracts.d.ts b/types/contracts.d.ts deleted file mode 100644 index 8a74d4a..0000000 --- a/types/contracts.d.ts +++ /dev/null @@ -1,73 +0,0 @@ -declare interface SignHash { - sign(hash: string, options?: TransactionOptions): Promise; - revoke( - hash: string, - options?: TransactionOptions - ): Promise; - - addProof( - method: string, - value: string, - options?: TransactionOptions - ): Promise; - - removeProof( - method: string, - options?: TransactionOptions - ): Promise; - - getSigners(hash: string, maxCount: number): Promise; - - getProof(signer: string, method: string): Promise; -} - -declare interface Signed { - hash: string; - signer: string; -} - -declare interface Revoked { - hash: string; - signer: string; -} - -declare interface ProofAdded { - signer: string; - method: string; - value: string; -} - -declare interface ProofRemoved { - signer: string; - method: string; -} - -declare interface Migrations { - setCompleted( - completed: number, - options?: TransactionOptions - ): Promise; - - upgrade( - address: string, - options?: TransactionOptions - ): Promise; -} - -declare interface MigrationsContract extends Contract { - 'new'(options?: TransactionOptions): Promise; -} - -declare interface AddressSetLibrary extends ContractBase { - 'new'(options?: TransactionOptions): Promise; -} - -declare interface SignHashContract extends Contract { - 'new'(options?: TransactionOptions): Promise; -} - -declare interface SignHashArtifacts extends TruffleArtifacts { - require(name: './Migrations.sol'): MigrationsContract; - require(name: './AddressSet.sol'): AddressSetLibrary; - require(name: './SignHash.sol'): SignHashContract; -} diff --git a/types/signhash.d.ts b/types/signhash.d.ts new file mode 100644 index 0000000..74a1fff --- /dev/null +++ b/types/signhash.d.ts @@ -0,0 +1,201 @@ +declare module 'signhash' { + import { BigNumber } from 'bignumber.js'; + import { + AnyContract, + Contract, + ContractBase, + Deployer, + TransactionOptions, + TransactionResult, + TruffleArtifacts + } from 'truffle'; + import { AnyNumber } from 'web3'; + + namespace signhash { + interface SignHash extends ContractBase { + sign( + hash: string, + options?: TransactionOptions + ): Promise; + revoke( + hash: string, + options?: TransactionOptions + ): Promise; + + addProof( + method: string, + value: string, + options?: TransactionOptions + ): Promise; + + removeProof( + method: string, + options?: TransactionOptions + ): Promise; + + getSigners(hash: string, maxCount: number): Promise; + + getProof(signer: Address, method: string): Promise; + } + + interface SignedEvent { + hash: string; + signer: Address; + } + + interface RevokedEvent { + hash: string; + signer: Address; + } + + interface ProofAddedEvent { + signer: Address; + method: string; + value: string; + } + + interface ProofRemovedEvent { + signer: Address; + method: string; + } + + interface Migrations extends ContractBase { + setCompleted( + completed: number, + options?: TransactionOptions + ): Promise; + + upgrade( + address: Address, + options?: TransactionOptions + ): Promise; + } + + interface MultiSig extends ContractBase { + nonce(): Promise; + + owners(index: number): Promise
; + listOwners(): Promise; + + execute( + v: number[], + r: string[], + s: string[], + to: Address, + value: AnyNumber, + data: string, + options?: TransactionOptions + ): Promise; + } + + interface DepositedEvent { + from: Address; + value: BigNumber; + } + + interface ExecutedEvent { + destination: Address; + nonce: BigNumber; + value: BigNumber; + data: string; + } + + interface TransferableMultiSig extends MultiSig { + transferOwnership( + v: number[], + r: string[], + s: string[], + newOwners: Address[], + options?: TransactionOptions + ): Promise; + } + + interface RecoverableMultiSig extends MultiSig { + recoveryBlockOffset(): Promise; + recoveryBlock(): Promise; + recoveryHash(): Promise; + + startRecovery( + newOwners: Address[], + options?: TransactionOptions + ): Promise; + + cancelRecovery(options?: TransactionOptions): Promise; + + confirmRecovery( + newOwners: Address[], + options?: TransactionOptions + ): Promise; + } + + interface RecoveryStartedEvent { + from: Address; + newOwners: Address[]; + } + + interface RecoveryCancelledEvent { + from: Address; + } + + interface RecoveryConfirmedEvent { + from: Address; + newOwners: Address[]; + } + + interface TipsWallet extends TransferableMultiSig, RecoverableMultiSig {} + + interface MigrationsContract extends Contract { + 'new'(options?: TransactionOptions): Promise; + } + + interface AddressSetLibrary extends ContractBase { + 'new'(options?: TransactionOptions): Promise; + } + + interface SignHashContract extends Contract { + 'new'(options?: TransactionOptions): Promise; + } + + interface TipsWalletContract extends Contract { + 'new'( + owners: Address[], + recoveryBlockOffset: AnyNumber, + options?: TransactionOptions + ): Promise; + } + + interface SignHashArtifacts extends TruffleArtifacts { + require(name: string): AnyContract; + require(name: './Migrations.sol'): MigrationsContract; + require(name: './AddressSet.sol'): AddressSetLibrary; + require(name: './SignHash.sol'): SignHashContract; + require(name: './TipsWallet.sol'): TipsWalletContract; + } + + interface SignHashDeployer extends Deployer { + deploy(contract: SignHashContract): Promise; + deploy( + contract: TipsWalletContract, + owners: Address[], + recoveryBlockOffset: AnyNumber + ): Promise; + } + + interface ERC20 extends ContractBase { + totalSupply(): Promise; + + balanceOf(who: Address): Promise; + allowance(owner: Address, spender: Address): Promise; + + transfer(to: Address, value: BigNumber): Promise; + transferFrom( + from: Address, + to: Address, + value: AnyNumber + ): Promise; + approve(spender: Address, value: AnyNumber): Promise; + } + } + + export = signhash; +} diff --git a/types/tempo.d.ts b/types/tempo.d.ts new file mode 100644 index 0000000..5790fba --- /dev/null +++ b/types/tempo.d.ts @@ -0,0 +1,16 @@ +declare module '@digix/tempo' { + import * as Web3 from 'web3'; + + interface Tempo { + waitUntilBlock(seconds: number, targetBlock: number): Promise; + + wait(seconds?: number, blocks?: number): Promise; + } + + function build(web3: Web3): Tempo; + + namespace build { + + } + export = build; +} diff --git a/types/truffle-global.d.ts b/types/truffle-global.d.ts deleted file mode 100644 index b75b9a1..0000000 --- a/types/truffle-global.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as Web3 from 'web3'; - -declare global { - const web3: Web3; - const artifacts: SignHashArtifacts; - const assert: Chai.AssertStatic; - const contract: ContractContextDefinition; -} diff --git a/types/truffle.d.ts b/types/truffle.d.ts index 5500780..7a1ef66 100644 --- a/types/truffle.d.ts +++ b/types/truffle.d.ts @@ -3,60 +3,107 @@ declare module '*.json' { export default value; } -declare interface ContractContextDefinition extends Mocha.IContextDefinition { - (description: string, callback: (accounts: Address[]) => void): Mocha.ISuite; -} +declare module 'truffle' { + import { TxData } from 'web3'; + + namespace truffle { + type ContractCallback = ( + this: Mocha.ISuiteCallbackContext, + accounts: Address[] + ) => void; + + type ContractContextDefinition = ( + description: string, + callback: ContractCallback + ) => Mocha.ISuite; + + interface Request { + method: 'eth_call' | 'eth_sendTransaction'; + params: RequestParameter[]; + } + + interface RequestParameter { + to: Address; + data: string; + } + + interface Method { + call(...args: any[]): Promise; + sendTransaction(...args: any[]): Promise; + request(...args: any[]): Promise; + estimateGas(...args: any[]): Promise; + } + + interface ContractBase { + address: Address; + sendTransaction(txData: TxData): Promise; + } + + interface Contract extends ContractBase { + at(address: Address): Promise; + deployed(): Promise; + } + + interface AnyContract extends Contract { + 'new'(...args: any[]): Promise; + } + + interface TruffleArtifacts { + require(name: string): AnyContract; + } + + type TransactionOptions = { + from?: Address; + gas?: number; + gasPrice?: number; + }; -declare interface ContractBase { - address: Address; -} + type TransactionReceipt = { + transactionHash: string; + transactionIndex: number; + blockHash: string; + blockNumber: number; + gasUsed: number; + cumulativeGasUsed: number; + contractAddress: Address | null; + logs: [TransactionLog]; + }; -declare interface Contract extends ContractBase { - deployed(): Promise; -} + type TransactionLog = { + logIndex: number; + transactionIndex: number; + transactionHash: string; + blockHash: string; + blockNumber: number; + address: Address; + type: string; + event: string; + args: any; + }; -declare interface TruffleArtifacts { - require(name: string): ContractBase; -} + type TransactionResult = { + tx: string; + receipt: TransactionReceipt; + logs: [TransactionLog]; + }; -declare type TransactionOptions = { - from?: Address; - gas?: number; - gasPrice?: number; -}; - -declare type TransactionReceipt = { - transactionHash: string; - transactionIndex: number; - blockHash: string; - blockNumber: number; - gasUsed: number; - cumulativeGasUsed: number; - contractAddress: Address | null; - logs: [TransactionLog]; -}; - -declare type TransactionLog = { - logIndex: number; - transactionIndex: number; - transactionHash: string; - blockHash: string; - blockNumber: number; - address: Address; - type: string; - event: string; - args: any; -}; - -declare type TransactionResult = { - tx: string; - receipt: TransactionReceipt; - logs: [TransactionLog]; -}; + interface Deployer extends Promise { + deploy(object: ContractBase, ...args: any[]): Promise; + + link( + library: ContractBase, + contracts: ContractBase | [ContractBase] + ): Promise; + } + } + + export = truffle; +} declare module 'truffle-config' { import { BigNumber } from 'bignumber.js'; import { Provider } from 'web3'; + import * as Artifactor from 'truffle-artifactor'; import * as Resolver from 'truffle-resolver'; @@ -82,16 +129,15 @@ declare module 'truffle-config' { }; class Config { - artifactor: Artifactor; - contracts_build_directory: string; - contracts_directory: string; - migrations_directory: string; - network: string; - networks: { [network: string]: Network }; - port: number; - provider: Provider; - resolver: Resolver; - working_directory: string; + public artifactor: Artifactor; + public contracts_build_directory: string; + public contracts_directory: string; + public migrations_directory: string; + public network: string; + public networks: { [network: string]: Network }; + public port: number; + public provider: Provider; + public resolver: Resolver; } type Network = { @@ -129,9 +175,8 @@ declare module 'truffle-compile' { declare module 'truffle-resolver' { import * as Config from 'truffle-config'; - // noinspection JSUnusedGlobalSymbols class Resolver { - public constructor(config: Config); + constructor(config: Config); } namespace Resolver { @@ -144,11 +189,10 @@ declare module 'truffle-resolver' { declare module 'truffle-artifactor' { import { ContractDefinitions } from 'truffle-compile'; - // noinspection JSUnusedGlobalSymbols class Artifactor { - public constructor(contractsBuildDirectory: string); + constructor(contractsBuildDirectory: string); - saveAll(contracts: ContractDefinitions): Promise; + public saveAll(contracts: ContractDefinitions): Promise; } namespace Artifactor { @@ -163,12 +207,3 @@ declare module 'truffle-migrate' { function run(config: Config, cb: Callback): Config; } - -declare interface Deployer extends Promise { - deploy(object: ContractBase): Promise; - - link( - library: ContractBase, - contracts: ContractBase | [ContractBase] - ): Promise; -} diff --git a/types/web3.d.ts b/types/web3.d.ts index 3c47e1d..24d0893 100644 --- a/types/web3.d.ts +++ b/types/web3.d.ts @@ -1,13 +1,10 @@ -type Callback = (err: Error | null, value: T) => void; -type VoidCallback = (err: Error | null) => void; +declare type Callback = (err: Error | null, value: T) => void; -type Address = string; +declare type Address = string; declare module 'web3' { import { BigNumber } from 'bignumber.js'; - type AnyNumber = number | string | BigNumber; - type Unit = | 'kwei' | 'ada' @@ -25,33 +22,30 @@ declare module 'web3' { | 'gether' | 'tether'; - interface TxData { - from: Address; - to?: Address; - value?: AnyNumber; - gas?: AnyNumber; - gasPrice?: AnyNumber; - data?: string; - nonce?: AnyNumber; - } - class Web3 { - public constructor(provider: Web3.Provider); - - public toWei(amount: AnyNumber, unit: Unit): string; - public sha3(str: string, options?: { encoding: 'hex' }): string; - public eth: { - sendTransaction(txData: TxData, callback: Callback): void; + blockNumber: BigNumber; + sendTransaction(txData: Web3.TxData, callback: Callback): void; getBalance(account: Address, callback: Callback): BigNumber; + sign(account: Address, text: string): string; }; public version: { getNetwork(cb: Callback): void; }; + + public constructor(provider: Web3.Provider); + + public toWei(amount: Web3.AnyNumber, unit: Unit): string; + public sha3(str: string, options?: { encoding: 'hex' }): string; + + public toDecimal(hex: string): number; + public toHex(num: number): string; } namespace Web3 { + type AnyNumber = number | string | BigNumber; + interface RequestPayload { params: any[]; method: string; @@ -71,6 +65,16 @@ declare module 'web3' { callback: (err: Error | null, result: ResponsePayload) => void ): void; } + + interface TxData { + from: Address; + to?: Address; + value?: AnyNumber; + gas?: AnyNumber; + gasPrice?: AnyNumber; + data?: string; + nonce?: AnyNumber; + } } export = Web3; diff --git a/utils/common.ts b/utils/common.ts new file mode 100644 index 0000000..27984a6 --- /dev/null +++ b/utils/common.ts @@ -0,0 +1,11 @@ +export function promisify(fn: (cb: Callback) => void) { + return new Promise((resolve, reject) => + fn((err: Error | null, res: T) => { + if (err) { + return reject(err); + } + + return resolve(res); + }) + ); +} diff --git a/utils/index.ts b/utils/index.ts new file mode 100644 index 0000000..d07bad6 --- /dev/null +++ b/utils/index.ts @@ -0,0 +1,2 @@ +export * from './common'; +export * from './web3'; diff --git a/utils/web3.ts b/utils/web3.ts new file mode 100644 index 0000000..c8e60cb --- /dev/null +++ b/utils/web3.ts @@ -0,0 +1,17 @@ +import * as Web3 from 'web3'; + +import { BigNumber } from 'bignumber.js'; + +import { promisify } from './common'; + +export class Web3Utils { + constructor(private web3: Web3) {} + + public toEther(num: number | string) { + return new BigNumber(this.web3.toWei(num, 'ether')); + } + + public getBalance(account: Address) { + return promisify(cb => this.web3.eth.getBalance(account, cb)); + } +}