# DApp project
## Topic
* 복권 서비스(몰아주기) + 기능 추가(스테이킹)
## 모임 시간
- 10월 26일 오후 8시
## 2022-10-26

- 기능 정의
- 참여하기
- Smart Contract 에 참가비 전송
- 취소하기
- 참가 취소
- 당첨 Rule ( 아래 중 1 택, 나머지 기능 추가, 룰은 변경 가능)
- 당첨 시간 (30분, 1시간, 1일?)
- 승자 독식
- ~~1, 2, 3순위, 랜덤~~
- 소액 투자, 무손실, 이자 공유
- 동일한 금액 참여 ~~vs 다른 금액 참여(가중평균)~~
- 참가 마감
- 마이닝
- 참여된 금액으로 마이닝
- 추가 채굴된 이더를 확인(모집금액, 이자 구분)
- 홈화면
- 로그인(지갑)
- ~~회원가입(?)~~
- 모집금액 조회
- 참여하기(금액 전송)
- 전 회차 금액, 이자
- 당첨자 주소
- flow
- 홈 - 모집금액 조회(회차정보, 이전회차 모집금액, 당첨주소)
- 참여하기 - withdraw
- 결과 조회 - 금액 / 주소
- Daemon?
- 실시간 조회성 서비스? 30초 간격?
- 수익 구조, 사업성
- 운용 보수(수수료)
- 채굴된 이더를 적용? (전액 / 일부)
- 해올 것
- 승남
- 각 page 나누기
- react-router-dom
- login(지갑 연동)
- smart contract와 통신 방법(web3.js)
- ex ) [react-query](https://react-query-v3.tanstack.com/)
- [alchemy](https://docs.alchemy.com/recipes)
- 효근
- smart contract 기능별 구현
- Test CA address 생성
- 종승
- 결과 조회 화면 구현(승남 페이지 작업 후)
- Smart Contract 이용하여 금액 및 주소 조회
## 2022-10-25 tasks
- [x] ⭐️ 프로젝트 주제 정하기
- [x] ⭐️ 프로젝트명 & 팀명 정하기
- [x] ⭐️ 역할(?) 분배
- [x] (노승남) 프로젝트 boilerplate setting
- [x] convention 정하기
- [x] [github flow](https://www.gitkraken.com/learn/git/best-practices/git-branch-strategy#github-flow-branch-strategy)
- [x] (bonus) issue template, PR template, labels
## 역할
* 노승남 - 프론트엔드 초기 세팅, 예시 찾기
* 윤종승 - 기능
* 박효근 - 기능
* 공통 - 솔리디티 문법 등 학습
## 기능
* 핵심 기능
* 공모 기능
* 어떤 로직으로 랜덤하게 당첨자를 뽑을 건지
* 부가 기능
* 기존의 공모된 금액 마이닝 하게 되면 +가 됐을 텐데.. +된 금액을 어떻게 분배할 건지
* 1등이 1/3 2등이 1/x ...
## 내일까지
* 솔리디티 문법 등 학습
* 전반적인 플로우 고민
* [Github Flow](https://www.gitkraken.com/learn/git/best-practices/git-branch-strategy#github-flow-branch-strategy)
## Tech stack
* [Truffle + react box](https://trufflesuite.com/boxes/)
* Ganache
## Smart Contract - Lottery 기능
* 몇 명 모였는지 / 총 인원수
* Owner의 경우, 다음 라운드 인원수 변경 지원
* 게임참가자 수가 다 차면 게임을 자동으로 진행
* 얼마를 넣어야 하는지(균등)
* Owner의 경우, 다음 라운드 참가비 변경
* 배팅하기
* 히스토리 조회 기능(회차별)
* 중복 지원 가능
* 한계
* 마지막 참가자가 게임에 참가하는 경우 자동으로 게임 진행하게 됨으로 마지막 참가자에게 가스비가 추가 발생을 부담.
* 해당 문제를 해결하기 위해 마지막 게임 진행은 Owner가 진행하고 대신 참가비 일부를 운영비로 받을 수 있도록 구현이 필요.
## Smart Contract - Lottery 메소드 설명
* constructor()
* 첫 라운드 설정 - 게임 Fee와 참가 인원 수는 디폴트 값으로 설정됨
* Owner 권한 획득
* function getWinnerByLottery(uint lottery) public view returns (address payable)
* 파라미터로 조회 회차를 입력받아 해당 회차 우승자 주소값을 리턴
* 파라미터 및 리턴
* unit lottery: 조회 회차
* returns(address payable): 조회 회차 주소값
* function getIDByLottery(uint lottery) public view returns (string memory)
* 파라미터로 조회 회차를 입력받아 해당 회차 ID 값을 리턴
* 파라미터 및 리턴
* unit lottery: 조회 회차
* returns(address payable): 조회 회차 ID값
* function getAmountByLottery(uint lottery) public view returns (uint256)
* 파라미터로 조회 회차를 입력받아 해당 회차 우승 상금 값을 리턴
* 파라미터 및 리턴
* unit lottery: 조회 회차
* returns(address payable): 조회 회차 우승 상금 값
* function getNumberOfPlayersByLottery(uint lottery) public view returns (uint256)
* 파라미터로 조회 회차를 입력받아 해당 회차 플레이어 수를 리턴
* 파라미터 및 리턴
* unit lottery: 조회 회차
* returns(address payable): 조회 회차 플레이어 수
* function getBalance() public view returns (uint)
* 현재 누적된 상금을 리턴
* 리턴
* returns (uint): 누적된 상금 값
* function getPlayers() public view returns (address payable[] memory)
* 현재 참가중인 플레이어 주소값 배열을 리턴
* 리턴
* returns (address payable[] memory): 참가중인 플레이어 주소값 배열
* function getCurrentRound() public view returns (uint256)
* 현재 회차 값을 리턴
* 리턴
* returns (uint256): 현재 회차 값
* function getCurrentNumberOfPlayers() public view returns (uint32)
* 현재 참가 인원 수를 리턴
* 리턴
* returns (uint32): 현재 참가 인원 수
* function getMaxNumberOfPlayers() public view returns (uint32)
* 최대 참가 인원 수를 리턴
* 리턴
* returns (uint32): 최대 참가 인원 수
* function enter() public payable
* function enter(string memory id) public payable
* 참가비 내고 게임에 참가. 파라미터로 id를 사용되며, 사용하지 않는 경우 현재 주소 값을 id로 사용
* 참가 인원이 최대 참가 인원 수와 동일한 경우, 게임이 진행되고 승자에게 상금이 지불됨
* 파라미터
* string memory id: 참가자 id
* function setMaximumNumberOfPlayers(uint32 pNextRoundMaxNumOfPlayers) public onlyOwner
* 다음 라운드 최대 참가 인원을 변경. (단, 게임참가자가 없는 경우 해당 라운드에 변경됨.)
* Onwer만 변경 가능
* function setRoundFee(uint256 pNextRoundFee) public onlyOwner
* 다음 라운드 참가비를 변경. (단, 게임참가자가 없는 경우 해당 라운드에 변경됨.)
* Onwer만 변경 가능
## 동작 화면
1. 메인 화면

2. 참가하기 버튼 클릭

3. 닉네임 입력 후 베팅(트랜잭션 생성)

4. 회차별 정보 조회 기능
