-1

I am working on a smart contract, and my goal is that when a certain (variable) amount of eth gets send to the contract, it gets split and payed to three adresses. I currently have this code. Am I missing something? It doesn't work in Remix unfortunately. Thanks in advance for your valuable time!

`pragma solidity ^0.6.0;

contract PaymentSplitter {
    address payable addressOne;
    address payable addressTwo;
    address payable addressThree;
    uint256 amount;

constructor(address payable _addressOne = 0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2, address payable _addressTwo = 0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db, address payable _addressThree = 0x78731D3Ca6b7E34aC0F824c42a7cC18A495cabaB) public {
    addressOne = _addressOne;
    addressTwo = _addressTwo;
    addressThree = _addressThree;
}

    function splitPayment(uint256 _amount) public {
        amount = _amount;
        addressOne.transfer(_amount / 3);
        addressTwo.transfer(_amount / 3);
        addressThree.transfer(_amount / 3);
    }

    function getSplitAmount() public view returns (uint256) {
        return amount;
    }

    // This will be invoked when the contract receives a payment
    function() external payable {
        splitPayment(msg.value);
    }
}`

We tried various smart contract, but without any significant results

BlockB
  • 1

2 Answers2

0

I modified your smart contract. I put some notes, to understand you some errors in your logic:

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

contract PaymentSplitter {
    address payable addressOne;
    address payable addressTwo;
    address payable addressThree;
    uint256 amount;

    constructor(address _addressOne, address _addressTwo, address _addressThree) public {
        addressOne = payable(_addressOne);
        addressTwo = payable(_addressTwo);
        addressThree = payable(_addressThree);
    }

    // NOTE: Avoid passing parameter with value because with this statement 'address(this).balance' I receive the entire amount of Ether stored in smart contract
    function splitPayment() public {
        // NOTE: I retrieve entire amount stored in smart contract balance after send value to it
        uint smartContractBalance = address(this).balance;
        // NOTE: Since smart contract balance should be divided into three equal part the amount, I make this operation one time and put the value inside 'amount' variable. Then
        //       I transfer the equal amount to three accounts.
        amount =  smartContractBalance / 3;
        addressOne.transfer(amount);
        addressTwo.transfer(amount);
        addressThree.transfer(amount);
    }

    function getSplitAmount() public view returns (uint256) {
        return amount;
    }

    // This will be invoked when the contract receives a payment
    receive() external payable {
        splitPayment();
    }
} 

NOTE: Consider to use address.call{value}() for send amount from smart contract to accounts.

Antonio Carito
  • 1,287
  • 1
  • 5
  • 10
0

Is this a better contract? A few changes, and different amounts have to be sent to different addresses.

pragma solidity ^0.8.17;

contract Blockbook{
    address payable public address1;
    address payable public address2;
    address payable public address3;

    constructor(address payable _address1, address payable _address2, address payable _address3) public {
        address1 = _address1;
        address2 = _address2;
        address3 = _address3;
    }

    function splitPayment(uint amount) public payable {
        address1.transfer(amount * 0.8);
        address2.transfer(amount * 0.1);
        address3.transfer(amount * 0.1);
    }

    receive() external payable {
        splitPayment(msg.value);
    }

    function updateAddresses(address payable _address1, address payable _address2, address payable _address3) public {
        address1 = _address1;
        address2 = _address2;
        address3 = _address3;
}
}
BlockB
  • 1