Sounds like when I was a kid and my brother would make up a game with vague rules, but when I'd pay it in a way he didn't expect, he'd say, "no not like that!" and call our mom.
Congrats to whoever found the loophole and made nine figures!
Sounds like when I was a kid and my brother would make up a game with vague rules, but when I'd pay it in a way he didn't expect, he'd say, "no not like that!" and call our mom.
Congrats to whoever found the loophole and made nine figures!
Beanstalk apparently set up what amounts to staking system for votes. More money == more votes. Have enough money? Well, then you have the majority of votes and can do whatever you want.
This is precisely how the system was designed to work. They just didn't foresee someone building up a large enough stake to amass the voting power needed to undermine the system. And that is simply a failure of imagination and goes to show how naive these folks were.
The way this works in the real world is you have a limited number of shares that give individuals some number of votes, and those shares change hands. In order to build up a large enough position to control a company, you have to convince existing owners to give up their stake or vote with you.
But if every dollar contributed to a "silo" creates a new vote, then yeah, you're basically saying: If you're rich enough you can take control of the project by simply amassing a large enough fortune in the project.
There's probably things they could've done to reduce the likelihood of an event like this--e.g. requiring supermajority or unanimous voting for certain types of changes, for example--but they didn't, so here we are. The system worked as intended.
And yes, I really mean "intended". They intended for people with more money to have more of a voice. And this is the (extremely obvious) consequence of that choice.
The only money you would need is the cost of gas.
flash_loan(int amount_borrowed, func arbitrary_trades)
1. give LOANEE_ADDRESS amount_borrowed
2. call arbitrary_trades()
3. give LOANER_ADDRESS (amount_borrowed + interest)
When 2. is executed, the loanee has the money. When 3. is complete, the loaner has the money back. If the loanee doesn't have the money to give, 3rd step fails. And since its atomic, the whole transaction fails.
A single atomic transaction does:
1) Borrow $80M 2) Use $80M however you want 3) Return $80M + loan fees (e.g. on Aave this would be 0.09%)
The lender is algorithmically guaranteed to get the money back and the borrower can potentially take advantage of large scale transient opportunities, or...just wreak havoc on a poorly secured system.
More info here: https://docs.aave.com/developers/guides/flash-loans
(I don't know what the second question means or what your mental model of a "real" currency is)
You're assuming that it wasn't intentionally designed that way.
The regularity of these events should makes it impossible to believe that they're all accidents... it's also not possible to figure out exactly which ones are and which aren't, which is itself no accident. (Or in which cases a third party exploited the vulnerability prematurely...)
Particularly so in that the advertised functionality of the system was obviously a non-sustatinable ponzi scheme... It was always going to explode, the only uncertainty would be how.
If that happens, and you used some kind of personal credibility to set it up, you've missed your shot.
Just a python script to avoid that artificial inefficiency entirely.
Also as the other user posted, gas fees would cripple you on Ethereum. Pretty sure I spent $50 sending some money somewhere earlier.
So then you need an identity verification system, or at least some practical difficulty in creating many accounts without getting caught.
A supermajority was required. The attacker purchased enough LP tokens to secure one. At the moment of the attack they held about 70% of voting power.
Unanimous voting wouldn't have been particularly useful because it would never be used. You can't ever convince every last investor to log in and pay gas to vote on a governance measure.
There was a protection in place, which was that the measure must be up for 24 hours before it can be passed. But the critical flaw was that the contents of a measure can be swapped out by a supermajority token holder, even after the 24 hour cooldown period. The attacker threw up 2 measures, one pointing to a nonexistent contract address, and another dummy measure as a diversion that would have transferred $250,000 to Ukraine and $10,000 to a wallet they owned. The diversion worked, and everyone spent the 24 hour period discussing why someone thought they could hoodwink the LP token holders into swindling $10,000 from them, and more or less ignored the second measure. Then, during the attack, the attacker deterministically created the treasury liquidation contract at the formerly blank address and used the flash loaned supermajority to pass it.
Second, I am curious:
> There was a protection in place, which was that the measure must be up for 24 hours before it can be passed.
So what happens after that 24 hours? The way you've described it here, it sounds like there's an up/down voting system after the cooldown period to either confirm or block the proposed measure, but it's not clear to me how that works. Who has control over that final decision?
>So what happens after that 24 hours? The way you've described it here, it sounds like there's an up/down voting system after the cooldown period to either confirm or block the proposed measure, but it's not clear to me how that works. Who has control over that final decision?
Anyone with at least 0.15% (IIRC) of voting power could propose a measure, at which point it would show up on the web app frontend with every LP token holder's vote defaulting to "No". It would have to accrue "Yes" votes from holders of >50% of LP tokens within a certain time period to pass. Alternatively, holders of >2/3rds of LP token could force pass a measure immediately, though this wasn't implemented on the web app frontend. But each of these was subject to a 24 hour period -- no measure that hadn't been proposed at least 24 hours ago could pass, even by supermajority.
And I assume the decoy proposal was just a means to ensure no one realized what was going on and themselves use a flash loan to reduce the attacker's voting power below the 50% level needed to pass the proposal?
My favorite take on crypto commodity is that “They’re recreating and failing to solve problems that have been solved in traditional banking for hundreds of years”.
Maybe there is some upside where this is just all growing pains, or maybe it’s all garbage all the way through, I don’t know.
But it’s clear to me that technically smart does not mean economically wise.
So how long until the crypto speedrun of financial crises reaches, and then surpasses, the regular financial system and we see financial crises that haven't even happened yet in the regular financial system (but are likely to happen at some point in the future)?
They also didn't do any research on why a mountain of legislature, regulation, and case law that protects minority shareholders exists.
By the time you're playing with nine figure sums, one would expect that to be something they should have looked into!
Well, no, because the assumption among crypto libertarians is those laws and regulations are a product of a government that's a) incompetent and/or b) corrupt.
If you take it as a first principle that the current system is the one that's broken and that you're part of a grand mission to reinvent it, of course you're not going to waste your time trying to learn from it.
The sad thing: These aren't just anonymous crypto bros on a beach losing their tokens through theft, rugpulls, crashes, or other vulnerabilities. A lot of ordinary people are burning up their savings on these schemes (enabled by platforms like Coinbase and OpenSea and even Venmo) even as they urge other suckers and family members to get in on it.
What basis would they have for calling this theft?