pragmasolidity^0.7.0;interfaceERC20Receiver{functionacceptERC20Deposit(addressdepositor,addresstoken,uintamount)externalreturns(bool);}interfaceERC721Receiver{functionacceptERC721Deposit(addressdepositor,addresstoken,uinttokenId)externalreturns(bool);}interfaceERC1155Receiver{functionacceptERC1155Deposit(addressdepositor,addresstoken,uinttokenId,uintvalue,bytescalldatadata)externalreturns(bool);functionacceptERC1155BatchDeposit(addressdepositor,addresstoken,uint[]calldatatokenIds,uint[]calldatavalues,bytescalldatadata)externalreturns(bool);}interfaceEtherReceiver{functionacceptEtherDeposit(addressdepositor,uintamount)externalreturns(bool);}interfaceIERC20{functiontransferFrom(addresssender,addressrecipient,uintamount)externalreturns(bool);}interfaceIERC721{functiontransferFrom(address_from,address_to,uint256_tokenId)externalpayable;functionsafeTransferFrom(address_from,address_to,uint256_tokenId,bytesmemorydata)externalpayable;}interfaceIERC1155{functionsafeTransferFrom(address_from,address_to,uint_id,uint_value,bytescalldata_data)external;functionsafeBatchTransferFrom(address_from,address_to,uint256[]calldata_ids,uint256[]calldata_values,bytescalldata_data)external;}contractWrappedDeposit{functiondepositERC20(addressto,addresstoken,uintamount)public{_assertContract(to);require(ERC20Receiver(to).acceptERC20Deposit(msg.sender,token,amount));bytesmemorydata=abi.encodeWithSelector(IERC20(token).transferFrom.selector,msg.sender,to,amount);(boolsuccess,bytesmemoryreturndata)=token.call(data);require(success);// backward compat for tokens incorrectly implementing the transfer function// 用于不正确地实现转移函数的代币的向后兼容if(returndata.length>0){require(abi.decode(returndata,(bool)),"ERC20 operation did not succeed");}}functiondepositERC721(addressto,addresstoken,uinttokenId)public{_assertContract(to);require(ERC721Receiver(to).acceptERC721Deposit(msg.sender,token,tokenId));IERC721(token).transferFrom(msg.sender,to,tokenId);}functionsafeDepositERC721(addressto,addresstoken,uinttokenId,bytesmemorydata)public{_assertContract(to);require(ERC721Receiver(to).acceptERC721Deposit(msg.sender,token,tokenId));IERC721(token).safeTransferFrom(msg.sender,to,tokenId,data);}functionsafeDepositERC1155(addressto,addresstoken,uinttokenId,uintvalue,bytescalldatadata)public{_assertContract(to);require(ERC1155Receiver(to).acceptERC1155Deposit(msg.sender,to,tokenId,value,data));IERC1155(token).safeTransferFrom(msg.sender,to,tokenId,value,data);}functionbatchDepositERC1155(addressto,addresstoken,uint[]calldatatokenIds,uint[]calldatavalues,bytescalldatadata)public{_assertContract(to);require(ERC1155Receiver(to).acceptERC1155BatchDeposit(msg.sender,to,tokenIds,values,data));IERC1155(token).safeBatchTransferFrom(msg.sender,to,tokenIds,values,data);}functiondepositEther(addressto)publicpayable{_assertContract(to);require(EtherReceiver(to).acceptEtherDeposit(msg.sender,msg.value));(boolsuccess,)=to.call{value:msg.value}('');require(success,"nonpayable");}function_assertContract(addressc)privateview{uintsize;assembly{size:=extcodesize(c)}require(size>0,"noncontract");}}