Skip to content

Commit e5bb677

Browse files
authored
Update contract deployment for new RLN contract (#110)
* Run deploy scripts for new incentivized contract and mint tokens per account * Add service to manage RLN contract token minting per nwaku service * Add token-mint-service as tool * revert back to sh instead of bash for contract deployer script * Add comments and code cleanup
1 parent 5f0dfb5 commit e5bb677

File tree

8 files changed

+328
-16
lines changed

8 files changed

+328
-16
lines changed

deploy_rln_contract.sh

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,15 @@ fi
2121
cd /waku-rlnv2-contract
2222
git checkout $RLN_CONTRACT_REPO_COMMIT
2323

24-
#3. Replace the hardcoded MAX_MESSAGE_LIMIT
25-
sed -i "s/\b100\b/${MAX_MESSAGE_LIMIT}/g" script/Deploy.s.sol
26-
27-
# 4. Compile
24+
# 3. Compile Contract Repo
2825
echo "forge install..."
2926
forge install
3027
echo "pnpm install..."
3128
pnpm install
3229
echo "forge build..."
3330
forge build
3431

35-
# 5. Export environment variables
32+
# 4. Export environment variables
3633
export RCL_URL=$RCL_URL
3734
export PRIVATE_KEY=$PRIVATE_KEY
3835
export ETH_FROM=$ETH_FROM
@@ -41,5 +38,23 @@ export API_KEY_ETHERSCAN=123
4138
export API_KEY_CARDONA=123
4239
export API_KEY_LINEASCAN=123
4340

44-
# 6. Deploy the contract
45-
forge script script/Deploy.s.sol:Deploy --rpc-url $RPC_URL --broadcast -vv --private-key $PRIVATE_KEY --sender $ETH_FROM
41+
# 5. Deploy the TestToken
42+
echo "\nDeploying TestToken (ERC20 Token Contract)...\n"
43+
forge script test/TestToken.sol --broadcast -vv --rpc-url http://foundry:8545 --tc TestTokenFactory --private-key $PRIVATE_KEY
44+
export TOKEN_ADDRESS=0x5FbDB2315678afecb367f032d93F642f64180aa3
45+
46+
echo "\nDeploying LinearPriceCalculator Contract..."
47+
forge script script/Deploy.s.sol --broadcast -vv --rpc-url http://foundry:8545 --tc DeployPriceCalculator --private-key $PRIVATE_KEY
48+
49+
echo "\nDeploying RLN contract..."
50+
forge script script/Deploy.s.sol --broadcast -vv --rpc-url http://foundry:8545 --tc DeployWakuRlnV2 --private-key $PRIVATE_KEY
51+
52+
echo "\nDeploying Proxy contract..."
53+
forge script script/Deploy.s.sol --broadcast -vvv --rpc-url http://foundry:8545 --tc DeployProxy --private-key $PRIVATE_KEY
54+
export CONTRACT_ADDRESS=0x5FC8d32690cc91D4c39d9d3abcBD16989F875707
55+
56+
# 6. Contract deployment completed
57+
echo "\nContract deployment completed successfully"
58+
echo "TOKEN_ADDRESS: $TOKEN_ADDRESS"
59+
echo "CONTRACT_ADDRESS: $CONTRACT_ADDRESS"
60+
echo "\nEach account registering a membership needs to first mint the token and approve the contract to spend it on their behalf."

docker-compose.yml

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ services:
2626
--allow-origin=*
2727
--block-time=12
2828
--chain-id=1234
29+
--gas-limit=30000000
30+
--gas-price=1
2931
--silent
3032
--config-out=/shared/anvil-config.txt
3133
volumes:
@@ -38,16 +40,17 @@ services:
3840
labels:
3941
com.centurylinklabs.watchtower.enable: '${WATCHTOWER_ENABLED:-false}'
4042
environment:
41-
- RLN_CONTRACT_REPO_COMMIT=${RLN_CONTRACT_REPO_COMMIT:-64df4593c6a14e43b8b0e9b396d2f4772bb08b34}
43+
- RLN_CONTRACT_REPO_COMMIT=${RLN_CONTRACT_REPO_COMMIT:-ad0dc9a81d892864ac2576d74e628ce93da592ef}
4244
- PRIVATE_KEY=${PRIVATE_KEY}
4345
- RPC_URL=${RPC_URL:-http://foundry:8545}
4446
- ETH_FROM=${ETH_FROM}
45-
- MAX_MESSAGE_LIMIT=${MAX_MESSAGE_LIMIT:-20}
47+
- NUM_NWAKU_NODES=${NUM_NWAKU_NODES:-5}
4648
entrypoint: sh
4749
command:
4850
- '/opt/deploy_rln_contract.sh'
4951
volumes:
5052
- ./deploy_rln_contract.sh:/opt/deploy_rln_contract.sh
53+
- privatekeys-volume:/shared
5154
depends_on:
5255
- foundry
5356
networks:
@@ -82,16 +85,41 @@ services:
8285
entrypoint: sh
8386
environment:
8487
- RPC_URL=${RPC_URL:-http://foundry:8545}
85-
- RLN_CONTRACT_ADDRESS=0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9
88+
- RLN_CONTRACT_ADDRESS=0x5FC8d32690cc91D4c39d9d3abcBD16989F875707
8689
- RLN_CREDENTIAL_PATH=/keystore.json
8790
- RLN_CREDENTIAL_PASSWORD=passw123
88-
- RLN_RELAY_MSG_LIMIT=${RLN_RELAY_MSG_LIMIT:-10}
89-
- RLN_RELAY_EPOCH_SEC=${RLN_RELAY_EPOCH_SEC:-60}
91+
- RLN_RELAY_MSG_LIMIT=${RLN_RELAY_MSG_LIMIT:-100}
92+
- RLN_RELAY_EPOCH_SEC=${RLN_RELAY_EPOCH_SEC:-600}
93+
- TOKEN_ADDRESS=0x5FbDB2315678afecb367f032d93F642f64180aa3
94+
- PRIVATE_KEY=${PRIVATE_KEY}
9095
command:
9196
- '/opt/run_nwaku.sh'
9297
volumes:
9398
- ./run_nwaku.sh:/opt/run_nwaku.sh:Z
9499
- privatekeys-volume:/shared
100+
init: true
101+
depends_on:
102+
contract-repo-deployer:
103+
condition: service_completed_successfully
104+
nwaku-token-init:
105+
condition: service_completed_successfully
106+
networks:
107+
- simulation
108+
109+
nwaku-token-init:
110+
build:
111+
context: ./tools/token-mint-service
112+
dockerfile: Dockerfile
113+
environment:
114+
- RPC_URL=${RPC_URL:-http://foundry:8545}
115+
- TOKEN_ADDRESS=0x5FbDB2315678afecb367f032d93F642f64180aa3
116+
- CONTRACT_ADDRESS=0x5FC8d32690cc91D4c39d9d3abcBD16989F875707
117+
- PRIVATE_KEY=${PRIVATE_KEY}
118+
- NUM_NWAKU_NODES=${NUM_NWAKU_NODES:-5}
119+
deploy:
120+
replicas: ${NUM_NWAKU_NODES:-5}
121+
volumes:
122+
- privatekeys-volume:/shared
95123
depends_on:
96124
contract-repo-deployer:
97125
condition: service_completed_successfully

run_nwaku.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#!/bin/sh
22

3+
ANVIL_CONFIG_PATH=${ANVIL_CONFIG_PATH:-/shared/anvil-config.txt}
4+
35
# Check Linux Distro Version - it can differ depending on the nwaku image used
46
OS=$(cat /etc/os-release)
57
if echo $OS | grep -q "Debian"; then
@@ -49,7 +51,7 @@ fi
4951
get_private_key(){
5052

5153
# Read the JSON file
52-
json_content=$(cat /shared/anvil-config.txt)
54+
json_content=$(cat "$ANVIL_CONFIG_PATH")
5355

5456
# Check if json_content has a value
5557
if [ -z "$json_content" ]; then
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
FROM python:3.11-alpine
2+
3+
WORKDIR /app
4+
5+
# Install system packages needed by the script
6+
RUN apk add --no-cache bind-tools jq
7+
8+
# Install requirements
9+
COPY requirements.txt .
10+
RUN pip install --no-cache-dir -r requirements.txt
11+
12+
# Copy scripts
13+
COPY init_node_tokens.py .
14+
COPY get_account_key.sh .
15+
16+
# Make scripts executable
17+
RUN chmod +x /app/init_node_tokens.py /app/get_account_key.sh
18+
19+
# Use the account key helper as entrypoint
20+
ENTRYPOINT ["/bin/sh", "/app/get_account_key.sh"]
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#!/bin/sh
2+
# Helper script to get the index of the container and use it to retrieve a unique account private key.
3+
# Each node uses a unique Ethereum account to register with the RLN contract.
4+
# The account and private key pairs are stored in anvil-config.txt on a shared volume at anvil startup in the foundry service
5+
6+
set -e
7+
8+
ANVIL_CONFIG_PATH=${ANVIL_CONFIG_PATH:-/shared/anvil-config.txt}
9+
10+
# Get container IP and determine index (same method as run_nwaku.sh)
11+
IP=$(ip a | grep "inet " | grep -Fv 127.0.0.1 | sed 's/.*inet \([^/]*\).*/\1/')
12+
echo "Container IP: $IP"
13+
14+
# Extract container name from reverse DNS lookup and get index
15+
CNTR=$(dig -x $IP +short | cut -d'.' -f1)
16+
INDEX=$(echo $CNTR | sed 's/.*[-_]\([0-9]*\)/\1/')
17+
18+
if [ $? -ne 0 ] || [ -z "$INDEX" ]; then
19+
echo "Error: Failed to determine the replica index from IP." >&2
20+
exit 1
21+
fi
22+
23+
echo "Determined container index: $INDEX"
24+
25+
# Read anvil config
26+
json_content=$(cat "$ANVIL_CONFIG_PATH")
27+
if [ -z "$json_content" ]; then
28+
echo "Error: Failed to read the JSON file or the file is empty." >&2
29+
exit 1
30+
fi
31+
32+
# Get private key and address for this index
33+
ARRAY_INDEX=$((INDEX - 1))
34+
35+
ACCOUNT_PRIVATE_KEY=$(echo "$json_content" | jq -r ".private_keys[$ARRAY_INDEX]")
36+
ACCOUNT_ADDRESS=$(echo "$json_content" | jq -r ".available_accounts[$ARRAY_INDEX]")
37+
38+
if [ "$ACCOUNT_PRIVATE_KEY" = "null" ] || [ "$ACCOUNT_ADDRESS" = "null" ]; then
39+
echo "Failed to get account private key or address for index $INDEX (array index $ARRAY_INDEX)" >&2
40+
exit 1
41+
fi
42+
43+
# Export for the Python script
44+
export NODE_PRIVATE_KEY="$ACCOUNT_PRIVATE_KEY"
45+
export NODE_ADDRESS="$ACCOUNT_ADDRESS"
46+
export NODE_INDEX="$INDEX"
47+
48+
echo "Node $INDEX using Ethereum account: $ACCOUNT_ADDRESS"
49+
50+
# Run the Python initialization script
51+
exec python3 /app/init_node_tokens.py

0 commit comments

Comments
 (0)