-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathmulti-chain-bridge.bats
More file actions
322 lines (275 loc) · 13.2 KB
/
multi-chain-bridge.bats
File metadata and controls
322 lines (275 loc) · 13.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
#!/usr/bin/env bats
# bats file_tags=lxly,multi-chain-bridge
# shellcheck disable=SC1091,SC2154
setup_file() {
# shellcheck source=core/helpers/common.bash
source "$BATS_TEST_DIRNAME/../../core/helpers/common.bash"
_setup_vars
# Multi-chain network configurations
declare -A l2_rpc_urls=(
["network1"]="$(kurtosis port print "$kurtosis_enclave_name" cdk-erigon-rpc-001 rpc)"
["network2"]="$(kurtosis port print "$kurtosis_enclave_name" op-el-1-op-geth-op-node-002 rpc)"
)
declare -A bridge_service_urls=(
["network1"]="$(kurtosis port print "$kurtosis_enclave_name" zkevm-bridge-service-001 rpc)"
["network2"]="$(kurtosis port print "$kurtosis_enclave_name" zkevm-bridge-service-002 rpc)"
)
export l2_rpc_urls
export bridge_service_urls
# Default to network1 for backward compatibility
export default_network=${NETWORK_TARGET:-"network1"}
export l2_rpc_url=${L2_RPC_URL:-"${l2_rpc_urls[$default_network]}"}
export l2_bridge_addr=${L2_BRIDGE_ADDR:-"0x78908F7A87d589fdB46bdd5EfE7892C5aD6001b6"}
export bridge_service_url=${BRIDGE_SERVICE_URL:-"${bridge_service_urls[$default_network]}"}
network_id=$(cast call --rpc-url "$l2_rpc_url" "$l2_bridge_addr" 'networkID()(uint32)')
export network_id
export claimtxmanager_addr=${CLAIMTXMANAGER_ADDR:-"0x5f5dB0D4D58310F53713eF4Df80ba6717868A9f8"}
export claim_wait_duration=${CLAIM_WAIT_DURATION:-"10m"}
export erc20_token_name="e2e test"
export erc20_token_symbol="E2E"
load "$BATS_TEST_DIRNAME/../../core/helpers/scripts/bridging.bash"
fund_claim_tx_manager
}
setup() {
load "$BATS_TEST_DIRNAME/../../core/helpers/scripts/bridging.bash"
}
# Helper function to get network configuration
function get_network_config() {
local network_name="$1"
local config_type="$2"
case $config_type in
"rpc_url")
case $network_name in
"network1") kurtosis port print "$kurtosis_enclave_name" cdk-erigon-rpc-001 rpc ;;
"network2") kurtosis port print "$kurtosis_enclave_name" op-el-1-op-geth-op-node-002 rpc ;;
*) echo "" ;;
esac
;;
"bridge_service_url")
case $network_name in
"network1") kurtosis port print "$kurtosis_enclave_name" zkevm-bridge-service-001 rpc ;;
"network2") kurtosis port print "$kurtosis_enclave_name" zkevm-bridge-service-002 rpc ;;
*) echo "" ;;
esac
;;
esac
}
# bats test_tags=bridge
@test "bridge native eth from L1 to L2 ("$NETWORK_TARGET")" {
echo "Stopping the bridge-spammer service" >&3
kurtosis service stop "$kurtosis_enclave_name" bridge-spammer-001
echo "Starting bridge native ETH test for network: $NETWORK_TARGET" >&3
echo "L1 RPC URL: $l1_rpc_url" >&3
echo "L2 RPC URL: $l2_rpc_url" >&3
echo "Network ID: $network_id" >&3
bridge_amount=$(date +%s)
echo "Bridge amount: $bridge_amount wei" >&3
echo "Bridging ETH from L1 to L2..." >&3
run polycli ulxly bridge asset \
--bridge-address "$l1_bridge_addr" \
--destination-address "$l2_eth_address" \
--destination-network "$network_id" \
--private-key "$l1_private_key" \
--rpc-url "$l1_rpc_url" \
--value "$bridge_amount"
run polycli_bridge_asset_get_info "$output" "$l1_rpc_url" "$l1_bridge_addr"
if [[ $status -ne 0 ]]; then
echo "Failed to get deposit info" >&3
echo "$output" >&3
exit 1
fi
deposit_count=$(echo "$output" | jq -r '.depositCount')
echo "Deposit count: $deposit_count" >&3
echo "ETH bridge transaction completed, attempting to claim on L2..." >&3
# It's possible this command will fail due to the auto claimer
set +e
polycli ulxly claim asset \
--bridge-address "$l2_bridge_addr" \
--private-key "$l2_private_key" \
--rpc-url "$l2_rpc_url" \
--deposit-count "$deposit_count" \
--deposit-network "0" \
--bridge-service-url "$bridge_service_url" \
--wait "$claim_wait_duration"
set -e
echo "L1 to L2 ETH bridge test completed for network: $NETWORK_TARGET" >&3
}
# bats test_tags=bridge,transaction-erc20
@test "bridge L2 ("$NETWORK_TARGET") originated token from L2 to L1" {
echo "Starting ERC20 token bridge test for network: $NETWORK_TARGET" >&3
echo "Setting up deterministic deployer and ERC20 token..." >&3
salt="0x0000000000000000000000000000000000000000000000000000000000000000"
deterministic_deployer_addr=0x4e59b44847b379578588920ca78fbf26c0b4956c
deterministic_deployer_code=$(cast code --rpc-url "$l2_rpc_url" "$deterministic_deployer_addr")
if [[ $deterministic_deployer_code == "0x" ]]; then
echo "Deploying missing deterministic deployer proxy contract..." >&3
cast send --legacy --value 0.1ether --rpc-url "$l2_rpc_url" --private-key "$l2_private_key" 0x3fab184622dc19b6109349b94811493bf2a45362
cast publish --rpc-url "$l2_rpc_url" 0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222
fi
erc_20_bytecode=$(cat core/contracts/bin/erc20permitmock.bin)
constructor_args=$(cast abi-encode 'f(string,string,address,uint256)' "$erc20_token_name" "$erc20_token_symbol" "$l2_eth_address" 100000000000000000000 | sed 's/0x//')
test_erc20_addr=$(cast create2 --salt $salt --init-code "$erc_20_bytecode$constructor_args")
echo "ERC20 token address: $test_erc20_addr" >&3
if [[ $(cast code --rpc-url "$l2_rpc_url" "$test_erc20_addr") == "0x" ]]; then
echo "Deploying ERC20 test token..." >&3
cast send --legacy --rpc-url "$l2_rpc_url" --private-key "$l2_private_key" "$deterministic_deployer_addr" "$salt$erc_20_bytecode$constructor_args"
cast send --legacy --rpc-url "$l2_rpc_url" --private-key "$l2_private_key" "$test_erc20_addr" 'approve(address,uint256)' "$l2_bridge_addr" "$(cast max-uint)"
echo "ERC20 token deployed and approved for bridge" >&3
fi
bridge_amount=$(date +%s)
echo "Bridge amount: $bridge_amount" >&3
echo "Bridging ERC20 token from L2 to L1..." >&3
# Bridge some funds from L2 to L1
run polycli ulxly bridge asset \
--destination-network 0 \
--token-address "$test_erc20_addr" \
--value "$bridge_amount" \
--bridge-address "$l2_bridge_addr" \
--rpc-url "$l2_rpc_url" \
--private-key "$l2_private_key"
run polycli_bridge_asset_get_info "$output" "$l2_rpc_url" "$l2_bridge_addr"
if [[ $status -ne 0 ]]; then
echo "Failed to get deposit info" >&3
echo "$output" >&3
exit 1
fi
deposit_count=$(echo "$output" | jq -r '.depositCount')
echo "Deposit count: $deposit_count" >&3
echo "Claiming ERC20 token on L1..." >&3
polycli ulxly claim asset \
--bridge-address "$l1_bridge_addr" \
--private-key "$l1_private_key" \
--rpc-url "$l1_rpc_url" \
--deposit-count "$deposit_count" \
--deposit-network "$network_id" \
--bridge-service-url "$bridge_service_url" \
--wait "$claim_wait_duration"
token_hash=$(cast keccak "$(cast abi-encode --packed 'f(uint32, address)' "$network_id" "$test_erc20_addr")")
wrapped_token_addr=$(cast call --rpc-url "$l1_rpc_url" "$l1_bridge_addr" 'tokenInfoToWrappedToken(bytes32)(address)' "$token_hash")
echo "Wrapped token address on L1: $wrapped_token_addr" >&3
echo "Bridging wrapped token from L1 back to L2..." >&3
run polycli ulxly bridge asset \
--destination-network "$network_id" \
--token-address "$wrapped_token_addr" \
--value "$bridge_amount" \
--bridge-address "$l1_bridge_addr" \
--rpc-url "$l1_rpc_url" \
--private-key "$l1_private_key"
run polycli_bridge_asset_get_info "$output" "$l1_rpc_url" "$l1_bridge_addr"
if [[ $status -ne 0 ]]; then
echo "Failed to get deposit info" >&3
echo "$output" >&3
exit 1
fi
deposit_count=$(echo "$output" | jq -r '.depositCount')
echo "Deposit count: $deposit_count" >&3
echo "Attempting to claim wrapped token back on L2..." >&3
# It's possible this command will fail due to the auto claimer
set +e
polycli ulxly claim asset \
--bridge-address "$l2_bridge_addr" \
--private-key "$l2_private_key" \
--rpc-url "$l2_rpc_url" \
--deposit-count "$deposit_count" \
--deposit-network "0" \
--bridge-service-url "$bridge_service_url" \
--wait "$claim_wait_duration"
set -e
echo "Performing second round of L2 to L1 bridging..." >&3
# repeat the first step again to trigger another exit of l2 but with the added claim
bridge_amount=$(date +%s)
echo "Second round - Bridge amount: $bridge_amount" >&3
run polycli ulxly bridge asset \
--destination-network 0 \
--token-address "$test_erc20_addr" \
--value "$bridge_amount" \
--bridge-address "$l2_bridge_addr" \
--rpc-url "$l2_rpc_url" \
--private-key "$l2_private_key"
run polycli_bridge_asset_get_info "$output" "$l2_rpc_url" "$l2_bridge_addr"
if [[ $status -ne 0 ]]; then
echo "Failed to get deposit info" >&3
echo "$output" >&3
exit 1
fi
deposit_count=$(echo "$output" | jq -r '.depositCount')
echo "Deposit count: $deposit_count" >&3
echo "Claiming second round ERC20 token on L1..." >&3
# Wait for that exit to settle on L1
set +e
polycli ulxly claim asset \
--bridge-address "$l1_bridge_addr" \
--private-key "$l1_private_key" \
--rpc-url "$l1_rpc_url" \
--deposit-count "$deposit_count" \
--deposit-network "$network_id" \
--bridge-service-url "$bridge_service_url" \
--wait "$claim_wait_duration"
set -e
echo "ERC20 token bridge test completed for network: $NETWORK_TARGET" >&3
echo "Restarting the bridge-spammer service" >&3
kurtosis service start "$kurtosis_enclave_name" bridge-spammer-001
}
# bats test_tags=bridge,multi-chain
@test "cross-chain bridge between different L2 networks (target:"$NETWORK_TARGET")" {
# Define all possible network combinations (source -> target)
declare -A network_combinations=(
["network1"]="network2"
["network2"]="network1"
)
# Use the combination based on NETWORK_TARGET, or default
local target_network="${NETWORK_TARGET:-network2}"
local source_network="${network_combinations[$target_network]:-network1}"
# Ensure we have valid networks
if [[ -z "$source_network" ]]; then
source_network="network1"
fi
echo "Testing bridge combination: $source_network -> $target_network" >&3
local source_rpc_url
source_rpc_url=$(get_network_config "$source_network" "rpc_url")
local source_bridge_service_url
source_bridge_service_url=$(get_network_config "$source_network" "bridge_service_url")
local target_rpc_url
target_rpc_url=$(get_network_config "$target_network" "rpc_url")
# local target_bridge_service_url
# target_bridge_service_url=$(get_network_config "$target_network" "bridge_service_url")
# Validate that we can reach both networks
if [[ -z "$source_rpc_url" || -z "$target_rpc_url" ]]; then
skip "Required networks ($source_network, $target_network) are not available"
fi
# Get network IDs
local source_network_id
source_network_id=$(cast call --rpc-url "$source_rpc_url" "$l2_bridge_addr" 'networkID()(uint32)')
local target_network_id
target_network_id=$(cast call --rpc-url "$target_rpc_url" "$l2_bridge_addr" 'networkID()(uint32)')
echo "Bridging from network $source_network_id to network $target_network_id" >&3
# Bridge from source to target network
local bridge_amount
bridge_amount=$(date +%s)
run polycli ulxly bridge asset \
--destination-network "$target_network_id" \
--destination-address "$l2_eth_address" \
--bridge-address "$l2_bridge_addr" \
--rpc-url "$source_rpc_url" \
--private-key "$l2_private_key" \
--value "$bridge_amount"
run polycli_bridge_asset_get_info "$output" "$source_rpc_url" "$l2_bridge_addr"
if [[ $status -ne 0 ]]; then
echo "Failed to get deposit info" >&3
echo "$output" >&3
exit 1
fi
deposit_count=$(echo "$output" | jq -r '.depositCount')
echo "Claiming bridged L2 token on another L2..." >&3
# Claim on target network
set +e
polycli ulxly claim asset \
--bridge-address "$l2_bridge_addr" \
--private-key "$l2_private_key" \
--rpc-url "$target_rpc_url" \
--deposit-count "$deposit_count" \
--deposit-network "$source_network_id" \
--bridge-service-url "$source_bridge_service_url" \
--wait "$claim_wait_duration"
set -e
}