solidity基础_2

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract Payable {
    // address + payable can pay ETH
    address payable public owner;

    constructor(){
        owner = payable(msg.sender);
    }
    // function + payable can receive ETH
    function deposit() external payable{

    }

    function getBalance() external view returns (uint){
        return address(this).balance;
    }
}
//Un_

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract CallTestContract {
    (address , parameters)
    //Constract + ( address ).function( )
    function func_1(address _test,uint _x) external {
        TestConTract(_test).setX(_x);
    }

    //Constract address, 
    //address.function()
    /* equals to
    function func_1(TestConTract address _test,uint _x) external {
        _test.setX(_x);
    }
    */

    function func_2(address _test) external view returns (uint){
        uint x = TestConTract(_test).getX();
        return x;//have or not dousen;t matter
    }
    
    function func_3(address _test,uint _x) external payable {
        TestConTract(_test).setXandReceiveEther{value:msg.value}(_x);
    }//if you want to pass value {value:msg.value}
    // send Ether along with the function call. 

    function func_4(address _test) external view returns (uint x,uint value){
        (uint x,uint value) = TestConTract(_test).getXandValue();
        return (x,value);//have or not dousen;t matter
    }
}

contract TestConTract {
    uint public x;
    uint public value = 123;

    function setX(uint _x) external {
        x = _x;
    }

    function getX() external view returns (uint) {
        return x;
    }

    function setXandReceiveEther(uint _x) external payable {
        x = _x;
        value = msg.value;//the value changed
    }

    function getXandValue() external view returns (uint,uint){
        return (x,value);
    }

}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract Imuutable {
    //can't be changed reduce gas
    address public immutable owner;

    constructor(){// set up auto
        owner = msg.sender;
    }

    uint public x;
    function foo() external{
        require(msg.sender == owner);
        x += 1;
        
    }
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
/*
calling parent functions
- direct
- super

    E
   / \
  F   G
   \ /
    H

 */

contract E {
    //A memo to record the emit Log("")
    event Log(string message);

    function foo() public virtual {//virtual means can be changed in contract son
        emit Log("E.foo");
    }
    
    function bar() public virtual {
        emit Log("E.bar");
    }
}

contract F is E{
    function foo() public virtual override {//overrride means overlap
        emit Log("F.foo");
        E.foo();//directily use parent's function
    }
    function bar() public virtual override{
        emit Log("F.bar");
        super.bar();//find the father auto
    }
}

contract G is E{
    function foo() public virtual override {
        emit Log("G.foo");
        E.foo();
    }
    function bar() public virtual override{
        emit Log("G.bar");
        super.bar();//find the father auto
    }
}

contract H is F, G {
    function foo() public override(F,G) {// 2 together
        emit Log("H.foo");
        F.foo();

    }
    function bar() public virtual override(F,G) {
        emit Log("H.bar"); // G F E(once)
        super.bar();//both F,G 's .bar() will be excuted
    }
}

 

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract S {
    string public name;
    
    constructor(string memory _name) {
        name = _name;
    }
}

contract T {
    string public text;
    //constructor is the things when you deploy should give
    constructor(string memory _text) {
        text = _text;
    }
}

//You have alreay know what the input is
contract U is S("s"),T("t") {

}

//You don't know what the input will be
contract V is S,T {
    constructor(string memory _nam,string memory _tex) S(_nam) T(_tex){
        
    }
}

contract VV is S("s"),T {
    constructor(string memory _tex) T(_tex){
        
    }
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract A {

    //virtual means you can rewrite the function
    function foo() public pure virtual returns (string memory){
        return "A";
    }

    function bar() public pure virtual returns (string memory){
        return "A";
    }

    function baz() public pure virtual returns (string memory){
        return "A";
    }
}

contract B is A {// A is father

    //override means you can cover the father's function
    function foo() public pure override returns (string memory){
        return "B";
    }
    function bar() public pure virtual override  returns (string memory){
        return "B";
    }
}

contract C is B {// B is father

    //override means you can cover the father's function
    function bar() public pure override  returns (string memory){
        return "C";
    }
}

 

//Inter_Counter.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract Counter {

    uint public count ;

    function inc() external {
        count += 1;
    }
    function dec() external {
        count -= 1;
    }
}


//Interface.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

//interface in order to give a fucntion in other files into here
interface ICounter {// Interface name start with I

    function count() external view returns (uint);

    function inc() external;

}

contract CallInterface{
    
    uint public count;

    function examples(address _counter) external {
        ICounter(_counter).inc();//pass the address  remember
        count = ICounter(_counter).count();
    }
}

 

 

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract Account {

    address public owner;

    constructor(address _owner) payable {
        owner = _owner;
    }
}

contract AccountFactory {

    Account[] public accounts;

    function createAccount(address _owner) external payable {
        Account account = new Account{value: msg.value}(_owner);//传入主币
        accounts.push(account);
    }
}

 

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

/*
      X
    / |
   /  |
  Y   |
    \ |
      Z

order :X Y Z
*/
contract X {

    function foo() public pure virtual returns (string memory){
        return "X";
    }
    function bar() public pure virtual returns (string memory){
        return "X";
    }
    function x() public pure returns (string memory){
        return "X";
    }
}

contract Y is X {// this contract Y also have function x()
    function foo() public pure virtual override returns (string memory){
        return "Y";
    }
    function bar() public pure virtual override returns (string memory){
        return "Y";
    }
    function y() public pure returns (string memory){
        return "Y";
    }
}

contract Z is X,Y {
    function foo() public pure override(X,Y) returns (string memory){
        return "Z";
    }
    function bar() public pure virtual override(X,Y) returns (string memory){
        return "Z";
    }
}

 

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract Fallback {
    event Log(string func,address sender,uint value,bytes data);
    //if have data it can just feedback
    fallback() external payable {
        emit Log("feedback",msg.sender,msg.value,msg.data);
    }
    //receive can's have msg.data
    receive() external payable {
        emit Log("receive",msg.sender,msg.value,"");
    }
    
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
//39 发送EDH  40
contract SendEther {

    constructor() payable {}

    receive() external payable{}
    
    function semdViaTransfer(address payable _to) external payable {
        _to.transfer(123);
    }//no return

    function sendViaSend(address payable _to) external payable {
        bool sent = _to.send(123);
        require (sent,"send failed");
    }//return bool
    
    function sendViaCall(address payable _to) external payable {
        (bool success, ) = _to.call{value:123}("");
        require(success,"call failed");
    }//consume all gas return bool,data
    
}

contract EthReceiver {

    event Log(uint amount , uint gas);

    receive() external payable {
        emit Log(msg.value,gasleft());//the left of gas
    }

}

 

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract TestDelegateCall {
    uint public num;//被委托
    address public sender;
    uint public value;

    function setVars(uint _num) external payable {
        num = _num;
        sender = msg.sender;
        value = msg.value;
    }
}

contract DelegateCall {//委托
    uint public num;//这里被改了
    address public sender;
    uint public value;
    //传入被委托人的地址
    function setVars(address _test, uint _num) external payable {
        (bool success, bytes memory data) = _test.delegatecall(//
            abi.encodeWithSelector(TestDelegateCall(_test).setVars.selector, _num)//
        );//被委托的可以修改委托的值
        require(success, "Delegate call failed");
    }
}

 

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值