//SPDX-License-Identifier: Unlicense// This contract runs on L1, and controls a Greeter on L2.pragmasolidity^0.8.0;
import { ICrossDomainMessenger } from"@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.sol";
contractGreeterL1 {
addresscrossDomainMessengerAddr=0x5086d1eEF304eb5284A0f6720f79403b4e9bE294;
addressgreeterL2Addr=0xC0836cCc8FBa87637e782Dde6e6572aD624fb984;
functionsetGreeting(stringcalldata_greeting) public {
bytesmemorymessage;
message=abi.encodeWithSignature("setGreeting(string)",
_greeting);
ICrossDomainMessenger(crossDomainMessengerAddr).sendMessage(
greeterL2Addr,
message,
1000000// within the free gas limit amount
);
} // function setGreeting
} // contract GreeterL1
varGreeter=artifacts.require("GreeterL1");
/** * Set L2 Greeting * Run this migration on L1 to update the L1 greeting. */module.exports=asyncfunction (deployer) {
console.log("Updating the L2 Greetings contract from L1!");
constinstance=awaitGreeter.deployed();
consttx=awaitinstance.setGreeting("Greetings from Truffle!");
console.log(`Greeter txn confirmed on L1! ${tx.receipt.transactionHash}`);
console.log(`Bridging message to L2 Greeter contract...`);
console.log(
`In about 1 minute, check the Greeter contract "read" function: https://goerli-optimism.etherscan.io/address/0xC0836cCc8FBa87637e782Dde6e6572aD624fb984#readContract`
);
};
require("dotenv").config();
constsdk=require("@eth-optimism/sdk");
constethers=require("ethers");
constGreeter=artifacts.require("GreeterL2");
constgoerliMnemonic=process.env["GOERLI_MNEMONIC"];
constinfuraKey=process.env["INFURA_KEY"];
constsleep= (milliseconds) => {
returnnewPromise((resolve) =>setTimeout(resolve, milliseconds));
};
/** * Set L1 Greeting * Run this migration on L1 to update the L1 greeting. */module.exports=asyncfunction (deployer) {
constnewGreeting="Greetings from Truffle!"; //<---- CHANGE THIS VALUE TO YOUR NAME!!!constinstance=awaitGreeter.deployed();
console.log("Updating the L1 Greetings contract from L2!");
consttx=awaitinstance.setGreeting(newGreeting);
consttxHash=tx.receipt.transactionHash;
console.log(`Greeter txn confirmed on L2! ${txHash}`);
console.log(
`Bridging message to L1 Greeter contract.\n This will take at least 1-5 min...`
);
// Set providers for Optimism sdkconstl1Provider=newethers.providers.JsonRpcProvider(
"https://goerli.infura.io/v3/"+infuraKey
);
constl2Provider=newethers.providers.JsonRpcProvider(
"https://optimism-goerli.infura.io/v3/"+infuraKey
);
// Connect an L1 signerconstwallet=ethers.Wallet.fromMnemonic(goerliMnemonic);
constl1Signer=wallet.connect(l1Provider);
// Initialize sdk messengerconstcrossChainMessenger=newsdk.CrossChainMessenger({
l1ChainId: 5,
l2ChainId: 420,
l1SignerOrProvider: l1Signer,
l2SignerOrProvider: l2Provider,
});
letstatusReady=false;
// Sleep for 1 min during L2 -> L1 bridgingawaitsleep(60000); // 60 seconds// Poll the L1 msg statuswhile (!statusReady) {
letstatus=null;
status=awaitcrossChainMessenger.getMessageStatus(txHash);
statusReady=status==sdk.MessageStatus.READY_FOR_RELAY;
if (!statusReady) {
console.log(
"Message not yet received on L1.\n Retrying in 10 seconds..."
);
awaitsleep(10000); // 10 seconds
}
}
console.log("Message received! Finalizing...");
// Open the message on L1finalize=awaitcrossChainMessenger.finalizeMessage(txHash);
console.log(
`Message finalized. Check the L1 Greeter contract "read" function: https://goerli.etherscan.io/address/0x7fA4D972bB15B71358da2D937E4A830A9084cf2e#readContract`
);
};