APE Price: $0.67 (+2.43%)

Contract

0x064F8943f61Db9c8c870E9b05f6e32042a427ad7

Overview

APE Balance

Apechain LogoApechain LogoApechain Logo0 APE

APE Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Deploy Clone79677912025-01-11 14:23:2923 days ago1736605409IN
0x064F8943...42a427ad7
0 APE0.008692525.42069

Latest 2 internal transactions

Parent Transaction Hash Block From To
79677912025-01-11 14:23:2923 days ago1736605409
0x064F8943...42a427ad7
 Contract Creation0 APE
78446352025-01-09 21:02:3625 days ago1736456556  Contract Creation0 APE

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Factory

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 999999 runs

Other Settings:
london EvmVersion, MIT license
/**
 *Submitted for verification at apescan.io on 2025-01-10
*/

// SPDX-License-Identifier: MIT
pragma solidity <0.9.0 >=0.8.4;

// src/Factory.sol

contract Factory {
  address[] public proxies;

  function deployClone(address implementationContract_, bytes calldata deploymentData_) external returns (address) {
    // convert the address to 20 bytes
    bytes20 implementationContractInBytes = bytes20(implementationContract_);
    //address to assign a cloned proxy
    address proxy;

    // as stated earlier, the minimal proxy has this bytecode
    // <3d602d80600a3d3981f3363d3d373d3d3d363d73><address of implementation contract><5af43d82803e903d91602b57fd5bf3>

    // <3d602d80600a3d3981f3> == creation code which copies runtime code into memory and deploys it

    // <363d3d373d3d3d363d73> <address of implementation contract> <5af43d82803e903d91602b57fd5bf3> == runtime code that makes a delegatecall to the implentation contract

    assembly {
      /*
      reads the 32 bytes of memory starting at the pointer stored in 0x40
      In solidity, the 0x40 slot in memory is special: it contains the "free memory pointer"
      which points to the end of the currently allocated memory.
      */
      let clone := mload(0x40)
      // store 32 bytes to memory starting at "clone"
      mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)

      /*
        |              20 bytes                |
      0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000
                            ^
                            pointer
      */
      // store 32 bytes to memory starting at "clone" + 20 bytes
      // 0x14 = 20
      mstore(add(clone, 0x14), implementationContractInBytes)

      /*
        |               20 bytes               |                 20 bytes              |
      0x3d602d80600a3d3981f3363d3d373d3d3d363d73bebebebebebebebebebebebebebebebebebebebe
                                                ^
                                                pointer
      */
      // store 32 bytes to memory starting at "clone" + 40 bytes
      // 0x28 = 40
      mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)

      /*
      |                 20 bytes                  |          20 bytes          |           15 bytes          |
      0x3d602d80600a3d3981f3363d3d373d3d3d363d73b<implementationContractInBytes>5af43d82803e903d91602b57fd5bf3 == 45 bytes in total
      */

      // create a new contract
      // send 0 Ether
      // code starts at the pointer stored in "clone"
      // code size == 0x37 (55 bytes)
      proxy := create(0, clone, 0x37)

      // Call initialization
      // Get the size of deploymentData_
      // revert if call reverts
      // The following list explains what the arguments are to the `staticcall` function below
      // first, we use staticcall to ensure read-only behavior
      // gas()              : forward all gas
      // proxy              : contract we are calling
      // 0x00               : no ether is sent with the call
      // deploymentData_    : our calldata start location
      // deploymentDataSize : make sure we send all the calldata
      // 0x00               : where the return data starts in memory
      // 0x20               : the offset of where the return data ends in memory
      calldatacopy(mload(0x40), deploymentData_.offset, deploymentData_.length)
      if iszero(call(gas(), proxy, 0x00, mload(0x40), deploymentData_.length, 0x00, 0x20)) {
        returndatacopy(0x00, 0x00, returndatasize())
        revert(0x00, returndatasize())
      }
    }
    proxies.push(proxy);
    return proxy;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"implementationContract_","type":"address"},{"internalType":"bytes","name":"deploymentData_","type":"bytes"}],"name":"deployClone","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proxies","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b506102ab806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063abd90f851461003b578063b6d3ef3714610077575b600080fd5b61004e6100493660046101be565b61008a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61004e6100853660046101d7565b6100c1565b6000818154811061009a57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6000808460601b905060006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505083856040513760206000856040516000855af1610148573d6000803e3d6000fd5b600080546001810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831617905595945050505050565b6000602082840312156101d057600080fd5b5035919050565b6000806000604084860312156101ec57600080fd5b833573ffffffffffffffffffffffffffffffffffffffff8116811461021057600080fd5b9250602084013567ffffffffffffffff8082111561022d57600080fd5b818601915086601f83011261024157600080fd5b81358181111561025057600080fd5b87602082850101111561026257600080fd5b602083019450809350505050925092509256fea264697066735822122055534a50bd0c95ba17a8d2660116d520d214072fa3e04d3c0dadf9438e491fd664736f6c63430008180033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063abd90f851461003b578063b6d3ef3714610077575b600080fd5b61004e6100493660046101be565b61008a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61004e6100853660046101d7565b6100c1565b6000818154811061009a57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6000808460601b905060006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505083856040513760206000856040516000855af1610148573d6000803e3d6000fd5b600080546001810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831617905595945050505050565b6000602082840312156101d057600080fd5b5035919050565b6000806000604084860312156101ec57600080fd5b833573ffffffffffffffffffffffffffffffffffffffff8116811461021057600080fd5b9250602084013567ffffffffffffffff8082111561022d57600080fd5b818601915086601f83011261024157600080fd5b81358181111561025057600080fd5b87602082850101111561026257600080fd5b602083019450809350505050925092509256fea264697066735822122055534a50bd0c95ba17a8d2660116d520d214072fa3e04d3c0dadf9438e491fd664736f6c63430008180033

Deployed Bytecode Sourcemap

90:3618:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;112:24;;;;;;:::i;:::-;;:::i;:::-;;;375:42:1;363:55;;;345:74;;333:2;318:18;112:24:0;;;;;;;143:3562;;;;;;:::i;:::-;;:::i;112:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;112:24:0;:::o;143:3562::-;247:7;303:37;351:23;343:32;;303:72;;422:13;1197:4;1191:11;1279:66;1272:5;1265:81;1679:29;1672:4;1665:5;1661:16;1654:55;2138:66;2131:4;2124:5;2120:16;2113:92;2657:4;2650:5;2647:1;2640:22;2631:31;;;3428:22;3404;3397:4;3391:11;3378:73;3537:4;3531;3507:22;3500:4;3494:11;3488:4;3481:5;3474;3469:73;3459:189;;3582:16;3576:4;3570;3555:44;3622:16;3616:4;3609:30;3459:189;3661:7;:19;;;;;;;;;;;;;;;;;;;;;;;143:3562;-1:-1:-1;;;;;143:3562:0:o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;430:788::-;509:6;517;525;578:2;566:9;557:7;553:23;549:32;546:52;;;594:1;591;584:12;546:52;633:9;620:23;683:42;676:5;672:54;665:5;662:65;652:93;;741:1;738;731:12;652:93;764:5;-1:-1:-1;820:2:1;805:18;;792:32;843:18;873:14;;;870:34;;;900:1;897;890:12;870:34;938:6;927:9;923:22;913:32;;983:7;976:4;972:2;968:13;964:27;954:55;;1005:1;1002;995:12;954:55;1045:2;1032:16;1071:2;1063:6;1060:14;1057:34;;;1087:1;1084;1077:12;1057:34;1132:7;1127:2;1118:6;1114:2;1110:15;1106:24;1103:37;1100:57;;;1153:1;1150;1143:12;1100:57;1184:2;1180;1176:11;1166:21;;1206:6;1196:16;;;;;430:788;;;;;:::o

Swarm Source

ipfs://55534a50bd0c95ba17a8d2660116d520d214072fa3e04d3c0dadf9438e491fd6

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.