logo

色んな意味で話題のMagaコントラクト解説

〜誰かを傷つけようとすれば、自分も傷つくことになるよ〜
profile photo
TaniguchiAkira

はじめに

私は今まで比較的品行方正に生きてきたような気がします。
ベンツのエンブレムを折ってコレクションしたこともないし、傷害事件も起こしていません。
でもミームコインの技術解説は行います。しかもクセ強のミームコインです。
今回扱うトークンの発行までの経緯や思想についてはコメントしません。投資助言でもありませんのでよろしくお願いします。こちらはただのコードの解説記事です。
本記事は2024/05/29時点の情報に基づいております。

Magaとは

近年価格が高騰したことで記事になったこともあるが、トランプ前大統領との関係性は不明。

解説

コードの品質は🤔

このコントラクトはSolidity0.8.20でコンパイルされている。そしてSafeMathを利用している。
完全に蛇足ですね。
💡
SafeMathは数値計算のオーバーフローが自動的にエラーになるライブラリ。
Solidityの0.8以降は数値計算のオーバーフローが自動的にエラーになるようになったので利用する必要はない。
そして、SafeMathは使ってるのに肝心なOpenZeppelinのERC20は利用しておらず、トークンとしての機能は独自実装となる。
大手CEXの上場基準に、「OpenZeppelinのERC20を継承していること」という項目があるくらい品質に影響する部分なのだが、この先どうなるのだろうか。
ちなみにproxyパターンではないので、これ以上のmintは発生しないと思われる。今の発行数(4700万)がそのまま上限。
solidity
constructor () { _taxWallet = payable(_msgSender()); _teamWallet = payable(0x5432FC1c238179dEd479BC9B8e041265C623ad64); _balances[_msgSender()] = _tTotal; _isExcludedFromFee[owner()] = true; _isExcludedFromFee[address(this)] = true; _isExcludedFromFee[_taxWallet] = true; emit Transfer(address(0), _msgSender(), _tTotal); }
ERC20を継承していないため、_balancesやTransferのemitを独自に実装している

transferの中身

solidity
function _transfer(address from, address to, uint256 amount) private { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); uint256 taxAmount=0; if (from != owner() && to != owner()) { //taxAmountを送金額の1%に設定 taxAmount = amount.mul((_buyCount>_reduceBuyTaxAt)?_finalBuyTax:_initialBuyTax).div(100); if (from == uniswapV2Pair && to != address(uniswapV2Router) && ! _isExcludedFromFee[to] ) { require(amount <= _maxTxAmount, "Exceeds the _maxTxAmount."); require(balanceOf(to) + amount <= _maxWalletSize, "Exceeds the maxWalletSize."); if (firstBlock + 3 > block.number) { require(!isContract(to)); } _buyCount++; } if (to != uniswapV2Pair && ! _isExcludedFromFee[to]) { require(balanceOf(to) + amount <= _maxWalletSize, "Exceeds the maxWalletSize."); } if(to == uniswapV2Pair && from!= address(this) ){ taxAmount = amount.mul((_buyCount>_reduceSellTaxAt)?_finalSellTax:_initialSellTax).div(100); } uint256 contractTokenBalance = balanceOf(address(this)); if (!inSwap && to == uniswapV2Pair && swapEnabled && contractTokenBalance>_taxSwapThreshold && _buyCount>_preventSwapBefore) { //ここで山分けする資産を確保 swapTokensForEth(min(amount,min(contractTokenBalance,_maxTaxSwap))); uint256 contractETHBalance = address(this).balance; if(contractETHBalance > 0) { //山分け送信 sendETHToFee(address(this).balance); } } } if(taxAmount>0){  //コントラクトにtaxAmount分を強制デポジット _balances[address(this)]=_balances[address(this)].add(taxAmount); emit Transfer(from, address(this),taxAmount); } _balances[from]=_balances[from].sub(amount); //taxAmount分を徴収 _balances[to]=_balances[to].add(amount.sub(taxAmount)); emit Transfer(from, to, amount.sub(taxAmount)); }
実はこのトークン、送金時に自動的に1%の手数料を徴収する仕組みが組み込まれている。
具体的には、例えばDEXにおいて、1ETHで1000Maga買おうとしたとすると、1ETHはプールに送金されるが、ユーザには990Magaしか送金されず、10Magaはコントラクト自身の持ち物となる。
この仕様は取引だけではなく、流動性提供時にも適用される。CEXの場合は関係ない。(まじウケル)
そして、コントラクトが保持しているトークン数が47000を超えると、保持しているトークンをUniswapを使いETHにトレードする機能もついている。(まじウケる)
solidity
function swapTokensForEth(uint256 tokenAmount) private lockTheSwap { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, path, address(this), block.timestamp ); }
そのETHは仲間内で山分けとなるロジックも組み込まれている。(まじウケる)
solidity
function sendETHToFee(uint256 amount) private { uint256 taxWalletShare = amount * _taxWalletPercentage / 100; uint256 teamWalletShare = amount * _teamWalletPercentage / 100; _taxWallet.transfer(taxWalletShare); _teamWallet.transfer(teamWalletShare); }
当然そのタイミングでMagaの価格は下がるので、運が悪いと流動性提供者は流動性が提供された瞬間、Magaの価格が下がるという厳しい状況が訪れる。(まじウケる)
それを回避したい場合は、誰でも実行できるmanualSwapという関数がこのコントラクトには組み込まれているので、それを実行し、強制的にコントラクトが保持しているMagaを吐き出させてから流動性を提供するという手段も取れる。(まじウケる)
solidity
function manualSwap() external{ uint256 tokenBalance=balanceOf(address(this)); if(tokenBalance>0){ swapTokensForEth(tokenBalance); } uint256 ethBalance=address(this).balance; if(ethBalance>0){ sendETHToFee(ethBalance); } }
当然その時のガス代はmanualSwapを実行した人が持つことになるし、そこまでして流動性を提供したいかという問題も存在する。(まじウケる)
2024/05/29現在、このコントラクトが保持しているMagaは3256、パチンコの沼のように、どのタイミングでホールドが解かれるかは、神?のみぞ知る。。そしてMagaのチームウォレットとタックスウォレットには合計55万ドル分の暗号資産が入っている模様
etherscan.io
etherscan.io
おそろしいですね、怖いですね、
それではみなさん、さよなら、さよなら、、、、、さよなら、

参考リンク

etherscan.io
Related posts
post image
〜SushiSwapもお友達になるよ〜
post image
Layer2
zk-Rollup
INTMAX
Mining
INTMAXのマイニングやってみた
人の夢と書いてトークンと読む
Powered by Notaku