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:
Sending ether directly from my wallet is success https://ropsten.etherscan.io/tx/0x1fdc3a9d03e23b0838c23b00ff99739b775bf4dd7b5b7f2fa38043056f731cdc
done() function is success https://ropsten.etherscan.io/tx/0xd319c40fcf50bd8188ae039ce9d41830ab795e0f92d611b16efde0bfa1ee82cd
fail() function is failed https://ropsten.etherscan.io/tx/0x0c98eafa0e608cfa66777f1c77267ce9bdf81c6476bdefe2a7615158d17b59ad
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 :)
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With