Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
N
nebula
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
exchain
nebula
Commits
6812d26e
Unverified
Commit
6812d26e
authored
Jan 25, 2022
by
Kelvin Fichter
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat(sdk): implement resendMessage
parent
1c6d89be
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
136 additions
and
9 deletions
+136
-9
cross-chain-messenger.ts
packages/sdk/src/cross-chain-messenger.ts
+37
-5
cross-chain-provider.ts
packages/sdk/src/cross-chain-provider.ts
+1
-0
types.ts
packages/sdk/src/interfaces/types.ts
+1
-0
MockMessenger.sol
packages/sdk/test/contracts/MockMessenger.sol
+18
-0
cross-chain-messenger.spec.ts
packages/sdk/test/cross-chain-messenger.spec.ts
+69
-4
cross-chain-provider.spec.ts
packages/sdk/test/cross-chain-provider.spec.ts
+10
-0
No files found.
packages/sdk/src/cross-chain-messenger.ts
View file @
6812d26e
...
...
@@ -14,6 +14,7 @@ import {
NumberLike
,
MessageDirection
,
}
from
'
./interfaces
'
import
{
omit
}
from
'
./utils
'
export
class
CrossChainMessenger
implements
ICrossChainMessenger
{
provider
:
ICrossChainProvider
...
...
@@ -43,6 +44,7 @@ export class CrossChainMessenger implements ICrossChainMessenger {
overrides
?:
L1ToL2Overrides
):
Promise
<
TransactionResponse
>
{
const
tx
=
await
this
.
populateTransaction
.
sendMessage
(
message
,
overrides
)
if
(
message
.
direction
===
MessageDirection
.
L1_TO_L2
)
{
return
this
.
l1Signer
.
sendTransaction
(
tx
)
}
else
{
...
...
@@ -55,7 +57,13 @@ export class CrossChainMessenger implements ICrossChainMessenger {
messageGasLimit
:
NumberLike
,
overrides
?:
Overrides
):
Promise
<
TransactionResponse
>
{
throw
new
Error
(
'
Not implemented
'
)
const
tx
=
await
this
.
populateTransaction
.
resendMessage
(
message
,
messageGasLimit
,
overrides
)
return
this
.
l1Signer
.
sendTransaction
(
tx
)
}
public
async
finalizeMessage
(
...
...
@@ -91,7 +99,8 @@ export class CrossChainMessenger implements ICrossChainMessenger {
message
.
target
,
message
.
message
,
overrides
?.
l2GasLimit
||
(
await
this
.
provider
.
estimateL2MessageGasLimit
(
message
))
(
await
this
.
provider
.
estimateL2MessageGasLimit
(
message
)),
omit
(
overrides
||
{},
'
l2GasLimit
'
)
)
}
else
{
return
this
.
provider
.
contracts
.
l2
.
L2CrossDomainMessenger
.
connect
(
...
...
@@ -99,7 +108,8 @@ export class CrossChainMessenger implements ICrossChainMessenger {
).
populateTransaction
.
sendMessage
(
message
.
target
,
message
.
message
,
0
// Gas limit goes unused when sending from L2 to L1
0
,
// Gas limit goes unused when sending from L2 to L1
omit
(
overrides
||
{},
'
l2GasLimit
'
)
)
}
},
...
...
@@ -109,7 +119,22 @@ export class CrossChainMessenger implements ICrossChainMessenger {
messageGasLimit
:
NumberLike
,
overrides
?:
Overrides
):
Promise
<
TransactionRequest
>
=>
{
throw
new
Error
(
'
Not implemented
'
)
const
resolved
=
await
this
.
provider
.
toCrossChainMessage
(
message
)
if
(
resolved
.
direction
===
MessageDirection
.
L2_TO_L1
)
{
throw
new
Error
(
`cannot resend L2 to L1 message`
)
}
return
this
.
provider
.
contracts
.
l1
.
L1CrossDomainMessenger
.
connect
(
this
.
l1Signer
).
populateTransaction
.
replayMessage
(
resolved
.
target
,
resolved
.
sender
,
resolved
.
message
,
resolved
.
messageNonce
,
resolved
.
gasLimit
,
messageGasLimit
,
overrides
||
{}
)
},
finalizeMessage
:
async
(
...
...
@@ -140,6 +165,7 @@ export class CrossChainMessenger implements ICrossChainMessenger {
overrides
?:
L1ToL2Overrides
):
Promise
<
BigNumber
>
=>
{
const
tx
=
await
this
.
populateTransaction
.
sendMessage
(
message
,
overrides
)
if
(
message
.
direction
===
MessageDirection
.
L1_TO_L2
)
{
return
this
.
provider
.
l1Provider
.
estimateGas
(
tx
)
}
else
{
...
...
@@ -152,7 +178,13 @@ export class CrossChainMessenger implements ICrossChainMessenger {
messageGasLimit
:
NumberLike
,
overrides
?:
Overrides
):
Promise
<
BigNumber
>
=>
{
throw
new
Error
(
'
Not implemented
'
)
const
tx
=
await
this
.
populateTransaction
.
resendMessage
(
message
,
messageGasLimit
,
overrides
)
return
this
.
provider
.
l1Provider
.
estimateGas
(
tx
)
},
finalizeMessage
:
async
(
...
...
packages/sdk/src/cross-chain-provider.ts
View file @
6812d26e
...
...
@@ -134,6 +134,7 @@ export class CrossChainProvider implements ICrossChainProvider {
sender
:
parsed
.
args
.
sender
,
message
:
parsed
.
args
.
message
,
messageNonce
:
parsed
.
args
.
messageNonce
,
gasLimit
:
parsed
.
args
.
gasLimit
,
logIndex
:
log
.
logIndex
,
blockNumber
:
log
.
blockNumber
,
transactionHash
:
log
.
transactionHash
,
...
...
packages/sdk/src/interfaces/types.ts
View file @
6812d26e
...
...
@@ -161,6 +161,7 @@ export interface CoreCrossChainMessage {
*/
export
interface
CrossChainMessage
extends
CoreCrossChainMessage
{
direction
:
MessageDirection
gasLimit
:
number
logIndex
:
number
blockNumber
:
number
transactionHash
:
string
...
...
packages/sdk/test/contracts/MockMessenger.sol
View file @
6812d26e
...
...
@@ -25,6 +25,24 @@ contract MockMessenger is ICrossDomainMessenger {
nonce++;
}
function replayMessage(
address _target,
address _sender,
bytes calldata _message,
uint256 _queueIndex,
uint32 _oldGasLimit,
uint32 _newGasLimit
) public {
emit SentMessage(
_target,
_sender,
_message,
nonce,
_newGasLimit
);
nonce++;
}
struct SentMessageEventParams {
address target;
address sender;
...
...
packages/sdk/test/cross-chain-messenger.spec.ts
View file @
6812d26e
...
...
@@ -118,12 +118,77 @@ describe('CrossChainMessenger', () => {
})
describe
(
'
resendMessage
'
,
()
=>
{
describe
(
'
when the message being resent exists
'
,
()
=>
{
it
(
'
should resend the message with the new gas limit
'
)
let
l1Messenger
:
Contract
let
l2Messenger
:
Contract
let
provider
:
CrossChainProvider
let
messenger
:
CrossChainMessenger
beforeEach
(
async
()
=>
{
l1Messenger
=
(
await
(
await
ethers
.
getContractFactory
(
'
MockMessenger
'
)
).
deploy
())
as
any
l2Messenger
=
(
await
(
await
ethers
.
getContractFactory
(
'
MockMessenger
'
)
).
deploy
())
as
any
provider
=
new
CrossChainProvider
({
l1Provider
:
ethers
.
provider
,
l2Provider
:
ethers
.
provider
,
l1ChainId
:
31337
,
contracts
:
{
l1
:
{
L1CrossDomainMessenger
:
l1Messenger
.
address
,
},
l2
:
{
L2CrossDomainMessenger
:
l2Messenger
.
address
,
},
},
})
messenger
=
new
CrossChainMessenger
({
provider
,
l1Signer
,
l2Signer
,
})
})
describe
(
'
when the message being resent does not exist
'
,
()
=>
{
it
(
'
should throw an error
'
)
describe
(
'
when resending an L1 to L2 message
'
,
()
=>
{
it
(
'
should resend the message with the new gas limit
'
,
async
()
=>
{
const
message
=
{
direction
:
MessageDirection
.
L1_TO_L2
,
target
:
'
0x
'
+
'
11
'
.
repeat
(
20
),
message
:
'
0x
'
+
'
22
'
.
repeat
(
32
),
}
const
sent
=
await
messenger
.
sendMessage
(
message
,
{
l2GasLimit
:
1234
,
})
await
expect
(
messenger
.
resendMessage
(
sent
,
10000
))
.
to
.
emit
(
l1Messenger
,
'
SentMessage
'
)
.
withArgs
(
message
.
target
,
await
l1Signer
.
getAddress
(),
message
.
message
,
1
,
// nonce is now 1
10000
)
})
})
describe
(
'
when resending an L2 to L1 message
'
,
()
=>
{
it
(
'
should throw an error
'
,
async
()
=>
{
const
message
=
{
direction
:
MessageDirection
.
L2_TO_L1
,
target
:
'
0x
'
+
'
11
'
.
repeat
(
20
),
message
:
'
0x
'
+
'
22
'
.
repeat
(
32
),
}
const
sent
=
await
messenger
.
sendMessage
(
message
,
{
l2GasLimit
:
1234
,
})
await
expect
(
messenger
.
resendMessage
(
sent
,
10000
)).
to
.
be
.
rejected
})
})
})
...
...
packages/sdk/test/cross-chain-provider.spec.ts
View file @
6812d26e
...
...
@@ -270,6 +270,7 @@ describe('CrossChainProvider', () => {
target
:
message
.
target
,
message
:
message
.
message
,
messageNonce
:
ethers
.
BigNumber
.
from
(
message
.
messageNonce
),
gasLimit
:
ethers
.
BigNumber
.
from
(
message
.
gasLimit
),
logIndex
:
i
,
blockNumber
:
tx
.
blockNumber
,
transactionHash
:
tx
.
hash
,
...
...
@@ -321,6 +322,7 @@ describe('CrossChainProvider', () => {
target
:
message
.
target
,
message
:
message
.
message
,
messageNonce
:
ethers
.
BigNumber
.
from
(
message
.
messageNonce
),
gasLimit
:
ethers
.
BigNumber
.
from
(
message
.
gasLimit
),
logIndex
:
i
,
blockNumber
:
tx
.
blockNumber
,
transactionHash
:
tx
.
hash
,
...
...
@@ -685,6 +687,7 @@ describe('CrossChainProvider', () => {
sender
:
'
0x
'
+
'
22
'
.
repeat
(
20
),
message
:
'
0x
'
+
'
33
'
.
repeat
(
64
),
messageNonce
:
1234
,
gasLimit
:
0
,
logIndex
:
0
,
blockNumber
:
1234
,
transactionHash
:
'
0x
'
+
'
44
'
.
repeat
(
32
),
...
...
@@ -1006,6 +1009,7 @@ describe('CrossChainProvider', () => {
sender
:
'
0x
'
+
'
22
'
.
repeat
(
20
),
message
:
'
0x
'
+
'
33
'
.
repeat
(
64
),
messageNonce
:
1234
,
gasLimit
:
0
,
logIndex
:
0
,
blockNumber
:
1234
,
transactionHash
:
'
0x
'
+
'
44
'
.
repeat
(
32
),
...
...
@@ -1036,6 +1040,7 @@ describe('CrossChainProvider', () => {
sender
:
'
0x
'
+
'
22
'
.
repeat
(
20
),
message
:
'
0x
'
+
'
33
'
.
repeat
(
64
),
messageNonce
:
1234
,
gasLimit
:
0
,
logIndex
:
0
,
blockNumber
:
1234
,
transactionHash
:
'
0x
'
+
'
44
'
.
repeat
(
32
),
...
...
@@ -1066,6 +1071,7 @@ describe('CrossChainProvider', () => {
sender
:
'
0x
'
+
'
22
'
.
repeat
(
20
),
message
:
'
0x
'
+
'
33
'
.
repeat
(
64
),
messageNonce
:
1234
,
gasLimit
:
0
,
logIndex
:
0
,
blockNumber
:
1234
,
transactionHash
:
'
0x
'
+
'
44
'
.
repeat
(
32
),
...
...
@@ -1101,6 +1107,7 @@ describe('CrossChainProvider', () => {
sender
:
'
0x
'
+
'
22
'
.
repeat
(
20
),
message
:
'
0x
'
+
'
33
'
.
repeat
(
64
),
messageNonce
:
1234
,
gasLimit
:
0
,
logIndex
:
0
,
blockNumber
:
1234
,
transactionHash
:
'
0x
'
+
'
44
'
.
repeat
(
32
),
...
...
@@ -1145,6 +1152,7 @@ describe('CrossChainProvider', () => {
sender
:
'
0x
'
+
'
22
'
.
repeat
(
20
),
message
:
'
0x
'
+
'
33
'
.
repeat
(
64
),
messageNonce
:
1234
,
gasLimit
:
0
,
logIndex
:
0
,
blockNumber
:
1234
,
transactionHash
:
'
0x
'
+
'
44
'
.
repeat
(
32
),
...
...
@@ -1176,6 +1184,7 @@ describe('CrossChainProvider', () => {
sender
:
'
0x
'
+
'
22
'
.
repeat
(
20
),
message
:
'
0x
'
+
'
33
'
.
repeat
(
64
),
messageNonce
:
1234
,
gasLimit
:
0
,
logIndex
:
0
,
blockNumber
:
1234
,
transactionHash
:
'
0x
'
+
'
44
'
.
repeat
(
32
),
...
...
@@ -1208,6 +1217,7 @@ describe('CrossChainProvider', () => {
sender
:
'
0x
'
+
'
22
'
.
repeat
(
20
),
message
:
'
0x
'
+
'
33
'
.
repeat
(
64
),
messageNonce
:
1234
,
gasLimit
:
0
,
logIndex
:
0
,
blockNumber
:
1234
,
transactionHash
:
'
0x
'
+
'
44
'
.
repeat
(
32
),
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment