So I recently created an nft collection and after already creating the contract and minting 1,000 nft's I saw in the source code that it's creator (hashlips) had a line of code that collects 5% fee:

function withdraw() public payable onlyOwner { // This will pay HashLips 5% of the initial sale. // You can remove this if you want, or keep it in to support HashLips and his channel. // ============================================================================ (bool hs, ) = payable(0x943590A42C27D08e3744202c4Ae5eD55c2dE240D).call{value: address(this).balance * 5 / 100}(""); require(hs); // ============================================================================

// This will payout the owner 95% of the contract balance.
// Do not remove this otherwise you will not be able to withdraw the funds.
// ============================================================================
(bool os, ) = payable(owner()).call{value: address(this).balance}("");
// ============================================================================   }

I removed it afterwards and compiled it in remix and now it looks like this:

function withdraw() public payable onlyOwner { // ============================================================================ (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); // ============================================================================ }

The problem is that I read that you cant change the source code of a contract that has already been deployed, so it doesnt matter that I removed it afterwards and compiled the file in remix. He will still get the 5% fee when I withdraw from the contract address to mine. The collection is on Opensea and I've set a 3.5% fee there. Is it possible to somehow remove royalty addresses from a contract that has been deployed, or do I have to create a new contract with the correct source code and mint the nft's again?

full code:

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/access/Ownable.sol";

contract NFT is ERC721Enumerable, Ownable { using Strings for uint256;

string public baseURI; string public baseExtension = ".json";
uint256 public cost = 0.025 ether; uint256 public maxSupply = 10000; uint256 public maxMintAmount = 10000; bool public paused = false;
mapping(address => bool) public whitelisted;

constructor( string memory _name, string memory _symbol, string memory _initBaseURI ) ERC721(_name, _symbol) { setBaseURI(_initBaseURI); mint(msg.sender, 100); }

// internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; }

// public function mint(address _to, uint256 _mintAmount) public payable { uint256 supply = totalSupply(); require(!paused); require(_mintAmount > 0); require(_mintAmount <= maxMintAmount); require(supply + _mintAmount <= maxSupply);

if (msg.sender != owner()) {
    if(whitelisted[msg.sender] != true) {
      require(msg.value >= cost * _mintAmount);

for (uint256 i = 1; i <= _mintAmount; i++) {
  _safeMint(_to, supply + i);
}   }

function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256; for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; }

function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" );

string memory currentBaseURI = _baseURI();
return bytes(currentBaseURI).length > 0
    ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
    : "";   }

//only owner function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; }

function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner { maxMintAmount = _newmaxMintAmount; }

function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; }

function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; }

function pause(bool _state) public onlyOwner { paused = _state; } function whitelistUser(address _user) public onlyOwner { whitelisted[_user] = true; } function removeWhitelistUser(address _user) public onlyOwner { whitelisted[_user] = false; }

function withdraw() public payable onlyOwner { // ============================================================================ (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); // ============================================================================ } }

1 Answer 1


Ouch. It's impossible to change the code on the blockchain, so yes, your options are to accept it or to start again with a new contract. Have a look into unit testing, as you'd probably have caught this before deploying.

If you've sold any NFTs you should be able to get the contract's balance out without royalty using self destruct, but there's the issue of how to setup the new contract still honouring the sold NFTs.

  • Okay, I'll have to redo it then. I did a test launch on the testnet but haven't thought about unit testing, I'll check that out, thanks! I minted them myself 2 days ago and havent listed any because of this, thankfully I saw it sooner.
    – guest123
    Jun 2 at 11:11
  • no biggie then. all part of the learning process. unit tests can take a bit of setting up, but they're also quite fun.
    – sola24
    Jun 2 at 15:31
  • yeah, big learning process indeed. Now I learned that people can literally mint for free directly on polygonscan after I verified the contract :D I wonder what else is gonna happen. Congrats to the 4 peeps with 30 free nft's tho :D
    – guest123
    Jun 2 at 21:08

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.