├── BIRB2.0.sol ├── BirbLotteryCollection.sol ├── BirbV3ToV4Migration.sol ├── README.md └── V1+V3->V4Migration.sol /BIRB2.0.sol: -------------------------------------------------------------------------------- 1 | /* 2 | * MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWXKkdlc;,... ...,;cldOKNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM 3 | * MMMMMMMMMMMMMMMMMMMMMMMMMMMWX0xl;.. ..;lx0NWMMMMMMMMMMMMMMMMMMMMMMMMMMM 4 | * MMMMMMMMMMMMMMMMMMMMMMMMNOd:. .':d0NMMMMMMMMMMMMMMMMMMMMMMMM 5 | * MMMMMMMMMMMMMMMMMMMMWXkc' .'lkXWMMMMMMMMMMMMMMMMMMMM 6 | * MMMMMMMMMMMMMMMMMMNOc. 'lONMMMMMMMMMMMMMMMMMM 7 | * MMMMMMMMMMMMMMMWKd, ,dXWMMMMMMMMMMMMMMM 8 | * MMMMMMMMMMMMMW0l. ........... .oKWMMMMMMMMMMMMM 9 | * MMMMMMMMMMMWKl. .';:codxxkkOOOOOkkkxdolc;,.. .lKMMMMMMMMMMMM 10 | * MMMMMMMMMMXo. .':ldO00000OOkkkkkkkkkkkkkOOO00Oxoc,. .dNMMMMMMMMMM 11 | * MMMMMMMMWO, .;lxO000OkkxxddddddddooooooddodddxxkkOOko;. ;OWMMMMMMMM 12 | * MMMMMMMXo. .ck0K00OkxddoodddoooddddddddodoodddooddddxkOxl. .oNMMMMMMM 13 | * MMMMMMK: .lO0K0Okddddodooddddodddddoddooddddddddddoooodxkxc. :KMMMMMM 14 | * MMMMWO, .:k000OxdddddodoooddddddoddxxxkOO0000000000OOkkxdddxo, ;0MMMMM 15 | * MMMWO' .o0K00kdddddoddool:;;;;:ok0KXXXNNNNNNNNNNNNNNNNXXK0Oxxd;. ,0MMMM 16 | * MMM0' .d0K0Oxdodo::llc;.. .;xKNNNNNNNNNNNNNNNNNNNNNNNNXKOx: ,0MMM 17 | * MMK; .o000Odddooo:'.. .;;. :0NNNNNNNNNNNNNNNXXXKKKXXNNNXk; :XMM 18 | * MNl c0K0Ododooooool' ;KK: c0XNNNNNNNNNKkoc;,'...',:cdOKk' lNM 19 | * Wx. ,kK0Oxoododooodl' .. ,x0NNNNNNXOc' ..,;:::;,.. .'c, .kM 20 | * X; .l000xddooddodddo; ...c0XNNNNN0l. .lk0KKKKKXK0ko;. :X 21 | * x. 'xK0Ododddooddoodo;. ..',..:0NNNNNN0; 'd000000000KKKXKkc. .k 22 | * c :OK0xdodddooododdx0k:......'':xKNNNNNNK: .;dO0000000000000KXKd. l 23 | * ' .l00OdddddoododdodOXNXKkdoodk0XNNNNNNNXo. 'dO00000000000000000KKo. , 24 | * . .xK0kdddddoodddoox0NNNNNNNNNNNNNNNNNNNK; ,k00000000000000000000O: . 25 | * ;OK0xddddddooddodkXNNNNNNNNNNNNNNNNNNNk. .lkOOOOOOOkkkkkkkOOOO00o. . 26 | * c0KOxdddoddodddodOXNNNNNNNNNNNNNNNNNNNx. .,:ccc::::::::::cloxkOd. . 27 | * .dK0Ododdoodooddox0NNNNNNNNNNNNNNNNNNNNx. .:;'..................'::. . 28 | * . :OK0kdddddddddddoxKNNNNNNNNNNNNNNNNNNNNO' .lxdooooooodddddoddl' . 29 | * . .d00OxddoddoodddodOXNNNNNNNNNNNNNNNNNNNNK: ;ddddddddddddddxkOk; . ' 30 | * ; c000kdddooddodddod0NNNNNNNNNNNNNNNNNNNNNNx. .lddxxddxddddddxkOl. '; : 31 | * d. .cOK0kdoooddoododddkKNNNNNNNNNNNNNNNNNNNNNNXo. .cdddddddddddxkOo. .d: .x 32 | * 0' 'oO0OkdooddodoodododOXNNNNNNNNNNNNNNNNNNNNNNNXd. .;ldddddddxxxd:. 'x0; ,K 33 | * Wo .lO00Oxdool:clooddoooxKNNNNNNNNNNNNNNNNNNNNNNNNNXOc. ..;:clllc:,. .cONO' .dW 34 | * MK; .:k00Oxdddoooc,';coddddOXNNNNNNNNNNNNNNNNNNNNNNNNNNNXOo;.. ..;oOXNNx. :XM 35 | * MWk. ,d00Okddodooddol:'.,lodkXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXKOxdoooxkKXNNNNXl 'OMM 36 | * MMWx,cO0Okdoodddooddoolc,..:xKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNK: .xWMM 37 | * MMMWX00kxdddoddooddddolcc;..lXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0' .dWMMM 38 | * MMMMWXkddddoodddoodddoolcc;..dXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNk. .xWMMMM 39 | * MMMMMWKxddddoddoodddooolccc' 'kNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNo. 'kWMMMMM 40 | * MMMMMMWXkddodddddoddddolccc:. cKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNK: ;0WMMMMMM 41 | * MMMMMMMMN0xddodddodddolccccc' .kNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNk. .oXMMMMMMMM 42 | * MMMMMMMMMWXOddoddddddolccccc;. lXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXl ;OWMMMMMMMMM 43 | * MMMMMMMMMMMWKkddddoddolccccl;. ;0XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNk. 'xNMMMMMMMMMMM 44 | * MMMMMMMMMMMMMNKkddodolcccccc;. ;O0KXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0: 'dXMMMMMMMMMMMMM 45 | * MMMMMMMMMMMMMMMNKOxollcccccc, cO000KXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXKl. .;xXMMMMMMMMMMMMMMM 46 | * MMMMMMMMMMMMMMMMMWXOdlcccccc. .d000000KXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXK0o. 'lONMMMMMMMMMMMMMMMMM 47 | * MMMMMMMMMMMMMMMMMMMMNKkdllc, cO000000000KXXNNNNNNNNNNNNNNNNNNNNNNNXXKK00o. .ckXWMMMMMMMMMMMMMMMMMMM 48 | * MMMMMMMMMMMMMMMMMMMMMMWNKOo'.:k00000000000000KKXXXXXXNNNNNNNXXXXXKK00000kooOXWMMMMMMMMMMMMMMMMMMMMMM 49 | * MMMMMMMMMMMMMMMMMMMMMMMMMMWK0KXK0000000000000000000000KKKKK000000000KXXNNWMMMMMMMMMMMMMMMMMMMMMMMMMM 50 | * MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWNNXXKK0000000000000000000000KKXXNNWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM 51 | * MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWNNXXKKKKKKKKKKKKKKXXNNWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM 52 | * 53 | * Written by: MrGreenCrypto 54 | * Co-Founder of CodeCraftrs.com 55 | * 56 | * SPDX-License-Identifier: None 57 | */ 58 | 59 | pragma solidity 0.8.17; 60 | 61 | interface IBEP20 { 62 | function totalSupply() external view returns (uint256); 63 | function decimals() external view returns (uint8); 64 | function symbol() external view returns (string memory); 65 | function name() external view returns (string memory); 66 | function balanceOf(address account) external view returns (uint256); 67 | function transfer(address recipient, uint256 amount) external returns (bool); 68 | function allowance(address _owner, address spender) external view returns (uint256); 69 | function approve(address spender, uint256 amount) external returns (bool); 70 | function transferFrom(address sender, address recipient, uint256 amount ) external returns (bool); 71 | event Transfer(address indexed from, address indexed to, uint256 value); 72 | event Approval(address indexed owner, address indexed spender, uint256 value); 73 | } 74 | 75 | interface IDEXFactory { 76 | function createPair(address tokenA, address tokenB) external returns (address pair); 77 | } 78 | 79 | interface IDEXPair { 80 | function sync() external; 81 | } 82 | 83 | interface IDEXRouter { 84 | function factory() external pure returns (address); 85 | function swapExactTokensForETHSupportingFeeOnTransferTokens( 86 | uint256 amountIn, 87 | uint256 amountOutMin, 88 | address[] calldata path, 89 | address to, 90 | uint256 deadline 91 | ) external; 92 | } 93 | 94 | contract NewBirb is IBEP20 { 95 | string public constant name = "Birb"; 96 | string public constant symbol = "BIRB"; 97 | uint8 public constant decimals = 18; 98 | uint256 constant _totalSupply = 100_000_000 * (10**decimals); 99 | 100 | mapping(address => uint256) private _balances; 101 | mapping(address => mapping(address => uint256)) private _allowances; 102 | mapping(address => bool) public limitless; 103 | 104 | uint256 public buyTax = 0; 105 | uint256 public sellTax = 5; 106 | 107 | uint256 private buyLiq = 0; 108 | uint256 private buyMarketing = 0; 109 | uint256 private buyToken = 0; 110 | uint256 private buyBurn = 0; 111 | uint256 private sellLiq = 2; 112 | uint256 private sellMarketing = 3; 113 | uint256 private sellToken = 0; 114 | uint256 private sellBurn = 0; 115 | uint256 private taxDivisor = 100; 116 | uint256 private swapBirbAt = _totalSupply / 10_000; 117 | 118 | IDEXRouter public constant ROUTER = IDEXRouter(0x10ED43C718714eb63d5aA57B78B54704E256024E); 119 | address public constant CEO = 0x6AE2C08E6A91BEc45f6F64E96d8157F6B5DE3536; 120 | address public constant OWNER = 0x43CC8a482957B617E7536C7d1816e61901B8d481; 121 | address private constant DEAD = 0x000000000000000000000000000000000000dEaD; 122 | address private constant WBNB = 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c; 123 | 124 | address public marketingWallet = 0x02a05695989120517CC0bA9940741ff5323d7067; 125 | address public tokenWallet = 0x1C11409562C815B53c943868e6de58b15725AC6c; 126 | address public immutable pcsPair; 127 | address[] public pairs; 128 | 129 | modifier onlyOwner(){ 130 | require (msg.sender == OWNER, "Only the OWNER can do that"); 131 | _; 132 | } 133 | 134 | event WalletsChanged(address marketingWallet, address tokenWallet); 135 | event SwapBirbAtSet(uint256 swapBirbAt); 136 | event TokenRescued(address tokenRescued, uint256 amountRescued); 137 | event BnbRescued(uint256 balanceRescued); 138 | event ExcludedAddressFromTax(address wallet); 139 | event UnExcludedAddressFromTax(address wallet); 140 | event AirdropsSent(address[] airdropWallets, uint256[] amount); 141 | event MarketingTaxSwapped(uint256 bnbReceived); 142 | event PairAdded(address addedPair); 143 | event PairRemoved(address removedPair); 144 | 145 | event TaxesChanged( 146 | uint256 sellTax, 147 | uint256 buyTax, 148 | uint256 newBuyLiq, 149 | uint256 newBuyMarketing, 150 | uint256 newBuyToken, 151 | uint256 newBuyBurn, 152 | uint256 newSellLiq, 153 | uint256 newSellMarketing, 154 | uint256 newSellToken, 155 | uint256 newSellBurn, 156 | uint256 newTaxDivisor 157 | ); 158 | 159 | constructor() { 160 | pcsPair = IDEXFactory(IDEXRouter(ROUTER).factory()).createPair(WBNB, address(this)); 161 | pairs.push(pcsPair); 162 | _allowances[address(this)][address(ROUTER)] = type(uint256).max; 163 | 164 | limitless[CEO] = true; 165 | limitless[address(this)] = true; 166 | 167 | _balances[CEO] = _totalSupply; 168 | emit Transfer(address(0), CEO, _totalSupply); 169 | } 170 | 171 | receive() external payable {} 172 | 173 | function totalSupply() public view override returns (uint256) {return _totalSupply - _balances[DEAD];} 174 | function balanceOf(address account) public view override returns (uint256) {return _balances[account];} 175 | function allowance(address holder, address spender) public view override returns (uint256) {return _allowances[holder][spender];} 176 | function approveMax(address spender) external returns (bool) {return approve(spender, type(uint256).max);} 177 | 178 | function approve(address spender, uint256 amount) public override returns (bool) { 179 | require(spender != address(0), "Can't use zero address here"); 180 | _allowances[msg.sender][spender] = amount; 181 | emit Approval(msg.sender, spender, amount); 182 | return true; 183 | } 184 | 185 | function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { 186 | require(spender != address(0), "Can't use zero address here"); 187 | _allowances[msg.sender][spender] = allowance(msg.sender, spender) + addedValue; 188 | emit Approval(msg.sender, spender, _allowances[msg.sender][spender]); 189 | return true; 190 | } 191 | 192 | function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { 193 | require(spender != address(0), "Can't use zero address here"); 194 | require(allowance(msg.sender, spender) >= subtractedValue, "Can't subtract more than current allowance"); 195 | _allowances[msg.sender][spender] = allowance(msg.sender, spender) - subtractedValue; 196 | emit Approval(msg.sender, spender, _allowances[msg.sender][spender]); 197 | return true; 198 | } 199 | 200 | function transfer(address recipient, uint256 amount) external override returns (bool) { 201 | return _transferFrom(msg.sender, recipient, amount); 202 | } 203 | 204 | function transferFrom(address sender, address recipient, uint256 amount ) external override returns (bool) { 205 | if (_allowances[sender][msg.sender] != type(uint256).max) { 206 | require(_allowances[sender][msg.sender] >= amount, "Insufficient Allowance"); 207 | _allowances[sender][msg.sender] -= amount; 208 | emit Approval(sender, msg.sender, _allowances[sender][msg.sender]); 209 | } 210 | 211 | return _transferFrom(sender, recipient, amount); 212 | } 213 | 214 | function setBirbWallets(address marketingAddress, address tokenAddress) external onlyOwner { 215 | require(marketingAddress != address(0) && tokenAddress != address(0), "Can't use zero addresses here"); 216 | marketingWallet = marketingAddress; 217 | tokenWallet = tokenAddress; 218 | emit WalletsChanged(marketingWallet, tokenWallet); 219 | } 220 | 221 | function setSwapBirbAt(uint256 _swapBirbAt) external onlyOwner{ 222 | require(_swapBirbAt <= _totalSupply / 50, "Can't set the amount to sell to higher than 2% of totalSupply"); 223 | swapBirbAt = _swapBirbAt; 224 | emit SwapBirbAtSet(swapBirbAt); 225 | } 226 | 227 | function rescueAnyToken(address tokenToRescue) external onlyOwner { 228 | require(tokenToRescue != address(this), "Can't rescue your own"); 229 | emit TokenRescued(tokenToRescue, IBEP20(tokenToRescue).balanceOf(address(this))); 230 | IBEP20(tokenToRescue).transfer(CEO, IBEP20(tokenToRescue).balanceOf(address(this))); 231 | } 232 | 233 | function rescueBnb() external onlyOwner { 234 | emit BnbRescued(address(this).balance); 235 | (bool success, ) = CEO.call{value: address(this).balance}(""); 236 | require(success, "Something went wrong"); 237 | } 238 | 239 | function setSellTax(uint256 newTaxDivisor, uint256 newSellLiq, uint256 newSellMarketing, uint256 newSellToken, uint256 newSellBurn) external onlyOwner { 240 | taxDivisor = newTaxDivisor; 241 | sellLiq = newSellLiq; 242 | sellMarketing = newSellMarketing; 243 | sellToken = newSellToken; 244 | sellBurn = newSellBurn; 245 | sellTax = sellLiq + sellMarketing + sellToken + sellBurn; 246 | require(buyTax <= taxDivisor / 20 || sellTax <= taxDivisor / 20, "Taxes are limited to max. 5%"); 247 | 248 | emit TaxesChanged( 249 | sellTax, 250 | buyTax, 251 | buyLiq, 252 | buyMarketing, 253 | buyToken, 254 | buyBurn, 255 | newSellLiq, 256 | newSellMarketing, 257 | newSellToken, 258 | newSellBurn, 259 | newTaxDivisor 260 | ); 261 | } 262 | 263 | function setBuyTax(uint256 newTaxDivisor, uint256 newBuyLiq, uint256 newBuyMarketing, uint256 newBuyToken, uint256 newBuyBurn) external onlyOwner { 264 | taxDivisor = newTaxDivisor; 265 | buyLiq = newBuyLiq; 266 | buyMarketing = newBuyMarketing; 267 | buyToken = newBuyToken; 268 | buyBurn = newBuyBurn; 269 | buyTax = buyLiq + buyMarketing + buyToken + buyBurn; 270 | require(buyTax <= taxDivisor / 20 || sellTax <= taxDivisor / 20, "Taxes are limited to max. 5%"); 271 | 272 | emit TaxesChanged( 273 | sellTax, 274 | buyTax, 275 | newBuyLiq, 276 | newBuyMarketing, 277 | newBuyToken, 278 | newBuyBurn, 279 | sellLiq, 280 | sellMarketing, 281 | sellToken, 282 | sellBurn, 283 | newTaxDivisor 284 | ); 285 | } 286 | 287 | function setAddressTaxStatus(address wallet, bool status) external onlyOwner { 288 | limitless[wallet] = status; 289 | if(status) emit ExcludedAddressFromTax(wallet); 290 | else emit UnExcludedAddressFromTax(wallet); 291 | } 292 | 293 | function isContract(address account) internal view returns (bool) { 294 | bytes32 codehash; 295 | bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; 296 | assembly { codehash := extcodehash(account) } 297 | return (codehash != accountHash && codehash != 0x0); 298 | } 299 | 300 | function addPair(address pairToAdd) external onlyOwner { 301 | require(isContract(pairToAdd) && pairToAdd != address(this) && pairToAdd != address(ROUTER), "This address can not be set as a pair"); 302 | pairs.push(pairToAdd); 303 | emit PairAdded(pairToAdd); 304 | } 305 | 306 | function removeLastPair() external onlyOwner { 307 | address pairToBeRemoved = pairs[pairs.length-1]; 308 | if(pairs.length == 1) return; 309 | pairs.pop(); 310 | emit PairRemoved(pairToBeRemoved); 311 | } 312 | 313 | function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) { 314 | if (limitless[sender] || limitless[recipient]) return _lowGasTransfer(sender, recipient, amount); 315 | amount = takeTax(sender, recipient, amount); 316 | return _lowGasTransfer(sender, recipient, amount); 317 | } 318 | 319 | function takeTax(address sender, address recipient, uint256 amount) internal returns (uint256) { 320 | uint256 taxAmount = 0; 321 | uint256 totalTax = 0; 322 | 323 | if(isPair(sender)) { 324 | totalTax = buyTax; 325 | if(totalTax == 0) return amount; 326 | taxAmount = amount * totalTax / taxDivisor; 327 | 328 | if(buyBurn > 0) 329 | _lowGasTransfer(sender, DEAD, taxAmount * buyBurn / totalTax); 330 | 331 | if(buyToken > 0) 332 | _lowGasTransfer(sender, tokenWallet, taxAmount * buyToken / totalTax); 333 | 334 | if(buyLiq > 0) 335 | _lowGasTransfer(sender, pcsPair, taxAmount * buyLiq / totalTax); 336 | 337 | if(buyMarketing > 0) 338 | _lowGasTransfer(sender, address(this), taxAmount * buyMarketing / totalTax); 339 | 340 | return amount - taxAmount; 341 | } 342 | 343 | if(isPair(recipient)) { 344 | totalTax = sellTax; 345 | if(totalTax == 0) return amount; 346 | taxAmount = amount * sellTax / taxDivisor; 347 | 348 | if(sellBurn > 0) 349 | _lowGasTransfer(sender, DEAD, taxAmount * sellBurn / totalTax); 350 | 351 | if(sellToken > 0) 352 | _lowGasTransfer(sender, tokenWallet, taxAmount * sellToken / totalTax); 353 | 354 | if(sellLiq > 0) 355 | _lowGasTransfer(sender, pcsPair, taxAmount * sellLiq / totalTax); 356 | 357 | if(sellMarketing > 0) 358 | _lowGasTransfer(sender, address(this), taxAmount * sellMarketing / totalTax); 359 | 360 | if(balanceOf(address(this)) >= swapBirbAt) { 361 | swapBirb(); 362 | } else if(sellLiq > 0) { 363 | IDEXPair(pcsPair).sync(); 364 | } 365 | } 366 | 367 | return amount - taxAmount; 368 | } 369 | 370 | function isPair(address check) internal view returns(bool) { 371 | for (uint256 i = 0; i < pairs.length; i++) if(check == pairs[i]) return true; 372 | return false; 373 | } 374 | 375 | function _lowGasTransfer(address sender, address recipient, uint256 amount) internal returns (bool) { 376 | require(sender != address(0) && recipient != address(0), "Can't use zero addresses here"); 377 | require(amount <= _balances[sender], "Can't transfer more than you own"); 378 | if(amount == 0) return true; 379 | _balances[sender] -= amount; 380 | _balances[recipient] += amount; 381 | emit Transfer(sender, recipient, amount); 382 | return true; 383 | } 384 | 385 | function swapBirb() internal { 386 | uint256 contractBalance = _balances[address(this)]; 387 | if(contractBalance == 0) return; 388 | uint256 balanceBefore = marketingWallet.balance; 389 | address[] memory path = new address[](2); 390 | path[0] = address(this); 391 | path[1] = 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c; 392 | 393 | ROUTER.swapExactTokensForETHSupportingFeeOnTransferTokens( 394 | contractBalance, 395 | 0, 396 | path, 397 | marketingWallet, 398 | block.timestamp 399 | ); 400 | 401 | emit MarketingTaxSwapped(marketingWallet.balance - balanceBefore); 402 | } 403 | } 404 | -------------------------------------------------------------------------------- /BirbLotteryCollection.sol: -------------------------------------------------------------------------------- 1 | /* 2 | * MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNXK0OkkxxddooooooooooddxxkkO0KXNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM 3 | * MMMMMMMMMMMMMMMMMMMMMMMMMMMMWNK0kxdolllllloooddddddddddooollllllodxk0KNWMMMMMMMMMMMMMMMMMMMMMMMMMMMM 4 | * MMMMMMMMMMMMMMMMMMMMMMMMWNKOxdllllodxkOO0KXXNNNNWWWWNNNNXXK0OOkxdolllldxOKNWMMMMMMMMMMMMMMMMMMMMMMMM 5 | * MMMMMMMMMMMMMMMMMMMMMWX0xolllodxO0XNWMMMMMMMMMMMMMMMMMMMMMMMMMMWNX0OxdollloxOXWMMMMMMMMMMMMMMMMMMMMM 6 | * MMMMMMMMMMMMMMMMMMWX0xollldxOKNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNKOxdllloxOXWMMMMMMMMMMMMMMMMMM 7 | * MMMMMMMMMMMMMMMMNKkollldk0NWMMMMMMMMWXK0OkxdoooooooooodxxO0KXWWMMMMMMMMMWN0kdlllokKNMMMMMMMMMMMMMMMM 8 | * MMMMMMMMMMMMMMN0xollok0NWMMMMMWN0kol:,'.....................,;coxOXWMMMMMMMWN0xollox0NMMMMMMMMMMMMMM 9 | * MMMMMMMMMMMMN0dllldOXWMMMMMW0xc,.....';;:clloooddddddooolcc:;,'...':oONMMMMMMMWXOdllld0NMMMMMMMMMMMM 10 | * MMMMMMMMMMWKxllldONWMMMMWKx:....,;clodxxxxxdddddddddddddddxxxxdol:,...,lONMMMMMMWNOdlllxKWMMMMMMMMMM 11 | * MMMMMMMMWXkolloOXWMMMMW0o'...,codxxxxdddoooooooooooooooooooooodddxxoc;...:xXMMMMMMWNOollokXWMMMMMMMM 12 | * MMMMMMMW0dlloxXWMMMMMXo'..':oxxxxdddooooooooooooooooooooooooooooooodddoc'..;kNMMMMMMWXxolld0WMMMMMMM 13 | * MMMMMMNOolld0WMMMMMWO;..'cdxxxxdoooooooooooooooooooooooooooooooooooooooddc'..lKMMMMMMMN0dlloONMMMMMM 14 | * MMMMMNklllxKWMMMMMNd'..;oxxxddooooooooooooooooooodddxkkOO000000OOOkkxdooodl;..;0WMMMMMMWKxlllkNMMMMM 15 | * MMMMXxlllxXMMMMMMNo...cxxxxdoooooooooolc::::coxO0KXXNNNNNNNNNNNNNNNNXK0Okxoo:..;0WMMMMMMMXxlllxXMMMM 16 | * MMMNxlllkNMMMMMMWx..'lxxxxdoooocclll:;'......'ckXNNNNNNNNNNNNNNNNNNNNNNNNX0Od:..:KMMMMMMMMNklllxNMMM 17 | * MMNklllxNMMMMMMMO,..lxxxdoooooo:,,'...:c'.......lKNNNNNNNNNNNNNNNNNNNNXNNNNNXk:..lNMMMMMMMMNxlllkNMM 18 | * MW0olldXMMMMMMMXc..:xxxdooooooooll;..cXNo........oKXNNNNNNNNNNX0xolc::::cldkKNO;.'kMMMMMMMMMXdlloOWM 19 | * MXdllo0WMMMMMMMx..,dxxxooooooooooo;...;:'......'.:kKNNNNNNNX0o;'.,;::c::;'..'cxl..lNMMMMMMMMW0olldKM 20 | * WklllkNMMMMMMMXc..cxxxdooooooooooo:...........;;.lKXNNNNNN0l'.,ok0KKKKXXK0ko:.....,OMMMMMMMMMNklllkW 21 | * KdlloKMMMMMMMMO'.,oxxdooooooooooool:.......';:;'c0NNNNNNNO;..;k0000000000KXXKkc....lNMMMMMMMMMKdlldK 22 | * OlllkNMMMMMMMWd..;xxxdooooooooooood0Oc,''',;;;:xXNNNNNNNO,.'cxO0O000000OOO00KX0o'..'OMMMMMMMMMNklloO 23 | * xllo0WMMMMMMMXc..cxxdoooooooooooookXNNKkxdddk0XNNNNNNNNKc.:kOO0000OOOO0OOO0O00KKl...oWMMMMMMMMW0lllx 24 | * dlloKMMMMMMMM0,..collllooooooooood0NNNNNNNNNNNNNNNNNNNNx..lOOOOO0OOOOOOOOOOO0O0KO;..:XMMMMMMMMMKolld 25 | * olldXMMMMMMMWd....'''''',:cloooooxKNNNNNNNNNNNNNNNNNNNXl..;xOOOOOOOkkkkkkkOOOOO0Oc..;KMMMMMMMMMXdllo 26 | * olldXMMMMMMKl'.',;;;;;;,'..';coookXNNNNNNNNNNNNNNNNNNNK:..',cllllllllccclllodxkOOl..;0MMMMMMMMMXdllo 27 | * olldXMMMMMK:..,;;;;;;;;;::;,..,:o0NNNNNNNNNNNNNNNNNNNNK:.co;..............';;;;:oc..'o0NMMMMMMMXdllo 28 | * dlldKMMMMXl..,,;;;;;;;;;,,;::;,.'o0NNNNNNNNNNNNNNNNNNNK:.:kko;....'',,,'..:0Oxd;.....'':0WMMMMMKdlld 29 | * xllo0WMWKc..',,;;;;;;;;;;,'',;::,.,oKNNNNNNNNNNNNNNNNNXl.;dxkkdc,.........';,,k0;...'c;.:XMMMMM0ollx 30 | * klllxOkl,..',,;;;;;;;;;;;;;'..';::,.,dXNNNNNNNNNNNNNNNNk''lxdxkkkdocc:::ccl:..dXl...,c:.,0MMMMNklllk 31 | * 0c,'.....',,;;;;;;;;;;;;;;;;;'..';c:'.:ONNNNNNNNNNNNNNNKc.;dxddxxxkkkkkkkxxc.'ONl..';c:.,0MMMMXdllo0 32 | * K:....''''',;;;;;;;;;;;;;;;;;;,'..,:c;.,xXNNNNNNNNNNNNNNO;.;oddxdddxddddddl'.dNXc..,::,..cXMMWOlllxX 33 | * Wx'.''''''''''',,;;;;;;;;;;;;,,'...';c:..;loxOKXNNNNNNNNNO:.'cdxxddddxxdo:.'dXNk'.,;:,.,,.:OWKdllo0W 34 | * MXo,,;;;;;;;;;,,,,'',;;;;;,'.,cooc;.';c:.....',:lxkOXNNNNNKd,.';:cllcc:,'':dxoc'.,;:;'';::.'dxlllkNM 35 | * MW0:'',,,,,;;;;::::;,''',,'.;kKXXX0x;';l;..,;;,,'''';cdOXNNNKxl:,,'',,,'',,''...';,,;;;,;c:.'clldXMM 36 | * MMWk;..''....'',,;;:::;,'...lO0KKKKXO:'cc'..,;;;;;;;,''';lkKNNNXXKOxl;''',,;;'.';,:dOKk;.::.'clo0WMM 37 | * MMMWOcodc,;c;.''...',;;::;,.;dO00KKKKl.:l,...,,'...',;;;,'',lkKXOo;'.',,,'','..,,;kKKKO;'c,.'co0WMMM 38 | * MMMMW0d::lllloxdl:,...',,;:;',ldkOOOx;'cl,.':;'..':::,'',;;,'.,;'.,,,'','.....','l00KOc,:;...c0WMMMM 39 | * MMMMMWOodo:::::ccc:;'....',;;,',;::;,,cl:'.c00kd:;cd0Oxl;'.,;;,,,,'':oxxc;oo'.,,'cxxo:,,,.,,,kWMMMMM 40 | * MMMMMMMNklc:;lddl:'';cll;...',,,,,,;:cc:,..:ocldo:.:xO0K0kl,.';,',lk00klcddl'..,,,;,,,'...:d0WMMMMMM 41 | * MMMMMMMMXd;;dkxdo:;ccclodl:,'....''''''..;oxd::dxollclxO0KK0o,.,o0KKOdlcoo::l;...'''...,oodXMMMMMMMM 42 | * MMMMMMMMMWKxlc:;:ldxdc:;;,,,'.,::;;;;;';dOKKKk:lO0KKOxoldxdddl;cdxxoodk00ooOKkc',,..,c:;xNWMMMMMMMMM 43 | * MMMMMMMMMMMNko;,:c;,''''......';ldkOO0x::lodxxo:cxOO0OdccoxkOOOkxxoclk0kllxkdo;';,...':xNMMMMMMMMMMM 44 | * MMMMMMMMMMMMMN0xl;....''',,,,,'...,:ldko,cdxdddl;:cclldO0kdoddxddddxxlc;:oddo:...',;ckXMMMMMMMMMMMMM 45 | * MMMMMMMMMMMMMMMNk:'',;;;;;::;;,...':llll;,ck0KKKOc,;d0OdloodxkOkkkdllxo:xKKOo'.,;;lONMMMMMMMMMMMMMMM 46 | * MMMMMMMMMMMMMMMMMN0dc;;;:clc,','..'cdkOOkdl:lkOOoldk0xllxxxkOOOOkxxOdcxolkdc,.'ok0NMMMMMMMMMMMMMMMMM 47 | * MMMMMMMMMMMMMMMMMMMWXOdollc'.';;,'...';coddc,;l::x00dcdOxkOdcd00OxokKold;,;c:lONWMMMMMMMMMMMMMMMMMMM 48 | * MMMMMMMMMMMMMMMMMMMMMMWNKkc'.,;;;;,,'..,c;,cxkl,lkko:d0xkKOocdkkOklxXdcdclxOXWMMMMMMMMMMMMMMMMMMMMMM 49 | * MMMMMMMMMMMMMMMMMMMMMMMMMMNKkdoc:;;;,'..,cc:col;oxxccOkx0KKKKOdolooOXOkKXNMMMMMMMMMMMMMMMMMMMMMMMMMM 50 | * MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNKOkdol:'..';,'',oxd:cxxO0KXKK0O0OO0NWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM 51 | * MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNKOxoc;,:c:okxc:kK00XNNNNNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM 52 | * 53 | * Birb Lottery Collection 54 | * 55 | * Created, deployed, run, managed and maintained by CodeCraftrs 56 | * https://codecraftrs.com 57 | * 58 | * Written by: MrGreenCrypto 59 | * 60 | * SPDX-License-Identifier: None 61 | */ 62 | 63 | pragma solidity 0.8.17; 64 | 65 | interface IBEP20 { 66 | function decimals() external view returns (uint8); 67 | function balanceOf(address account) external view returns (uint256); 68 | function transfer(address recipient, uint256 amount) external returns (bool); 69 | function transferFrom(address sender, address recipient, uint256 amount ) external returns (bool); 70 | } 71 | 72 | interface ICCVRF { 73 | function requestRandomness(uint256 requestID, uint256 howManyNumbers) external payable; 74 | } 75 | 76 | interface IDEXRouter { 77 | function WETH() external pure returns (address); 78 | function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); 79 | function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn,uint amountOutMin,address[] calldata path,address to,uint deadline) external; 80 | function swapExactETHForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external payable; 81 | } 82 | 83 | contract BirbLotteryCollection { 84 | address public constant CEO = 0x7D70D9EDFa339895914A87E590921c0EECb3c2CC; 85 | address public constant CC = 0x7c4ad2B72bA1bDB68387E0AE3496F49561b45625; 86 | address private constant DEAD = 0x000000000000000000000000000000000000dEaD; 87 | 88 | IDEXRouter private router = IDEXRouter(0x10ED43C718714eb63d5aA57B78B54704E256024E); 89 | IBEP20 public BIRB = IBEP20(0x88888888Fc33e4ECba8958c0c2AD361089E19885); // will be updated to use Birb 2.0 address 90 | ICCVRF public randomnessSupplier = ICCVRF(0xC0de0aB6E25cc34FB26dE4617313ca559f78C0dE); 91 | 92 | uint256 private vrfCost = 0.002 ether; 93 | uint256 public priceOfTicketBurnLottery = 500; 94 | uint256 public maxTicketsPerWallet = 10; 95 | uint256 public maxTicketsPerDraw = 50; 96 | uint256 public chanceToWinSuperJackpot = 1000; 97 | uint256 public ticketPrice = 500; 98 | uint256 public minBuy = 0.02 ether; 99 | uint256 public maxBuy = 1 ether; 100 | 101 | bool public burnJackpotIsOpen = true; 102 | bool public maintenanceMode; 103 | 104 | address[] public players; 105 | address[] public stillGetMoney; 106 | uint256[] public howMuch; 107 | mapping (uint256 => uint256) public whichLottery; 108 | mapping (uint256 => uint256) public birbAtNonce; 109 | mapping (uint256 => address) public playerAtNonce; 110 | mapping (uint256 => bool) public nonceProcessed; 111 | 112 | uint256 private nonce; 113 | uint256 private decimals; 114 | uint256 public burnJackpot; 115 | uint256 public superJackpot; 116 | uint256 public birbToBurn; 117 | uint256 public totalTicketsSoldInThisLottery; 118 | 119 | event Winner(address winner, uint256 tokensWon, uint256 lotteryID); 120 | event WinnerToBePaid(address winner, uint256 tokensWon, uint256 _nonce, uint256 lotteryID); 121 | 122 | modifier onlyOwner() {if(msg.sender != CEO && msg.sender != CC) return; _;} 123 | modifier onlyVRF() {if(msg.sender != address(randomnessSupplier)) return; _;} 124 | 125 | constructor() { 126 | decimals = BIRB.decimals(); 127 | } 128 | 129 | receive() external payable {} 130 | 131 | function BetBirb() external payable { 132 | require(!maintenanceMode, "Lottery is currently suspended"); 133 | require(msg.value >= vrfCost, "Randomness has a price!"); 134 | IBEP20(BIRB).transferFrom(msg.sender, address(this), ticketPrice * (10**BIRB.decimals())); 135 | whichLottery[nonce] = 2; 136 | playerAtNonce[nonce] = msg.sender; 137 | randomnessSupplier.requestRandomness{value: vrfCost}(nonce, 1); 138 | nonce++; 139 | } 140 | 141 | function BuyBurn(uint256 tickets) external payable { 142 | require(!maintenanceMode, "Lottery is currently suspended"); 143 | require(burnJackpotIsOpen, "Jackpot is full, please wait"); 144 | require(msg.value >= vrfCost*6/5, "Randomness has a price"); 145 | require(tickets + getTicketsBought(msg.sender) <= maxTicketsPerWallet, "Trying to buy too many tickets"); 146 | 147 | if(totalTicketsSoldInThisLottery + tickets > maxTicketsPerDraw) tickets = maxTicketsPerDraw - totalTicketsSoldInThisLottery; 148 | totalTicketsSoldInThisLottery += tickets; 149 | 150 | uint256 tokensToSend = tickets * priceOfTicketBurnLottery * (10**decimals); 151 | 152 | BIRB.transferFrom(msg.sender, address(this), tokensToSend); 153 | burnJackpot += tokensToSend / 2; 154 | superJackpot += tokensToSend / 10; 155 | birbToBurn += tokensToSend * 4 / 10; 156 | for(uint256 i= 1; i<=tickets; i++) players.push(msg.sender); 157 | 158 | // getBonusTickets 159 | whichLottery[nonce] = 11; 160 | playerAtNonce[nonce] = msg.sender; 161 | randomnessSupplier.requestRandomness{value: vrfCost}(nonce, tickets); 162 | nonce++; 163 | 164 | // if the jackpot is full, draw a winner 165 | if(players.length >= maxTicketsPerDraw) drawBurnWinner(); 166 | } 167 | 168 | function betBnbToWinBirb() external payable { 169 | require(!maintenanceMode, "Lottery is currently suspended"); 170 | require(msg.value >= minBuy, "Minimum bet not reached"); 171 | require(msg.value <= maxBuy, "Maximum bet exceeded"); 172 | 173 | uint256 balanceNow = BIRB.balanceOf(address(this)); 174 | buyBirbWithBnb(msg.value - 0.002 ether); 175 | uint256 birbBought = BIRB.balanceOf(address(this)) - balanceNow; 176 | 177 | whichLottery[nonce] = 3; 178 | playerAtNonce[nonce] = msg.sender; 179 | birbAtNonce[nonce] = birbBought; 180 | randomnessSupplier.requestRandomness{value: vrfCost}(nonce, 1); 181 | nonce++; 182 | } 183 | 184 | function supplyRandomness(uint256 _nonce,uint256[] memory randomNumbers) external onlyVRF { 185 | uint256 lotteryId = whichLottery[_nonce]; 186 | if(lotteryId == 1) { 187 | if(nonceProcessed[_nonce]) return; 188 | address winnerAdd = players[(randomNumbers[0] % players.length)]; 189 | BIRB.transfer(winnerAdd, burnJackpot); 190 | BIRB.transfer(DEAD, birbToBurn); 191 | nonceProcessed[_nonce] = true; 192 | emit Winner(winnerAdd, burnJackpot, 1); 193 | birbToBurn = 0; 194 | burnJackpot = 0; 195 | burnJackpotIsOpen = true; 196 | delete players; 197 | totalTicketsSoldInThisLottery = 0; 198 | } 199 | 200 | if(lotteryId == 11){ 201 | if(nonceProcessed[_nonce]) return; 202 | nonceProcessed[_nonce] = true; 203 | for(uint256 i= 0; i < randomNumbers.length; i++) { 204 | if(randomNumbers[i] % chanceToWinSuperJackpot == 0) { 205 | address winner = playerAtNonce[_nonce]; 206 | IBEP20(BIRB).transfer(winner,superJackpot); 207 | emit Winner(winner, superJackpot, 11); 208 | superJackpot = 0; 209 | return; 210 | } 211 | } 212 | } 213 | 214 | if(lotteryId == 2) { 215 | if(nonceProcessed[_nonce]) return; 216 | uint256 rand = randomNumbers[0] % 10000; 217 | address winner = playerAtNonce[_nonce]; 218 | uint256 prizeMoney; 219 | 220 | if(rand == 0) prizeMoney = ticketPrice * 200 * 10**decimals; 221 | else if(rand <= 10) prizeMoney = ticketPrice * 100 * 10**decimals; 222 | else if(rand <= 210) prizeMoney = ticketPrice * 10 * 10**decimals; 223 | else if(rand <= 1110) prizeMoney = ticketPrice * 5 * 10**decimals; 224 | else if(rand <= 2110) prizeMoney = ticketPrice * 2 * 10**decimals; 225 | 226 | if(prizeMoney > 0) { 227 | if(prizeMoney>BIRB.balanceOf(address(this)) - (burnJackpot + birbToBurn + superJackpot)) { 228 | stillGetMoney.push(winner); 229 | howMuch.push(prizeMoney); 230 | emit WinnerToBePaid(winner, prizeMoney, _nonce, 2); 231 | maintenanceMode = true; 232 | nonceProcessed[_nonce] = true; 233 | return; 234 | } 235 | BIRB.transfer(winner,prizeMoney); 236 | nonceProcessed[_nonce] = true; 237 | emit Winner(winner, prizeMoney, 2); 238 | } 239 | return; 240 | } 241 | 242 | if(lotteryId == 3) { 243 | if(nonceProcessed[_nonce]) return; 244 | uint256 rand = randomNumbers[0] % 10000; 245 | uint256 birbBoughtAtNonce = birbAtNonce[_nonce]; 246 | address winner = playerAtNonce[_nonce]; 247 | uint256 prizeMoney; 248 | 249 | if(rand == 0) prizeMoney = birbBoughtAtNonce * 10; 250 | else if(rand <= 10) prizeMoney = birbBoughtAtNonce * 5; 251 | else if(rand <= 1510) prizeMoney = birbBoughtAtNonce * 2; 252 | else if(rand <= 6510) prizeMoney = birbBoughtAtNonce; 253 | else prizeMoney = birbBoughtAtNonce / 2; 254 | 255 | if(prizeMoney > 0) { 256 | if(prizeMoney>BIRB.balanceOf(address(this)) - (burnJackpot + birbToBurn + superJackpot)) { 257 | stillGetMoney.push(winner); 258 | howMuch.push(prizeMoney); 259 | emit WinnerToBePaid(winner, prizeMoney, _nonce, 3); 260 | maintenanceMode = true; 261 | nonceProcessed[_nonce] = true; 262 | return; 263 | } 264 | BIRB.transfer(winner,prizeMoney); 265 | nonceProcessed[_nonce] = true; 266 | emit Winner(winner, prizeMoney, 3); 267 | } 268 | return; 269 | } 270 | } 271 | 272 | function getTicketsBought(address player) public view returns (uint256) { 273 | uint256 ticketsOfPlayer; 274 | for(uint256 i= 0; i < players.length; i++) if(players[i] == player) ticketsOfPlayer++; 275 | return ticketsOfPlayer; 276 | } 277 | 278 | function buyBirbWithBnb(uint256 bnbToSpend) internal { 279 | address[] memory pathFromBNBToBIRB = new address[](2); 280 | pathFromBNBToBIRB[0] = router.WETH(); 281 | pathFromBNBToBIRB[1] = address(BIRB); 282 | 283 | router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbToSpend}( 284 | 0, 285 | pathFromBNBToBIRB, 286 | address(this), 287 | block.timestamp 288 | ); 289 | } 290 | 291 | function drawBurnWinner() internal { 292 | whichLottery[nonce] = 1; 293 | randomnessSupplier.requestRandomness{value: vrfCost}(nonce, 1); 294 | nonce++; 295 | burnJackpotIsOpen = false; 296 | } 297 | 298 | function rescueAnyToken(address token) external onlyOwner { 299 | IBEP20(token).transfer(msg.sender, IBEP20(token).balanceOf(address(this))); 300 | } 301 | 302 | function rescueBNB() external onlyOwner { 303 | payable(msg.sender).transfer(address(this).balance); 304 | } 305 | 306 | function activateMaintenanceMode() external onlyOwner{ 307 | maintenanceMode = true; 308 | } 309 | 310 | function deactivateMaintenanceMode() external onlyOwner{ 311 | if(stillGetMoney.length != 0){ 312 | for(uint256 i= 0; i V4 54 | * 55 | * Written by: MrGreenCrypto 56 | * Co-Founder of CodeCraftrs.com 57 | * 58 | * SPDX-License-Identifier: None 59 | */ 60 | 61 | pragma solidity 0.8.17; 62 | 63 | interface IBEP20 { 64 | function balanceOf(address account) external view returns (uint256); 65 | function transfer(address recipient, uint256 amount) external returns (bool); 66 | function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); 67 | } 68 | 69 | contract BirbV3ToV4Migration { 70 | address public constant CEO = 0x6AE2C08E6A91BEc45f6F64E96d8157F6B5DE3536; 71 | address public constant OWNER = 0x43CC8a482957B617E7536C7d1816e61901B8d481; 72 | address public constant TOKEN_IN = 0x88888888Fc33e4ECba8958c0c2AD361089E19885; 73 | address public constant TOKEN_OUT = 0xb67B8118c7B0A0b4101F65F4F8c24d1fE08c8bC4; 74 | 75 | uint256 public totalDeposits; 76 | bool public newTokenAvailable = false; 77 | 78 | mapping (address => uint256) public deposits; 79 | 80 | event Deposit(address indexed depositer, uint256 quantity); 81 | event Redeem(address indexed redeemer, uint256 quantity); 82 | event MigrationOpened(); 83 | event TokenRecovered(address tokenRecovered); 84 | 85 | modifier onlyOwner(){ 86 | require (msg.sender == OWNER, "Only the OWNER can do that"); 87 | _; 88 | } 89 | 90 | constructor() {} 91 | 92 | function sendTokens(address sender, address receiver, uint256 amount) internal returns(bool) { 93 | return IBEP20(TOKEN_IN).transferFrom(sender, receiver, amount); 94 | } 95 | 96 | function deposit() external { 97 | uint256 amount = IBEP20(TOKEN_IN).balanceOf(msg.sender); 98 | totalDeposits += amount; 99 | deposits[msg.sender] += amount; 100 | emit Deposit(msg.sender, amount); 101 | require(sendTokens(msg.sender, address(this), amount), "Token transfer failed"); 102 | } 103 | 104 | function redeem() external { 105 | require(newTokenAvailable, "Wait for migration to open"); 106 | uint256 amount = deposits[msg.sender]; 107 | if(amount == 0) return; 108 | totalDeposits -= amount; 109 | deposits[msg.sender] = 0; 110 | emit Redeem(msg.sender, amount); 111 | require(IBEP20(TOKEN_OUT).transfer(msg.sender, amount), "Token transfer failed"); 112 | } 113 | 114 | function openMigration() external onlyOwner { 115 | newTokenAvailable = true; 116 | emit MigrationOpened(); 117 | } 118 | 119 | function emergencyRecoverToken(address t) external onlyOwner { 120 | IBEP20 tok = IBEP20(t); 121 | tok.transfer(CEO, tok.balanceOf(address(this))); 122 | emit TokenRecovered(t); 123 | } 124 | 125 | function recoverTokenIn() external onlyOwner { 126 | IBEP20 tok = IBEP20(TOKEN_IN); 127 | tok.transfer(CEO, tok.balanceOf(address(this))); 128 | emit TokenRecovered(TOKEN_IN); 129 | } 130 | 131 | function emergencyRecoverTokenOut() external onlyOwner { 132 | IBEP20 tok = IBEP20(TOKEN_OUT); 133 | tok.transfer(CEO, tok.balanceOf(address(this))); 134 | emit TokenRecovered(TOKEN_OUT); 135 | } 136 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BirbContracts -------------------------------------------------------------------------------- /V1+V3->V4Migration.sol: -------------------------------------------------------------------------------- 1 | /* 2 | * MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWXKkdlc;,... ...,;cldOKNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM 3 | * MMMMMMMMMMMMMMMMMMMMMMMMMMMWX0xl;.. ..;lx0NWMMMMMMMMMMMMMMMMMMMMMMMMMMM 4 | * MMMMMMMMMMMMMMMMMMMMMMMMNOd:. .':d0NMMMMMMMMMMMMMMMMMMMMMMMM 5 | * MMMMMMMMMMMMMMMMMMMMWXkc' .'lkXWMMMMMMMMMMMMMMMMMMMM 6 | * MMMMMMMMMMMMMMMMMMNOc. 'lONMMMMMMMMMMMMMMMMMM 7 | * MMMMMMMMMMMMMMMWKd, ,dXWMMMMMMMMMMMMMMM 8 | * MMMMMMMMMMMMMW0l. ........... .oKWMMMMMMMMMMMMM 9 | * MMMMMMMMMMMWKl. .';:codxxkkOOOOOkkkxdolc;,.. .lKMMMMMMMMMMMM 10 | * MMMMMMMMMMXo. .':ldO00000OOkkkkkkkkkkkkkOOO00Oxoc,. .dNMMMMMMMMMM 11 | * MMMMMMMMWO, .;lxO000OkkxxddddddddooooooddodddxxkkOOko;. ;OWMMMMMMMM 12 | * MMMMMMMXo. .ck0K00OkxddoodddoooddddddddodoodddooddddxkOxl. .oNMMMMMMM 13 | * MMMMMMK: .lO0K0Okddddodooddddodddddoddooddddddddddoooodxkxc. :KMMMMMM 14 | * MMMMWO, .:k000OxdddddodoooddddddoddxxxkOO0000000000OOkkxdddxo, ;0MMMMM 15 | * MMMWO' .o0K00kdddddoddool:;;;;:ok0KXXXNNNNNNNNNNNNNNNNXXK0Oxxd;. ,0MMMM 16 | * MMM0' .d0K0Oxdodo::llc;.. .;xKNNNNNNNNNNNNNNNNNNNNNNNNXKOx: ,0MMM 17 | * MMK; .o000Odddooo:'.. .;;. :0NNNNNNNNNNNNNNNXXXKKKXXNNNXk; :XMM 18 | * MNl c0K0Ododooooool' ;KK: c0XNNNNNNNNNKkoc;,'...',:cdOKk' lNM 19 | * Wx. ,kK0Oxoododooodl' .. ,x0NNNNNNXOc' ..,;:::;,.. .'c, .kM 20 | * X; .l000xddooddodddo; ...c0XNNNNN0l. .lk0KKKKKXK0ko;. :X 21 | * x. 'xK0Ododddooddoodo;. ..',..:0NNNNNN0; 'd000000000KKKXKkc. .k 22 | * c :OK0xdodddooododdx0k:......'':xKNNNNNNK: .;dO0000000000000KXKd. l 23 | * ' .l00OdddddoododdodOXNXKkdoodk0XNNNNNNNXo. 'dO00000000000000000KKo. , 24 | * . .xK0kdddddoodddoox0NNNNNNNNNNNNNNNNNNNK; ,k00000000000000000000O: . 25 | * ;OK0xddddddooddodkXNNNNNNNNNNNNNNNNNNNk. .lkOOOOOOOkkkkkkkOOOO00o. . 26 | * c0KOxdddoddodddodOXNNNNNNNNNNNNNNNNNNNx. .,:ccc::::::::::cloxkOd. . 27 | * .dK0Ododdoodooddox0NNNNNNNNNNNNNNNNNNNNx. .:;'..................'::. . 28 | * . :OK0kdddddddddddoxKNNNNNNNNNNNNNNNNNNNNO' .lxdooooooodddddoddl' . 29 | * . .d00OxddoddoodddodOXNNNNNNNNNNNNNNNNNNNNK: ;ddddddddddddddxkOk; . ' 30 | * ; c000kdddooddodddod0NNNNNNNNNNNNNNNNNNNNNNx. .lddxxddxddddddxkOl. '; : 31 | * d. .cOK0kdoooddoododddkKNNNNNNNNNNNNNNNNNNNNNNXo. .cdddddddddddxkOo. .d: .x 32 | * 0' 'oO0OkdooddodoodododOXNNNNNNNNNNNNNNNNNNNNNNNXd. .;ldddddddxxxd:. 'x0; ,K 33 | * Wo .lO00Oxdool:clooddoooxKNNNNNNNNNNNNNNNNNNNNNNNNNXOc. ..;:clllc:,. .cONO' .dW 34 | * MK; .:k00Oxdddoooc,';coddddOXNNNNNNNNNNNNNNNNNNNNNNNNNNNXOo;.. ..;oOXNNx. :XM 35 | * MWk. ,d00Okddodooddol:'.,lodkXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXKOxdoooxkKXNNNNXl 'OMM 36 | * MMWx,cO0Okdoodddooddoolc,..:xKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNK: .xWMM 37 | * MMMWX00kxdddoddooddddolcc;..lXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0' .dWMMM 38 | * MMMMWXkddddoodddoodddoolcc;..dXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNk. .xWMMMM 39 | * MMMMMWKxddddoddoodddooolccc' 'kNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNo. 'kWMMMMM 40 | * MMMMMMWXkddodddddoddddolccc:. cKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNK: ;0WMMMMMM 41 | * MMMMMMMMN0xddodddodddolccccc' .kNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNk. .oXMMMMMMMM 42 | * MMMMMMMMMWXOddoddddddolccccc;. lXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXl ;OWMMMMMMMMM 43 | * MMMMMMMMMMMWKkddddoddolccccl;. ;0XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNk. 'xNMMMMMMMMMMM 44 | * MMMMMMMMMMMMMNKkddodolcccccc;. ;O0KXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0: 'dXMMMMMMMMMMMMM 45 | * MMMMMMMMMMMMMMMNKOxollcccccc, cO000KXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXKl. .;xXMMMMMMMMMMMMMMM 46 | * MMMMMMMMMMMMMMMMMWXOdlcccccc. .d000000KXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXK0o. 'lONMMMMMMMMMMMMMMMMM 47 | * MMMMMMMMMMMMMMMMMMMMNKkdllc, cO000000000KXXNNNNNNNNNNNNNNNNNNNNNNNXXKK00o. .ckXWMMMMMMMMMMMMMMMMMMM 48 | * MMMMMMMMMMMMMMMMMMMMMMWNKOo'.:k00000000000000KKXXXXXXNNNNNNNXXXXXKK00000kooOXWMMMMMMMMMMMMMMMMMMMMMM 49 | * MMMMMMMMMMMMMMMMMMMMMMMMMMWK0KXK0000000000000000000000KKKKK000000000KXXNNWMMMMMMMMMMMMMMMMMMMMMMMMMM 50 | * MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWNNXXKK0000000000000000000000KKXXNNWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM 51 | * MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWNNXXKKKKKKKKKKKKKKXXNNWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM 52 | * 53 | * BIRB 2.0 - MigrationPortal V1/V3 -> V4 54 | * 55 | * Written by: MrGreenCrypto 56 | * Co-Founder of CodeCraftrs.com 57 | * 58 | * SPDX-License-Identifier: None 59 | */ 60 | 61 | pragma solidity 0.8.17; 62 | 63 | interface IBEP20 { 64 | function balanceOf(address account) external view returns (uint256); 65 | function transfer(address recipient, uint256 amount) external returns (bool); 66 | function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); 67 | } 68 | 69 | contract BirbV1V3ToV4Migration { 70 | address public constant CEO = 0x6AE2C08E6A91BEc45f6F64E96d8157F6B5DE3536; 71 | address public constant OWNER = 0x43CC8a482957B617E7536C7d1816e61901B8d481; 72 | address public constant TOKEN_IN = 0x88888888Fc33e4ECba8958c0c2AD361089E19885; 73 | address public constant TOKEN_INV1 = 0x82A479264B36104be4FDb91618a59A4fC0F50650; 74 | address public constant TOKEN_OUT = 0x2e8799f0A26d8A9f37a0b4747Fa534f039C2d234; 75 | 76 | uint256 public totalDeposits; 77 | bool public newTokenAvailable = false; 78 | 79 | mapping (address => uint256) public deposits; 80 | mapping (address => uint256) public depositsV1; 81 | mapping (address => uint256) public depositsV3; 82 | 83 | event Deposit(address indexed depositer, uint256 quantity); 84 | event DepositV1(address indexed depositer, uint256 quantity); 85 | event Redeem(address indexed redeemer, uint256 quantity); 86 | event MigrationOpened(); 87 | event TokenRecovered(address tokenRecovered); 88 | 89 | modifier onlyOwner(){ 90 | require (msg.sender == OWNER, "Only the OWNER can do that"); 91 | _; 92 | } 93 | 94 | constructor() {} 95 | 96 | function sendTokens(address token, address sender, address receiver, uint256 amount) internal returns(bool) { 97 | return IBEP20(token).transferFrom(sender, receiver, amount); 98 | } 99 | 100 | function deposit() external { 101 | uint256 amount = IBEP20(TOKEN_IN).balanceOf(msg.sender); 102 | totalDeposits += amount; 103 | deposits[msg.sender] += amount; 104 | depositsV3[msg.sender] += amount; 105 | emit Deposit(msg.sender, amount); 106 | require(sendTokens(TOKEN_IN, msg.sender, address(this), amount), "Token transfer failed"); 107 | } 108 | 109 | function depositV1() external { 110 | uint256 amount = IBEP20(TOKEN_INV1).balanceOf(msg.sender); 111 | totalDeposits += amount; 112 | deposits[msg.sender] += amount; 113 | depositsV1[msg.sender] += amount; 114 | emit DepositV1(msg.sender, amount); 115 | require(sendTokens(TOKEN_INV1, msg.sender, address(this), amount), "Token transfer failed"); 116 | } 117 | 118 | function redeem() external { 119 | require(newTokenAvailable, "Wait for migration to open"); 120 | uint256 amount = deposits[msg.sender]; 121 | if(amount == 0) return; 122 | totalDeposits -= amount; 123 | deposits[msg.sender] = 0; 124 | emit Redeem(msg.sender, amount); 125 | require(IBEP20(TOKEN_OUT).transfer(msg.sender, amount), "Token transfer failed"); 126 | } 127 | 128 | function openMigration() external onlyOwner { 129 | newTokenAvailable = true; 130 | emit MigrationOpened(); 131 | } 132 | 133 | function emergencyRecoverToken(address t) external onlyOwner { 134 | IBEP20 tok = IBEP20(t); 135 | tok.transfer(CEO, tok.balanceOf(address(this))); 136 | emit TokenRecovered(t); 137 | } 138 | 139 | function recoverTokenIn() external onlyOwner { 140 | IBEP20 tok = IBEP20(TOKEN_IN); 141 | tok.transfer(CEO, tok.balanceOf(address(this))); 142 | emit TokenRecovered(TOKEN_IN); 143 | } 144 | 145 | function emergencyRecoverTokenOut() external onlyOwner { 146 | IBEP20 tok = IBEP20(TOKEN_OUT); 147 | tok.transfer(CEO, tok.balanceOf(address(this))); 148 | emit TokenRecovered(TOKEN_OUT); 149 | } 150 | } 151 | --------------------------------------------------------------------------------