Skip to content

Instantly share code, notes, and snippets.

@MicahZoltu
Created May 22, 2017 09:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MicahZoltu/38e0a93f57737e8ec2f50781bf61414c to your computer and use it in GitHub Desktop.
Save MicahZoltu/38e0a93f57737e8ec2f50781bf61414c to your computer and use it in GitHub Desktop.
Unexpected Parity Solidity Output
[{"constant":false,"inputs":[{"name":"recoveryDelayInDays","type":"uint8"}],"name":"createWallet","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"walletOwner","type":"address"}],"name":"getWalletFor","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"}],"name":"WalletCreated","type":"event"}]
0x6060604052341561000c57fe5b5b610e868061001c6000396000f300606060405263ffffffff60e060020a60003504166335f6c161811461002c5780638208921d1461006a575bfe5b341561003457fe5b61004260ff600435166100ae565b6040518082600160a060020a0316600160a060020a0316815260200191505060405180910390f35b341561007257fe5b610042600160a060020a0360043516610291565b6040518082600160a060020a0316600160a060020a0316815260200191505060405180910390f35b600060006000600160a060020a03166000600033600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a9004600160a060020a0316600160a060020a031614806101b0575033600160a060020a03166000600033600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a9004600160a060020a0316600160a060020a031663b2bdfa7b6000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b151561018e57fe5b60325a03f1151561019b57fe5b50505060405180519050600160a060020a0316145b15156101bc5760006000fd5b82336101c66102bf565b808360ff1660ff16815260200182600160a060020a0316600160a060020a0316815260200192505050604051809103906000f080151561020257fe5b9050806000600033600160a060020a0316600160a060020a0316815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a0316021790555033600160a060020a03167f234cf33b32239d80b54161e2396c80cdeaf4d34161300e54d8bc01eb7c0ea55360405180905060405180910390a28091505b50919050565b600160a060020a03808216811660009081526020808201828152018120546101009190910a9004165b919050565b604051610b8b806102d08339019056006060604052341561000c57fe5b604051604080610b8b8339810160405280516020909101515b805b805b80600060006101000a815481600160a060020a030219169083600160a060020a031602179055505b505b506000600160a060020a031681600160a060020a0316141515156100775760006000fd5b81600560006101000a81548160ff021916908360ff1602179055505b50505b610ae6806100a56000396000f300606060405236156100ca5763ffffffff60e060020a6000350416630ba234d681146100d3578063103437b8146100e557806326532a22146101115780632fdcfbd2146101345780634e71e0c8146101625780636c81552d146101745780637e3bfa1d146101a7578063915a1909146101c5578063a6308909146101fd578063b2bdfa7b1461021b578063bd5021af14610253578063c1756a2c14610271578063c742380314610295578063d3b83758146102a7578063da3e3397146102df578063f2fde38b1461030d575b6100d15b5b565b005b34156100db57fe5b6100d161032b565b005b34156100ed57fe5b6100f56103b6565b604051808260ff1660ff16815260200191505060405180910390f35b341561011957fe5b6101216103c7565b6040805191825251602090910181900390f35b341561013c57fe5b6100d1600160a060020a0360048035821691602091820180359091169101356103cd565b005b341561016a57fe5b6100d1610499565b005b341561017c57fe5b610190600160a060020a0360043516610550565b604080519115151515825251602090910181900390f35b34156101af57fe5b6100d1600160a060020a0360043516610570565b005b34156101cd57fe5b6101d5610622565b6040518082600160a060020a0316600160a060020a0316815260200191505060405180910390f35b341561020557fe5b6100d1600160a060020a0360043516610639565b005b341561022357fe5b6101d56106eb565b6040518082600160a060020a0316600160a060020a0316815260200191505060405180910390f35b341561025b57fe5b6100d1600160a060020a0360043516610704565b005b341561027957fe5b6100d160048035600160a060020a031690602001356107ce565b005b341561029d57fe5b6100d1610839565b005b34156102af57fe5b6101d5610916565b6040518082600160a060020a0316600160a060020a0316815260200191505060405180910390f35b34156102e757fe5b6100d1600160a060020a03600480358216916020918201803590911691013561092d565b005b341561031557fe5b6100d1600160a060020a03600435166109f9565b005b600060009054906101000a9004600160a060020a0316600160a060020a031633600160a060020a03161415156103615760006000fd5b60038054600160a060020a03600081811661010082900a908102920219909216179091556004556040517fedd770ee01b7c0ef4f503125eafdc2725536cbf32342dffcaa300d95a7cafce39080800390a15b5b565b60055460006101000a900460ff1681565b60045481565b6000600060009054906101000a9004600160a060020a0316600160a060020a031633600160a060020a03161415156104055760006000fd5b83905080600160a060020a031663a9059cbb84846000604051602001526040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b151561047057fe5b60325a03f1151561047d57fe5b505060405151151590506104915760006000fd5b5b5b50505050565b6000600160009054906101000a9004600160a060020a0316600160a060020a031633600160a060020a03161415156104d15760006000fd5b50600080546001805461010084900a90819004600160a060020a0390811681168202818302198086169190911786558354828716840291161790925592546040519284900482169390048116811691908316907fc2773729e033b030f1f595242c7740dc972227b5e11dfc64f0089481fe03b0379080800390a35b5b50565b60026020528060005260406000206000915054906101000a900460ff1681565b600060009054906101000a9004600160a060020a0316600160a060020a031633600160a060020a03161415156105a65760006000fd5b60006002600083600160a060020a0316600160a060020a0316815260200190815260200160002060006101000a81548160ff02191690831515021790555080600160a060020a03167f250546491931526473f4670f0964714a4f7272548fa2040f447d653f5cffbbb760405180905060405180910390a25b5b50565b60035460006101000a9004600160a060020a031681565b600060009054906101000a9004600160a060020a0316600160a060020a031633600160a060020a031614151561066f5760006000fd5b60016002600083600160a060020a0316600160a060020a0316815260200190815260200160002060006101000a81548160ff02191690831515021790555080600160a060020a03167fb5e3e4cd19e074ee95bbd1f4d13e94edb122e9abf12b57d96d2c4aea9b5dc5eb60405180905060405180910390a25b5b50565b600060009054906101000a9004600160a060020a031681565b6002600033600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a900460ff1615156107435760006000fd5b6000600160a060020a0316600360009054906101000a9004600160a060020a0316600160a060020a031614151561077a5760006000fd5b60038054600160a060020a0380841660006101000a81810292021990921617909155426004556040517fcd4e9df2b0a742bc5628c20baf55859f839c034aa76a32f600d6b085c4de48299080800390a25b50565b600060009054906101000a9004600160a060020a0316600160a060020a031633600160a060020a03161415156108045760006000fd5b604051600160a060020a0383169082156108fc0290839060008180800381858888f19350505050151561083357fe5b5b5b5050565b6000600160a060020a0316600360009054906101000a9004600160a060020a0316600160a060020a0316141515156108715760006000fd5b600560009054906101000a900460ff1660ff16620151800262ffffff1660045401421115156108a05760006000fd5b6003805460018054600160a060020a03600061010081900a948590048216821685028286021993841617845585548282168602931692909217909455600455546040519190048216909116907f67e7e71677fff5d10e5f4c8855a7c978cafa5e152631ba1a283fe64a83030e589080800390a25b565b60015460006101000a9004600160a060020a031681565b6000600060009054906101000a9004600160a060020a0316600160a060020a031633600160a060020a03161415156109655760006000fd5b83905080600160a060020a031663095ea7b384846000604051602001526040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b151561047057fe5b60325a03f1151561047d57fe5b505060405151151590506104915760006000fd5b5b5b50505050565b600060009054906101000a9004600160a060020a0316600160a060020a031633600160a060020a0316141515610a2f5760006000fd5b6000600160a060020a031681600160a060020a031614151515610a525760006000fd5b60018054600061010081900a600160a060020a03818102199093168584168202179384905590546040519382900483168316939190048216909116907f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227009080800390a35b5b505600a165627a7a723058203f144336b36b86a27c57452514756ef63f751b2d6346dbed9b6373d8fd4be8a90029a165627a7a72305820991d0b05c3c0032d751803fc294c904c85acc7b2c2aaaccabcff730f12afdb910029
{"compiler":{"version":"0.4.10+commit.f0d539ae"},"language":"Solidity","output":{"abi":[{"constant":false,"inputs":[{"name":"recoveryDelayInDays","type":"uint8"}],"name":"createWallet","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"walletOwner","type":"address"}],"name":"getWalletFor","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"}],"name":"WalletCreated","type":"event"}],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"":"RecoverableWalletFactory"},"libraries":{},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"":{"keccak256":"0x7013ca6ae772378b445053f4a4a8b2d234d9be84be9ccf72cd072abd5fc64a7f","urls":["bzzr://970d4ecc4974ecf64ba3545339023f7ddb87e57310b3a300bcfc983eb43b5638"]}},"version":1}
pragma solidity 0.4.10;
contract Token {
function transfer(address recipient, uint256 amount) external returns (bool success);
function approve(address spender, uint256 value) external returns (bool success);
}
contract RecoverableWalletFactory {
event WalletCreated(address indexed owner);
mapping(address => RecoverableWallet) private _wallets;
function createWallet(uint8 recoveryDelayInDays) external returns (RecoverableWallet) {
require(_wallets[msg.sender] == address(0) || _wallets[msg.sender]._owner() == msg.sender);
RecoverableWallet newWallet = new RecoverableWallet(recoveryDelayInDays, msg.sender);
_wallets[msg.sender] = newWallet;
WalletCreated(msg.sender);
return newWallet;
}
function getWalletFor(address walletOwner) external constant returns (RecoverableWallet) {
return _wallets[walletOwner];
}
}
contract Ownable {
event OwnerChanged(address indexed oldOwner, address indexed newOwner);
address public _owner;
function Ownable(address owner) {
_owner = owner;
}
modifier onlyOwner() {
require(msg.sender == _owner);
_;
}
function transferOwnership(address newOwner) external onlyOwner {
require(newOwner != address(0));
address oldOwner = _owner;
_owner = newOwner;
OwnerChanged(oldOwner, _owner);
}
}
contract Claimable is Ownable {
event OwnershipTransferStarted(address indexed oldOwner, address indexed newOwner);
event OwnershipTransferFinished(address indexed oldOwner, address indexed newOwner);
address public _pendingOwner;
modifier onlyPendingOwner() {
require(msg.sender == _pendingOwner);
_;
}
function Claimable(address owner) Ownable(owner) {}
function transferOwnership(address newOwner) external onlyOwner {
require(newOwner != address(0));
_pendingOwner = newOwner;
OwnershipTransferStarted(_owner, _pendingOwner);
}
function claimOwnership() external onlyPendingOwner {
address oldOwner = _owner;
_owner = _pendingOwner;
_pendingOwner = address(0);
OwnershipTransferFinished(oldOwner, _owner);
}
}
contract RecoverableWallet is Claimable {
event RecoveryAddressAdded(address indexed newRecoverer);
event RecoveryAddressRemoved(address indexed oldRecoverer);
event RecoveryStarted(address indexed newOwner);
event RecoveryCancelled();
event RecoveryFinished(address indexed newOwner);
mapping(address => bool) public _recoveryAddresses;
address public _activeRecoveryAddress;
uint256 public _activeRecoveryStartTime;
uint8 public _recoveryDelayDays;
function RecoverableWallet(uint8 recoveryDelayInDays, address owner) Claimable(owner) {
require(owner != address(0));
_recoveryDelayDays = recoveryDelayInDays;
}
function () external payable { }
function addRecoveryAddress(address newRecoveryAddress) external onlyOwner {
_recoveryAddresses[newRecoveryAddress] = true;
RecoveryAddressAdded(newRecoveryAddress);
}
function removeRecoveryAddress(address oldRecoveryAddress) external onlyOwner {
_recoveryAddresses[oldRecoveryAddress] = false;
RecoveryAddressRemoved(oldRecoveryAddress);
}
function startRecovery(address newOwnerAddress) external {
require(_recoveryAddresses[msg.sender]);
require(_activeRecoveryAddress == address(0));
_activeRecoveryAddress = newOwnerAddress;
_activeRecoveryStartTime = block.timestamp;
RecoveryStarted(newOwnerAddress);
}
function cancelRecovery() external onlyOwner {
_activeRecoveryAddress = address(0);
_activeRecoveryStartTime = 0;
RecoveryCancelled();
}
function finishRecovery() external {
require(_activeRecoveryAddress != address(0));
require(block.timestamp > _activeRecoveryStartTime + _recoveryDelayDays * 1 days);
_pendingOwner = _activeRecoveryAddress;
_activeRecoveryAddress = address(0);
_activeRecoveryStartTime = 0;
RecoveryFinished(_pendingOwner);
}
function sendEther(address destination, uint256 amount) external onlyOwner {
destination.transfer(amount);
}
function sendToken(address tokenAddress, address destination, uint256 amount) external onlyOwner {
Token token = Token(tokenAddress);
require(token.transfer(destination, amount));
}
function approveToken(address tokenAddress, address spender, uint256 amount) external onlyOwner {
Token token = Token(tokenAddress);
require(token.approve(spender, amount));
}
// TODO: allow calling arbitrary contracts by owner
}
991d0b05c3c0032d751803fc294c904c85acc7b2c2aaaccabcff730f12afdb91
@MicahZoltu
Copy link
Author

Parity Version: Parity//v1.6.6-beta-8c6e3f3-20170411/x86_64-windows-msvc/rustc1.16.0

@MicahZoltu
Copy link
Author

All of the above (except source) is for the RecoverableWalletFactory contract.

@MicahZoltu
Copy link
Author

Has been uploaded to mainnet at 0x1B69BCd7A17ec0C3b6a66212306C903A53533613

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment