Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why we can't send ether to ethereum address 0x1 via smart contracts

With this below solidity code I have tried to send ether to ethereum wallet address 0x1 via smart contract and it becomes failed. But, when I try to send ether to address 0x1 directly from my wallet it becomes success.

pragma solidity ^0.4.24;

contract Transfer {

    constructor () public payable {
        // Deploy contract with 1000 wei for testing purpose
        require(msg.value == 1000);
    }

    function done() public {
        address(0).transfer(1); // Transaction success
    }

    function fail() public {
        address(1).transfer(1); // Transaction failed
    }

    function send(address account) public {
        account.transfer(1); // Transaction success (except 0x1)
    }

}

Why we can't send ether to address 0x1 via contracts ?

REFERENCE:

  1. Sending ether directly from my wallet is success https://ropsten.etherscan.io/tx/0x1fdc3a9d03e23b0838c23b00ff99739b775bf4dd7b5b7f2fa38043056f731cdc

  2. done() function is success https://ropsten.etherscan.io/tx/0xd319c40fcf50bd8188ae039ce9d41830ab795e0f92d611b16efde0bfa1ee82cd

  3. fail() function is failed https://ropsten.etherscan.io/tx/0x0c98eafa0e608cfa66777f1c77267ce9bdf81c6476bdefe2a7615158d17b59ad


UPDATE:

After researching about ethereum pre-compiled contracts I have written this below solidity code to send ether to 0x1 address via smart contract and it's working.

pragma solidity ^0.4.24;

contract Learning {

    constructor () public payable {
        // Deploy contract with 1000 wei for testing purpose
        require(msg.value == 1000);
    }

    function test() public returns (bool) {
        // Set minimum gas limit as 700 to send ether to 0x1
        transfer(0x0000000000000000000000000000000000000001, 1, 700);
        return true;
    }

    function transfer(address _account, uint _wei, uint _gas) private {
        require(_account.call.value(_wei).gas(_gas)());
    }
}

For testing, just deploy contract with 1000 wei and execute test() function. It's working :)

like image 673
Chandra Nakka Avatar asked Sep 02 '18 18:09

Chandra Nakka


People also ask

Can smart contract transfer ether?

A smart contract transfer, also known as an internal transaction, is a transfer of a native asset (ETH: Mainnet, Arbitrum, Optimism, Aurora/BNB/MATIC/FTM/AVAX/KLAY/xDAI) from a smart contract to another smart contract or address. These types of transfers are referred to by the community as an internal transaction.

Is smart contract in Ethereum has how many address?

Solidity has a type called address , which holds an Ethereum 20-byte address. Every account and smart contract on the Ethereum blockchain has a unique address and can send and receive Ether (ETH) to and from this address.


1 Answers

You have accidentally stumbled upon one of ethereum's lesser known "features". The chain actually has a few precompiled contracts (Appendix E in the yellowpaper), one of which lives at 0x0000000000000000000000000000000000000001 (the ecrecover contract).

Your fail() function fails with out of gas due to the fact that the ecrecover contract's fallback execution will require more than the 2300 gas forwarded by the transfer method.

The 0x0 address is not a special contract, so a regular transfer call works just fine, as it would with any other address.

like image 81
Raghav Sood Avatar answered Oct 04 '22 22:10

Raghav Sood