Thanks to visit codestin.com
Credit goes to github.com

Skip to content

dnr00/eth-bulk-operations

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

2 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

ํ† ํฐ ๋‹ค์ค‘ ์ „์†ก ๋ฐ ์ˆ˜์ง‘ ๋„๊ตฌ

์ด ์ €์žฅ์†Œ๋Š” ์ด๋”๋ฆฌ์›€ ๋„ค์ดํ‹ฐ๋ธŒ ํ† ํฐ(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

์ค€๋น„ ์‚ฌํ•ญ

ํ•„์ˆ˜ ๋„๊ตฌ

  1. Python 3.7+
  2. Foundry (์ปจํŠธ๋ž™ํŠธ ๋ฐฐํฌ ์‹œ ํ•„์š”)

Foundry ์„ค์น˜

macOS ์‚ฌ์šฉ์ž

curl -L https://foundry.paradigm.xyz | bash

์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•œ ํ›„, ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Foundry๋ฅผ ์‹œ์Šคํ…œ์— ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค:

source ~/.bashrc  # bash ์‚ฌ์šฉ์ž
# ๋˜๋Š”
source ~/.zshrc   # zsh ์‚ฌ์šฉ์ž

๊ทธ๋Ÿฐ ๋‹ค์Œ foundryup ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Foundry ๋„๊ตฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค:

foundryup

Linux ์‚ฌ์šฉ์ž

curl -L https://foundry.paradigm.xyz | bash

์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•œ ํ›„, ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Foundry๋ฅผ ์‹œ์Šคํ…œ์— ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค:

source ~/.bashrc

๊ทธ๋Ÿฐ ๋‹ค์Œ foundryup ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Foundry ๋„๊ตฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค:

foundryup

Windows ์‚ฌ์šฉ์ž

Windows์—์„œ๋Š” ๊ณต์‹ ์„ค์น˜ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

๊ฐ„๋‹จํžˆ ์š”์•ฝํ•˜๋ฉด:

  1. Git Bash ๋˜๋Š” WSL ์„ค์น˜
  2. Git Bash ๋˜๋Š” WSL ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด ์‹คํ–‰:
curl -L https://foundry.paradigm.xyz | bash
  1. ๊ทธ๋Ÿฐ ๋‹ค์Œ foundryup ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Foundry ๋„๊ตฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค:
foundryup

์„ค์น˜ ํ™•์ธ

์„ค์น˜๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”:

forge --version
cast --version
foundryup --help

์„ค์น˜

  1. ์ €์žฅ์†Œ ๋ณต์ œ:

    git clone https://github.com/yourusername/eth-bulk-operations.git
    cd eth-bulk-operations
  2. ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€ ์„ค์น˜:

    pip install web3 python-dotenv
  3. ํ™˜๊ฒฝ ์„ค์ •:

    cp examples/.env.example .env
    # .env ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜์—ฌ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”

์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ์‚ฌ์šฉ๋ฒ•

BatchTransfer ์ปจํŠธ๋ž™ํŠธ

์ด ์ปจํŠธ๋ž™ํŠธ๋Š” ํ•œ ๋ฒˆ์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์—ฌ๋Ÿฌ ์ฃผ์†Œ์— ETH๋‚˜ ERC-20 ํ† ํฐ์„ ์ „์†กํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

  • batchTransfer: ์—ฌ๋Ÿฌ ์ฃผ์†Œ๋กœ ETH ์ผ๊ด„ ์ „์†ก
  • batchTransferERC20: ์—ฌ๋Ÿฌ ์ฃผ์†Œ๋กœ ERC-20 ํ† ํฐ ์ผ๊ด„ ์ „์†ก
  • depositERC20: ERC-20 ํ† ํฐ์„ ์ปจํŠธ๋ž™ํŠธ์— ์ž…๊ธˆ
  • withdrawERC20: ERC-20 ํ† ํฐ์„ ์ปจํŠธ๋ž™ํŠธ์—์„œ ์ธ์ถœ
  • withdraw: ์ปจํŠธ๋ž™ํŠธ์—์„œ ETH ์ธ์ถœ

Foundry๋กœ ์ปจํŠธ๋ž™ํŠธ ๋ฐฐํฌํ•˜๊ธฐ

  1. Foundry ์ดˆ๊ธฐํ™”(์ฒ˜์Œ ์‚ฌ์šฉ์‹œ):

    forge init --no-commit
  2. ์˜์กด์„ฑ ์„ค์น˜:

    forge install OpenZeppelin/openzeppelin-contracts
  3. ์ปจํŠธ๋ž™ํŠธ ๋ฐฐํฌ:

    # ๋กœ์ปฌ ํ…Œ์ŠคํŠธ๋„ท
    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

ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ๋ฒ•

๋„ค์ดํ‹ฐ๋ธŒ ํ† ํฐ(ETH) ์ผ๊ด„ ์ „์†ก

# scripts/native ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™
cd scripts/native

# batch_send.py ์‹คํ–‰
python batch_send.py

ERC-20 ํ† ํฐ ์Šน์ธ (approve)

# scripts/token ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™
cd scripts/token

# ๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ (์†Œ๋Ÿ‰์˜ ๊ณ„์ •์ธ ๊ฒฝ์šฐ)
python approve_sync.py

# ๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ (๋Œ€๋Ÿ‰์˜ ๊ณ„์ •์ธ ๊ฒฝ์šฐ)
python approve_async.py

ERC-20 ํ† ํฐ ์ผ๊ด„ ์ „์†ก

BatchTransfer ์ปจํŠธ๋ž™ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ฃผ์†Œ์— 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๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ ํ† ํฐ(ETH) ์ˆ˜์ง‘

# scripts/native ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™
cd scripts/native

# ๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ (์†Œ๋Ÿ‰์˜ ๊ณ„์ •์ธ ๊ฒฝ์šฐ)
python gather_native_sync.py

# ๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ (๋Œ€๋Ÿ‰์˜ ๊ณ„์ •์ธ ๊ฒฝ์šฐ)
python gather_native_async.py

ERC-20 ํ† ํฐ ์ˆ˜์ง‘

# scripts/token ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™
cd scripts/token

# ๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ (์†Œ๋Ÿ‰์˜ ๊ณ„์ •์ธ ๊ฒฝ์šฐ)
python gather_sync.py

# ๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ (๋Œ€๋Ÿ‰์˜ ๊ณ„์ •์ธ ๊ฒฝ์šฐ)
python gather_async.py

์Šคํฌ๋ฆฝํŠธ ์„ธ๋ถ€ ์„ค์ •

๊ฐ ์Šคํฌ๋ฆฝํŠธ๋Š” ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ค์ •์„ ํ™•์ธํ•˜๊ณ  ํ•„์š”์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

๊ณตํ†ต ์„ค์ • (๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ)

  • .env ํŒŒ์ผ์— RPC_URL ๋ฐ CHAIN_ID ์„ค์ •
  • ERC-20 ํ† ํฐ์˜ ์ปจํŠธ๋ž™ํŠธ ์ฃผ์†Œ ์ˆ˜์ •
  • ๊ณ„์ • ์ •๋ณด๊ฐ€ ๋‹ด๊ธด JSON ํŒŒ์ผ ๊ฒฝ๋กœ ์ง€์ •

batch_send.py ์„ค์ •

# ๋„ค์ดํ‹ฐ๋ธŒ ํ† ํฐ(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  # ๊ฐ ์ฃผ์†Œ์— ๋ณด๋‚ผ ํ† ํฐ ์–‘ (ํ† ํฐ ๋‹จ์œ„)

approve_sync.py / approve_async.py ์„ค์ •

TOKEN_CONTRACT_ADDRESS = '0x...'  # ERC-20 ํ† ํฐ ์ปจํŠธ๋ž™ํŠธ ์ฃผ์†Œ
SPENDER_ADDRESS = '0x...'  # approve ๋Œ€์ƒ ์ฃผ์†Œ (์ผ๋ฐ˜์ ์œผ๋กœ BatchTransfer ์ฃผ์†Œ)
APPROVE_AMOUNT = 150  # approveํ•  ํ† ํฐ ์–‘ (ETH ๋‹จ์œ„)

gather_native_sync.py / gather_native_async.py ์„ค์ •

RECIPIENT_ADDRESS = '0x...'  # ETH๋ฅผ ์ˆ˜์ง‘ํ•  ๋Œ€์ƒ ์ฃผ์†Œ
MIN_ETH_BALANCE = 0.001  # ์ „์†ก์„ ์œ„ํ•œ ์ตœ์†Œ ETH ์ž”์•ก
RESERVE_GAS_ETH = 0.0005  # ๊ฐ€์Šค๋น„๋ฅผ ์œ„ํ•ด ๋‚จ๊ฒจ๋‘˜ ETH ๊ธˆ์•ก
CONCURRENT_TASKS = 500  # ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ํƒœ์Šคํฌ ์ˆ˜ (๋น„๋™๊ธฐ์‹ ๋ฒ„์ „๋งŒ)

gather_sync.py / gather_async.py ์„ค์ •

TOKEN_CONTRACT_ADDRESS = '0x...'  # ERC-20 ํ† ํฐ ์ปจํŠธ๋ž™ํŠธ ์ฃผ์†Œ
RECIPIENT_ADDRESS = '0x...'  # ํ† ํฐ์„ ๋ชจ์„ ๋Œ€์ƒ ์ฃผ์†Œ
MIN_TOKEN_BALANCE = 0.001  # ์ „์†ก ์ตœ์†Œ ํ† ํฐ ์ž”์•ก (ETH ๋‹จ์œ„)

๊ณ„์ • ์„ค์ •

๊ณ„์ • ์ •๋ณด๋Š” JSON ํŒŒ์ผ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

[
  {
    "address": "0x1234...",
    "private_key": "0xabcd..."
  },
  ...
]

์ฃผ์˜: ๊ฐœ์ธํ‚ค๋Š” ๋งค์šฐ ๋ฏผ๊ฐํ•œ ์ •๋ณด์ด๋ฏ€๋กœ ๋ณด์•ˆ์— ์ฃผ์˜ํ•˜์„ธ์š”. ํ…Œ์ŠคํŠธ์šฉ ๊ณ„์ •๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published