Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
28 changes: 28 additions & 0 deletions contracts/contracts/IScrollMessenger.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.18;

interface IScrollMessenger {
/**********
* Events *
**********/

/// @notice Emitted when a cross domain message is sent.
event SentMessage(
uint256 tokenId,
address to
);

/// @notice Return the sender of a cross domain message.
function xDomainMessageSender() external view returns (address);

/****************************
* Public Mutated Functions *
****************************/

/// @notice Send cross chain message from L1 to L2 or L2 to L1.
function sendMessage(
uint256 tokenId,
address to

) external payable;
}
28 changes: 28 additions & 0 deletions contracts/contracts/L1Contract.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.18;

import "./IScrollMessenger.sol";

// interface IL2Contract {
// function setGreeting(string memory _greeting) external;
// }

contract L1Contract {
address l1Messenger;


constructor(address _l1Messenger) {
l1Messenger = _l1Messenger;
}

function sendMessage(uint256 _tokenId, address _to) payable public {
// uint256 _gasLimit = 100000;
// bytes memory _message = abi.encodeWithSelector(
// IL2Contract.setGreeting.selector,
// _tokenId,
// _to
// );

IScrollMessenger(l1Messenger).sendMessage{ value: msg.value }(_tokenId, _to);
}
}
38 changes: 38 additions & 0 deletions contracts/contracts/L2Contract.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.18;

import "./IScrollMessenger.sol";

contract L2Contract {
string private greeting;
address l1Contract;
address l2Messenger;
uint256 public tokenId;
address public to;

event ReceiveMessage(
uint256 _tokentId,
address _to
);

constructor(address _l1Contract, address _l2Messenger) {
l1Contract = _l1Contract;
l2Messenger = _l2Messenger;
}

function greet() public view returns (string memory) {
return greeting;
}

function receiveMessage( uint256 _tokenId,address _to) public {
tokenId = _tokenId;
to = _to;
emit ReceiveMessage(_tokenId,_to);
}

function setGreeting(string memory _greeting) public {
require(msg.sender == l2Messenger);
require(l1Contract == IScrollMessenger(l2Messenger).xDomainMessageSender());
greeting = _greeting;
}
}
10 changes: 10 additions & 0 deletions contracts/deploy/L1Contract.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
module.exports = async ({ getNamedAccounts, deployments }) => {
const { deploy } = deployments;
const { deployer } = await getNamedAccounts();
await deploy('L1Contract', {
from: deployer,
args: ['0x5260e38080BFe97e6C4925d9209eCc5f964373b6'],
log: true,
});
};
module.exports.tags = ['L1Contract'];
10 changes: 10 additions & 0 deletions contracts/deploy/L2Contract.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
module.exports = async ({ getNamedAccounts, deployments }) => {
const { deploy } = deployments;
const { deployer } = await getNamedAccounts();
await deploy('L2Contract', {
from: deployer,
args: ['0x24F05AAc6837727012226B5c0Bf87BdeF3ae97A4','0xb75d7e84517e1504C151B270255B087Fd746D34C'],
log: true,
});
};
module.exports.tags = ['L2Contract'];
87 changes: 87 additions & 0 deletions contracts/deployments/goerli/L1Contract.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
{
"address": "0x24F05AAc6837727012226B5c0Bf87BdeF3ae97A4",
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "_l1Messenger",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_tokenId",
"type": "uint256"
},
{
"internalType": "address",
"name": "_to",
"type": "address"
}
],
"name": "sendMessage",
"outputs": [],
"stateMutability": "payable",
"type": "function"
}
],
"transactionHash": "0xfdff7b391091ee16427280f527340ad54bfa36d9522bd3c5415f5d513bed1b94",
"receipt": {
"to": null,
"from": "0x03f4e5405730477629319B6A059325403f801E90",
"contractAddress": "0x24F05AAc6837727012226B5c0Bf87BdeF3ae97A4",
"transactionIndex": 45,
"gasUsed": "198804",
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"blockHash": "0xd1c049c1298edf36447f516bf04357d486ed992455ba1ad93d30971fe1b94263",
"transactionHash": "0xfdff7b391091ee16427280f527340ad54bfa36d9522bd3c5415f5d513bed1b94",
"logs": [],
"blockNumber": 8774795,
"cumulativeGasUsed": "6600653",
"status": 1,
"byzantium": true
},
"args": [
"0x5260e38080BFe97e6C4925d9209eCc5f964373b6"
],
"numDeployments": 9,
"solcInputHash": "d573f576e60495a7dc03c91d9fad4e3e",
"metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Messenger\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1Contract.sol\":\"L1Contract\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/IScrollMessenger.sol\":{\"content\":\"//SPDX-License-Identifier: Unlicense\\npragma solidity ^0.8.18;\\n\\ninterface IScrollMessenger {\\n /**********\\n * Events *\\n **********/\\n\\n /// @notice Emitted when a cross domain message is sent.\\n event SentMessage(\\n uint256 tokenId,\\n address to\\n );\\n\\n /// @notice Return the sender of a cross domain message.\\n function xDomainMessageSender() external view returns (address);\\n\\n /****************************\\n * Public Mutated Functions *\\n ****************************/\\n\\n /// @notice Send cross chain message from L1 to L2 or L2 to L1.\\n function sendMessage(\\n uint256 tokenId,\\n address to\\n\\n ) external payable;\\n}\",\"keccak256\":\"0x1e329abf05935a84a5b446ac1d791e94b7c0f2aaeccd6d3a8003bf402bb64648\",\"license\":\"Unlicense\"},\"contracts/L1Contract.sol\":{\"content\":\"//SPDX-License-Identifier: Unlicense\\npragma solidity ^0.8.18;\\n\\nimport \\\"./IScrollMessenger.sol\\\";\\n\\n// interface IL2Contract {\\n// function setGreeting(string memory _greeting) external;\\n// }\\n\\ncontract L1Contract {\\n address l1Messenger;\\n \\n\\n constructor(address _l1Messenger) {\\n l1Messenger = _l1Messenger;\\n }\\n\\n function sendMessage(uint256 _tokenId, address _to) payable public {\\n // uint256 _gasLimit = 100000;\\n // bytes memory _message = abi.encodeWithSelector(\\n // IL2Contract.setGreeting.selector,\\n // _tokenId,\\n // _to\\n // );\\n\\n IScrollMessenger(l1Messenger).sendMessage{ value: msg.value }(_tokenId, _to); \\n }\\n}\\n\",\"keccak256\":\"0xea85eacd4c1f8577deb6728f94a279a7b24bab2014cb0505c2084df4e830d683\",\"license\":\"Unlicense\"}},\"version\":1}",
"bytecode": "0x608060405234801561001057600080fd5b5060405161033e38038061033e833981810160405281019061003291906100db565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610108565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100a88261007d565b9050919050565b6100b88161009d565b81146100c357600080fd5b50565b6000815190506100d5816100af565b92915050565b6000602082840312156100f1576100f0610078565b5b60006100ff848285016100c6565b91505092915050565b610227806101176000396000f3fe60806040526004361061001e5760003560e01c80634fb0ffa414610023575b600080fd5b61003d6004803603810190610038919061016a565b61003f565b005b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634fb0ffa43484846040518463ffffffff1660e01b815260040161009b9291906101c8565b6000604051808303818588803b1580156100b457600080fd5b505af11580156100c8573d6000803e3d6000fd5b50505050505050565b600080fd5b6000819050919050565b6100e9816100d6565b81146100f457600080fd5b50565b600081359050610106816100e0565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101378261010c565b9050919050565b6101478161012c565b811461015257600080fd5b50565b6000813590506101648161013e565b92915050565b60008060408385031215610181576101806100d1565b5b600061018f858286016100f7565b92505060206101a085828601610155565b9150509250929050565b6101b3816100d6565b82525050565b6101c28161012c565b82525050565b60006040820190506101dd60008301856101aa565b6101ea60208301846101b9565b939250505056fea264697066735822122098a99e87cc7ac0a44415776f071447193339b273e6bcf032e46bc58a73982d6464736f6c63430008120033",
"deployedBytecode": "0x60806040526004361061001e5760003560e01c80634fb0ffa414610023575b600080fd5b61003d6004803603810190610038919061016a565b61003f565b005b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634fb0ffa43484846040518463ffffffff1660e01b815260040161009b9291906101c8565b6000604051808303818588803b1580156100b457600080fd5b505af11580156100c8573d6000803e3d6000fd5b50505050505050565b600080fd5b6000819050919050565b6100e9816100d6565b81146100f457600080fd5b50565b600081359050610106816100e0565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101378261010c565b9050919050565b6101478161012c565b811461015257600080fd5b50565b6000813590506101648161013e565b92915050565b60008060408385031215610181576101806100d1565b5b600061018f858286016100f7565b92505060206101a085828601610155565b9150509250929050565b6101b3816100d6565b82525050565b6101c28161012c565b82525050565b60006040820190506101dd60008301856101aa565b6101ea60208301846101b9565b939250505056fea264697066735822122098a99e87cc7ac0a44415776f071447193339b273e6bcf032e46bc58a73982d6464736f6c63430008120033",
"devdoc": {
"kind": "dev",
"methods": {},
"version": 1
},
"userdoc": {
"kind": "user",
"methods": {},
"version": 1
},
"storageLayout": {
"storage": [
{
"astId": 28,
"contract": "contracts/L1Contract.sol:L1Contract",
"label": "l1Messenger",
"offset": 0,
"slot": "0",
"type": "t_address"
}
],
"types": {
"t_address": {
"encoding": "inplace",
"label": "address",
"numberOfBytes": "20"
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"language": "Solidity",
"sources": {
"contracts/L1Contract.sol": {
"content": "//SPDX-License-Identifier: Unlicense\npragma solidity ^0.8.18;\n\nimport \"./L2Contract.sol\";\n\ncontract L1Contract {\n address l2Messenger = 0xeC48b843169a07E9D1076f7785920D661bA684C2;\n\n event SendMessage(\n uint256 tokenId, \n address _to\n );\n\n constructor() {}\n\n function sendMessage(uint256 _tokenId) public{\n emit SendMessage(_tokenId, l2Messenger);\n L2Contract(l2Messenger).receiveMessage(_tokenId, l2Messenger);\n }\n}"
},
"contracts/L2Contract.sol": {
"content": "//SPDX-License-Identifier: Unlicense\npragma solidity ^0.8.18;\n\ncontract L2Contract {\n \n event ReceivedMessage(\n uint256 _tokentId,\n address _to\n );\n\n constructor() {}\n \n\n function receiveMessage( uint256 _tokenId,address _to) public {\n emit ReceivedMessage(_tokenId,_to);\n }\n}"
}
},
"settings": {
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"abi",
"evm.bytecode",
"evm.deployedBytecode",
"evm.methodIdentifiers",
"metadata",
"devdoc",
"userdoc",
"storageLayout",
"evm.gasEstimates"
],
"": [
"ast"
]
}
},
"metadata": {
"useLiteralContent": true
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"language": "Solidity",
"sources": {
"contracts/L1Contract.sol": {
"content": "//SPDX-License-Identifier: Unlicense\npragma solidity ^0.8.18;\n\nimport \"./L2Contract.sol\";\n\ncontract L1Contract {\n address l2Messenger = 0xeC48b843169a07E9D1076f7785920D661bA684C2;\n\n event SendMessage(\n uint256 tokenId, \n address _to\n );\n\n constructor() {}\n\n function sendMessage(uint256 _tokenId) external payable{\n emit SendMessage(_tokenId, l2Messenger);\n L2Contract(l2Messenger).receiveMessage(_tokenId, l2Messenger);\n }\n}"
},
"contracts/L2Contract.sol": {
"content": "//SPDX-License-Identifier: Unlicense\npragma solidity ^0.8.18;\n\ncontract L2Contract {\n \n event ReceivedMessage(\n uint256 _tokentId,\n address _to\n );\n\n constructor() {}\n \n\n function receiveMessage( uint256 _tokenId,address _to) public {\n emit ReceivedMessage(_tokenId,_to);\n }\n}"
}
},
"settings": {
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"abi",
"evm.bytecode",
"evm.deployedBytecode",
"evm.methodIdentifiers",
"metadata",
"devdoc",
"userdoc",
"storageLayout",
"evm.gasEstimates"
],
"": [
"ast"
]
}
},
"metadata": {
"useLiteralContent": true
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"language": "Solidity",
"sources": {
"contracts/L1Contract.sol": {
"content": "//SPDX-License-Identifier: Unlicense\npragma solidity ^0.8.18;\n\nimport \"./L2Contract.sol\";\n\ninterface IL2Contract {\n function receiveMessage(\n uint256 _tokenId,\n address _to,\n uint256 gasLimit\n ) external ;\n}\n\ncontract L1Contract {\n address l2Messenger = 0xeC48b843169a07E9D1076f7785920D661bA684C2;\n\n event SendMessage(\n uint256 tokenId, \n address _to\n );\n\n constructor() {}\n\n function sendMessage(uint256 _tokenId) external{\n uint256 _gasLimit = 100;\n IL2Contract(l2Messenger).receiveMessage(_tokenId,l2Messenger, _gasLimit);\n emit SendMessage(_tokenId, l2Messenger);\n }\n}"
},
"contracts/L2Contract.sol": {
"content": "//SPDX-License-Identifier: Unlicense\npragma solidity ^0.8.18;\n\ncontract L2Contract {\n \n event ReceivedMessage(\n uint256 _tokentId,\n address _to\n );\n\n constructor() {}\n \n\n function receiveMessage( uint256 _tokenId,address _to) public {\n emit ReceivedMessage(_tokenId,_to);\n }\n}"
}
},
"settings": {
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"abi",
"evm.bytecode",
"evm.deployedBytecode",
"evm.methodIdentifiers",
"metadata",
"devdoc",
"userdoc",
"storageLayout",
"evm.gasEstimates"
],
"": [
"ast"
]
}
},
"metadata": {
"useLiteralContent": true
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"language": "Solidity",
"sources": {
"contracts/L1Contract.sol": {
"content": "//SPDX-License-Identifier: Unlicense\npragma solidity ^0.8.18;\n\nimport \"./L2Contract.sol\";\n\ncontract L1Contract {\n address l2Messenger = 0xeC48b843169a07E9D1076f7785920D661bA684C2;\n\n event SendMessage(\n uint256 tokenId, \n address _to\n );\n\n constructor() {}\n\n function sendMessage(uint256 _tokenId) payable external{\n L2Contract(l2Messenger).receiveMessage(_tokenId,l2Messenger);\n emit SendMessage(_tokenId, l2Messenger);\n }\n}"
},
"contracts/L2Contract.sol": {
"content": "//SPDX-License-Identifier: Unlicense\npragma solidity ^0.8.18;\n\ncontract L2Contract {\n \n event ReceivedMessage(\n uint256 _tokentId,\n address _to\n );\n\n constructor() {}\n \n\n function receiveMessage( uint256 _tokenId,address _to) public {\n emit ReceivedMessage(_tokenId,_to);\n }\n}"
}
},
"settings": {
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"abi",
"evm.bytecode",
"evm.deployedBytecode",
"evm.methodIdentifiers",
"metadata",
"devdoc",
"userdoc",
"storageLayout",
"evm.gasEstimates"
],
"": [
"ast"
]
}
},
"metadata": {
"useLiteralContent": true
}
}
}
Loading