This wallet contract is capable of receiving, holding and sending Ether as well as tokens that comply with one of the following standards:
Copy # Author: Sören Steiger, twitter.com/ssteiger_
# License: MIT
contract ERC1820Registry :
def setInterfaceImplementer (
_addr : address ,
_interfaceHash : bytes32 ,
_implementer : address
): modifying
contract ERC20Token :
def transfer (
_to : address ,
_value : uint256
) -> bool : modifying
contract ERC721Token :
def safeTransferFrom (
_from : address ,
_to : address ,
_tokenId : uint256 ,
_data : bytes [ 256 ]
): modifying
contract ERC777Token :
def send (
_to : address ,
_amount : uint256 ,
_data : bytes [ 256 ]
): modifying
ETHReceived : event ({
_from: address,
_amount: wei_value
})
ETHSent : event ({
_to: address,
_amount: uint256
})
# TODO :
#ERC20Received: event({
#})
ERC20Sent : event ({
_token: address,
_to: address,
_amount: uint256
})
ERC721Received : event ({
_token: address,
_from: address,
_tokenId: uint256,
_data: bytes32
})
ERC721Sent : event ({
_token: address,
_from: address,
_to: address,
_tokenId: uint256,
_data: bytes[ 256 ]
})
ERC777Received : event ({
_operator: indexed (address),
_from: indexed (address),
_to: indexed (address),
_amount: uint256,
_data: bytes[ 256 ],
_operatorData: bytes[ 256 ]
})
ERC777Sent : event ({
_operator: indexed (address),
_from: indexed (address),
_to: indexed (address),
_amount: uint256,
_data: bytes[ 256 ],
_operatorData: bytes[ 256 ]
})
erc1820Registry : ERC1820Registry
erc1820RegistryAddress : constant (address) = 0x 1820a4B7618BdE71Dce8cdc73aAB6C95905faD24
owner : public (address)
@public
def __init__ ():
self . owner = msg . sender
self . erc1820Registry = ERC1820Registry (erc1820RegistryAddress)
self . erc1820Registry . setInterfaceImplementer (self, keccak256 ( "ERC777TokensRecipient" ), self)
self . erc1820Registry . setInterfaceImplementer (self, keccak256 ( "ERC777TokensSender" ), self)
# ----- ETH -----
@public
@payable
def __default__ ():
log . ETHReceived (msg.sender, msg.value)
@public
def sendETH (
_to : address ,
_amount : uint256
):
assert msg . sender == self . owner
send (_to, _amount)
log . ETHSent (_to, _amount)
# ----- ERC20 -----
@public
def sendERC20 (
_token : address ,
_to : address ,
_amount : uint256
):
assert msg . sender == self . owner
ERC20Token (_token). transfer (_to, _amount)
log . ERC20Sent (_token, _to, _amount)
#@public
#def onERC20Received():
# ----- ERC721 -----
@public
def sendERC721 (
_token : address ,
_to : address ,
_tokenId : uint256 ,
_data : bytes [ 256 ] = ""
):
assert msg . sender == self . owner
ERC721Token (_token). safeTransferFrom (self, _to, _tokenId, _data)
log . ERC721Sent (_token, self, _to, _tokenId, _data)
@public
def onERC721Received (
_token : address ,
_from : address ,
_tokenId : uint256 ,
_data : bytes32
) -> bytes32:
log . ERC721Received (_token, _from, _tokenId, _data)
# TODO : need to return bytes4
return keccak256 ( "onERC721Received(address,address,uint256,bytes)" )
# ----- ERC777 -----
@public
def sendERC777 (
_token : address ,
_to : address ,
_amount : uint256 ,
_data : bytes [ 256 ] = ""
):
assert msg . sender == self . owner
ERC777Token (_token). send (_to, _amount, _data)
@public
def tokensToSend (
_operator : address ,
_from : address ,
_to : address ,
_amount : uint256 ,
_data : bytes [ 256 ],
_operatorData : bytes [ 256 ]
):
log . ERC777Sent (_operator, _from, _to, _amount, _data, _operatorData)
@public
def tokensReceived (
_operator : address ,
_from : address ,
_to : address ,
_amount : uint256 ,
_data : bytes [ 256 ],
_operatorData : bytes [ 256 ]
):
log . ERC777Received (_operator, _from, _to, _amount, _data, _operatorData)