이 저장소는 이더리움 네이티브 토큰(ETH)과 ERC-20 토큰을 여러 계정에 효율적으로 전송하고, 다시 한 계정으로 수집하기 위한 스마트 컨트랙트와 스크립트를 제공합니다.
- 일괄 전송: 한 번의 트랜잭션으로 여러 주소에 이더나 토큰을 전송
- 토큰 승인: 여러 계정에서 특정 주소에 ERC-20 토큰 사용 권한 부여
- 토큰 수집: 여러 계정에서 하나의 주소로 토큰 모으기
- 네이티브 토큰(예: ETH) 수집: 여러 계정에서 하나의 주소로 네이티브 토큰 모으기
- 동기식/비동기식 처리: 일반 처리 또는 대규모 계정을 위한 고속 비동기 처리
eth-bulk-operations/
├── contracts/ # 스마트 컨트랙트 파일
│ └── BatchTransfer.sol
├── script/ # Foundry 배포 스크립트
│ └── DeployBatchTransfer.s.sol
├── scripts/ # 파이썬 스크립트
│ ├── token/ # ERC-20 관련 스크립트
│ │ ├── approve_sync.py
│ │ ├── approve_async.py
│ │ ├── gather_sync.py
│ │ └── gather_async.py
│ ├── native/ # 네이티브 토큰 관련 스크립트
│ │ └── batch_send.py
│ └── utils/ # 공통 유틸리티
│ └── common.py
└── examples/ # 예제 파일
├── accounts_example.json
└── .env.example
- Python 3.7+
- Foundry (컨트랙트 배포 시 필요)
curl -L https://foundry.paradigm.xyz | bash설치 스크립트를 실행한 후, 다음 명령어를 실행하여 Foundry를 시스템에 로드합니다:
source ~/.bashrc # bash 사용자
# 또는
source ~/.zshrc # zsh 사용자그런 다음 foundryup 명령어를 실행하여 Foundry 도구를 설치합니다:
foundryupcurl -L https://foundry.paradigm.xyz | bash설치 스크립트를 실행한 후, 다음 명령어를 실행하여 Foundry를 시스템에 로드합니다:
source ~/.bashrc그런 다음 foundryup 명령어를 실행하여 Foundry 도구를 설치합니다:
foundryupWindows에서는 공식 설치 가이드를 참고하십시오.
간단히 요약하면:
curl -L https://foundry.paradigm.xyz | bash- 그런 다음 foundryup 명령어를 실행하여 Foundry 도구를 설치합니다:
foundryup설치가 성공적으로 완료되었는지 확인하려면 다음 명령어를 실행하세요:
forge --version
cast --version
foundryup --help-
저장소 복제:
git clone https://github.com/yourusername/eth-bulk-operations.git cd eth-bulk-operations -
파이썬 패키지 설치:
pip install web3 python-dotenv
-
환경 설정:
cp examples/.env.example .env # .env 파일을 편집하여 필요한 정보를 입력하세요
이 컨트랙트는 한 번의 트랜잭션으로 여러 주소에 ETH나 ERC-20 토큰을 전송할 수 있게 해줍니다.
batchTransfer: 여러 주소로 ETH 일괄 전송batchTransferERC20: 여러 주소로 ERC-20 토큰 일괄 전송depositERC20: ERC-20 토큰을 컨트랙트에 입금withdrawERC20: ERC-20 토큰을 컨트랙트에서 인출withdraw: 컨트랙트에서 ETH 인출
-
Foundry 초기화(처음 사용시):
forge init --no-commit
-
의존성 설치:
forge install OpenZeppelin/openzeppelin-contracts
-
컨트랙트 배포:
# 로컬 테스트넷 forge script script/DeployBatchTransfer.s.sol --rpc-url http://localhost:8545 --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --broadcast # 실제 네트워크 forge script script/DeployBatchTransfer.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --verify
# scripts/native 디렉토리로 이동
cd scripts/native
# batch_send.py 실행
python batch_send.py# scripts/token 디렉토리로 이동
cd scripts/token
# 동기식 처리 (소량의 계정인 경우)
python approve_sync.py
# 비동기식 처리 (대량의 계정인 경우)
python approve_async.pyBatchTransfer 컨트랙트를 사용하여 여러 주소에 ERC-20 토큰을 한 번에 전송할 수 있습니다.
# scripts/native 디렉토리로 이동
cd scripts/native
# 컨트랙트의 batchTransferERC20 함수를 사용하기 위해 batch_send.py 실행
# 이 때 실행 전 스크립트 내부의 USE_ERC20 변수를 True로 설정하고
# TOKEN_CONTRACT_ADDRESS 변수를 사용할 토큰의 주소로 설정해야 합니다
python batch_send.py참고: ERC-20 토큰을 사용하기 전에, 토큰 컨트랙트에서 BatchTransfer 컨트랙트에 대해 approve를 먼저 실행해야 합니다.
# scripts/native 디렉토리로 이동
cd scripts/native
# 동기식 처리 (소량의 계정인 경우)
python gather_native_sync.py
# 비동기식 처리 (대량의 계정인 경우)
python gather_native_async.py# scripts/token 디렉토리로 이동
cd scripts/token
# 동기식 처리 (소량의 계정인 경우)
python gather_sync.py
# 비동기식 처리 (대량의 계정인 경우)
python gather_async.py각 스크립트는 실행하기 전에 다음과 같은 설정을 확인하고 필요에 맞게 수정해야 합니다:
.env파일에 RPC_URL 및 CHAIN_ID 설정- ERC-20 토큰의 컨트랙트 주소 수정
- 계정 정보가 담긴 JSON 파일 경로 지정
# 네이티브 토큰(ETH) 전송 설정
BATCH_SIZE = 100 # 한 번에 처리할 주소 개수
AMOUNT_PER_ADDRESS = 0.001 # 각 주소에 보낼 ETH 양
contract_address = '0x...' # 배포한 BatchTransfer 컨트랙트 주소
# ERC-20 토큰 전송 설정
USE_ERC20 = False # ERC-20 토큰 전송 시 True로 설정
TOKEN_CONTRACT_ADDRESS = '0x...' # 전송할 ERC-20 토큰 컨트랙트 주소
TOKEN_AMOUNT_PER_ADDRESS = 10 # 각 주소에 보낼 토큰 양 (토큰 단위)TOKEN_CONTRACT_ADDRESS = '0x...' # ERC-20 토큰 컨트랙트 주소
SPENDER_ADDRESS = '0x...' # approve 대상 주소 (일반적으로 BatchTransfer 주소)
APPROVE_AMOUNT = 150 # approve할 토큰 양 (ETH 단위)RECIPIENT_ADDRESS = '0x...' # ETH를 수집할 대상 주소
MIN_ETH_BALANCE = 0.001 # 전송을 위한 최소 ETH 잔액
RESERVE_GAS_ETH = 0.0005 # 가스비를 위해 남겨둘 ETH 금액
CONCURRENT_TASKS = 500 # 동시에 처리할 태스크 수 (비동기식 버전만)TOKEN_CONTRACT_ADDRESS = '0x...' # ERC-20 토큰 컨트랙트 주소
RECIPIENT_ADDRESS = '0x...' # 토큰을 모을 대상 주소
MIN_TOKEN_BALANCE = 0.001 # 전송 최소 토큰 잔액 (ETH 단위)계정 정보는 JSON 파일로 관리됩니다. 다음과 같은 형식으로 작성해야 합니다:
[
{
"address": "0x1234...",
"private_key": "0xabcd..."
},
...
]주의: 개인키는 매우 민감한 정보이므로 보안에 주의하세요. 테스트용 계정만 사용하는 것을 권장합니다.