ETH Price: $1,983.11 (-4.84%)

Transaction Decoder

Block:
7741401 at May-11-2019 08:36:33 PM +UTC
Transaction Fee:
0.000830244 ETH $1.65
Gas Used:
691,870 Gas / 1.2 Gwei

Emitted Events:

48 InstaRegistry.LogRecord( currentOwner=[Receiver] InstaRegistry, nextOwner=[Sender] 0xb6b788f332933d7623b816222b0cc27be181ddce, proxy=0xb4c0de3533bc0a8ec64915cf6f2850ee756bff20 )
49 0xb4c0de3533bc0a8ec64915cf6f2850ee756bff20.0xce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed94( 0xce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed94, 0x000000000000000000000000b6b788f332933d7623b816222b0cc27be181ddce )
50 InstaRegistry.Created( sender=[Sender] 0xb6b788f332933d7623b816222b0cc27be181ddce, owner=[Sender] 0xb6b788f332933d7623b816222b0cc27be181ddce, proxy=0xb4c0de3533bc0a8ec64915cf6f2850ee756bff20 )

Account State Difference:

  Address   Before After State Difference Code
0x498b3Bfa...8Cd0Fd981
(InstaDApp: Registry)
(Nanopool)
6,898.208528760789191523 Eth6,898.209359004789191523 Eth0.000830244
0xb4C0DE35...e756Bff20
0 Eth
Nonce: 0
0 Eth
Nonce: 1
From: 0 To: 15667465200033308823500499544048889228567195418436732585037451139489020088697150721845605017671288029413908880245838528904255663599523959037248884909583563638095936672771745564913322006324785288312687417928547053259569100600154611662793612143369762514576970666701270918789332327328460118494780889857928471547257613089695862221395612438077019522603897078096246530371938249420132500356275466081181313001858031894226454346847140552884919368287449162970229527759964990151642558358956931214795678564458951869524757619634760261274350221154293646424659786234025515251708816072218496385042362256657486608217697664674709600761864590987913256458448551637920784042849718600604565784703582073803021668133979051049050150929644604433161050440402828607160653943615450749658720248547091423972744114519721212625497911666855463625555111682736815763356608360944973144735115804850668622981762159336752577559436357192024971783447442400140807768660049772395908946950138078991591527842047385053830722829285822515001172424271507904078703575641852460201339047877470524255452492588367347824291848654777222582253478867390597162576267628144548561328785922246363938130714162272122298248511851106820226126075627599109965086519409785459378106910037099883103079281569799704150877949385025308128932307433608724158845634769642666580628789802048088307551920669958856968702291868482575709312368144435339912410609637842692917785728572854779110228548480642713363189007269282514099788404134173842615563641576611488320605679000231628299513854024602922128431301394048717995808407568303558401498301108690800485375966586027540106565397870403613767537174944838925702304870150609007383550435921123964553904146242066256180167335832193624633023171935145272994547168235678284553616928969743100949084844656703534793575957002408822150595661538153100738036861645270563351283059099272236618096039279491985112606836086519755638654239678048457357132725045359951520089463264175148181300197346268424682157376961911588390579814229559823764989180540418222211032358576070217043693697028987931497810819906878748626084915192657085455468295172706989529296066373363028764761204440807772030578768202481404008591945178576431936232939131936707317025638166634112082630322810362785929698546141179784002789374337474115925419584960078240962075488258214721794128165776759561369440140283087904788373420425795980468108364236228625086176313799358613009485103707424428435663195280385761807650311459917674304120661634650789384870492553390474512542973446001787817728399416132103237460184620069957257516847802166699844995188168662858818127281828061088734645391851439801159405818956848040207707120758315274713464372802787261270917427461584281707817913089513837784400022415999668969139054678334330726159848785511283802504384647448283808663431303598307679538222866337775522286039975907202507315729590472416666802286262727575711402726371024052582598145451481771044397066380525626071750891754189956917803220726968577897029531000636197842806582051663110136426788329918956668356151656922154571601914099461508045553178720826174437395478905187382578927769473261001274793784602243106556923717099633370511678300143917423855497947782735126924983407439441265037156862199384160681495165685583658208725374192043929036788310717667479368962859209747412979879000459935070467545134213415673558126592109440441443927060344228048843561847307376130636837597968556692008586454991356864069770780434529398671812345499137467919671649079362580075616738474782785914244574594767138820877137453812203149316222002909087568438876621693768762846878694168218716877002802458242873129336125188825837499548526343758109560369393975467454702104353841331804433654425982378831652160614624940331422981920244580742520133541381096626979672103886132764788072105772971241545125100194404486200205738677146500446368847174381319451945454982681002996215617531100459165224470838136547642767798245198100563766467678827845872190751753497417776393323848867675544345293794616774863417330963409119767207222517227435117918429567554379019840230052376859154666427592007632285920435616224691110235221445534439893496481447624782959409259105298762938026156060827144760466419713107486097646349038379727325682816752370875446801516266571631432706758799883538507166719698361312024547809962453064877937750905460939722353851162306735577005232810112147980508708440257037568832777782818040081021321633971503653545250736001702687355420102620677489136087114503356755594646932374718881944085727756351253928297504951431062812966653849660344836541879278080455287039479775994103375154643873623387500314890256521415317594321973107857387501920286852008750788806940022186759738913204329868647013759087156493140467352765759494885188458675007845586726457238688708762270796540047193969426296800360549145585212286433342404190992472389307702385863822194649192765273083271443069522702601632845320576664479367217356450784023066007315580114115847951106472176542294169204901726340956754176759458367730668480380892631067003319399781607696465522006750385991823615330736023120635701455928977226553282333555702933117257231948705903681995648761683330546599947718487185606548092778926005900930688946458796144358710623917688382260337147866869514954497608814894170174937471427587199482118518616363262055705450048527302014013222419561088930907764257227933656512005934599897348306094201414535055412058827386104704307264952161945107186377527210513589627056383964521655824037701280725264212853045497835515369521588424588742848113682424043213754625530217805327896673948667477045882244229763508266264560074797650922755214046675866348021217599083605599601094918609384669600365144916647156189086166490635751026040635040964734541064851835380863932954441850345809614343671433801250580498994131865603542546325284675333002601959343696941073687235153703080250453933956412964305877883634167658540397200550728612634463305622647532456888729255742569442767816307327577402179036437320680318151698858531981301258976405745215934582400085361207094853596231135579322839346219960393723019379253839783996799855605612356053793166024136745251411621389561675587765755816141916137462950098934131395595076897787713639872450011612979557302983797326672504482347923725496317611569566063357964667559767214602918451931557255778155229719124283877915651125485331972150324683441216438899288211166692571540530924258628457020760644329408485087521199503789500023300326532300010674536850878623119345972767668581037314352890319125085886092007909252147016178636981768743979989965293569225777535890098405141402787304230818530017255633408436193983818157899560522781487335998573954245135686736565058459963766572198955724872778055721
0xb6b788f3...bE181ddCe
2.53292806 Eth
Nonce: 0
2.532097816 Eth
Nonce: 1
0.000830244

Execution Trace

InstaRegistry.CALL( )
  • 0xb4c0de3533bc0a8ec64915cf6f2850ee756bff20.60806040( )
  • 0xb4c0de3533bc0a8ec64915cf6f2850ee756bff20.13af4035( )
    • InstaRegistry.record( _currentOwner=0x498b3BfaBE9F73db90D252bCD4Fa9548Cd0Fd981, _nextOwner=0xb6b788f332933D7623B816222B0cC27bE181ddCe )
      pragma solidity ^0.5.2;
      
      /**
       * @title RegistryInterface Interface 
       */
      interface RegistryInterface {
          function logic(address logicAddr) external view returns (bool);
          function record(address currentOwner, address nextOwner) external;
      }
      
      
      /**
       * @title Address Registry Record
       */
      contract AddressRecord {
      
          /**
           * @dev address registry of system, logic and wallet addresses
           */
          address public registry;
      
          /**
           * @dev Throws if the logic is not authorised
           */
          modifier logicAuth(address logicAddr) {
              require(logicAddr != address(0), "logic-proxy-address-required");
              require(RegistryInterface(registry).logic(logicAddr), "logic-not-authorised");
              _;
          }
      
      }
      
      
      /**
       * @title User Auth
       */
      contract UserAuth is AddressRecord {
      
          event LogSetOwner(address indexed owner);
          address public owner;
      
          /**
           * @dev Throws if not called by owner or contract itself
           */
          modifier auth {
              require(isAuth(msg.sender), "permission-denied");
              _;
          }
      
          /**
           * @dev sets new owner
           */
          function setOwner(address nextOwner) public auth {
              RegistryInterface(registry).record(owner, nextOwner);
              owner = nextOwner;
              emit LogSetOwner(nextOwner);
          }
      
          /**
           * @dev checks if called by owner or contract itself
           * @param src is the address initiating the call
           */
          function isAuth(address src) public view returns (bool) {
              if (src == owner) {
                  return true;
              } else if (src == address(this)) {
                  return true;
              }
              return false;
          }
      }
      
      
      /**
       * @dev logging the execute events
       */
      contract UserNote {
          event LogNote(
              bytes4 indexed sig,
              address indexed guy,
              bytes32 indexed foo,
              bytes32 bar,
              uint wad,
              bytes fax
          );
      
          modifier note {
              bytes32 foo;
              bytes32 bar;
              assembly {
                  foo := calldataload(4)
                  bar := calldataload(36)
              }
              emit LogNote(
                  msg.sig, 
                  msg.sender, 
                  foo, 
                  bar, 
                  msg.value,
                  msg.data
              );
              _;
          }
      }
      
      
      /**
       * @title User Owned Contract Wallet
       */
      contract UserWallet is UserAuth, UserNote {
      
          event LogExecute(address target, uint srcNum, uint sessionNum);
      
          /**
           * @dev sets the "address registry", owner's last activity, owner's active period and initial owner
           */
          constructor() public {
              registry = msg.sender;
              owner = msg.sender;
          }
      
          function() external payable {}
      
          /**
           * @dev Execute authorised calls via delegate call
           * @param _target logic proxy address
           * @param _data delegate call data
           * @param _src to find the source
           * @param _session to find the session
           */
          function execute(
              address _target,
              bytes memory _data,
              uint _src,
              uint _session
          ) 
              public
              payable
              note
              auth
              logicAuth(_target)
              returns (bytes memory response)
          {
              emit LogExecute(
                  _target,
                  _src,
                  _session
              );
              
              // call contract in current context
              assembly {
                  let succeeded := delegatecall(sub(gas, 5000), _target, add(_data, 0x20), mload(_data), 0, 0)
                  let size := returndatasize
      
                  response := mload(0x40)
                  mstore(0x40, add(response, and(add(add(size, 0x20), 0x1f), not(0x1f))))
                  mstore(response, size)
                  returndatacopy(add(response, 0x20), 0, size)
      
                  switch iszero(succeeded)
                      case 1 {
                          // throw if delegatecall failed
                          revert(add(response, 0x20), size)
                      }
              }
          }
      
      }
      
      
      /// @title AddressRegistry
      /// @notice 
      /// @dev 
      contract AddressRegistry {
          event LogSetAddress(string name, address addr);
      
          /// @notice Registry of role and address
          mapping(bytes32 => address) registry;
      
          /**
           * @dev Check if msg.sender is admin or owner.
           */
          modifier isAdmin() {
              require(
                  msg.sender == getAddress("admin") || 
                  msg.sender == getAddress("owner"),
                  "permission-denied"
              );
              _;
          }
      
          /// @dev Get the address from system registry 
          /// @param _name (string)
          /// @return  (address) Returns address based on role
          function getAddress(string memory _name) public view returns(address) {
              return registry[keccak256(abi.encodePacked(_name))];
          }
      
          /// @dev Set new address in system registry 
          /// @param _name (string) Role name
          /// @param _userAddress (string) User Address
          function setAddress(string memory _name, address _userAddress) public isAdmin {
              registry[keccak256(abi.encodePacked(_name))] = _userAddress;
              emit LogSetAddress(_name, _userAddress);
          }
      }
      
      
      /// @title LogicRegistry
      /// @notice
      /// @dev LogicRegistry 
      contract LogicRegistry is AddressRegistry {
      
          event LogEnableStaticLogic(address logicAddress);
          event LogEnableLogic(address logicAddress);
          event LogDisableLogic(address logicAddress);
      
          /// @notice Map of static proxy state
          mapping(address => bool) public logicProxiesStatic;
          
          /// @notice Map of logic proxy state
          mapping(address => bool) public logicProxies;
      
          /// @dev 
          /// @param _logicAddress (address)
          /// @return  (bool)
          function logic(address _logicAddress) public view returns (bool) {
              if (logicProxiesStatic[_logicAddress] || logicProxies[_logicAddress]) {
                  return true;
              }
              return false;
          }
      
          /// @dev 
          /// @param _logicAddress (address)
          /// @return  (bool)
          function logicStatic(address _logicAddress) public view returns (bool) {
              if (logicProxiesStatic[_logicAddress]) {
                  return true;
              }
              return false;
          }
      
          /// @dev Sets the static logic proxy to true
          /// static proxies mostly contains the logic for withdrawal of assets
          /// and can never be false to freely let user withdraw their assets
          /// @param _logicAddress (address)
          function enableStaticLogic(address _logicAddress) public isAdmin {
              logicProxiesStatic[_logicAddress] = true;
              emit LogEnableStaticLogic(_logicAddress);
          }
      
          /// @dev Enable logic proxy address
          /// @param _logicAddress (address)
          function enableLogic(address _logicAddress) public isAdmin {
              logicProxies[_logicAddress] = true;
              emit LogEnableLogic(_logicAddress);
          }
      
          /// @dev Disable logic proxy address
          /// @param _logicAddress (address)
          function disableLogic(address _logicAddress) public isAdmin {
              logicProxies[_logicAddress] = false;
              emit LogDisableLogic(_logicAddress);
          }
      
      }
      
      
      /**
       * @dev Deploys a new proxy instance and sets msg.sender as owner of proxy
       */
      contract WalletRegistry is LogicRegistry {
          
          event Created(address indexed sender, address indexed owner, address proxy);
          event LogRecord(address indexed currentOwner, address indexed nextOwner, address proxy);
          
          /// @notice Address to UserWallet proxy map
          mapping(address => UserWallet) public proxies;
          
          /// @dev Deploys a new proxy instance and sets custom owner of proxy
          /// Throws if the owner already have a UserWallet
          /// @return proxy ()
          function build() public returns (UserWallet proxy) {
              proxy = build(msg.sender);
          }
      
          /// @dev update the proxy record whenever owner changed on any proxy
          /// Throws if msg.sender is not a proxy contract created via this contract
          /// @return proxy () UserWallet
          function build(address _owner) public returns (UserWallet proxy) {
              require(proxies[_owner] == UserWallet(0), "multiple-proxy-per-user-not-allowed");
              proxy = new UserWallet();
              proxies[address(this)] = proxy; // will be changed via record() in next line execution
              proxy.setOwner(_owner);
              emit Created(msg.sender, _owner, address(proxy));
          }
      
          /// @dev Transafers ownership
          /// @param _currentOwner (address) Current Owner
          /// @param _nextOwner (address) Next Owner
          function record(address _currentOwner, address _nextOwner) public {
              require(msg.sender == address(proxies[_currentOwner]), "invalid-proxy-or-owner");
              require(proxies[_nextOwner] == UserWallet(0), "multiple-proxy-per-user-not-allowed");
              proxies[_nextOwner] = proxies[_currentOwner];
              proxies[_currentOwner] = UserWallet(0);
              emit LogRecord(_currentOwner, _nextOwner, address(proxies[_nextOwner]));
          }
      
      }
      
      
      /// @title InstaRegistry
      /// @dev Initializing Registry
      contract InstaRegistry is WalletRegistry {
      
          constructor() public {
              registry[keccak256(abi.encodePacked("admin"))] = msg.sender;
              registry[keccak256(abi.encodePacked("owner"))] = msg.sender;
          }
      }