// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "https://github.com/ProjectOpenSea/seaport/blob/main/contracts/interfaces/SeaportInterface.sol"; import "https://github.com/ProjectOpenSea/seaport/blob/main/contracts/lib/ConsiderationEnums.sol"; contract Vault { address public creator; // Person who created the group chat. string public name; // Group chat name. mapping(address => address) public members; // Key: member wallet address, value: member wallet address (just needed a unique arbitrary value). mapping(address => address) public ownedAssets; // Key: nft address, value: nft address (just needed a unique arbitrary value). mapping(address => uint256) public amountRaisedForAsset; // Key: nft address, value: amount of Eth raised for that asset. mapping(address => mapping(address => uint256)) public individualEscrowedAmounts; // Key: nft address, value: mapping of user address to amount of Eth they have escrowed to that pending asset. mapping(address => mapping(address => uint256)) public individualContributionAmounts; // Key: nft address, value: mapping of user address to amount of Eth they have contributed to that bought asset. event PaymentReceived(uint256 amount); // Log payment received event. constructor(string memory chatName, address[] memory chatMembers) { creator = msg.sender; name = chatName; for (uint8 i = 0; i < chatMembers.length; i++) { members[chatMembers[i]] = chatMembers[i]; } } function receiveMoney(address assetAddress) public payable { require(members[msg.sender] == msg.sender, "You cannot send money to this vault since you are not a member of this group chat."); // Must be a member of the group. require(msg.value > 0, "Cannot contribute 0 wei."); // Can't send 0 wei. require(members[assetAddress] == address(0), "Not a valid asset address to contribute to."); // Verify the contribution address is not a user's wallet address. require(ownedAssets[assetAddress] == address(0), "Your group already owns this asset, cannot contribute more."); // Verify the contribution address is not an already owned asset. individualEscrowedAmounts[assetAddress][msg.sender] += msg.value; amountRaisedForAsset[assetAddress] += msg.value; } function updateContributionAmountsAfterNFTPurchased(address assetAddress) { ownedAssets[assetAddress] = assetAddress; // The mapping value is irrelevant, just need to place the key into the mapping and use a unique arbitrary address for the value. amountRaisedForAsset[assetAddress] = 0; for (uint8 i = 0; i < members.length; i++) { individualContributionAmounts[assetAddress][members[i]] = individualEscrowedAmounts[assetAddress][members[i]] individualEscrowedAmounts[assetAddress][members[i]] = 0; } } // function buyOpenSeaNFT(uint256 _tokenId) public { // require(ownedAssets[_tokenId] != ownedAssets[_tokenId], "NFT already owned by this group's vault"); // require(amountRaisedForAsset[_tokenId] >= _____price_of_NFT_on_OpenSea_____, "Your group's funds for this NFT have not reached 100% of the OpenSea asking price yet."); // // create BasicOrderParameters // BasicOrderParameters basicOrderParameters = // // call fulfillBasicOrder // } }
0.4.18