mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-16 00:43:46 +00:00
Merge pull request #11 from primevprotocol/whitelist-integration
feat: complete whitelist integration with hyperlane
This commit is contained in:
commit
7561e169b0
5 changed files with 93 additions and 24 deletions
|
|
@ -8,6 +8,7 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||||
"github.com/ethereum/go-ethereum/common/math"
|
"github.com/ethereum/go-ethereum/common/math"
|
||||||
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -79,11 +80,12 @@ func (c *mint) RequiredGas(input []byte) uint64 {
|
||||||
|
|
||||||
// Predetermined create2 address of whitelist contract with exclusive mint/burn privileges.
|
// Predetermined create2 address of whitelist contract with exclusive mint/burn privileges.
|
||||||
// This address assumes deployer is 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266.
|
// This address assumes deployer is 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266.
|
||||||
const whitelistCreate2Addr = "0x07e77fdc3DF92E58c9230eEFaABdBd92a8D0c2Af"
|
const whitelistCreate2Addr = "0x5D1415C0973034d162F5FEcF19B50dA057057e29"
|
||||||
|
|
||||||
func (c *mint) Run(input []byte, ctx *precompileContext) ([]byte, error) {
|
func (c *mint) Run(input []byte, ctx *precompileContext) ([]byte, error) {
|
||||||
|
|
||||||
if ctx.caller != common.HexToAddress(whitelistCreate2Addr) {
|
if ctx.caller != common.HexToAddress(whitelistCreate2Addr) {
|
||||||
|
log.Error("Error parsing transfer: caller not whitelisted")
|
||||||
return nil, fmt.Errorf("Error parsing transfer: caller not whitelisted")
|
return nil, fmt.Errorf("Error parsing transfer: caller not whitelisted")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -92,7 +94,8 @@ func (c *mint) Run(input []byte, ctx *precompileContext) ([]byte, error) {
|
||||||
var parsed bool
|
var parsed bool
|
||||||
value, parsed := math.ParseBig256(hexutil.Encode(input[32:64]))
|
value, parsed := math.ParseBig256(hexutil.Encode(input[32:64]))
|
||||||
if !parsed {
|
if !parsed {
|
||||||
return nil, fmt.Errorf("Error parsing transfer: unable to parse value from " + hexutil.Encode(input[64:96]))
|
log.Error("Error parsing transfer: unable to parse value from " + hexutil.Encode(input[32:64]))
|
||||||
|
return nil, fmt.Errorf("Error parsing transfer: unable to parse value from " + hexutil.Encode(input[32:64]))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create native token out of thin air
|
// Create native token out of thin air
|
||||||
|
|
@ -109,9 +112,13 @@ func (c *burn) RequiredGas(input []byte) uint64 {
|
||||||
return 100
|
return 100
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Note ctx.CanTransfer method obtains an incorrect balance w.r.t "burnFrom" address,
|
||||||
|
// specifically during estimateGas. The CanTransfer check was therefore removed,
|
||||||
|
// and the calling contract is responsible for checking balance.
|
||||||
func (c *burn) Run(input []byte, ctx *precompileContext) ([]byte, error) {
|
func (c *burn) Run(input []byte, ctx *precompileContext) ([]byte, error) {
|
||||||
|
|
||||||
if ctx.caller != common.HexToAddress(whitelistCreate2Addr) {
|
if ctx.caller != common.HexToAddress(whitelistCreate2Addr) {
|
||||||
|
log.Error("Error parsing transfer: caller not whitelisted")
|
||||||
return nil, fmt.Errorf("Error parsing transfer: caller not whitelisted")
|
return nil, fmt.Errorf("Error parsing transfer: caller not whitelisted")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -120,12 +127,10 @@ func (c *burn) Run(input []byte, ctx *precompileContext) ([]byte, error) {
|
||||||
var parsed bool
|
var parsed bool
|
||||||
value, parsed := math.ParseBig256(hexutil.Encode(input[32:64]))
|
value, parsed := math.ParseBig256(hexutil.Encode(input[32:64]))
|
||||||
if !parsed {
|
if !parsed {
|
||||||
return nil, fmt.Errorf("Error parsing transfer: unable to parse value from " + hexutil.Encode(input[64:96]))
|
log.Error("Error parsing transfer: unable to parse value from " + hexutil.Encode(input[32:64]))
|
||||||
|
return nil, fmt.Errorf("Error parsing transfer: unable to parse value from " + hexutil.Encode(input[32:64]))
|
||||||
}
|
}
|
||||||
|
|
||||||
if !ctx.CanTransfer(ctx.evm.StateDB, burnFrom, value) {
|
|
||||||
return nil, ErrInsufficientBalance
|
|
||||||
}
|
|
||||||
ctx.evm.StateDB.SubBalance(burnFrom, value)
|
ctx.evm.StateDB.SubBalance(burnFrom, value)
|
||||||
|
|
||||||
return input, nil
|
return input, nil
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@ WORKDIR /
|
||||||
RUN git clone https://github.com/primevprotocol/hyperlane-monorepo.git
|
RUN git clone https://github.com/primevprotocol/hyperlane-monorepo.git
|
||||||
WORKDIR /hyperlane-monorepo
|
WORKDIR /hyperlane-monorepo
|
||||||
# Hyperlane 3.5 release w/ merged primev changes
|
# Hyperlane 3.5 release w/ merged primev changes
|
||||||
# https://github.com/primevprotocol/hyperlane-monorepo/commit/ce1fe3f05e915823ecc355e8d764f010b4b38fa9
|
# https://github.com/primevprotocol/hyperlane-monorepo/commit/1c8cdc9e57389024274242d28e032a2de535c2c7
|
||||||
RUN git checkout ce1fe3f05e915823ecc355e8d764f010b4b38fa9
|
RUN git checkout 1c8cdc9e57389024274242d28e032a2de535c2c7
|
||||||
|
|
||||||
RUN yarn install
|
RUN yarn install
|
||||||
RUN yarn build
|
RUN yarn build
|
||||||
|
|
|
||||||
|
|
@ -38,4 +38,4 @@ mevcommitsettlement:
|
||||||
# Partial override sepolia config for custom rpc
|
# Partial override sepolia config for custom rpc
|
||||||
sepolia:
|
sepolia:
|
||||||
rpcUrls:
|
rpcUrls:
|
||||||
- http: https://1rpc.io/sepolia
|
- http: https://eth-sepolia.g.alchemy.com/v2/a0wg_g1X-Wz4IeVA-0SS3PsQhbyQNjc_
|
||||||
|
|
|
||||||
|
|
@ -2,30 +2,43 @@
|
||||||
set -x
|
set -x
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
# TODO: Stress test bridge back to sepolia, including not having enough balance on sidechain.
|
||||||
|
|
||||||
|
read -p "Has the whitelist contract been deployed, updated with hypERC20 addr, and have router addresss been pasted into this file? (y/n): " answer
|
||||||
|
if [ "$answer" = "y" ]; then
|
||||||
|
echo "Continuing with bridging process..."
|
||||||
|
else
|
||||||
|
echo "Exiting..."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Test account, this must be funded on Sepolia
|
# Test account, this must be funded on Sepolia
|
||||||
# Address: 0xa43b806D2f09AE94dfa38bc00d6F75426D274540
|
# Address: 0xa43b806D2f09AE94dfa38bc00d6F75426D274540
|
||||||
# Private key: 0x8b21e3bc5c26d3327109d341d121fbfb7cb79c95fba5eb2f8c064f87332df7dd
|
# Private key: 0x8b21e3bc5c26d3327109d341d121fbfb7cb79c95fba5eb2f8c064f87332df7dd
|
||||||
ADDRESS=0xa43b806D2f09AE94dfa38bc00d6F75426D274540
|
ADDRESS=0xa43b806D2f09AE94dfa38bc00d6F75426D274540
|
||||||
PRIVATE_KEY=0x8b21e3bc5c26d3327109d341d121fbfb7cb79c95fba5eb2f8c064f87332df7dd
|
PRIVATE_KEY=0x8b21e3bc5c26d3327109d341d121fbfb7cb79c95fba5eb2f8c064f87332df7dd
|
||||||
|
|
||||||
# make print-warp-deploy prints these contract addrs
|
# "make print-warp-deploy" prints these contract addrs
|
||||||
SEPOLIA_ROUTER=0x11dE1a80570f36E57b3F15dAb008DFEAA4F1bf05
|
SEPOLIA_ROUTER=0x2a3840332456e1C27ddd493f89fF33402450C537
|
||||||
SIDECHAIN_ROUTER=0xf46a69166dB5C2a7ff97D50Fc46B5fb663CeD4c3
|
SIDECHAIN_ROUTER=0x707719517b112c9A3F571709e59Cfbaa28fCf873
|
||||||
|
|
||||||
# Store initial sidechain ERC20 balance
|
SEPOLIA_URL=https://ethereum-sepolia.publicnode.com
|
||||||
SIDECHAIN_ERC20_BALANCE=$(cast call $SIDECHAIN_ROUTER "balanceOf(address)" $ADDRESS)
|
SIDECHAIN_URL=http://localhost:8545
|
||||||
|
|
||||||
|
# Store initial sidechain native balance
|
||||||
|
SIDECHAIN_BALANCE=$(cast balance --rpc-url $SIDECHAIN_URL $ADDRESS)
|
||||||
|
|
||||||
# sepolia -> dest chain (account must be funded on sepolia)
|
# sepolia -> dest chain (account must be funded on sepolia)
|
||||||
cast call --rpc-url https://ethereum-sepolia.publicnode.com $SEPOLIA_ROUTER "quoteGasPayment(uint32)" "17864"
|
cast call --rpc-url $SEPOLIA_URL $SEPOLIA_ROUTER "quoteGasPayment(uint32)" "17864"
|
||||||
# Above returns 1 wei, therefore ether value is 1 wei larger than value function argument
|
# Above returns 1 wei, therefore ether value is 1 wei larger than value function argument
|
||||||
cast send --rpc-url https://ethereum-sepolia.publicnode.com --private-key $PRIVATE_KEY $SEPOLIA_ROUTER "transferRemote(uint32,bytes32,uint256)" "17864" "0x000000000000000000000000a43b806d2f09ae94dfa38bc00d6f75426d274540" "5000000000000000" --value 5000000000000001wei
|
cast send --rpc-url $SEPOLIA_URL --private-key $PRIVATE_KEY $SEPOLIA_ROUTER "transferRemote(uint32,bytes32,uint256)" "17864" "0x000000000000000000000000a43b806d2f09ae94dfa38bc00d6f75426d274540" "5000000000000000" --value 5000000000000001wei
|
||||||
|
|
||||||
# Block until ERC20 balance is incremented
|
# Block until native balance is incremented
|
||||||
MAX_RETRIES=20
|
MAX_RETRIES=20
|
||||||
RETRY_COUNT=0
|
RETRY_COUNT=0
|
||||||
while [ $(printf '%d' $(cast call $SIDECHAIN_ROUTER "balanceOf(address)" $ADDRESS)) -eq $(printf '%d' $SIDECHAIN_ERC20_BALANCE) ]
|
while [ $(printf '%d' $(cast balance --rpc-url $SIDECHAIN_URL $ADDRESS)) -eq $(printf '%d' $SIDECHAIN_BALANCE) ]
|
||||||
do
|
do
|
||||||
echo "Waiting for ERC20 balance to increment..."
|
echo "Waiting for native balance to increment..."
|
||||||
sleep 5
|
sleep 5
|
||||||
|
|
||||||
RETRY_COUNT=$((RETRY_COUNT + 1))
|
RETRY_COUNT=$((RETRY_COUNT + 1))
|
||||||
|
|
@ -37,22 +50,29 @@ do
|
||||||
done
|
done
|
||||||
|
|
||||||
# Store sepolia balance
|
# Store sepolia balance
|
||||||
SEPOLIA_BALANCE=$(cast balance --rpc-url https://ethereum-sepolia.publicnode.com $ADDRESS)
|
SEPOLIA_BALANCE=$(cast balance --rpc-url $SEPOLIA_URL $ADDRESS)
|
||||||
|
|
||||||
# Send some sidechain ether from genesis funded account to pay for tx fees on sidechain
|
# Send some sidechain ether from genesis funded account to pay for tx fees on sidechain
|
||||||
cast send --private-key 0xc065f4c9a6dda0785e2224f5af8e473614de1c029acf094f03d5830e2dd5b0ea $ADDRESS --value 0.1ether
|
cast send --rpc-url $SIDECHAIN_URL --private-key 0xc065f4c9a6dda0785e2224f5af8e473614de1c029acf094f03d5830e2dd5b0ea $ADDRESS --value 0.1ether
|
||||||
|
|
||||||
sleep 5
|
sleep 5
|
||||||
|
|
||||||
# dest chain -> sepolia (account must be funded on dest chain)
|
# dest chain -> sepolia (account must be funded on dest chain)
|
||||||
cast call $SIDECHAIN_ROUTER "quoteGasPayment(uint32)" "11155111"
|
cast call --rpc-url $SIDECHAIN_URL $SIDECHAIN_ROUTER "quoteGasPayment(uint32)" "11155111"
|
||||||
# Above returns 0 wei, therefore ether value is same as function argument
|
# Above returns 0 wei, therefore ether value is same as function argument
|
||||||
cast send --private-key $PRIVATE_KEY $SIDECHAIN_ROUTER "transferRemote(uint32,bytes32,uint256)" "11155111" "0x000000000000000000000000a43b806d2f09ae94dfa38bc00d6f75426d274540" "5000000000000000" --value 500000000000000wei
|
cast send \
|
||||||
|
--rpc-url $SIDECHAIN_URL \
|
||||||
|
--private-key $PRIVATE_KEY \
|
||||||
|
$SIDECHAIN_ROUTER "transferRemote(uint32,bytes32,uint256)" \
|
||||||
|
"11155111" \
|
||||||
|
"0x000000000000000000000000a43b806d2f09ae94dfa38bc00d6f75426d274540" \
|
||||||
|
"5000000000000000" \
|
||||||
|
--value 500000000000000wei
|
||||||
|
|
||||||
# Block until sepolia balance is incremented
|
# Block until sepolia balance is incremented
|
||||||
MAX_RETRIES=30
|
MAX_RETRIES=30
|
||||||
RETRY_COUNT=0
|
RETRY_COUNT=0
|
||||||
while [ $(cast balance --rpc-url https://ethereum-sepolia.publicnode.com $ADDRESS) -eq $SEPOLIA_BALANCE ]
|
while [ $(cast balance --rpc-url $SEPOLIA_URL $ADDRESS) -eq $SEPOLIA_BALANCE ]
|
||||||
do
|
do
|
||||||
echo "Waiting for sepolia balance to increment..."
|
echo "Waiting for sepolia balance to increment..."
|
||||||
sleep 5
|
sleep 5
|
||||||
|
|
|
||||||
44
geth-poa/util/test_whitelist.sh
Executable file
44
geth-poa/util/test_whitelist.sh
Executable file
|
|
@ -0,0 +1,44 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
echo "Usage: $0 <HYP_ERC20_ADDR>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
HYP_ERC20_ADDR="$1"
|
||||||
|
|
||||||
|
WHITELIST_ADDR=0x5D1415C0973034d162F5FEcF19B50dA057057e29
|
||||||
|
EXPECTED_OWNER=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
|
||||||
|
RPC_URL=http://localhost:8545
|
||||||
|
|
||||||
|
# Checks that contract deployed to expected address
|
||||||
|
DATA='{"jsonrpc":"2.0","method":"eth_getCode","params":["'$WHITELIST_ADDR'", "latest"],"id":1}'
|
||||||
|
RESPONSE=$(curl -s -X POST --data "$DATA" -H "Content-Type: application/json" $RPC_URL)
|
||||||
|
CODE=$(echo $RESPONSE | jq -r '.result')
|
||||||
|
if [ -z "$RESPONSE" ] || [ "$RESPONSE" == "null" ]; then
|
||||||
|
echo "Error: No response from JSON RPC at $RPC_URL"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ "$CODE" != "0x" ]; then
|
||||||
|
echo "Contract deployed at $WHITELIST_ADDR"
|
||||||
|
else
|
||||||
|
echo "No contract deployed at $WHITELIST_ADDR! geth and hyperlane hardcodes will not work"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
IS_WHITELISTED=$(cast call $WHITELIST_ADDR \
|
||||||
|
"isWhitelisted(address)(bool)" $HYP_ERC20_ADDR \
|
||||||
|
--rpc-url $RPC_URL)
|
||||||
|
if [ "$IS_WHITELISTED" == "false" ]; then
|
||||||
|
echo "Error: HYP_ERC20_ADDR $HYP_ERC20_ADDR not whitelisted"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "HYP_ERC20_ADDR $HYP_ERC20_ADDR is whitelisted"
|
||||||
|
|
||||||
|
OWNER=$(cast call $WHITELIST_ADDR \
|
||||||
|
"owner()(address)" \
|
||||||
|
--rpc-url $RPC_URL)
|
||||||
|
if [ "$OWNER" != "$EXPECTED_OWNER" ]; then
|
||||||
|
echo "Error: Whitelist owner is not $EXPECTED_OWNER"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "Whitelist owner is $EXPECTED_OWNER"
|
||||||
Loading…
Reference in a new issue