Solidity Steps
  • Learning Solidity
  • Step 1
    • 1: Introduction
    • 2: Data Types
    • 3: Functions
    • 4: Control Structures
    • 5: State Variable
    • 6: Local Variables
    • 7: Global Variables
    • 8: View Keyword
    • 9: Pure Keyword
  • STEP 2
    • 10: Immunable Keyword
    • 11: Events
    • 12: Condition
    • 13: While Loop
    • 14: Do While Loop
    • 15: For Loop
    • 16: Required
    • 17: Assert
    • 18: Revert
    • 19: Modifier
  • STEP 3
    • 20: Constructor
    • 21: Mapping
    • 22: Array
    • 23: Enum
    • 24: Structs
    • 25: Data Location
    • 26: Inheritance
    • 27: The Shadowing Effect
    • 28: Super Keyword
    • 29: Visibility
  • STEP 4
    • 30: Interface
    • 31: Abstract Contract
    • 32: Payable
    • 33: Using type()
    • 34: Sending Ether
    • 35: Receive
    • 36: Fallback
    • 37: Call
    • 38: DelegateCall
    • 39: Calling Other Contracts
  • STEP 5
    • 40: Factory Contract
    • 41: Proxy Contract
    • 42: Create2
    • 43: Try and Catch
    • 44: Solidity Library
    • 45: ABI Encoded
    • 46: ABI Decoded
    • 47: Keccak256
    • 48: Function Signature Hash
  • TIPS
    • Tips: Solidity by "Immunable"
    • Tips: Truffle Tutorial
    • Tips: Microblog Dapp
    • Tips: Reentrancy
    • Tips: Slither Tutorial
    • Tips: Remix Tutorial
    • Tips: Hardhat Tutorial
  • CAREER
    • 💲Cover Letter
    • 💲Resume
  • ABOUT
    • Contact me
Powered by GitBook
On this page
  • Example 1
  • Example 2
  1. STEP 4

38: DelegateCall

DelegateCall is a Solidity feature which allows a function to be called on another contract while preserving the caller's address and associated code. This article will discuss DelegateCall by some examples.

Example 1

Let's assume we have two contracts:

  • Contract A

  • Contract B

Contract A calls the function doSomething in Contract B using delegatecall.

contract A {  
    address contractB;    
    function doSomething() public {    
        contractB.delegatecall(bytes4(keccak256("doSomething")));  
    }
} 

contract B {  
    function doSomething() public {    //Do something  }
}

By using delegatecall, the function doSomething in Contract B will be called while preserving the caller's address and associated code. In this example, the address of Contract A will be preserved in the call to Contract B.

Example 2

Let's assume we have three contracts:

  • Contract A

  • Contract B

  • Contract C

Contract A calls the function doSomething in Contract B using delegatecall. Furthermore, Contract B calls the function doSomethingElse in Contract C using delegatecall.

contract A {  
    address contractB;    
    function doSomething() public {    
        contractB.delegatecall(bytes4(keccak256("doSomething")));  
    }
} 

contract B {  
    address contractC;    
    function doSomething() public {    
        contractC.delegatecall(bytes4(keccak256("doSomethingElse")));  
    }
} 

contract C {  
    function doSomethingElse() public {    //Do something else  }
}

By using delegatecall, the function doSomething in Contract B will be called while preserving the caller's address and associated code. Furthermore, the function doSomethingElse in Contract C will be called while preserving the address of Contract B and its associated code. Thus, in this example, the address of Contract A will be preserved in the call to Contract C.

That's it for the lesson 38! In the next lesson, Calling Other Contract

Previous37: CallNext39: Calling Other Contracts

Last updated 2 years ago