Untitled

mail@pastecode.io avatarunknown
c_cpp
2 months ago
2.6 kB
7
Indexable
Never
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

contract TradeFinance {
    struct Escrow {
        address alice; // Exporter
        address gamma; // Delivery company
        uint256 aliceAmount;
        uint256 gammaAmount;
        uint256 nftId; // For Stretch Flow
        bool nftTransferred; // For Stretch Flow
    }

    mapping(address => mapping(uint256 => Escrow)) public escrows; // Importer's address to escrow ID to Escrow

    mapping(uint256 => address) public nftOwners;
    uint256 public currentNFTId = 0;

    function lockEscrow(
        uint256 aliceAmount,
        uint256 gammaAmount,
        address aliceAddress,
        address gammaAddress
    ) external payable returns (uint256) {
        require(
            msg.value == aliceAmount + gammaAmount,
            "Incorrect amount sent."
        );

        Escrow memory newEscrow = Escrow({
            alice: aliceAddress,
            gamma: gammaAddress,
            aliceAmount: aliceAmount,
            gammaAmount: gammaAmount,
            nftId: currentNFTId,
            nftTransferred: false
        });

        uint256 escrowId = currentNFTId;
        escrows[msg.sender][escrowId] = newEscrow;

        nftOwners[newEscrow.nftId] = aliceAddress; // Mint the NFT to Alice

        currentNFTId += 1;
        return escrowId;
    }

    function transferNFTToGamma(uint256 escrowId) external {
        Escrow storage escrow = escrows[msg.sender][escrowId];
        require(escrow.alice != address(0), "Invalid escrow ID.");
        require(
            nftOwners[escrow.nftId] == escrow.alice,
            "NFT not in Alice's possession."
        );

        nftOwners[escrow.nftId] = escrow.gamma;
    }

    function releaseEscrow(uint256 escrowId) external {
        Escrow storage escrow = escrows[msg.sender][escrowId];

        require(escrow.alice != address(0), "Invalid escrow ID.");
        require(
            nftOwners[escrow.nftId] == escrow.gamma,
            "NFT must be with Gamma Delivery before release."
        );

        payable(escrow.alice).transfer(escrow.aliceAmount);
        payable(escrow.gamma).transfer(escrow.gammaAmount);

        nftOwners[escrow.nftId] = msg.sender; // Transfer NFT to Bob
        escrow.nftTransferred = true; // Indicate NFT was transferred. (can also be seen as delivered)

        // You may also want to delete the escrow once it's complete
        // to save storage and gas.
        delete escrows[msg.sender][escrowId];
    }

    function getNFTOwner(uint256 nftId) external view returns (address) {
        return nftOwners[nftId];
    }
}