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
a559b220
Unverified
Commit
a559b220
authored
Mar 15, 2023
by
mergify[bot]
Committed by
GitHub
Mar 15, 2023
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop' into refcell/batcher/config
parents
16b76dfa
17281374
Changes
12
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
552 additions
and
449 deletions
+552
-449
api.go
op-node/node/api.go
+11
-1
output_root.go
op-node/rollup/output_root.go
+15
-18
.gas-snapshot
packages/contracts-bedrock/.gas-snapshot
+2
-2
.gitignore
packages/contracts-bedrock/.gitignore
+1
-0
CommonTest.t.sol
packages/contracts-bedrock/contracts/test/CommonTest.t.sol
+71
-79
Encoding.t.sol
packages/contracts-bedrock/contracts/test/Encoding.t.sol
+1
-1
Hashing.t.sol
packages/contracts-bedrock/contracts/test/Hashing.t.sol
+1
-1
package.json
packages/contracts-bedrock/package.json
+1
-3
differential-testing.ts
packages/contracts-bedrock/scripts/differential-testing.ts
+0
-229
differential-testing.go
...rock/scripts/differential-testing/differential-testing.go
+318
-0
utils.go
...s/contracts-bedrock/scripts/differential-testing/utils.go
+129
-0
yarn.lock
yarn.lock
+2
-115
No files found.
op-node/node/api.go
View file @
a559b220
...
...
@@ -9,6 +9,7 @@ import (
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
"github.com/ethereum-optimism/optimism/op-node/eth"
"github.com/ethereum-optimism/optimism/op-node/rollup"
...
...
@@ -114,7 +115,16 @@ func (n *nodeAPI) OutputAtBlock(ctx context.Context, number hexutil.Uint64) (*et
}
var
l2OutputRootVersion
eth
.
Bytes32
// it's zero for now
l2OutputRoot
:=
rollup
.
ComputeL2OutputRoot
(
l2OutputRootVersion
,
head
.
Hash
(),
head
.
Root
(),
proof
.
StorageHash
)
l2OutputRoot
,
err
:=
rollup
.
ComputeL2OutputRoot
(
&
bindings
.
TypesOutputRootProof
{
Version
:
l2OutputRootVersion
,
StateRoot
:
head
.
Root
(),
MessagePasserStorageRoot
:
proof
.
StorageHash
,
LatestBlockhash
:
head
.
Hash
(),
})
if
err
!=
nil
{
n
.
log
.
Error
(
"Error computing L2 output root, nil ptr passed to hashing function"
)
return
nil
,
err
}
return
&
eth
.
OutputResponse
{
Version
:
l2OutputRootVersion
,
...
...
op-node/rollup/output_root.go
View file @
a559b220
package
rollup
import
(
"errors"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum-optimism/optimism/op-node/eth"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
)
// ComputeL2OutputRoot computes the L2 output root
func
ComputeL2OutputRoot
(
l2OutputRootVersion
eth
.
Bytes32
,
blockHash
common
.
Hash
,
blockRoot
common
.
Hash
,
storageRoot
common
.
Hash
)
eth
.
Bytes32
{
digest
:=
crypto
.
Keccak256Hash
(
l2OutputRootVersion
[
:
],
blockRoot
.
Bytes
(),
storageRoot
[
:
],
blockHash
.
Bytes
(),
)
return
eth
.
Bytes32
(
digest
)
}
var
NilProof
=
errors
.
New
(
"Output root proof is nil"
)
// ComputeL2OutputRoot computes the L2 output root by hashing an output root proof.
func
ComputeL2OutputRoot
(
proofElements
*
bindings
.
TypesOutputRootProof
)
(
eth
.
Bytes32
,
error
)
{
if
proofElements
==
nil
{
return
eth
.
Bytes32
{},
NilProof
}
// HashOutputRootProof computes the hash of the output root proof
func
HashOutputRootProof
(
proof
*
bindings
.
TypesOutputRootProof
)
eth
.
Bytes32
{
return
ComputeL2OutputRoot
(
proof
.
Version
,
proof
.
StateRoot
,
proof
.
MessagePasserStorageRoot
,
proof
.
LatestBlockhash
,
digest
:=
crypto
.
Keccak256Hash
(
proofElements
.
Version
[
:
],
proofElements
.
StateRoot
[
:
],
proofElements
.
MessagePasserStorageRoot
[
:
],
proofElements
.
LatestBlockhash
[
:
],
)
return
eth
.
Bytes32
(
digest
),
nil
}
packages/contracts-bedrock/.gas-snapshot
View file @
a559b220
...
...
@@ -266,9 +266,9 @@ OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutp
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutputTimestampIsNotFinalized_reverts() (gas: 207520)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifWithdrawalNotProven_reverts() (gas: 41753)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifWithdrawalProofNotOldEnough_reverts() (gas: 199464)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onInsufficientGas_reverts() (gas: 20
6360
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onInsufficientGas_reverts() (gas: 20
5818
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onRecentWithdrawal_reverts() (gas: 180229)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onReentrancy_reverts() (gas: 24
4377
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onReentrancy_reverts() (gas: 24
3835
)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onReplay_reverts() (gas: 245528)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_paused_reverts() (gas: 53555)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_provenWithdrawalHash_succeeds() (gas: 234941)
...
...
packages/contracts-bedrock/.gitignore
View file @
a559b220
...
...
@@ -12,3 +12,4 @@ deployments/mainnet-forked
deploy-config/mainnet-forked.json
test-case-generator/fuzz
.resource-metering.csv
scripts/differential-testing/differential-testing
packages/contracts-bedrock/contracts/test/CommonTest.t.sol
View file @
a559b220
...
...
@@ -477,16 +477,15 @@ contract FFIInterface is Test {
bytes[] memory
)
{
string[] memory cmds = new string[](9);
cmds[0] = "node";
cmds[1] = "dist/scripts/differential-testing.js";
cmds[2] = "getProveWithdrawalTransactionInputs";
cmds[3] = vm.toString(_tx.nonce);
cmds[4] = vm.toString(_tx.sender);
cmds[5] = vm.toString(_tx.target);
cmds[6] = vm.toString(_tx.value);
cmds[7] = vm.toString(_tx.gasLimit);
cmds[8] = vm.toString(_tx.data);
string[] memory cmds = new string[](8);
cmds[0] = "scripts/differential-testing/differential-testing";
cmds[1] = "getProveWithdrawalTransactionInputs";
cmds[2] = vm.toString(_tx.nonce);
cmds[3] = vm.toString(_tx.sender);
cmds[4] = vm.toString(_tx.target);
cmds[5] = vm.toString(_tx.value);
cmds[6] = vm.toString(_tx.gasLimit);
cmds[7] = vm.toString(_tx.data);
bytes memory result = vm.ffi(cmds);
(
...
...
@@ -508,16 +507,15 @@ contract FFIInterface is Test {
uint256 _gasLimit,
bytes memory _data
) external returns (bytes32) {
string[] memory cmds = new string[](9);
cmds[0] = "node";
cmds[1] = "dist/scripts/differential-testing.js";
cmds[2] = "hashCrossDomainMessage";
cmds[3] = vm.toString(_nonce);
cmds[4] = vm.toString(_sender);
cmds[5] = vm.toString(_target);
cmds[6] = vm.toString(_value);
cmds[7] = vm.toString(_gasLimit);
cmds[8] = vm.toString(_data);
string[] memory cmds = new string[](8);
cmds[0] = "scripts/differential-testing/differential-testing";
cmds[1] = "hashCrossDomainMessage";
cmds[2] = vm.toString(_nonce);
cmds[3] = vm.toString(_sender);
cmds[4] = vm.toString(_target);
cmds[5] = vm.toString(_value);
cmds[6] = vm.toString(_gasLimit);
cmds[7] = vm.toString(_data);
bytes memory result = vm.ffi(cmds);
return abi.decode(result, (bytes32));
...
...
@@ -531,16 +529,15 @@ contract FFIInterface is Test {
uint256 _gasLimit,
bytes memory _data
) external returns (bytes32) {
string[] memory cmds = new string[](9);
cmds[0] = "node";
cmds[1] = "dist/scripts/differential-testing.js";
cmds[2] = "hashWithdrawal";
cmds[3] = vm.toString(_nonce);
cmds[4] = vm.toString(_sender);
cmds[5] = vm.toString(_target);
cmds[6] = vm.toString(_value);
cmds[7] = vm.toString(_gasLimit);
cmds[8] = vm.toString(_data);
string[] memory cmds = new string[](8);
cmds[0] = "scripts/differential-testing/differential-testing";
cmds[1] = "hashWithdrawal";
cmds[2] = vm.toString(_nonce);
cmds[3] = vm.toString(_sender);
cmds[4] = vm.toString(_target);
cmds[5] = vm.toString(_value);
cmds[6] = vm.toString(_gasLimit);
cmds[7] = vm.toString(_data);
bytes memory result = vm.ffi(cmds);
return abi.decode(result, (bytes32));
...
...
@@ -552,14 +549,13 @@ contract FFIInterface is Test {
bytes32 _messagePasserStorageRoot,
bytes32 _latestBlockhash
) external returns (bytes32) {
string[] memory cmds = new string[](7);
cmds[0] = "node";
cmds[1] = "dist/scripts/differential-testing.js";
cmds[2] = "hashOutputRootProof";
cmds[3] = Strings.toHexString(uint256(_version));
cmds[4] = Strings.toHexString(uint256(_stateRoot));
cmds[5] = Strings.toHexString(uint256(_messagePasserStorageRoot));
cmds[6] = Strings.toHexString(uint256(_latestBlockhash));
string[] memory cmds = new string[](6);
cmds[0] = "scripts/differential-testing/differential-testing";
cmds[1] = "hashOutputRootProof";
cmds[2] = Strings.toHexString(uint256(_version));
cmds[3] = Strings.toHexString(uint256(_stateRoot));
cmds[4] = Strings.toHexString(uint256(_messagePasserStorageRoot));
cmds[5] = Strings.toHexString(uint256(_latestBlockhash));
bytes memory result = vm.ffi(cmds);
return abi.decode(result, (bytes32));
...
...
@@ -572,20 +568,19 @@ contract FFIInterface is Test {
uint256 _value,
uint64 _gas,
bytes memory _data,
uint
256
_logIndex
uint
64
_logIndex
) external returns (bytes32) {
string[] memory cmds = new string[](11);
cmds[0] = "node";
cmds[1] = "dist/scripts/differential-testing.js";
cmds[2] = "hashDepositTransaction";
cmds[3] = "0x0000000000000000000000000000000000000000000000000000000000000000";
cmds[4] = vm.toString(_logIndex);
cmds[5] = vm.toString(_from);
cmds[6] = vm.toString(_to);
cmds[7] = vm.toString(_mint);
cmds[8] = vm.toString(_value);
cmds[9] = vm.toString(_gas);
cmds[10] = vm.toString(_data);
string[] memory cmds = new string[](10);
cmds[0] = "scripts/differential-testing/differential-testing";
cmds[1] = "hashDepositTransaction";
cmds[2] = "0x0000000000000000000000000000000000000000000000000000000000000000";
cmds[3] = vm.toString(_logIndex);
cmds[4] = vm.toString(_from);
cmds[5] = vm.toString(_to);
cmds[6] = vm.toString(_mint);
cmds[7] = vm.toString(_value);
cmds[8] = vm.toString(_gas);
cmds[9] = vm.toString(_data);
bytes memory result = vm.ffi(cmds);
return abi.decode(result, (bytes32));
...
...
@@ -595,19 +590,18 @@ contract FFIInterface is Test {
external
returns (bytes memory)
{
string[] memory cmds = new string[](12);
cmds[0] = "node";
cmds[1] = "dist/scripts/differential-testing.js";
cmds[2] = "encodeDepositTransaction";
cmds[3] = vm.toString(txn.from);
cmds[4] = vm.toString(txn.to);
cmds[5] = vm.toString(txn.value);
cmds[6] = vm.toString(txn.mint);
cmds[7] = vm.toString(txn.gasLimit);
cmds[8] = vm.toString(txn.isCreation);
cmds[9] = vm.toString(txn.data);
cmds[10] = vm.toString(txn.l1BlockHash);
cmds[11] = vm.toString(txn.logIndex);
string[] memory cmds = new string[](11);
cmds[0] = "scripts/differential-testing/differential-testing";
cmds[1] = "encodeDepositTransaction";
cmds[2] = vm.toString(txn.from);
cmds[3] = vm.toString(txn.to);
cmds[4] = vm.toString(txn.value);
cmds[5] = vm.toString(txn.mint);
cmds[6] = vm.toString(txn.gasLimit);
cmds[7] = vm.toString(txn.isCreation);
cmds[8] = vm.toString(txn.data);
cmds[9] = vm.toString(txn.l1BlockHash);
cmds[10] = vm.toString(txn.logIndex);
bytes memory result = vm.ffi(cmds);
return abi.decode(result, (bytes));
...
...
@@ -621,27 +615,25 @@ contract FFIInterface is Test {
uint256 _gasLimit,
bytes memory _data
) external returns (bytes memory) {
string[] memory cmds = new string[](9);
cmds[0] = "node";
cmds[1] = "dist/scripts/differential-testing.js";
cmds[2] = "encodeCrossDomainMessage";
cmds[3] = vm.toString(_nonce);
cmds[4] = vm.toString(_sender);
cmds[5] = vm.toString(_target);
cmds[6] = vm.toString(_value);
cmds[7] = vm.toString(_gasLimit);
cmds[8] = vm.toString(_data);
string[] memory cmds = new string[](8);
cmds[0] = "scripts/differential-testing/differential-testing";
cmds[1] = "encodeCrossDomainMessage";
cmds[2] = vm.toString(_nonce);
cmds[3] = vm.toString(_sender);
cmds[4] = vm.toString(_target);
cmds[5] = vm.toString(_value);
cmds[6] = vm.toString(_gasLimit);
cmds[7] = vm.toString(_data);
bytes memory result = vm.ffi(cmds);
return abi.decode(result, (bytes));
}
function decodeVersionedNonce(uint256 nonce) external returns (uint256, uint256) {
string[] memory cmds = new string[](4);
cmds[0] = "node";
cmds[1] = "dist/scripts/differential-testing.js";
cmds[2] = "decodeVersionedNonce";
cmds[3] = vm.toString(nonce);
string[] memory cmds = new string[](3);
cmds[0] = "scripts/differential-testing/differential-testing";
cmds[1] = "decodeVersionedNonce";
cmds[2] = vm.toString(nonce);
bytes memory result = vm.ffi(cmds);
return abi.decode(result, (uint256, uint256));
...
...
packages/contracts-bedrock/contracts/test/Encoding.t.sol
View file @
a559b220
...
...
@@ -91,7 +91,7 @@ contract Encoding_Test is CommonTest {
uint64 _gas,
bool isCreate,
bytes memory _data,
uint
256
_logIndex
uint
64
_logIndex
) external {
Types.UserDepositTransaction memory t = Types.UserDepositTransaction(
_from,
...
...
packages/contracts-bedrock/contracts/test/Hashing.t.sol
View file @
a559b220
...
...
@@ -129,7 +129,7 @@ contract Hashing_hashDepositTransaction_Test is CommonTest {
uint256 _value,
uint64 _gas,
bytes memory _data,
uint
256
_logIndex
uint
64
_logIndex
) external {
assertEq(
Hashing.hashDepositTransaction(
...
...
packages/contracts-bedrock/package.json
View file @
a559b220
...
...
@@ -17,7 +17,7 @@
"bindings"
:
"cd ../../op-bindings && make"
,
"build:forge"
:
"forge build"
,
"build:with-metadata"
:
"FOUNDRY_PROFILE=echidna yarn build:forge"
,
"build:differential"
:
"
tsc scripts/differential-testing.ts --outDir dist --moduleResolution node --esModuleInterop
"
,
"build:differential"
:
"
go build -o ./scripts/differential-testing/differential-testing ./scripts/differential-testing
"
,
"build:fuzz"
:
"(cd test-case-generator && go build ./cmd/fuzz.go)"
,
"prebuild"
:
"yarn ts-node scripts/verify-foundry-install.ts"
,
"build"
:
"hardhat compile && yarn autogen:artifacts && yarn build:ts && yarn typechain"
,
...
...
@@ -59,8 +59,6 @@
},
"devDependencies"
:
{
"@eth-optimism/hardhat-deploy-config"
:
"^0.2.5"
,
"@ethereumjs/trie"
:
"^5.0.0-beta.1"
,
"@ethereumjs/util"
:
"^8.0.0-beta.1"
,
"@ethersproject/abstract-provider"
:
"^5.7.0"
,
"@ethersproject/abstract-signer"
:
"^5.7.0"
,
"ethereumjs-wallet"
:
"^1.0.2"
,
...
...
packages/contracts-bedrock/scripts/differential-testing.ts
deleted
100644 → 0
View file @
16b76dfa
import
{
BigNumber
,
utils
,
constants
}
from
'
ethers
'
import
{
decodeVersionedNonce
,
hashCrossDomainMessage
,
DepositTx
,
SourceHashDomain
,
encodeCrossDomainMessage
,
hashWithdrawal
,
hashOutputRootProof
,
}
from
'
@eth-optimism/core-utils
'
import
{
SecureTrie
}
from
'
@ethereumjs/trie
'
import
{
Account
,
Address
,
toBuffer
,
bufferToHex
}
from
'
@ethereumjs/util
'
import
{
predeploys
}
from
'
../src
'
const
{
hexZeroPad
,
keccak256
}
=
utils
const
args
=
process
.
argv
.
slice
(
2
)
const
command
=
args
[
0
]
;(
async
()
=>
{
switch
(
command
)
{
case
'
decodeVersionedNonce
'
:
{
const
input
=
BigNumber
.
from
(
args
[
1
])
const
{
nonce
,
version
}
=
decodeVersionedNonce
(
input
)
const
output
=
utils
.
defaultAbiCoder
.
encode
(
[
'
uint256
'
,
'
uint256
'
],
[
nonce
.
toHexString
(),
version
.
toHexString
()]
)
process
.
stdout
.
write
(
output
)
break
}
case
'
encodeCrossDomainMessage
'
:
{
const
nonce
=
BigNumber
.
from
(
args
[
1
])
const
sender
=
args
[
2
]
const
target
=
args
[
3
]
const
value
=
BigNumber
.
from
(
args
[
4
])
const
gasLimit
=
BigNumber
.
from
(
args
[
5
])
const
data
=
args
[
6
]
const
encoding
=
encodeCrossDomainMessage
(
nonce
,
sender
,
target
,
value
,
gasLimit
,
data
)
const
output
=
utils
.
defaultAbiCoder
.
encode
([
'
bytes
'
],
[
encoding
])
process
.
stdout
.
write
(
output
)
break
}
case
'
hashCrossDomainMessage
'
:
{
const
nonce
=
BigNumber
.
from
(
args
[
1
])
const
sender
=
args
[
2
]
const
target
=
args
[
3
]
const
value
=
BigNumber
.
from
(
args
[
4
])
const
gasLimit
=
BigNumber
.
from
(
args
[
5
])
const
data
=
args
[
6
]
const
hash
=
hashCrossDomainMessage
(
nonce
,
sender
,
target
,
value
,
gasLimit
,
data
)
const
output
=
utils
.
defaultAbiCoder
.
encode
([
'
bytes32
'
],
[
hash
])
process
.
stdout
.
write
(
output
)
break
}
case
'
hashDepositTransaction
'
:
{
// The solidity transaction hash computation currently only works with
// user deposits. System deposit transaction hashing is not supported.
const
l1BlockHash
=
args
[
1
]
const
logIndex
=
BigNumber
.
from
(
args
[
2
])
const
from
=
args
[
3
]
const
to
=
args
[
4
]
const
mint
=
BigNumber
.
from
(
args
[
5
])
const
value
=
BigNumber
.
from
(
args
[
6
])
const
gas
=
BigNumber
.
from
(
args
[
7
])
const
data
=
args
[
8
]
const
tx
=
new
DepositTx
({
l1BlockHash
,
logIndex
,
from
,
to
,
mint
,
value
,
gas
,
data
,
isSystemTransaction
:
false
,
domain
:
SourceHashDomain
.
UserDeposit
,
})
const
digest
=
tx
.
hash
()
const
output
=
utils
.
defaultAbiCoder
.
encode
([
'
bytes32
'
],
[
digest
])
process
.
stdout
.
write
(
output
)
break
}
case
'
encodeDepositTransaction
'
:
{
const
from
=
args
[
1
]
const
to
=
args
[
2
]
const
value
=
BigNumber
.
from
(
args
[
3
])
const
mint
=
BigNumber
.
from
(
args
[
4
])
const
gasLimit
=
BigNumber
.
from
(
args
[
5
])
const
isCreate
=
args
[
6
]
===
'
true
'
?
true
:
false
const
data
=
args
[
7
]
const
l1BlockHash
=
args
[
8
]
const
logIndex
=
BigNumber
.
from
(
args
[
9
])
const
tx
=
new
DepositTx
({
from
,
to
:
isCreate
?
null
:
to
,
value
,
mint
,
gas
:
gasLimit
,
data
,
l1BlockHash
,
logIndex
,
domain
:
SourceHashDomain
.
UserDeposit
,
})
const
raw
=
tx
.
encode
()
const
output
=
utils
.
defaultAbiCoder
.
encode
([
'
bytes
'
],
[
raw
])
process
.
stdout
.
write
(
output
)
break
}
case
'
hashWithdrawal
'
:
{
const
nonce
=
BigNumber
.
from
(
args
[
1
])
const
sender
=
args
[
2
]
const
target
=
args
[
3
]
const
value
=
BigNumber
.
from
(
args
[
4
])
const
gas
=
BigNumber
.
from
(
args
[
5
])
const
data
=
args
[
6
]
const
hash
=
hashWithdrawal
(
nonce
,
sender
,
target
,
value
,
gas
,
data
)
const
output
=
utils
.
defaultAbiCoder
.
encode
([
'
bytes32
'
],
[
hash
])
process
.
stdout
.
write
(
output
)
break
}
case
'
hashOutputRootProof
'
:
{
const
version
=
hexZeroPad
(
BigNumber
.
from
(
args
[
1
]).
toHexString
(),
32
)
const
stateRoot
=
hexZeroPad
(
BigNumber
.
from
(
args
[
2
]).
toHexString
(),
32
)
const
messagePasserStorageRoot
=
hexZeroPad
(
BigNumber
.
from
(
args
[
3
]).
toHexString
(),
32
)
const
latestBlockhash
=
hexZeroPad
(
BigNumber
.
from
(
args
[
4
]).
toHexString
(),
32
)
const
hash
=
hashOutputRootProof
({
version
,
stateRoot
,
messagePasserStorageRoot
,
latestBlockhash
,
})
const
output
=
utils
.
defaultAbiCoder
.
encode
([
'
bytes32
'
],
[
hash
])
process
.
stdout
.
write
(
output
)
break
}
case
'
getProveWithdrawalTransactionInputs
'
:
{
const
nonce
=
BigNumber
.
from
(
args
[
1
])
const
sender
=
args
[
2
]
const
target
=
args
[
3
]
const
value
=
BigNumber
.
from
(
args
[
4
])
const
gas
=
BigNumber
.
from
(
args
[
5
])
const
data
=
args
[
6
]
// Compute the withdrawalHash
const
withdrawalHash
=
hashWithdrawal
(
nonce
,
sender
,
target
,
value
,
gas
,
data
)
// Compute the storage slot the withdrawalHash will be stored in
const
slot
=
utils
.
defaultAbiCoder
.
encode
(
[
'
bytes32
'
,
'
bytes32
'
],
[
withdrawalHash
,
utils
.
hexZeroPad
(
'
0x
'
,
32
)]
)
const
key
=
keccak256
(
slot
)
// Create the account storage trie
const
storage
=
new
SecureTrie
()
// Put a bool "true" into storage
await
storage
.
put
(
toBuffer
(
key
),
toBuffer
(
'
0x01
'
))
// Put the storage root into the L2ToL1MessagePasser storage
const
address
=
Address
.
fromString
(
predeploys
.
L2ToL1MessagePasser
)
const
account
=
Account
.
fromAccountData
({
nonce
:
0
,
balance
:
0
,
stateRoot
:
storage
.
root
,
})
const
world
=
new
SecureTrie
()
await
world
.
put
(
address
.
toBuffer
(),
account
.
serialize
())
const
proof
=
await
SecureTrie
.
createProof
(
storage
,
toBuffer
(
key
))
const
outputRoot
=
hashOutputRootProof
({
version
:
constants
.
HashZero
,
stateRoot
:
bufferToHex
(
world
.
root
),
messagePasserStorageRoot
:
bufferToHex
(
storage
.
root
),
latestBlockhash
:
constants
.
HashZero
,
})
const
output
=
utils
.
defaultAbiCoder
.
encode
(
[
'
bytes32
'
,
'
bytes32
'
,
'
bytes32
'
,
'
bytes32
'
,
'
bytes[]
'
],
[
world
.
root
,
storage
.
root
,
outputRoot
,
withdrawalHash
,
proof
]
)
process
.
stdout
.
write
(
output
)
break
}
}
})().
catch
((
err
:
Error
)
=>
{
console
.
error
(
err
)
process
.
stdout
.
write
(
''
)
})
packages/contracts-bedrock/scripts/differential-testing/differential-testing.go
0 → 100644
View file @
a559b220
package
main
import
(
"bytes"
"fmt"
"math/big"
"os"
"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
"github.com/ethereum-optimism/optimism/op-chain-ops/crossdomain"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core/rawdb"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/trie"
)
// ABI types
var
(
// Plain dynamic dynBytes type
dynBytes
,
_
=
abi
.
NewType
(
"bytes"
,
""
,
nil
)
bytesArgs
=
abi
.
Arguments
{
{
Type
:
dynBytes
},
}
// Plain fixed bytes32 type
fixedBytes
,
_
=
abi
.
NewType
(
"bytes32"
,
""
,
nil
)
fixedBytesArgs
=
abi
.
Arguments
{
{
Type
:
fixedBytes
},
}
// Decoded nonce tuple (nonce, version)
decodedNonce
,
_
=
abi
.
NewType
(
"tuple"
,
"DecodedNonce"
,
[]
abi
.
ArgumentMarshaling
{
{
Name
:
"nonce"
,
Type
:
"uint256"
},
{
Name
:
"version"
,
Type
:
"uint256"
},
})
decodedNonceArgs
=
abi
.
Arguments
{
{
Name
:
"encodedNonce"
,
Type
:
decodedNonce
},
}
// WithdrawalHash slot tuple (bytes32, bytes32)
withdrawalSlot
,
_
=
abi
.
NewType
(
"tuple"
,
"SlotHash"
,
[]
abi
.
ArgumentMarshaling
{
{
Name
:
"withdrawalHash"
,
Type
:
"bytes32"
},
{
Name
:
"zeroPadding"
,
Type
:
"bytes32"
},
})
withdrawalSlotArgs
=
abi
.
Arguments
{
{
Name
:
"slotHash"
,
Type
:
withdrawalSlot
},
}
// Prove withdrawal inputs tuple (bytes32, bytes32, bytes32, bytes32, bytes[])
proveWithdrawalInputs
,
_
=
abi
.
NewType
(
"tuple"
,
"ProveWithdrawalInputs"
,
[]
abi
.
ArgumentMarshaling
{
{
Name
:
"worldRoot"
,
Type
:
"bytes32"
},
{
Name
:
"stateRoot"
,
Type
:
"bytes32"
},
{
Name
:
"outputRoot"
,
Type
:
"bytes32"
},
{
Name
:
"withdrawalHash"
,
Type
:
"bytes32"
},
{
Name
:
"proof"
,
Type
:
"bytes[]"
},
})
proveWithdrawalInputsArgs
=
abi
.
Arguments
{
{
Name
:
"inputs"
,
Type
:
proveWithdrawalInputs
},
}
)
func
main
()
{
args
:=
os
.
Args
[
1
:
]
// This command requires arguments
if
len
(
args
)
==
0
{
panic
(
"Error: No arguments provided"
)
}
switch
args
[
0
]
{
case
"decodeVersionedNonce"
:
// Parse input arguments
input
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
1
],
10
)
checkOk
(
ok
)
// Decode versioned nonce
nonce
,
version
:=
crossdomain
.
DecodeVersionedNonce
(
input
)
// ABI encode output
packArgs
:=
struct
{
Nonce
*
big
.
Int
Version
*
big
.
Int
}{
nonce
,
version
,
}
packed
,
err
:=
decodedNonceArgs
.
Pack
(
&
packArgs
)
checkErr
(
err
,
"Error encoding output"
)
fmt
.
Print
(
hexutil
.
Encode
(
packed
))
case
"encodeCrossDomainMessage"
:
// Parse input arguments
nonce
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
1
],
10
)
checkOk
(
ok
)
sender
:=
common
.
HexToAddress
(
args
[
2
])
target
:=
common
.
HexToAddress
(
args
[
3
])
value
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
4
],
10
)
checkOk
(
ok
)
gasLimit
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
5
],
10
)
checkOk
(
ok
)
data
:=
common
.
FromHex
(
args
[
6
])
// Encode cross domain message
encoded
,
err
:=
encodeCrossDomainMessage
(
nonce
,
sender
,
target
,
value
,
gasLimit
,
data
)
checkErr
(
err
,
"Error encoding cross domain message"
)
// Pack encoded cross domain message
packed
,
err
:=
bytesArgs
.
Pack
(
&
encoded
)
checkErr
(
err
,
"Error encoding output"
)
fmt
.
Print
(
hexutil
.
Encode
(
packed
))
case
"hashCrossDomainMessage"
:
// Parse input arguments
nonce
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
1
],
10
)
checkOk
(
ok
)
sender
:=
common
.
HexToAddress
(
args
[
2
])
target
:=
common
.
HexToAddress
(
args
[
3
])
value
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
4
],
10
)
checkOk
(
ok
)
gasLimit
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
5
],
10
)
checkOk
(
ok
)
data
:=
common
.
FromHex
(
args
[
6
])
// Encode cross domain message
encoded
,
err
:=
encodeCrossDomainMessage
(
nonce
,
sender
,
target
,
value
,
gasLimit
,
data
)
checkErr
(
err
,
"Error encoding cross domain message"
)
// Hash encoded cross domain message
hash
:=
crypto
.
Keccak256Hash
(
encoded
)
// Pack hash
packed
,
err
:=
fixedBytesArgs
.
Pack
(
&
hash
)
checkErr
(
err
,
"Error encoding output"
)
fmt
.
Print
(
hexutil
.
Encode
(
packed
))
case
"hashDepositTransaction"
:
// Parse input arguments
l1BlockHash
:=
common
.
HexToHash
(
args
[
1
])
logIndex
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
2
],
10
)
checkOk
(
ok
)
from
:=
common
.
HexToAddress
(
args
[
3
])
to
:=
common
.
HexToAddress
(
args
[
4
])
mint
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
5
],
10
)
checkOk
(
ok
)
value
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
6
],
10
)
checkOk
(
ok
)
gasLimit
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
7
],
10
)
checkOk
(
ok
)
data
:=
common
.
FromHex
(
args
[
8
])
// Create deposit transaction
depositTx
:=
makeDepositTx
(
from
,
to
,
value
,
mint
,
gasLimit
,
false
,
data
,
l1BlockHash
,
logIndex
)
// RLP encode deposit transaction
encoded
,
err
:=
types
.
NewTx
(
&
depositTx
)
.
MarshalBinary
()
checkErr
(
err
,
"Error encoding deposit transaction"
)
// Hash encoded deposit transaction
hash
:=
crypto
.
Keccak256Hash
(
encoded
)
// Pack hash
packed
,
err
:=
fixedBytesArgs
.
Pack
(
&
hash
)
checkErr
(
err
,
"Error encoding output"
)
fmt
.
Print
(
hexutil
.
Encode
(
packed
))
case
"encodeDepositTransaction"
:
// Parse input arguments
from
:=
common
.
HexToAddress
(
args
[
1
])
to
:=
common
.
HexToAddress
(
args
[
2
])
value
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
3
],
10
)
checkOk
(
ok
)
mint
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
4
],
10
)
checkOk
(
ok
)
gasLimit
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
5
],
10
)
checkOk
(
ok
)
isCreate
:=
args
[
6
]
==
"true"
data
:=
common
.
FromHex
(
args
[
7
])
l1BlockHash
:=
common
.
HexToHash
(
args
[
8
])
logIndex
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
9
],
10
)
checkOk
(
ok
)
depositTx
:=
makeDepositTx
(
from
,
to
,
value
,
mint
,
gasLimit
,
isCreate
,
data
,
l1BlockHash
,
logIndex
)
// RLP encode deposit transaction
encoded
,
err
:=
types
.
NewTx
(
&
depositTx
)
.
MarshalBinary
()
checkErr
(
err
,
"Failed to RLP encode deposit transaction"
)
// Pack rlp encoded deposit transaction
packed
,
err
:=
bytesArgs
.
Pack
(
&
encoded
)
checkErr
(
err
,
"Error encoding output"
)
fmt
.
Print
(
hexutil
.
Encode
(
packed
))
case
"hashWithdrawal"
:
// Parse input arguments
nonce
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
1
],
10
)
checkOk
(
ok
)
sender
:=
common
.
HexToAddress
(
args
[
2
])
target
:=
common
.
HexToAddress
(
args
[
3
])
value
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
4
],
10
)
checkOk
(
ok
)
gasLimit
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
5
],
10
)
checkOk
(
ok
)
data
:=
common
.
FromHex
(
args
[
6
])
// Hash withdrawal
hash
,
err
:=
hashWithdrawal
(
nonce
,
sender
,
target
,
value
,
gasLimit
,
data
)
checkErr
(
err
,
"Error hashing withdrawal"
)
// Pack hash
packed
,
err
:=
fixedBytesArgs
.
Pack
(
&
hash
)
checkErr
(
err
,
"Error encoding output"
)
fmt
.
Print
(
hexutil
.
Encode
(
packed
))
case
"hashOutputRootProof"
:
// Parse input arguments
version
:=
common
.
HexToHash
(
args
[
1
])
stateRoot
:=
common
.
HexToHash
(
args
[
2
])
messagePasserStorageRoot
:=
common
.
HexToHash
(
args
[
3
])
latestBlockHash
:=
common
.
HexToHash
(
args
[
4
])
// Hash the output root proof
hash
,
err
:=
hashOutputRootProof
(
version
,
stateRoot
,
messagePasserStorageRoot
,
latestBlockHash
)
checkErr
(
err
,
"Error hashing output root proof"
)
// Pack hash
packed
,
err
:=
fixedBytesArgs
.
Pack
(
&
hash
)
checkErr
(
err
,
"Error encoding output"
)
fmt
.
Print
(
hexutil
.
Encode
(
packed
))
case
"getProveWithdrawalTransactionInputs"
:
// Parse input arguments
nonce
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
1
],
10
)
checkOk
(
ok
)
sender
:=
common
.
HexToAddress
(
args
[
2
])
target
:=
common
.
HexToAddress
(
args
[
3
])
value
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
4
],
10
)
checkOk
(
ok
)
gasLimit
,
ok
:=
new
(
big
.
Int
)
.
SetString
(
args
[
5
],
10
)
checkOk
(
ok
)
data
:=
common
.
FromHex
(
args
[
6
])
wdHash
,
err
:=
hashWithdrawal
(
nonce
,
sender
,
target
,
value
,
gasLimit
,
data
)
checkErr
(
err
,
"Error hashing withdrawal"
)
// Compute the storage slot the withdrawalHash will be stored in
slot
:=
struct
{
WithdrawalHash
common
.
Hash
ZeroPadding
common
.
Hash
}{
WithdrawalHash
:
wdHash
,
ZeroPadding
:
common
.
Hash
{},
}
packed
,
err
:=
withdrawalSlotArgs
.
Pack
(
&
slot
)
checkErr
(
err
,
"Error packing withdrawal slot"
)
// Compute the storage slot the withdrawalHash will be stored in
hash
:=
crypto
.
Keccak256Hash
(
packed
)
// Create a secure trie for state
state
,
err
:=
trie
.
NewStateTrie
(
trie
.
TrieID
(
types
.
EmptyRootHash
),
trie
.
NewDatabase
(
rawdb
.
NewMemoryDatabase
()),
)
checkErr
(
err
,
"Error creating secure trie"
)
// Put a "true" bool in the storage slot
state
.
Update
(
hash
.
Bytes
(),
[]
byte
{
0x01
})
// Create a secure trie for the world state
world
,
err
:=
trie
.
NewStateTrie
(
trie
.
TrieID
(
types
.
EmptyRootHash
),
trie
.
NewDatabase
(
rawdb
.
NewMemoryDatabase
()),
)
checkErr
(
err
,
"Error creating secure trie"
)
// Put the put the rlp encoded account in the world trie
account
:=
types
.
StateAccount
{
Nonce
:
0
,
Balance
:
big
.
NewInt
(
0
),
Root
:
state
.
Hash
(),
}
writer
:=
new
(
bytes
.
Buffer
)
checkErr
(
account
.
EncodeRLP
(
writer
),
"Error encoding account"
)
world
.
Update
(
predeploys
.
L2ToL1MessagePasserAddr
.
Bytes
(),
writer
.
Bytes
())
// Get the proof
var
proof
proofList
checkErr
(
state
.
Prove
(
predeploys
.
L2ToL1MessagePasserAddr
.
Bytes
(),
0
,
&
proof
),
"Error getting proof"
)
// Get the output root
outputRoot
,
err
:=
hashOutputRootProof
(
common
.
Hash
{},
world
.
Hash
(),
state
.
Hash
(),
common
.
Hash
{})
checkErr
(
err
,
"Error hashing output root proof"
)
// Pack the output
output
:=
struct
{
WorldRoot
common
.
Hash
StateRoot
common
.
Hash
OutputRoot
common
.
Hash
WithdrawalHash
common
.
Hash
Proof
proofList
}{
WorldRoot
:
world
.
Hash
(),
StateRoot
:
state
.
Hash
(),
OutputRoot
:
outputRoot
,
WithdrawalHash
:
wdHash
,
Proof
:
proof
,
}
packed
,
err
=
proveWithdrawalInputsArgs
.
Pack
(
&
output
)
checkErr
(
err
,
"Error encoding output"
)
// Print the output
fmt
.
Print
(
hexutil
.
Encode
(
packed
[
32
:
]))
default
:
panic
(
fmt
.
Errorf
(
"Unknown command: %s"
,
args
[
0
]))
}
}
packages/contracts-bedrock/scripts/differential-testing/utils.go
0 → 100644
View file @
a559b220
package
main
import
(
"errors"
"fmt"
"math/big"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum-optimism/optimism/op-chain-ops/crossdomain"
"github.com/ethereum-optimism/optimism/op-node/rollup"
"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
)
var
UnknownNonceVersion
=
errors
.
New
(
"Unknown nonce version"
)
// checkOk checks if ok is false, and panics if so.
// Shorthand to ease go's god awful error handling
func
checkOk
(
ok
bool
)
{
if
!
ok
{
panic
(
fmt
.
Errorf
(
"checkOk failed"
))
}
}
// checkErr checks if err is not nil, and throws if so.
// Shorthand to ease go's god awful error handling
func
checkErr
(
err
error
,
failReason
string
)
{
if
err
!=
nil
{
panic
(
fmt
.
Errorf
(
"%s: %s"
,
failReason
,
err
))
}
}
// encodeCrossDomainMessage encodes a versioned cross domain message into a byte array.
func
encodeCrossDomainMessage
(
nonce
*
big
.
Int
,
sender
common
.
Address
,
target
common
.
Address
,
value
*
big
.
Int
,
gasLimit
*
big
.
Int
,
data
[]
byte
)
([]
byte
,
error
)
{
_
,
version
:=
crossdomain
.
DecodeVersionedNonce
(
nonce
)
var
encoded
[]
byte
var
err
error
if
version
.
Cmp
(
big
.
NewInt
(
0
))
==
0
{
// Encode cross domain message V0
encoded
,
err
=
crossdomain
.
EncodeCrossDomainMessageV0
(
target
,
sender
,
data
,
nonce
)
}
else
if
version
.
Cmp
(
big
.
NewInt
(
1
))
==
0
{
// Encode cross domain message V1
encoded
,
err
=
crossdomain
.
EncodeCrossDomainMessageV1
(
nonce
,
sender
,
target
,
value
,
gasLimit
,
data
)
}
else
{
return
nil
,
UnknownNonceVersion
}
return
encoded
,
err
}
// hashWithdrawal hashes a withdrawal transaction.
func
hashWithdrawal
(
nonce
*
big
.
Int
,
sender
common
.
Address
,
target
common
.
Address
,
value
*
big
.
Int
,
gasLimit
*
big
.
Int
,
data
[]
byte
)
(
common
.
Hash
,
error
)
{
wd
:=
crossdomain
.
Withdrawal
{
Nonce
:
nonce
,
Sender
:
&
sender
,
Target
:
&
target
,
Value
:
value
,
GasLimit
:
gasLimit
,
Data
:
data
,
}
return
wd
.
Hash
()
}
// hashOutputRootProof hashes an output root proof.
func
hashOutputRootProof
(
version
common
.
Hash
,
stateRoot
common
.
Hash
,
messagePasserStorageRoot
common
.
Hash
,
latestBlockHash
common
.
Hash
)
(
common
.
Hash
,
error
)
{
hash
,
err
:=
rollup
.
ComputeL2OutputRoot
(
&
bindings
.
TypesOutputRootProof
{
Version
:
version
,
StateRoot
:
stateRoot
,
MessagePasserStorageRoot
:
messagePasserStorageRoot
,
LatestBlockhash
:
latestBlockHash
,
})
if
err
!=
nil
{
return
common
.
Hash
{},
err
}
return
common
.
Hash
(
hash
),
nil
}
// makeDepositTx creates a deposit transaction type.
func
makeDepositTx
(
from
common
.
Address
,
to
common
.
Address
,
value
*
big
.
Int
,
mint
*
big
.
Int
,
gasLimit
*
big
.
Int
,
isCreate
bool
,
data
[]
byte
,
l1BlockHash
common
.
Hash
,
logIndex
*
big
.
Int
,
)
types
.
DepositTx
{
// Create deposit transaction source
udp
:=
derive
.
UserDepositSource
{
L1BlockHash
:
l1BlockHash
,
LogIndex
:
logIndex
.
Uint64
(),
}
// Create deposit transaction
depositTx
:=
types
.
DepositTx
{
SourceHash
:
udp
.
SourceHash
(),
From
:
from
,
Value
:
value
,
Gas
:
gasLimit
.
Uint64
(),
IsSystemTransaction
:
false
,
// This will never be a system transaction in the tests.
Data
:
data
,
}
// Fill optional fields
if
mint
.
Cmp
(
big
.
NewInt
(
0
))
==
1
{
depositTx
.
Mint
=
mint
}
if
!
isCreate
{
depositTx
.
To
=
&
to
}
return
depositTx
}
// Custom type to write the generated proof to
type
proofList
[][]
byte
func
(
n
*
proofList
)
Put
(
key
[]
byte
,
value
[]
byte
)
error
{
*
n
=
append
(
*
n
,
value
)
return
nil
}
func
(
n
*
proofList
)
Delete
(
key
[]
byte
)
error
{
panic
(
"not supported"
)
}
yarn.lock
View file @
a559b220
...
...
@@ -1105,20 +1105,6 @@
ethereumjs-util "^7.1.1"
miller-rabin "^4.0.0"
"@ethereumjs/trie@^5.0.0-beta.1":
version "5.0.0-beta.1"
resolved "https://registry.yarnpkg.com/@ethereumjs/trie/-/trie-5.0.0-beta.1.tgz#79d1108222b45bc3576d62583364c96626ce4175"
integrity sha512-OjTzt9fK5aMzm84GRSe+C7bO2zorbEWRueLbxOMlS7lHCiXA7akIQ3mzz9VBSMjT7m01hZ1r3fZIOGHzQVCHtw==
dependencies:
"@ethereumjs/util" "8.0.0-beta.1"
abstract-level "^1.0.3"
ethereum-cryptography "^1.0.3"
level "^8.0.0"
memory-level "^1.0.0"
readable-stream "^3.6.0"
rlp "4.0.0-beta.1"
semaphore-async-await "^1.5.1"
"@ethereumjs/tx@^3.2.1":
version "3.3.0"
resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.0.tgz#14ed1b7fa0f28e1cd61e3ecbdab824205f6a4378"
...
...
@@ -1143,14 +1129,6 @@
"@ethereumjs/common" "^2.6.3"
ethereumjs-util "^7.1.4"
"@ethereumjs/util@8.0.0-beta.1", "@ethereumjs/util@^8.0.0-beta.1":
version "8.0.0-beta.1"
resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.0.0-beta.1.tgz#369526faf6e9f1cadfd39c7741cc07cf33d128f8"
integrity sha512-yUg3TdJm25HiamAXbNuOagXQPmgdSrV3oEH0h+Adsxt6D7qHw8HyHLA8C+tNrLP2YwcjF1dGJ+F7WtOibzEp9g==
dependencies:
ethereum-cryptography "^1.0.3"
rlp "4.0.0-beta.1"
"@ethereumjs/vm@^5.9.0":
version "5.9.0"
resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.9.0.tgz#54e485097c6dbb42554d541ef8d84d06b7ddf12f"
...
...
@@ -5534,19 +5512,6 @@ abort-controller@^3.0.0:
dependencies:
event-target-shim "^5.0.0"
abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741"
integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==
dependencies:
buffer "^6.0.3"
catering "^2.1.0"
is-buffer "^2.0.5"
level-supports "^4.0.0"
level-transcoder "^1.0.1"
module-error "^1.0.1"
queue-microtask "^1.2.3"
abstract-leveldown@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57"
...
...
@@ -7086,16 +7051,6 @@ brorand@^1.0.1, brorand@^1.1.0:
resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
browser-level@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011"
integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==
dependencies:
abstract-level "^1.0.2"
catering "^2.1.1"
module-error "^1.0.2"
run-parallel-limit "^1.1.0"
browser-stdout@1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
...
...
@@ -7528,11 +7483,6 @@ caseless@^0.12.0, caseless@~0.12.0:
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
catering@^2.1.0, catering@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510"
integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==
cbor@^5.0.2:
version "5.2.0"
resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c"
...
...
@@ -7803,17 +7753,6 @@ class-utils@^0.3.5:
isobject "^3.0.0"
static-extend "^0.1.1"
classic-level@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.2.0.tgz#2d52bdec8e7a27f534e67fdeb890abef3e643c27"
integrity sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==
dependencies:
abstract-level "^1.0.2"
catering "^2.1.0"
module-error "^1.0.1"
napi-macros "~2.0.0"
node-gyp-build "^4.3.0"
clean-regexp@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7"
...
...
@@ -13089,7 +13028,7 @@ is-buffer@^1.1.5:
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
is-buffer@^2.0.0, is-buffer@
^2.0.5, is-buffer@
~2.0.3:
is-buffer@^2.0.0, is-buffer@~2.0.3:
version "2.0.5"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
...
...
@@ -14256,11 +14195,6 @@ level-sublevel@6.6.4:
typewiselite "~1.0.0"
xtend "~4.0.0"
level-supports@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a"
integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==
level-supports@~1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d"
...
...
@@ -14268,14 +14202,6 @@ level-supports@~1.0.0:
dependencies:
xtend "^4.0.2"
level-transcoder@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c"
integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==
dependencies:
buffer "^6.0.3"
module-error "^1.0.1"
level-ws@0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b"
...
...
@@ -14311,14 +14237,6 @@ level-ws@^2.0.0:
level-packager "^5.1.0"
leveldown "^5.4.0"
level@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394"
integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==
dependencies:
browser-level "^1.0.1"
classic-level "^1.2.0"
leveldown@^5.4.0:
version "5.6.0"
resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-5.6.0.tgz#16ba937bb2991c6094e13ac5a6898ee66d3eee98"
...
...
@@ -15176,15 +15094,6 @@ memdown@~3.0.0:
ltgt "~2.2.0"
safe-buffer "~5.1.1"
memory-level@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692"
integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==
dependencies:
abstract-level "^1.0.0"
functional-red-black-tree "^1.0.1"
module-error "^1.0.1"
memorystream@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
...
...
@@ -15849,11 +15758,6 @@ modify-values@^1.0.0:
resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022"
integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==
module-error@^1.0.1, module-error@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86"
integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==
morgan@^1.10.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7"
...
...
@@ -16164,11 +16068,6 @@ node-gyp-build@^4.2.0:
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739"
integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==
node-gyp-build@^4.3.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40"
integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==
node-gyp-build@~4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.1.1.tgz#d7270b5d86717068d114cc57fff352f96d745feb"
...
...
@@ -18046,7 +17945,7 @@ querystringify@^2.1.1:
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
queue-microtask@^1.2.2
, queue-microtask@^1.2.3
:
queue-microtask@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
...
...
@@ -18818,11 +18717,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
hash-base "^3.0.0"
inherits "^2.0.1"
rlp@4.0.0-beta.1:
version "4.0.0-beta.1"
resolved "https://registry.yarnpkg.com/rlp/-/rlp-4.0.0-beta.1.tgz#46983ee758344e5eee48f135129407434cfea2b6"
integrity sha512-UVIENF7Rw+nX5cpfzw6X3/oXNQKsSZ8HbDJUeU9RoIs1LLyMjcPZR1o26i1vFbpuVN8GRmcdopEYOMjVsLRsQQ==
rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4, rlp@^2.2.6:
version "2.2.6"
resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c"
...
...
@@ -18862,13 +18756,6 @@ run-async@^2.2.0, run-async@^2.4.0:
resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
run-parallel-limit@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba"
integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==
dependencies:
queue-microtask "^1.2.2"
run-parallel@^1.1.9:
version "1.2.0"
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
...
...
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