```anvil --port 8555 --chain-id 31338 --block-time 2 ```
```anvil --port 8545 --chain-id 31338 --block-time 2```
demo.sh
```
for CHAIN in anvil1 anvil2
do
mkdir /tmp/$CHAIN \
/tmp/$CHAIN/state \
/tmp/$CHAIN/validator \
/tmp/$CHAIN/relayer && \
chmod 777 /tmp/$CHAIN -R
done
# anvil
cast send 0x20f33CE90A13a4b5E7697E3544c3083B8F8A51D4 \
--value 5000000000000000000 \
--private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
--rpc-url http://localhost:8555
cast send 0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f \
--value 5000000000000000000 \
--private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
--rpc-url http://localhost:8555
cast send 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \
--value 5000000000000000000 \
--private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
--rpc-url http://localhost:8555
cast send 0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc \
--value 5000000000000000000 \
--private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
--rpc-url http://localhost:8555
# polaris
cast send 0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f \
--value 5000000000000000000 \
--private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
--rpc-url http://localhost:8545
cast send 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \
--value 5000000000000000000 \
--private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
--rpc-url http://localhost:8545
cast send 0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc \
--value 5000000000000000000 \
--private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
--rpc-url http://localhost:8545
sleep 4
set -e
for i in "anvil1 anvil2 --no-write-agent-config" "anvil2 anvil1 --write-agent-config"
do
set -- $i
echo "Deploying contracts to $1"
yarn ts-node scripts/deploy-hyperlane.ts --local $1 --remotes $2 \
--key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 $3
done
for i in "anvil1 http://localhost:8545 ANVIL1" "anvil2 http://localhost:8555 ANVIL2"
do
set -- $i
echo "Running validator on $1"
# Won't work on anything but linux due to -net=host
docker run --mount type=bind,source="$(pwd)/artifacts",target=/config \
--mount type=bind,source="/tmp",target=/data --net=host \
-e CONFIG_FILES=/config/agent_config.json -e HYP_VALIDATOR_ORIGINCHAINNAME=$1 \
-e HYP_VALIDATOR_REORGPERIOD=0 -e HYP_VALIDATOR_INTERVAL=1 \
-e HYP_BASE_CHAINS_${3}_CONNECTION_URL=${2} \
-e HYP_VALIDATOR_VALIDATOR_TYPE=hexKey \
-e HYP_VALIDATOR_VALIDATOR_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
-e HYP_VALIDATOR_CHECKPOINTSYNCER_TYPE=localStorage \
-e HYP_VALIDATOR_CHECKPOINTSYNCER_PATH=/data/${1}/validator \
-e HYP_BASE_TRACING_LEVEL=info -e HYP_BASE_TRACING_FMT=pretty \
gcr.io/abacus-labs-dev/hyperlane-agent:40cc4a6-20230420-080111 ./validator &
done
for i in "anvil1 8545" "anvil2 8555"
do
set -- $i
echo "Announcing validator on $1"
VALIDATOR_ANNOUNCE_ADDRESS=$(cat ./artifacts/addresses.json | jq -r ".$1.validatorAnnounce")
VALIDATOR=$(cat /tmp/$1/validator/announcement.json | jq -r '.value.validator')
STORAGE_LOCATION=$(cat /tmp/$1/validator/announcement.json | jq -r '.value.storage_location')
SIGNATURE=$(cat /tmp/$1/validator/announcement.json | jq -r '.serialized_signature')
cast send $VALIDATOR_ANNOUNCE_ADDRESS \
"announce(address, string calldata, bytes calldata)(bool)" \
$VALIDATOR $STORAGE_LOCATION $SIGNATURE --rpc-url http://localhost:$2 \
--private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
done
for i in "anvil1 anvil2 ANVIL2" "anvil2 anvil1 ANVIL1"
do
set -- $i
echo "Running relayer on $1"
docker run --mount type=bind,source="$(pwd)/artifacts",target=/config \
--mount type=bind,source="/tmp",target=/data/t2 --net=host \
-e CONFIG_FILES=/config/agent_config.json \
-e HYP_BASE_CHAINS_ANVIL1_CONNECTION_URL=http://localhost:8545 \
-e HYP_BASE_CHAINS_ANVIL2_CONNECTION_URL=http://localhost:8555 \
-e HYP_BASE_TRACING_LEVEL=info -e HYP_BASE_TRACING_FMT=pretty \
-e HYP_RELAYER_ORIGINCHAINNAME=$1 \
-e HYP_RELAYER_DESTINATIONCHAINNAMES=$2 \
-e HYP_RELAYER_ALLOWLOCALCHECKPOINTSYNCERS=true \
-e HYP_RELAYER_DB=/data/t2/$1/relayer \
-e HYP_BASE_CHAINS_${3}_SIGNER_TYPE=hexKey \
-e HYP_BASE_CHAINS_${3}_SIGNER_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
gcr.io/abacus-labs-dev/hyperlane-agent:40cc4a6-20230420-080111 ./relayer &
done
echo "Testing message sending"
yarn ts-node scripts/test-messages.ts --chains anvil2 anvil1 \
--key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --timeout 600
# docker ps -aq | xargs docker stop | xargs docker rm
```
command
```
./demo.sh
```
chain config
```
import { ChainMap, ChainMetadata, ProtocolType } from '@hyperlane-xyz/sdk';
// import { chainMetadata } from '@hyperlane-xyz/sdk';
// A map of chain names to ChainMetadata
export const chains: ChainMap<ChainMetadata> = {
// ----------- Add your chains here -----------------
anvil1: {
name: 'anvil1',
protocol: ProtocolType.Ethereum,
// anvil default chain id
chainId: 31337,
// Used to configure a Warp Route to bridge anvil1 ETH
// to anvil2 in CI tests.
nativeToken: {
name: 'ether',
symbol: 'ETH',
decimals: 18,
},
rpcUrls: [
{
http: 'http://127.0.0.1:8545',
},
],
// You can set overrides for transaction fields here
// transactionOverrides: {
// gasLimit: 1000000
// },
},
anvil2: {
name: 'anvil2',
protocol: ProtocolType.Ethereum,
chainId: 31338,
rpcUrls: [
{
http: 'http://127.0.0.1:8555',
},
],
},
// --------------------------------------------------
// You can also override the default chain metadata (completely)
// ethereum: {
// ...chainMetadata.ethereum,
// publicRpcUrls: [
// {
// http: 'my.custom.rpc.url',
// }
// ],
// }
};
```
multisig ISM
```
import { ChainMap, ModuleType, MultisigIsmConfig } from '@hyperlane-xyz/sdk';
export const multisigIsmConfig: ChainMap<MultisigIsmConfig> = {
// ----------- Your chains here -----------------
anvil1: {
type: ModuleType.LEGACY_MULTISIG,
threshold: 1,
validators: [
// Last anvil address
'0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',
],
},
anvil2: {
type: ModuleType.LEGACY_MULTISIG,
threshold: 1,
validators: [
// Last anvil address
'0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',
],
},
};
```