When sending native XCN or tokens to an address that does not yet exist on Goliath, the chain automatically creates a new account via "lazy-create" (hollow account creation). This requires significantly more gas than a standard transfer.
A hardcoded gas limit of 21,000 will fail with INSUFFICIENT_GAS when the destination address does not yet exist on Goliath. Always use eth_estimateGas before submitting transactions.
Gas Comparison
Scenario
Gas Required
Transfer to an existing address
~21,000
Transfer to a new address (triggers lazy-create)
~587,000
Recommended gasLimit for lazy-create transfers
704,400 (587,000 + 20% buffer)
The difference is roughly 28x more gas for a transfer that triggers account creation compared to a transfer to an existing account.
For Wallet and Frontend Developers
If you are building a wallet, dApp frontend, or any application that submits transactions on Goliath, follow these guidelines:
Always call eth_estimateGas before submitting a transaction. The Goliath JSON-RPC relay returns the correct estimate (~587,000) when the destination triggers lazy-create, and ~21,000 when it does not.
Do NOT hardcode gas limits. A hardcoded 21,000 will succeed for existing accounts but fail for new addresses. Use eth_estimateGas every time.
Do NOT cache gas estimates across transactions. Each call to eth_estimateGas checks whether the destination account currently exists on-chain. An address that was new (lazy-create) in one block may already exist in the next.
Add a safety buffer. Apply a 10-20% buffer on top of the estimate to account for minor fluctuations:
const{ethers}=require('ethers');constprovider=newethers.JsonRpcProvider('https://rpc.goliath.net');asyncfunctionsendWithEstimate(signer,to,value){ // Always estimate -- do not assume 21,000constestimated=awaitprovider.estimateGas({from:signer.address,to:to,value:value}); // Add 20% bufferconstgasLimit=estimated*120n/100n;consttx=awaitsigner.sendTransaction({to:to,value:value,gasLimit:gasLimit});returntx;}
For End Users
MetaMask, Brave Wallet, and other major wallets call eth_estimateGas automatically before each send. No special action is needed for normal usage.
If a transaction fails with INSUFFICIENT_GAS:
Clear your wallet's activity/transaction cache. In MetaMask: Settings > Advanced > Clear activity & nonce data. This forces the wallet to re-fetch the correct gas estimate instead of reusing a stale one.
Retry the transaction. The wallet will call eth_estimateGas again and receive the correct value.
If using a custom script or CLI, set gasLimit to at least 587,000 for transfers to new addresses, or better yet, call eth_estimateGas and apply a buffer as shown above.
Technical Details
Goliath is built on the Hedera consensus layer. When a transfer targets an EVM address that has no corresponding account on the ledger, the relay node automatically triggers a CryptoCreate operation to establish the account before completing the transfer. This is called lazy-create or hollow account creation.
How gas is calculated
The gas requirement for lazy-create is derived from the underlying Hedera fee schedule:
At current fee levels, this works out to approximately 587,000 gas units. The exact value may vary slightly as the Hedera fee schedule is updated, which is why calling eth_estimateGas is always the correct approach.
Address requirements
The destination address must be a valid ECDSA-derived address (the result of keccak256 applied to a secp256k1 public key). Synthetic addresses that do not correspond to a real public key -- for example, 0x0000000000000000000000000000000000CAFE -- will fail with INVALID_ALIAS_KEY.
This means lazy-create works for any standard Ethereum wallet address but will reject addresses that were manually constructed or derived from non-ECDSA key types.
When lazy-create does NOT apply
Lazy-create is only triggered for addresses that have never received a transaction on Goliath. Once an account exists, all subsequent transfers to that address use the standard ~21,000 gas. There is no way to "re-trigger" lazy-create for an existing account.