A lot of people put light on the grieving which locked processRefunds() for a bit, that was the first exploit.
Luckily that was unlocked, but funds are still locked forever. How?
🧵 1/
2/ Let's take a look at an overview.
People took bids. It stored their data. Then, they were eligible for refunds.
By calling processRefunds(), a loop is made according to a refundProgress counter which then does the refund.
3/ This was the cause of the more-so-well-known exploit of a griever contract that can call the bid function (because they did not disable contract calling) which as a fallback that fails.
In short, someone could have bid and broke the processRefunds() by bidding from a contract
4/ This was exploited and done. An example had been posted on GitHub as proof of concept.
Also another person sent some on-chain messages to prove that this was the case, and to invest more in contract auditing.
Bid with a malicious contract that fails on fallback when receives ETH.
This makes the function fail, and stops the "chain" of refunds from continuing.
6/ If you decompile the bytecode, they have a trigger on a fallback to either enable the stuck or disable it.
require (uint8) is probably a trigger to enable or disable the failing of receiving ETH.
Nice touch! That means it can be unstuck.
7/ As for a solidity readable, it was probably something similar to this.
If block, fail the receivable fallback. Otherwise, let it succeed.
Demonstration was written by @notchefbob which tried to notify the team of the issue.
@notchefbob 8/ Thus refunds AND withdrawals were stuck in a limbo, under the power of a single contract. Such power.
No refunds were able to be made, and in addition to that, the claimProjectFunds() logic of the owner required that all refunds were made first, before they can withdraw.
@notchefbob 9/ Funds were getting stuck and refunds were failing.
That would wrench any project owner's gut.
@notchefbob 10/ With the gods in favor, the anonymous contract deployer had unstuck the contract and processRefunds() worked again. He even sent a little message to let people know it was a demonstration. Invest in devs. Invest in security.
Let's take a look at the CryptoPunks contract which predates the ERC721 standard,
and also explain why a CryptoPunk was unintentionally sold today for 0.01 ETH (13$)
👇
CryptoPunks, deployed on 22 June 2017, is an NFT that actually pre-dates the ERC721 standard that powers all NFT collections now and is actually one of the inspirations for the ERC721 standard.
This means that the creators, Larva Labs, had to invent their own "NFT" mechanisms.
While creating their contract, they had to solve an issue that creators do not have anymore - supporting the purchasing and selling of their tokens.
1/ So there is a social engineering scam going on in servers, targeted at NFT figures and Project Moderator / Owners.
Have a read in this thread below.
2/ Firstly, the scammer will join the server with a new, burner account (or I guess, they could be an existing account) and frame you to the mods that you are a scammer. They will send your discord ID for the mod to ban, which instead of the supposite scammer, it's you instead.
3/ Then, once you are banned from the server (because they social engineered the mod to do so), they will contact you with an impersonator of the moderator. They will contact you in order to get you unbanned but you need to prove to them that you are innocent.