diff --git a/src/Mailbomb.sol b/src/Mailbomb.sol index 4b96e22..e2c4f71 100644 --- a/src/Mailbomb.sol +++ b/src/Mailbomb.sol @@ -58,13 +58,13 @@ contract Mailbomb is ERC1155, Owned { // ========================================================================= /// Mint tokens from main contract - function mint(address _to, uint256 _amount) external payable onlyMain { + function create(address _to, uint256 _amount) external payable onlyMain { bombsAssembled += _amount; super._mint(_to, 1, _amount, ""); } /// Burn spent tokens from main contract - function burn(address _from, uint256 _amount) external onlyMain { + function explode(address _from, uint256 _amount) external onlyMain { super._burn(_from, 1, _amount); } diff --git a/src/Unaboomer.sol b/src/Unaboomer.sol index 25c564e..b29f89b 100644 --- a/src/Unaboomer.sol +++ b/src/Unaboomer.sol @@ -69,7 +69,7 @@ contract Unaboomer is ERC721, Owned { // ========================================================================= /// Mint tokens from main contract - function mint(address _to, uint256 _amount) external payable onlyMain { + function radicalize(address _to, uint256 _amount) external payable onlyMain { require(minted + _amount <= MAX_SUPPLY, "supply reached"); unchecked { for (uint256 i; i < _amount; i++) { diff --git a/src/UnaboomerCommon.sol b/src/UnaboomerCommon.sol index fae372f..ad40595 100644 --- a/src/UnaboomerCommon.sol +++ b/src/UnaboomerCommon.sol @@ -72,31 +72,36 @@ contract UnaboomerCommon is Owned { /// Radicalize a boomer to become a Unaboomer - start with 2 bombs function radicalizeBoomers(uint256 _amount) external payable missionNotCompleted { require(msg.value >= _amount * boomerPrice, "not enough ether"); - unaboomer.mint(msg.sender, _amount); - mailbomb.mint(msg.sender, _amount * 2); + unaboomer.radicalize(msg.sender, _amount); + mailbomb.create(msg.sender, _amount * 2); } /// Assemble additional mailbombs to kill targets function assembleBombs(uint256 _amount) external payable missionNotCompleted { require(msg.value >= _amount * bombPrice, "not enough ether"); - mailbomb.mint(msg.sender, _amount); + mailbomb.create(msg.sender, _amount); } /// Send N bombs to pseudo-random Unaboomer tokenIds to kill them. /// If the Unaboomer is already dead, the bomb is considered a dud. /// @dev Pick a pseudo-random tokenID from Unaboomer contract and toggle a mapping value /// @dev The likelihood of killing a boomer decreases as time goes on - i.e. more duds - function sendBombs(uint256 _amount) external missionNotCompleted returns (bool[] memory results) { + function sendBombs(uint256 _amount) external missionNotCompleted returns ( + bool[] memory results, + uint256[] memory tokensKilled + ) { require(_amount <= mailbomb.balanceOf(msg.sender, 1), "not enough bombs"); bool[] memory res = new bool[](_amount); - uint256 boomerSupply = unaboomer.totalSupply(); + uint256[] memory killed = new uint256[](_amount); for (uint256 i; i < _amount; i++) { + uint256 boomerSupply = unaboomer.totalSupply(); uint256 randomBoomer = uint256(keccak256(abi.encodePacked(i, block.timestamp, msg.sender))) % boomerSupply; bool dud = unaboomer.tokenDead(randomBoomer); unaboomer.kill(randomBoomer); res[i] = dud; + killed[i] = randomBoomer; } - mailbomb.burn(msg.sender, _amount); - return res; + mailbomb.explode(msg.sender, _amount); + return (res, killed); } } \ No newline at end of file diff --git a/test/Unaboomer.t.sol b/test/Unaboomer.t.sol index 86b9b27..eb32de8 100644 --- a/test/Unaboomer.t.sol +++ b/test/Unaboomer.t.sol @@ -22,103 +22,36 @@ contract UnaboomerTest is Test { } function testBasicMechanics() public { - address t = address(3); - address t2 = address(4); - startHoax(t); + address t1 = address(1); + address t2 = address(2); // mint 20 boomers - should have 20 BOOMR and 40 BOMB + hoax(t1); main.radicalizeBoomers{value: .2 ether}(20); assertEq(boomr.totalSupply(), 20); + assertEq(boomr.balanceOf(t1), 20); assertEq(bomb.bombsAssembled(), 40); - assertEq(bomb.balanceOf(t, 1), 40); + assertEq(bomb.balanceOf(t1, 1), 40); // mint 20 more bombs - should have 60 BOMB + hoax(t1); main.assembleBombs{value: .2 ether}(20); assertEq(bomb.bombsAssembled(), 60); - assertEq(bomb.balanceOf(t, 1), 60); - stopHoax(); - vm.prank(t2); - main.assembleBombs{value: .2 ether}(20); - assertEq(bomb.bombsAssembled(), 80); - assertEq(bomb.balanceOf(t2, 1), 20); - + assertEq(bomb.balanceOf(t1, 1), 60); + // mint 20 more boomers as other address - supplies should line up + hoax(t2); + main.radicalizeBoomers{value: .2 ether}(20); + assertEq(boomr.totalSupply(), 40); + assertEq(boomr.balanceOf(t2), 20); + assertEq(bomb.bombsAssembled(), 100); + assertEq(bomb.balanceOf(t2, 1), 40); + // sending bombs should change supplies + hoax(t1); + (bool[] memory res, uint256[] memory killed) = main.sendBombs(60); + for (uint256 i; i < res.length; i++) { + console.log(res[i]); + console.log(killed[i]); + } } - // function testWithdraws() public { - // vm.deal(address(main), 10 ether); - // vm.prank(address(main.owner())); - // main.withdraw(); - // } - - // function testMint() public { - // hoax(address(1)); - // main.radicalizeBoomers{value: 0.05 ether}(5); - // assertEq(boomr.totalSupply(), 5); - // assertEq(boomr.tokenDead(1), false); - // } - - // src/Mailbomb.sol: function withdraw() external onlyOwner { - // src/Mailbomb.sol: function setBaseURI(string calldata _baseURI) external onlyOwner { - // src/Mailbomb.sol: /// Set main contract address for executing functions - // src/Mailbomb.sol: function setMainContract(address _address) external onlyOwner { - // src/Mailbomb.sol: function mint(address _to, uint256 _amount) external payable { - // src/Mailbomb.sol: function burn(uint256 tokenId) external { - // src/Mailbomb.sol: function totalSupply() public view returns (uint256 supply) { - // src/Mailbomb.sol: function tokenURI(uint256 _tokenId) public view override returns (string memory) { - // src/Mailbomb.sol: function supportsInterface(bytes4 interfaceId) public view virtual override (ERC721) returns (bool) { - // src/UnaboomerCommon.sol: function withdraw() external onlyOwner { - // src/UnaboomerCommon.sol: function setBombPrice(uint256 _price) external onlyOwner { - // src/UnaboomerCommon.sol: function setBoomerPrice(uint256 _price) external onlyOwner { - // src/UnaboomerCommon.sol: function setUnaboomerContract(address _address) external onlyOwner { - // src/UnaboomerCommon.sol: function setMailbombContract(address _address) external onlyOwner { - // src/UnaboomerCommon.sol: function radicalizeBoomers(uint256 _amount) external payable missionNotCompleted { - // src/UnaboomerCommon.sol: function assembleBombs(uint256 _amount) external payable missionNotCompleted { - // src/UnaboomerCommon.sol: function sendBombs(uint256[] calldata tokenIds) external missionNotCompleted returns (bool[] memory results) { - // function testX() public {} - - // ========================================================================= - // Unaboomer - // ========================================================================= - - // function testWithdrawUnaboomer() public {} - // function testUnaboomerSetters() public { - // string memory aliveURI = 'ipfs://xxxx/'; - // string memory deadURI = 'ipfs://yyyy/'; - // boomr.setAliveURI(aliveURI); - // boomr.setDeadURI(deadURI); - // assertEq(boomr.aliveURI(), aliveURI); - // assertEq(boomr.deadURI(), deadURI); - // } - // function testUnaboomerMainMint() public { - // startHoax(address(3)); - // main.radicalizeBoomers{value: .1 ether}(10); - // assertEq(boomr.totalSupply(), 10); - // assertEq(bomb.totalSupply(), 20); - // } - // function testUnaboomerMainKill() public { - // startHoax(address(3)); - // main.radicalizeBoomers{value: .01 ether}(1); - // uint256[] memory bombs = new uint256[](2); - // bombs[0] = 1; - // bombs[1] = 2; - // main.sendBombs(bombs); - // vm.expectRevert(bytes("not enough bombs")); - // main.sendBombs(bombs); - // main.radicalizeBoomers{value: .01 ether}(1); - // main.sendBombs(bombs); - - // } - // function testUnaboomerSupply() public {} - // function testUnaboomerTokenURIs() public {} - // function testUnaboomerDirectMint() public { - // startHoax(address(5)); - // vm.expectRevert(bytes("invalid minter")); - // boomr.mint(address(5), 2); - // } - // function testUnaboomerDirectKill() public { - // startHoax(address(5)); - // main.radicalizeBoomers{value: .05 ether}(5); - // vm.expectRevert(bytes("invalid minter")); - // boomr.kill(1); - // } }