Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/nft tribute minion #124

Open
wants to merge 2 commits into
base: feat/baalZodiac
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
NFTTributeMinion contract
  • Loading branch information
yellowBirdy committed Nov 14, 2024
commit c1b813aa1121819093d3a3ed5b720ef987430871
176 changes: 176 additions & 0 deletions contracts/tools/NFTTributeMinion.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.7;
import "../Baal.sol";

interface ERC20 {
function transferFrom(
address from,
address to,
uint256 tokenId
) external returns (bool);
}

contract NFTTributeMinion {
event TributeProposal(
address indexed baal,
address token,
uint256 tokenId,
address recipient,
uint256 proposalId
);
struct Escrow {
address token;
address applicant;
uint256 tokenId;
bool released;
address safe;
}
mapping(address => mapping(uint256 => Escrow)) public escrows;

event EscrowReleased(
address indexed baal,
uint32 proposalId,
address applicant,
address safe,
uint256 tokenId
);

function encodeTributeProposal(
address baal,
uint256 shares,
uint256 loot,
address recipient,
uint32 proposalId,
address escrow
) public pure returns (bytes memory) {
// Workaround for solidity dynamic memory array
address[] memory _recipients = new address[](1);
_recipients[0] = recipient;

bytes memory _releaseEscrow = abi.encodeWithSignature(
"releaseEscrow(address,uint32)",
baal,
proposalId
);

bytes memory tributeMultisend = abi.encodePacked(
uint8(0),
escrow,
uint256(0),
uint256(_releaseEscrow.length),
bytes(_releaseEscrow)
);

if (shares > 0) {
// Workaround for solidity dynamic memory array
uint256[] memory _shares = new uint256[](1);
_shares[0] = shares;

bytes memory _issueShares = abi.encodeWithSignature(
"mintShares(address[],uint256[])",
_recipients,
_shares
);

tributeMultisend = abi.encodePacked(
tributeMultisend,
uint8(0),
baal,
uint256(0),
uint256(_issueShares.length),
bytes(_issueShares)
);
}
if (loot > 0) {
// Workaround for solidity dynamic memory array
uint256[] memory _loot = new uint256[](1);
_loot[0] = loot;

bytes memory _issueLoot = abi.encodeWithSignature(
"mintLoot(address[],uint256[])",
_recipients,
_loot
);

tributeMultisend = abi.encodePacked(
tributeMultisend,
uint8(0),
address(baal),
uint256(0),
uint256(_issueLoot.length),
bytes(_issueLoot)
);
}

bytes memory _multisendAction = abi.encodeWithSignature(
"multiSend(bytes)",
tributeMultisend
);
return _multisendAction;
}

function submitTributeProposal(
Baal baal,
address token,
uint256 tokenId,
uint256 shares,
uint256 loot,
uint32 expiration,
uint256 baalgas,
string memory details
) external payable {
uint32 proposalId = baal.proposalCount() + 1;

bytes memory encodedProposal = encodeTributeProposal(
address(baal),
shares,
loot,
msg.sender,
proposalId,
address(this)
);

escrows[address(baal)][proposalId] = Escrow(
token,
msg.sender,
tokenId,
false,
baal.target()
);

baal.submitProposal{value:msg.value}(encodedProposal, expiration, baalgas, details);

emit TributeProposal(
address(baal),
token,
tokenId,
msg.sender,
proposalId
);
}

function releaseEscrow(address _baal, uint32 _proposalId) external {
Baal baal = Baal(_baal);
Escrow storage escrow = escrows[address(baal)][_proposalId];
require(!escrow.released, "Already released");

bool[4] memory status = baal.getProposalStatus(_proposalId);
require(status[2], "Not passed");
escrow.released = true;

IERC721 token = IERC721(escrow.token);

emit EscrowReleased(
_baal,
_proposalId,
escrow.applicant,
escrow.safe,
escrow.tokenId
);

require(
token.transferFrom(escrow.applicant, escrow.safe, escrow.tokenId),
"Transfer failed"
);
}
}