Вот эти две сточки
uint _50 = address(this).balance/100*50; //50% of balance of contract
uint _25 = address(this).balance/100*25; //25% of balance of contract
будут выполняться во время работы конструктора. Т.е. если заранее на адрес контракта (до его создания) не отослать ничего - то address(this).balance будет равен 0. Эти переменные надо вычислять каждый раз, когда нужно переводить eth.
Также рекомендую сначала делать все умножение, а потом все деление: меньше проблем с округлением.
Чтобы контракт срабатывал автоматически, метод перевода средств должен быть в
receive() external payable{}
. И лучше не использовать balance, т.к. в него будут попадать прошлые остатки. В этом плане подойдет msg.value (если говорить об автоматическом переводе).
address payable addr1
и вторую переменную стоит сделать константой, если не планируется обновлять эти адреса в будущем. А если говорим о промышленном коде с тестированием, то неплохой вариант сделать их immutable и задавать в конструкторе.
Помимо этого необходим метод для вывода оставшихся 25% иначе застрянут на адресе контракта на совсем.
И наверное добавлю еще одну мелочь:
transfer
не самый идеальный способ переводить средства (если говорим о реальном контракте), из-за ограничения по газу на такой методу, рекомендую глянуть Address.sol (кажется метод sendValue) из библиотеки openzeppelin.