Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Contracts top level #422

Merged
merged 29 commits into from
Jul 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
ab29ee4
libs to top level
cam-schultz Jul 11, 2024
ba00a78
remove old libs
cam-schultz Jul 11, 2024
8612bb8
subnet-evm v0.6.2
cam-schultz Jul 11, 2024
5591ed8
update remappings
cam-schultz Jul 11, 2024
27feb51
top level foundry project
cam-schultz Jul 11, 2024
a1c1330
update forget-std ver
cam-schultz Jul 11, 2024
821c980
remove contracts/src
cam-schultz Jul 11, 2024
6a22956
update bindings
cam-schultz Jul 11, 2024
ca9155a
update paths in jobs
cam-schultz Jul 11, 2024
a6a4da9
format
cam-schultz Jul 11, 2024
ddcf620
update path
cam-schultz Jul 11, 2024
deb2569
subnet-evm v0.6.1
cam-schultz Jul 11, 2024
bdd9297
forge-std v1
cam-schultz Jul 11, 2024
4bc2441
bump foundry version
cam-schultz Jul 11, 2024
78212b2
bump foundry ver
cam-schultz Jul 12, 2024
2273773
format
cam-schultz Jul 12, 2024
6000426
update bindings
cam-schultz Jul 12, 2024
d6fd2cc
ignore test compiler warnings
cam-schultz Jul 12, 2024
16fb775
fix compiler warnings
cam-schultz Jul 17, 2024
5c88d99
lowercase dirs
cam-schultz Jul 17, 2024
1488a35
governance and utilities dirs
cam-schultz Jul 17, 2024
7b48f10
Merge branch 'main' into contracts-top-level
cam-schultz Jul 17, 2024
81ebe2c
complete merge
cam-schultz Jul 17, 2024
fc4120c
Partial Merge branch 'main' into contracts-top-level
cam-schultz Jul 26, 2024
93fe8b5
finish merge
cam-schultz Jul 26, 2024
56c416e
Merge branch 'main' into contracts-top-level
cam-schultz Jul 31, 2024
fd5b9f6
remove ignore=dirty
cam-schultz Jul 31, 2024
fb216a7
update docs path
cam-schultz Jul 31, 2024
fae3473
disable auto remapping
cam-schultz Jul 31, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ jobs:
- name: Build Contracts
run: |
export PATH=$PATH:$HOME/.foundry/bin
cd contracts/
forge build --force --extra-output-files bin

- name: Build changelog
Expand All @@ -49,12 +48,12 @@ jobs:
- name: Create Artifacts
id: artifacts
run: |
go run utils/contract-deployment/contractDeploymentTools.go constructKeylessTx contracts/out/TeleporterMessenger.sol/TeleporterMessenger.json
go run utils/contract-deployment/contractDeploymentTools.go constructKeylessTx out/TeleporterMessenger.sol/TeleporterMessenger.json
mv UniversalTeleporterDeployerTransaction.txt ${{ env.deployment_tx_fn }}
mv UniversalTeleporterDeployerAddress.txt ${{ env.deployer_addr_fn }}
mv UniversalTeleporterMessengerContractAddress.txt ${{ env.contract_addr_fn }}
mv contracts/out/TeleporterMessenger.sol/TeleporterMessenger.bin ${{ env.teleporter_messenger_bytecode_fn }}
mv contracts/out/TeleporterRegistry.sol/TeleporterRegistry.bin ${{ env.teleporter_registry_bytecode_fn }}
mv out/TeleporterMessenger.sol/TeleporterMessenger.bin ${{ env.teleporter_messenger_bytecode_fn }}
mv out/TeleporterRegistry.sol/TeleporterRegistry.bin ${{ env.teleporter_registry_bytecode_fn }}

- name: Create release
uses: softprops/action-gh-release@v2
Expand Down
3 changes: 1 addition & 2 deletions .github/workflows/slither.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,9 @@ jobs:
- name: Run Slither
run: |
export PATH=$PATH:$HOME/.foundry/bin
cd contracts
slither ./ --fail-none --sarif ./results.sarif

- name: Upload SARIF file
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: contracts/results.sarif
sarif_file: results.sarif
1 change: 0 additions & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ jobs:
- name: Run unit tests
run: |
export PATH=$PATH:$HOME/.foundry/bin
cd contracts/
forge test -vvv

go-unit-tests:
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,4 @@ server.log
*.test

# Forge documentation
contracts/docs/
docs/
23 changes: 11 additions & 12 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
[submodule "contracts/lib/forge-std"]
path = contracts/lib/forge-std
url = https://github.com/foundry-rs/forge-std
[submodule "lib/forge-std"]
branch = v1.3.0
[submodule "contracts/lib/openzeppelin-contracts"]
path = contracts/lib/openzeppelin-contracts
url = https://github.com/OpenZeppelin/openzeppelin-contracts
[submodule "contracts/lib/subnet-evm"]
path = contracts/lib/subnet-evm
url = https://github.com/ava-labs/subnet-evm
[submodule "contracts/lib/openzeppelin-contracts-upgradeable"]
path = contracts/lib/openzeppelin-contracts-upgradeable
branch = v1
path = lib/forge-std
url = https://github.com/foundry-rs/forge-std
[submodule "lib/openzeppelin-contracts"]
path = lib/openzeppelin-contracts
url = https://github.com/openzeppelin/openzeppelin-contracts
[submodule "lib/openzeppelin-contracts-upgradeable"]
path = lib/openzeppelin-contracts-upgradeable
url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable
[submodule "lib/subnet-evm"]
path = lib/subnet-evm
url = https://github.com/ava-labs/subnet-evm
File renamed without changes.
1 change: 1 addition & 0 deletions .solhintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lib/
10 changes: 4 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,11 +123,11 @@ The user wallet set in `.env` must have native tokens for each of the Subnets us

## Upgradability

The Teleporter contract is non-upgradeable and can not be changed once it is deployed. This provides immutability to the contracts, and ensures that the contract's behavior at each address is unchanging. However, to allow for new features and potential bug fixes, new versions of the Teleporter contract can be deployed to different addresses. The [TeleporterRegistry](./contracts/src/teleporter/TeleporterRegistry.sol) is used to keep track of the deployed versions of Teleporter, and to provide a standard interface for dApps to interact with the different Teleporter versions.
The Teleporter contract is non-upgradeable and can not be changed once it is deployed. This provides immutability to the contracts, and ensures that the contract's behavior at each address is unchanging. However, to allow for new features and potential bug fixes, new versions of the Teleporter contract can be deployed to different addresses. The [TeleporterRegistry](./contracts/teleporter/TeleporterRegistry.sol) is used to keep track of the deployed versions of Teleporter, and to provide a standard interface for dApps to interact with the different Teleporter versions.

`TeleporterRegistry` **is not mandatory** for dApps built on top of Teleporter, but dApp's are recommended to leverage the registry to ensure they use the latest Teleporter version available. Another recommendation standard is to have a single canonical `TeleporterRegistry` for each Subnet chain, and unlike the Teleporter contract, the registry does not need to be deployed to the same address on every chain. This means the registry does not need a Nick's method deployment, and can be at different contract addresses on different chains.

For more information on the registry and how to integrate with Teleporter dApps, see the [Upgradability doc](./contracts/src/teleporter/upgrades/README.md).
For more information on the registry and how to integrate with Teleporter dApps, see the [Upgradability doc](./contracts/teleporter/registry/README.md).

## Deploy Teleporter to a Subnet

Expand Down Expand Up @@ -178,10 +178,8 @@ The auto-generated bindings should be written under the `abi-bindings/` director

## Docs

- [Teleporter Protocol Overview](./contracts/src/teleporter/README.md)
- [Cross Chain Applications](./contracts/src/CrossChainApplications/README.md)
- [Getting Started](./contracts/src/CrossChainApplications/GETTING_STARTED.md)
- [Teleporter Upgradability](./contracts/src/teleporter/upgrades/README.md)
- [Teleporter Protocol Overview](./contracts/teleporter/README.md)
- [Teleporter Registry and Upgrades](./contracts/teleporter/registry/README.md)
- [Contract Deployment](./utils/contract-deployment/README.md)
- [Teleporter CLI](./cmd/teleporter-cli/README.md)

Expand Down
2 changes: 1 addition & 1 deletion abi-bindings/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
## ABI Bindings

This directory contains ABI bindings for the Solidity contracts in the `contracts/src/CrossChainApplications` and `contracts/src/Teleporter` directories. The files with the same name as the Solidity source files are automatically generated by the `scripts/abi_bindings.sh` script. Other files in this directory (such as the packing utilities) are manually created and maintained.
This directory contains Solidity contract ABI bindings. The files with the same name as the Solidity source files are automatically generated by the `scripts/abi_bindings.sh` script. Other files in this directory (such as the packing utilities) are manually created and maintained.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

pragma solidity 0.8.25;

import {Test} from "forge-std/Test.sol";
import {Test} from "@forge-std/Test.sol";

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

did we need this change? I think this was working previously from the auto remappings, but we could consider turning auto remappings off to be more explicit

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nvm I see that it's updated in remappings. If we're going to explicitly set it for forge-std that differs from the default, might want to consider turning off auto remapping detection

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was encountering a scenario where the auto remapping used open-zeppelin-contracts' forge-std instead of ours. IMO we should be explicit wherever possible to prevent this sort of ambiguity.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i'm in favor of copying the remappings we need, then disabling auto remapping detection

import {
ValidatorSetSig,
WarpMessage,
Expand Down
1 change: 0 additions & 1 deletion contracts/lib/forge-std
Submodule forge-std deleted from 74cfb7
1 change: 0 additions & 1 deletion contracts/lib/openzeppelin-contracts
Submodule openzeppelin-contracts deleted from dbb610
1 change: 0 additions & 1 deletion contracts/lib/openzeppelin-contracts-upgradeable
Submodule openzeppelin-contracts-upgradeable deleted from 723f8c
Empty file removed contracts/src/.solhintignore
Empty file.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,6 @@ import {ITeleporterMessenger} from "@teleporter/ITeleporterMessenger.sol";
import {TeleporterMessenger} from "@teleporter/TeleporterMessenger.sol";

abstract contract GetTeleporterMessengerTest is BaseTeleporterRegistryAppTest {
function testGetTeleporterMessengerBasic() public {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

was there a reason to move this

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

seems like a lint with the new version, did it hit a lint rule?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, the linter complained about public view functions being before public ones. solc was throwing warnings saying that this function could be marked view. I'm not sure what change prompted solc to start warning though.

ITeleporterMessenger messenger = app.getTeleporterMessenger();
assertEq(
teleporterRegistry.getVersionFromAddress(address(messenger)),
teleporterRegistry.latestVersion()
);
}

function testGetPausedTeleporterMessenger() public {
_pauseTeleporterAddressSuccess(app, teleporterAddress);
vm.expectRevert(_formatErrorMessage("Teleporter sending paused"));
Expand Down Expand Up @@ -68,4 +60,12 @@ abstract contract GetTeleporterMessengerTest is BaseTeleporterRegistryAppTest {
teleporterRegistry.latestVersion()
);
}

function testGetTeleporterMessengerBasic() public view {
ITeleporterMessenger messenger = app.getTeleporterMessenger();
assertEq(
teleporterRegistry.getVersionFromAddress(address(messenger)),
teleporterRegistry.latestVersion()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

pragma solidity 0.8.25;

import {Test} from "forge-std/Test.sol";
import {Test} from "@forge-std/Test.sol";
import {TeleporterRegistry, ProtocolRegistryEntry} from "../TeleporterRegistry.sol";
import {
TeleporterMessenger, IWarpMessenger, WarpMessage
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
pragma solidity 0.8.25;

import {TeleporterMessenger} from "../TeleporterMessenger.sol";
import {Test} from "forge-std/Test.sol";
import {Test} from "@forge-std/Test.sol";

contract CheckIsAllowedRelayerTest is TeleporterMessenger, Test {
function testIsSpecifiedAllowedRelayer() public {
function testIsSpecifiedAllowedRelayer() public pure {
address relayerAddress = 0x6288dAdf62B57dd9A4ddcd02F88A98d0eb6c2598;
address[] memory allowedRelayers = new address[](3);
allowedRelayers[0] = relayerAddress;
Expand All @@ -18,7 +18,7 @@ contract CheckIsAllowedRelayerTest is TeleporterMessenger, Test {
assertTrue(_checkIsAllowedRelayer(relayerAddress, allowedRelayers));
}

function testAnyRelayerIsAllowed() public {
function testAnyRelayerIsAllowed() public pure {
address[] memory relayerAddresses = new address[](3);
relayerAddresses[0] = 0x6288dAdf62B57dd9A4ddcd02F88A98d0eb6c2598;
relayerAddresses[1] = 0xDeaDBeEf62B57DD9a4ddcD02F88a98d0eb6C2598;
Expand All @@ -30,7 +30,7 @@ contract CheckIsAllowedRelayerTest is TeleporterMessenger, Test {
}
}

function testUnauthorizedRelayer() public {
function testUnauthorizedRelayer() public pure {
address relayerAddress = 0x6288dAdf62B57dd9A4ddcd02F88A98d0eb6c2598;
address[] memory allowedRelayers = new address[](3);
allowedRelayers[0] = 0xCaFEbabE62B57DD9A4dDcD02F88A98d0Eb6c2598;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ contract GetFeeInfoTest is TeleporterMessengerTest {
assertEq(actualFeeAmount, 0);
}

function testInvalidMessage() public {
function testInvalidMessage() public view {
bytes32 fakeMessageID = bytes32(uint256(4646));

// Get the fee info to make sure it is zero since the message doesn't exist.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,6 @@ contract GetMessageHashTest is TeleporterMessengerTest {
assertEq(actualMessageHash, expectedMessageHash);
}

function testMessageDoesNotExist() public {
assertEq(teleporterMessenger.getMessageHash(bytes32(uint256(42))), bytes32(0));
}

function testMessageAlreadyReceived() public {
// Submit a message
uint256 expectedNonce = _getNextMessageNonce();
Expand All @@ -62,4 +58,8 @@ contract GetMessageHashTest is TeleporterMessengerTest {
// Now the message hash should be cleared.
assertEq(teleporterMessenger.getMessageHash(messageID), bytes32(0));
}

function testMessageDoesNotExist() public view {
assertEq(teleporterMessenger.getMessageHash(bytes32(uint256(42))), bytes32(0));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

pragma solidity 0.8.25;

import {Test} from "forge-std/Test.sol";
import {Test} from "@forge-std/Test.sol";
import {
TeleporterMessenger,
TeleporterMessage,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ contract MessageReceivedTest is TeleporterMessengerTest {
assertEq(teleporterMessenger.messageReceived(messageID), true);
}

function testUnreceivedMessage() public {
function testUnreceivedMessage() public view {
assertEq(
teleporterMessenger.messageReceived(
teleporterMessenger.calculateMessageID(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

pragma solidity 0.8.25;

import {Test} from "forge-std/Test.sol";
import {Test} from "@forge-std/Test.sol";
import {ReceiptQueue} from "../ReceiptQueue.sol";
import {TeleporterMessageReceipt} from "../ITeleporterMessenger.sol";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

pragma solidity 0.8.25;

import {Test} from "forge-std/Test.sol";
import {Test} from "@forge-std/Test.sol";
import {
TeleporterMessenger,
TeleporterMessage,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

pragma solidity 0.8.25;

import {Test} from "forge-std/Test.sol";
import {Test} from "@forge-std/Test.sol";
import {ReentrancyGuards} from "@utilities/ReentrancyGuards.sol";

contract ReentrancyGuardsTests is Test {
Expand Down
3 changes: 2 additions & 1 deletion contracts/foundry.toml → foundry.toml
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
[profile.default]
src = 'src'
src = 'contracts'
out = 'out'
libs = ['lib']
solc_version = '0.8.25'
evm_version = 'shanghai'
test = 'tests'
bytecode_hash = "none"
auto_detect_remappings = false

[fmt]
line_length = 100
Expand Down
1 change: 1 addition & 0 deletions lib/forge-std
Submodule forge-std added at c28115
1 change: 1 addition & 0 deletions lib/openzeppelin-contracts
Submodule openzeppelin-contracts added at 659f30
1 change: 1 addition & 0 deletions lib/openzeppelin-contracts-upgradeable
7 changes: 4 additions & 3 deletions contracts/remappings.txt → remappings.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
@avalabs/[email protected]/=lib/subnet-evm/contracts/
@openzeppelin/[email protected]=lib/openzeppelin-contracts/contracts/
@openzeppelin/[email protected]=lib/openzeppelin-contracts-upgradeable/contracts/
@teleporter/=src/teleporter/
@mocks/=src/mocks/
@utilities/=src/utilities/
@forge-std=lib/forge-std/src
@teleporter/=contracts/teleporter/
@mocks/=contracts/mocks/
@utilities/=contracts/utilities/
8 changes: 4 additions & 4 deletions scripts/abi_bindings.sh
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ go install github.com/ava-labs/subnet-evm/cmd/abigen@${SUBNET_EVM_VERSION}
# Force recompile of all contracts to prevent against using previous
# compilations that did not generate new ABI files.
echo "Building Contracts"
cd $TELEPORTER_PATH/contracts
cd $TELEPORTER_PATH
forge build --force --extra-output-files abi bin

function convertToLower() {
Expand All @@ -67,12 +67,12 @@ if [[ -z "${CONTRACT_LIST}" ]]; then
contract_names=($DEFAULT_CONTRACT_LIST)
fi

cd $TELEPORTER_PATH/contracts/src
cd $TELEPORTER_PATH/contracts
for contract_name in "${contract_names[@]}"
do
path=$(find . -name $contract_name.sol)
dir=$(dirname $path)
abi_file=$TELEPORTER_PATH/contracts/out/$contract_name.sol/$contract_name.abi.json
abi_file=$TELEPORTER_PATH/out/$contract_name.sol/$contract_name.abi.json
if ! [ -f $abi_file ]; then
echo "Error: Contract $contract_name abi file not found"
exit 1
Expand All @@ -83,7 +83,7 @@ do
mkdir -p $gen_path
$GOPATH/bin/abigen --abi $abi_file \
--pkg $(convertToLower $contract_name) \
--bin $TELEPORTER_PATH/contracts/out/$contract_name.sol/$contract_name.bin \
--bin $TELEPORTER_PATH/out/$contract_name.sol/$contract_name.bin \
--type $contract_name \
--out $gen_path/$contract_name.go
echo "Done generating Go bindings for $contract_name."
Expand Down
6 changes: 3 additions & 3 deletions scripts/lint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,19 @@ source $TELEPORTER_PATH/scripts/versions.sh
function solFormat() {
# format solidity contracts
echo "Formatting Solidity contracts..."
forge fmt --root $TELEPORTER_PATH/contracts $TELEPORTER_PATH/contracts/src/**
forge fmt --root $TELEPORTER_PATH $TELEPORTER_PATH/contracts/**
}

function solFormatCheck() {
# format solidity contracts
echo "Checking formatting of Solidity contracts..."
forge fmt --check --root $TELEPORTER_PATH/contracts $TELEPORTER_PATH/contracts/src/**
forge fmt --check --root $TELEPORTER_PATH $TELEPORTER_PATH/contracts/**
}

function solLinter() {
# lint solidity contracts
echo "Linting Solidity contracts..."
cd $TELEPORTER_PATH/contracts/src
cd $TELEPORTER_PATH
# "solhint **/*.sol" runs differently than "solhint '**/*.sol'", where the latter checks sol files
# in subdirectories. The former only checks sol files in the current directory and directories one level down.
solhint '**/*.sol' --config ./.solhint.json --ignore-path ./.solhintignore --max-warnings 0
Expand Down
2 changes: 1 addition & 1 deletion scripts/local/e2e_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ echo "Copied ${BASEDIR}/subnet-evm/subnet-evm binary to ${BASEDIR}/avalanchego/p

export AVALANCHEGO_BUILD_PATH=$BASEDIR/avalanchego

cd $TELEPORTER_PATH/contracts
cd $TELEPORTER_PATH
if command -v forge &> /dev/null; then
forge build
else
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion tests/flows/teleporter_registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (
)

const (
teleporterByteCodeFile = "./contracts/out/TeleporterMessenger.sol/TeleporterMessenger.json"
teleporterByteCodeFile = "./out/TeleporterMessenger.sol/TeleporterMessenger.json"
)

func TeleporterRegistry(network interfaces.LocalNetwork) {
Expand Down
2 changes: 1 addition & 1 deletion tests/local/e2e_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import (
)

const (
teleporterByteCodeFile = "./contracts/out/TeleporterMessenger.sol/TeleporterMessenger.json"
teleporterByteCodeFile = "./out/TeleporterMessenger.sol/TeleporterMessenger.json"

warpGenesisTemplateFile = "./tests/utils/warp-genesis-template.json"

Expand Down
2 changes: 1 addition & 1 deletion utils/contract-deployment/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ OR
`go run utils/contract-deployment/contractDeploymentTools.go deriveContractAddress <DEPLOYER_ADDRESS> <NONCE>`

For example:
`go run utils/contract-deployment/contractDeploymentTools.go constructKeylessTx contracts/out/TeleporterMessenger.sol/TeleporterMessenger.json`
`go run utils/contract-deployment/contractDeploymentTools.go constructKeylessTx out/TeleporterMessenger.sol/TeleporterMessenger.json`
OR
`go run utils/contract-deployment/contractDeploymentTools.go deriveContractAddress 0x38545c4b331D8BFb3bee94C62D77a6735b5eF8c0 1`

Expand Down