Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
296 changes: 296 additions & 0 deletions .openzeppelin/unknown-31337.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,296 @@
{
"manifestVersion": "3.2",
"admin": {
"address": "0xcEA7ae904ABF6cFA09330fF01C56790cA916dEE5",
"txHash": "0xafdbaaf27843e38ab6528f6250a2a12477e98269dfdd9a74ab889a15c0e82210"
},
"proxies": [
{
"address": "0xBceA63C5A6dDaC14853854D10f4b2AbAefed2C61",
"txHash": "0xc0c96dc0926da7fd52c8bfa6de4c10cb9151a9b61bcac8a2f529ac72f962e15a",
"kind": "transparent"
},
{
"address": "0x50aF0922d65D04D87d810048Dc640E2474eBfbd9",
"txHash": "0x82ac7524e1bcb112454502f74ed59df2502e9f536ac8fa348b3f71d85663444e",
"kind": "transparent"
},
{
"address": "0x15FC0878406CcF4d2963235A5B1EF68C67F17Ee5",
"txHash": "0x1a9a1cd2038eba3bfd476c4f6cb912aa127698f070520941be937925c512b00f",
"kind": "transparent"
},
{
"address": "0x055cBfeD6df4AFE2452b18fd3D2592D1795592b4",
"txHash": "0x97e17a9c66d2b06a8c4217a176dfc0277cf5d510506e6a95fd9783d4e9e521c6",
"kind": "transparent"
},
{
"address": "0xEe3c47a790fA24672b42125EE010A3A5ca02d3D7",
"txHash": "0x8e4bb1794ff4542ea315ea4ce6d600b6d5f98cdf0e8967557ce2abb6eacc4769",
"kind": "transparent"
}
],
"impls": {
"a1c5cebe331372a4f5706386561899d7e5fd3e949f492327a4869bca85a43c36": {
"address": "0x40900cd70351aE8955D38A48823b89b9c0463AaA",
"txHash": "0xdddb3b04c2443e83041aa0900e5b3687119f933934eae5ceb0d222bf224dbddf",
"layout": {
"solcVersion": "0.8.6",
"storage": [
{
"label": "_initialized",
"offset": 0,
"slot": "0",
"type": "t_uint8",
"contract": "Initializable",
"src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
"retypedFrom": "bool"
},
{
"label": "_initializing",
"offset": 1,
"slot": "0",
"type": "t_bool",
"contract": "Initializable",
"src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
},
{
"label": "__gap",
"offset": 0,
"slot": "1",
"type": "t_array(t_uint256)50_storage",
"contract": "ContextUpgradeable",
"src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36"
},
{
"label": "__gap",
"offset": 0,
"slot": "51",
"type": "t_array(t_uint256)50_storage",
"contract": "ERC165Upgradeable",
"src": "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol:41"
},
{
"label": "_roles",
"offset": 0,
"slot": "101",
"type": "t_mapping(t_bytes32,t_struct(RoleData)34_storage)",
"contract": "AccessControlUpgradeable",
"src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61"
},
{
"label": "__gap",
"offset": 0,
"slot": "102",
"type": "t_array(t_uint256)49_storage",
"contract": "AccessControlUpgradeable",
"src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:259"
},
{
"label": "_owner",
"offset": 0,
"slot": "151",
"type": "t_address",
"contract": "OwnableUpgradeable",
"src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22"
},
{
"label": "__gap",
"offset": 0,
"slot": "152",
"type": "t_array(t_uint256)49_storage",
"contract": "OwnableUpgradeable",
"src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94"
}
],
"types": {
"t_address": {
"label": "address",
"numberOfBytes": "20"
},
"t_array(t_uint256)49_storage": {
"label": "uint256[49]",
"numberOfBytes": "1568"
},
"t_array(t_uint256)50_storage": {
"label": "uint256[50]",
"numberOfBytes": "1600"
},
"t_bool": {
"label": "bool",
"numberOfBytes": "1"
},
"t_bytes32": {
"label": "bytes32",
"numberOfBytes": "32"
},
"t_mapping(t_address,t_bool)": {
"label": "mapping(address => bool)",
"numberOfBytes": "32"
},
"t_mapping(t_bytes32,t_struct(RoleData)34_storage)": {
"label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)",
"numberOfBytes": "32"
},
"t_struct(RoleData)34_storage": {
"label": "struct AccessControlUpgradeable.RoleData",
"members": [
{
"label": "members",
"type": "t_mapping(t_address,t_bool)",
"offset": 0,
"slot": "0"
},
{
"label": "adminRole",
"type": "t_bytes32",
"offset": 0,
"slot": "1"
}
],
"numberOfBytes": "64"
},
"t_uint256": {
"label": "uint256",
"numberOfBytes": "32"
},
"t_uint8": {
"label": "uint8",
"numberOfBytes": "1"
}
}
}
},
"7c46d57ccc8bf95723fb4a7f082e3004be042211e7cee730d0f3823b266bd781": {
"address": "0xfCacA4fB3e2cB70671de40FF20E01248e356fBe3",
"txHash": "0x5c83585242a9d322319bffabb8b5383a431279717c82a3a31d711f28877a8e1e",
"layout": {
"solcVersion": "0.8.6",
"storage": [
{
"label": "_initialized",
"offset": 0,
"slot": "0",
"type": "t_uint8",
"contract": "Initializable",
"src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
"retypedFrom": "bool"
},
{
"label": "_initializing",
"offset": 1,
"slot": "0",
"type": "t_bool",
"contract": "Initializable",
"src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
},
{
"label": "__gap",
"offset": 0,
"slot": "1",
"type": "t_array(t_uint256)50_storage",
"contract": "ContextUpgradeable",
"src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36"
},
{
"label": "__gap",
"offset": 0,
"slot": "51",
"type": "t_array(t_uint256)50_storage",
"contract": "ERC165Upgradeable",
"src": "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol:41"
},
{
"label": "_roles",
"offset": 0,
"slot": "101",
"type": "t_mapping(t_bytes32,t_struct(RoleData)34_storage)",
"contract": "AccessControlUpgradeable",
"src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61"
},
{
"label": "__gap",
"offset": 0,
"slot": "102",
"type": "t_array(t_uint256)49_storage",
"contract": "AccessControlUpgradeable",
"src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:259"
},
{
"label": "_owner",
"offset": 0,
"slot": "151",
"type": "t_address",
"contract": "OwnableUpgradeable",
"src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22"
},
{
"label": "__gap",
"offset": 0,
"slot": "152",
"type": "t_array(t_uint256)49_storage",
"contract": "OwnableUpgradeable",
"src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94"
}
],
"types": {
"t_address": {
"label": "address",
"numberOfBytes": "20"
},
"t_array(t_uint256)49_storage": {
"label": "uint256[49]",
"numberOfBytes": "1568"
},
"t_array(t_uint256)50_storage": {
"label": "uint256[50]",
"numberOfBytes": "1600"
},
"t_bool": {
"label": "bool",
"numberOfBytes": "1"
},
"t_bytes32": {
"label": "bytes32",
"numberOfBytes": "32"
},
"t_mapping(t_address,t_bool)": {
"label": "mapping(address => bool)",
"numberOfBytes": "32"
},
"t_mapping(t_bytes32,t_struct(RoleData)34_storage)": {
"label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)",
"numberOfBytes": "32"
},
"t_struct(RoleData)34_storage": {
"label": "struct AccessControlUpgradeable.RoleData",
"members": [
{
"label": "members",
"type": "t_mapping(t_address,t_bool)",
"offset": 0,
"slot": "0"
},
{
"label": "adminRole",
"type": "t_bytes32",
"offset": 0,
"slot": "1"
}
],
"numberOfBytes": "64"
},
"t_uint256": {
"label": "uint256",
"numberOfBytes": "32"
},
"t_uint8": {
"label": "uint8",
"numberOfBytes": "1"
}
}
}
}
}
}
72 changes: 72 additions & 0 deletions contracts/mock/Wallet/SharedWalletV2.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.6;

import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import '@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol';
import '@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol';
import '@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol';
import '@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol';
import 'hardhat/console.sol';

contract SharedWalletV2 is Initializable, AccessControlUpgradeable, OwnableUpgradeable {
using SafeERC20Upgradeable for IERC20Upgradeable;
bytes32 public constant MANAGER_ROLE = keccak256('MANAGER_ROLE');

modifier onlyManager() {
require(hasRole(MANAGER_ROLE, _msgSender()), "Caller is not a manager");
_;
}
/**
* @param _owner Address of the Owner contract.
*/
function initialize(address _owner) public initializer {
console.log('_owner', _owner);
__Ownable_init();
transferOwnership(_owner);
_grantRole(MANAGER_ROLE, _owner);
}

function approveERC20(address _tokenAddress, address _address, uint256 _amount) external onlyManager {
IERC20Upgradeable(_tokenAddress).approve(_address, _amount);
}

function approveERC721(address _tokenAddress, address _address, uint256 _tokenId) external onlyManager {
IERC721Upgradeable token = IERC721Upgradeable(_tokenAddress);
console.log('ownerOf shared wallet', token.ownerOf(_tokenId));
token.approve(_address, _tokenId);
}

function transferERC20(address _tokenAddress, address _to, uint256 _amount) external onlyManager {
IERC20Upgradeable erc20Token = IERC20Upgradeable(_tokenAddress);
require(erc20Token.balanceOf(_msgSender()) >= _amount, 'INSUFFICIENT BALANCE');
erc20Token.safeTransferFrom(_msgSender(), _to, _amount);
}

function transferERC721(address _tokenAddress, address _to, uint256 _tokenId) external onlyManager {
IERC721Upgradeable erc721Token = IERC721Upgradeable(_tokenAddress);
erc721Token.safeTransferFrom(_msgSender(), _to, _tokenId);
}

/**
* @notice Grants a role to a given account address if sender is contract owner.
* @param role Bytes32 array representing the role.
* @param account Address of the account that is given the role.
*/
function grantRole(bytes32 role, address account) override public onlyOwner {
_grantRole(role, account);
}

/**
* @notice Revokes the role for a given account address if sender is contract owner
* @param role Bytes32 array representing the role.
* @param account Address of the account
*/
function revokeRole(bytes32 role, address account) override public onlyOwner {
_revokeRole(role, account);
}

function isContractUpgraded() external pure returns(bool) {
return true;
}
}
Loading