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
17281374
Unverified
Commit
17281374
authored
Mar 15, 2023
by
Mark Tyneway
Committed by
GitHub
Mar 15, 2023
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #5114 from ethereum-optimism/clabby/ctb/speedy-diff-testing
feat(ctb): Optimize differential testing
parents
6a429a39
26868d3a
Changes
12
Hide 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 @
17281374
...
@@ -9,6 +9,7 @@ import (
...
@@ -9,6 +9,7 @@ import (
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/log"
"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-bindings/predeploys"
"github.com/ethereum-optimism/optimism/op-node/eth"
"github.com/ethereum-optimism/optimism/op-node/eth"
"github.com/ethereum-optimism/optimism/op-node/rollup"
"github.com/ethereum-optimism/optimism/op-node/rollup"
...
@@ -114,7 +115,16 @@ func (n *nodeAPI) OutputAtBlock(ctx context.Context, number hexutil.Uint64) (*et
...
@@ -114,7 +115,16 @@ func (n *nodeAPI) OutputAtBlock(ctx context.Context, number hexutil.Uint64) (*et
}
}
var
l2OutputRootVersion
eth
.
Bytes32
// it's zero for now
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
{
return
&
eth
.
OutputResponse
{
Version
:
l2OutputRootVersion
,
Version
:
l2OutputRootVersion
,
...
...
op-node/rollup/output_root.go
View file @
17281374
package
rollup
package
rollup
import
(
import
(
"errors"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
"github.com/ethereum-optimism/optimism/op-node/eth"
"github.com/ethereum-optimism/optimism/op-node/eth"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/crypto"
)
)
// ComputeL2OutputRoot computes the L2 output root
var
NilProof
=
errors
.
New
(
"Output root proof is nil"
)
func
ComputeL2OutputRoot
(
l2OutputRootVersion
eth
.
Bytes32
,
blockHash
common
.
Hash
,
blockRoot
common
.
Hash
,
storageRoot
common
.
Hash
)
eth
.
Bytes32
{
digest
:=
crypto
.
Keccak256Hash
(
// ComputeL2OutputRoot computes the L2 output root by hashing an output root proof.
l2OutputRootVersion
[
:
],
func
ComputeL2OutputRoot
(
proofElements
*
bindings
.
TypesOutputRootProof
)
(
eth
.
Bytes32
,
error
)
{
blockRoot
.
Bytes
(),
if
proofElements
==
nil
{
storageRoot
[
:
],
return
eth
.
Bytes32
{},
NilProof
blockHash
.
Bytes
(),
}
)
return
eth
.
Bytes32
(
digest
)
}
// HashOutputRootProof computes the hash of the output root proof
digest
:=
crypto
.
Keccak256Hash
(
func
HashOutputRootProof
(
proof
*
bindings
.
TypesOutputRootProof
)
eth
.
Bytes32
{
proofElements
.
Version
[
:
],
return
ComputeL2OutputRoot
(
proofElements
.
StateRoot
[
:
],
proof
.
Version
,
proofElements
.
MessagePasserStorageRoot
[
:
],
proof
.
StateRoot
,
proofElements
.
LatestBlockhash
[
:
],
proof
.
MessagePasserStorageRoot
,
proof
.
LatestBlockhash
,
)
)
return
eth
.
Bytes32
(
digest
),
nil
}
}
packages/contracts-bedrock/.gas-snapshot
View file @
17281374
...
@@ -266,9 +266,9 @@ OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutp
...
@@ -266,9 +266,9 @@ OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutp
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutputTimestampIsNotFinalized_reverts() (gas: 207520)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutputTimestampIsNotFinalized_reverts() (gas: 207520)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifWithdrawalNotProven_reverts() (gas: 41753)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifWithdrawalNotProven_reverts() (gas: 41753)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifWithdrawalProofNotOldEnough_reverts() (gas: 199464)
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_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_onReplay_reverts() (gas: 245528)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_paused_reverts() (gas: 53555)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_paused_reverts() (gas: 53555)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_provenWithdrawalHash_succeeds() (gas: 234941)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_provenWithdrawalHash_succeeds() (gas: 234941)
...
...
packages/contracts-bedrock/.gitignore
View file @
17281374
...
@@ -12,3 +12,4 @@ deployments/mainnet-forked
...
@@ -12,3 +12,4 @@ deployments/mainnet-forked
deploy-config/mainnet-forked.json
deploy-config/mainnet-forked.json
test-case-generator/fuzz
test-case-generator/fuzz
.resource-metering.csv
.resource-metering.csv
scripts/differential-testing/differential-testing
packages/contracts-bedrock/contracts/test/CommonTest.t.sol
View file @
17281374
...
@@ -477,16 +477,15 @@ contract FFIInterface is Test {
...
@@ -477,16 +477,15 @@ contract FFIInterface is Test {
bytes[] memory
bytes[] memory
)
)
{
{
string[] memory cmds = new string[](9);
string[] memory cmds = new string[](8);
cmds[0] = "node";
cmds[0] = "scripts/differential-testing/differential-testing";
cmds[1] = "dist/scripts/differential-testing.js";
cmds[1] = "getProveWithdrawalTransactionInputs";
cmds[2] = "getProveWithdrawalTransactionInputs";
cmds[2] = vm.toString(_tx.nonce);
cmds[3] = vm.toString(_tx.nonce);
cmds[3] = vm.toString(_tx.sender);
cmds[4] = vm.toString(_tx.sender);
cmds[4] = vm.toString(_tx.target);
cmds[5] = vm.toString(_tx.target);
cmds[5] = vm.toString(_tx.value);
cmds[6] = vm.toString(_tx.value);
cmds[6] = vm.toString(_tx.gasLimit);
cmds[7] = vm.toString(_tx.gasLimit);
cmds[7] = vm.toString(_tx.data);
cmds[8] = vm.toString(_tx.data);
bytes memory result = vm.ffi(cmds);
bytes memory result = vm.ffi(cmds);
(
(
...
@@ -508,16 +507,15 @@ contract FFIInterface is Test {
...
@@ -508,16 +507,15 @@ contract FFIInterface is Test {
uint256 _gasLimit,
uint256 _gasLimit,
bytes memory _data
bytes memory _data
) external returns (bytes32) {
) external returns (bytes32) {
string[] memory cmds = new string[](9);
string[] memory cmds = new string[](8);
cmds[0] = "node";
cmds[0] = "scripts/differential-testing/differential-testing";
cmds[1] = "dist/scripts/differential-testing.js";
cmds[1] = "hashCrossDomainMessage";
cmds[2] = "hashCrossDomainMessage";
cmds[2] = vm.toString(_nonce);
cmds[3] = vm.toString(_nonce);
cmds[3] = vm.toString(_sender);
cmds[4] = vm.toString(_sender);
cmds[4] = vm.toString(_target);
cmds[5] = vm.toString(_target);
cmds[5] = vm.toString(_value);
cmds[6] = vm.toString(_value);
cmds[6] = vm.toString(_gasLimit);
cmds[7] = vm.toString(_gasLimit);
cmds[7] = vm.toString(_data);
cmds[8] = vm.toString(_data);
bytes memory result = vm.ffi(cmds);
bytes memory result = vm.ffi(cmds);
return abi.decode(result, (bytes32));
return abi.decode(result, (bytes32));
...
@@ -531,16 +529,15 @@ contract FFIInterface is Test {
...
@@ -531,16 +529,15 @@ contract FFIInterface is Test {
uint256 _gasLimit,
uint256 _gasLimit,
bytes memory _data
bytes memory _data
) external returns (bytes32) {
) external returns (bytes32) {
string[] memory cmds = new string[](9);
string[] memory cmds = new string[](8);
cmds[0] = "node";
cmds[0] = "scripts/differential-testing/differential-testing";
cmds[1] = "dist/scripts/differential-testing.js";
cmds[1] = "hashWithdrawal";
cmds[2] = "hashWithdrawal";
cmds[2] = vm.toString(_nonce);
cmds[3] = vm.toString(_nonce);
cmds[3] = vm.toString(_sender);
cmds[4] = vm.toString(_sender);
cmds[4] = vm.toString(_target);
cmds[5] = vm.toString(_target);
cmds[5] = vm.toString(_value);
cmds[6] = vm.toString(_value);
cmds[6] = vm.toString(_gasLimit);
cmds[7] = vm.toString(_gasLimit);
cmds[7] = vm.toString(_data);
cmds[8] = vm.toString(_data);
bytes memory result = vm.ffi(cmds);
bytes memory result = vm.ffi(cmds);
return abi.decode(result, (bytes32));
return abi.decode(result, (bytes32));
...
@@ -552,14 +549,13 @@ contract FFIInterface is Test {
...
@@ -552,14 +549,13 @@ contract FFIInterface is Test {
bytes32 _messagePasserStorageRoot,
bytes32 _messagePasserStorageRoot,
bytes32 _latestBlockhash
bytes32 _latestBlockhash
) external returns (bytes32) {
) external returns (bytes32) {
string[] memory cmds = new string[](7);
string[] memory cmds = new string[](6);
cmds[0] = "node";
cmds[0] = "scripts/differential-testing/differential-testing";
cmds[1] = "dist/scripts/differential-testing.js";
cmds[1] = "hashOutputRootProof";
cmds[2] = "hashOutputRootProof";
cmds[2] = Strings.toHexString(uint256(_version));
cmds[3] = Strings.toHexString(uint256(_version));
cmds[3] = Strings.toHexString(uint256(_stateRoot));
cmds[4] = Strings.toHexString(uint256(_stateRoot));
cmds[4] = Strings.toHexString(uint256(_messagePasserStorageRoot));
cmds[5] = Strings.toHexString(uint256(_messagePasserStorageRoot));
cmds[5] = Strings.toHexString(uint256(_latestBlockhash));
cmds[6] = Strings.toHexString(uint256(_latestBlockhash));
bytes memory result = vm.ffi(cmds);
bytes memory result = vm.ffi(cmds);
return abi.decode(result, (bytes32));
return abi.decode(result, (bytes32));
...
@@ -572,20 +568,19 @@ contract FFIInterface is Test {
...
@@ -572,20 +568,19 @@ contract FFIInterface is Test {
uint256 _value,
uint256 _value,
uint64 _gas,
uint64 _gas,
bytes memory _data,
bytes memory _data,
uint
256
_logIndex
uint
64
_logIndex
) external returns (bytes32) {
) external returns (bytes32) {
string[] memory cmds = new string[](11);
string[] memory cmds = new string[](10);
cmds[0] = "node";
cmds[0] = "scripts/differential-testing/differential-testing";
cmds[1] = "dist/scripts/differential-testing.js";
cmds[1] = "hashDepositTransaction";
cmds[2] = "hashDepositTransaction";
cmds[2] = "0x0000000000000000000000000000000000000000000000000000000000000000";
cmds[3] = "0x0000000000000000000000000000000000000000000000000000000000000000";
cmds[3] = vm.toString(_logIndex);
cmds[4] = vm.toString(_logIndex);
cmds[4] = vm.toString(_from);
cmds[5] = vm.toString(_from);
cmds[5] = vm.toString(_to);
cmds[6] = vm.toString(_to);
cmds[6] = vm.toString(_mint);
cmds[7] = vm.toString(_mint);
cmds[7] = vm.toString(_value);
cmds[8] = vm.toString(_value);
cmds[8] = vm.toString(_gas);
cmds[9] = vm.toString(_gas);
cmds[9] = vm.toString(_data);
cmds[10] = vm.toString(_data);
bytes memory result = vm.ffi(cmds);
bytes memory result = vm.ffi(cmds);
return abi.decode(result, (bytes32));
return abi.decode(result, (bytes32));
...
@@ -595,19 +590,18 @@ contract FFIInterface is Test {
...
@@ -595,19 +590,18 @@ contract FFIInterface is Test {
external
external
returns (bytes memory)
returns (bytes memory)
{
{
string[] memory cmds = new string[](12);
string[] memory cmds = new string[](11);
cmds[0] = "node";
cmds[0] = "scripts/differential-testing/differential-testing";
cmds[1] = "dist/scripts/differential-testing.js";
cmds[1] = "encodeDepositTransaction";
cmds[2] = "encodeDepositTransaction";
cmds[2] = vm.toString(txn.from);
cmds[3] = vm.toString(txn.from);
cmds[3] = vm.toString(txn.to);
cmds[4] = vm.toString(txn.to);
cmds[4] = vm.toString(txn.value);
cmds[5] = vm.toString(txn.value);
cmds[5] = vm.toString(txn.mint);
cmds[6] = vm.toString(txn.mint);
cmds[6] = vm.toString(txn.gasLimit);
cmds[7] = vm.toString(txn.gasLimit);
cmds[7] = vm.toString(txn.isCreation);
cmds[8] = vm.toString(txn.isCreation);
cmds[8] = vm.toString(txn.data);
cmds[9] = vm.toString(txn.data);
cmds[9] = vm.toString(txn.l1BlockHash);
cmds[10] = vm.toString(txn.l1BlockHash);
cmds[10] = vm.toString(txn.logIndex);
cmds[11] = vm.toString(txn.logIndex);
bytes memory result = vm.ffi(cmds);
bytes memory result = vm.ffi(cmds);
return abi.decode(result, (bytes));
return abi.decode(result, (bytes));
...
@@ -621,27 +615,25 @@ contract FFIInterface is Test {
...
@@ -621,27 +615,25 @@ contract FFIInterface is Test {
uint256 _gasLimit,
uint256 _gasLimit,
bytes memory _data
bytes memory _data
) external returns (bytes memory) {
) external returns (bytes memory) {
string[] memory cmds = new string[](9);
string[] memory cmds = new string[](8);
cmds[0] = "node";
cmds[0] = "scripts/differential-testing/differential-testing";
cmds[1] = "dist/scripts/differential-testing.js";
cmds[1] = "encodeCrossDomainMessage";
cmds[2] = "encodeCrossDomainMessage";
cmds[2] = vm.toString(_nonce);
cmds[3] = vm.toString(_nonce);
cmds[3] = vm.toString(_sender);
cmds[4] = vm.toString(_sender);
cmds[4] = vm.toString(_target);
cmds[5] = vm.toString(_target);
cmds[5] = vm.toString(_value);
cmds[6] = vm.toString(_value);
cmds[6] = vm.toString(_gasLimit);
cmds[7] = vm.toString(_gasLimit);
cmds[7] = vm.toString(_data);
cmds[8] = vm.toString(_data);
bytes memory result = vm.ffi(cmds);
bytes memory result = vm.ffi(cmds);
return abi.decode(result, (bytes));
return abi.decode(result, (bytes));
}
}
function decodeVersionedNonce(uint256 nonce) external returns (uint256, uint256) {
function decodeVersionedNonce(uint256 nonce) external returns (uint256, uint256) {
string[] memory cmds = new string[](4);
string[] memory cmds = new string[](3);
cmds[0] = "node";
cmds[0] = "scripts/differential-testing/differential-testing";
cmds[1] = "dist/scripts/differential-testing.js";
cmds[1] = "decodeVersionedNonce";
cmds[2] = "decodeVersionedNonce";
cmds[2] = vm.toString(nonce);
cmds[3] = vm.toString(nonce);
bytes memory result = vm.ffi(cmds);
bytes memory result = vm.ffi(cmds);
return abi.decode(result, (uint256, uint256));
return abi.decode(result, (uint256, uint256));
...
...
packages/contracts-bedrock/contracts/test/Encoding.t.sol
View file @
17281374
...
@@ -91,7 +91,7 @@ contract Encoding_Test is CommonTest {
...
@@ -91,7 +91,7 @@ contract Encoding_Test is CommonTest {
uint64 _gas,
uint64 _gas,
bool isCreate,
bool isCreate,
bytes memory _data,
bytes memory _data,
uint
256
_logIndex
uint
64
_logIndex
) external {
) external {
Types.UserDepositTransaction memory t = Types.UserDepositTransaction(
Types.UserDepositTransaction memory t = Types.UserDepositTransaction(
_from,
_from,
...
...
packages/contracts-bedrock/contracts/test/Hashing.t.sol
View file @
17281374
...
@@ -129,7 +129,7 @@ contract Hashing_hashDepositTransaction_Test is CommonTest {
...
@@ -129,7 +129,7 @@ contract Hashing_hashDepositTransaction_Test is CommonTest {
uint256 _value,
uint256 _value,
uint64 _gas,
uint64 _gas,
bytes memory _data,
bytes memory _data,
uint
256
_logIndex
uint
64
_logIndex
) external {
) external {
assertEq(
assertEq(
Hashing.hashDepositTransaction(
Hashing.hashDepositTransaction(
...
...
packages/contracts-bedrock/package.json
View file @
17281374
...
@@ -17,7 +17,7 @@
...
@@ -17,7 +17,7 @@
"bindings"
:
"cd ../../op-bindings && make"
,
"bindings"
:
"cd ../../op-bindings && make"
,
"build:forge"
:
"forge build"
,
"build:forge"
:
"forge build"
,
"build:with-metadata"
:
"FOUNDRY_PROFILE=echidna yarn build:forge"
,
"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)"
,
"build:fuzz"
:
"(cd test-case-generator && go build ./cmd/fuzz.go)"
,
"prebuild"
:
"yarn ts-node scripts/verify-foundry-install.ts"
,
"prebuild"
:
"yarn ts-node scripts/verify-foundry-install.ts"
,
"build"
:
"hardhat compile && yarn autogen:artifacts && yarn build:ts && yarn typechain"
,
"build"
:
"hardhat compile && yarn autogen:artifacts && yarn build:ts && yarn typechain"
,
...
@@ -59,8 +59,6 @@
...
@@ -59,8 +59,6 @@
},
},
"devDependencies"
:
{
"devDependencies"
:
{
"@eth-optimism/hardhat-deploy-config"
:
"^0.2.5"
,
"@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-provider"
:
"^5.7.0"
,
"@ethersproject/abstract-signer"
:
"^5.7.0"
,
"@ethersproject/abstract-signer"
:
"^5.7.0"
,
"ethereumjs-wallet"
:
"^1.0.2"
,
"ethereumjs-wallet"
:
"^1.0.2"
,
...
...
packages/contracts-bedrock/scripts/differential-testing.ts
deleted
100644 → 0
View file @
6a429a39
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 @
17281374
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 @
17281374
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 @
17281374
...
@@ -1105,20 +1105,6 @@
...
@@ -1105,20 +1105,6 @@
ethereumjs-util "^7.1.1"
ethereumjs-util "^7.1.1"
miller-rabin "^4.0.0"
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":
"@ethereumjs/tx@^3.2.1":
version "3.3.0"
version "3.3.0"
resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.0.tgz#14ed1b7fa0f28e1cd61e3ecbdab824205f6a4378"
resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.0.tgz#14ed1b7fa0f28e1cd61e3ecbdab824205f6a4378"
...
@@ -1143,14 +1129,6 @@
...
@@ -1143,14 +1129,6 @@
"@ethereumjs/common" "^2.6.3"
"@ethereumjs/common" "^2.6.3"
ethereumjs-util "^7.1.4"
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":
"@ethereumjs/vm@^5.9.0":
version "5.9.0"
version "5.9.0"
resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.9.0.tgz#54e485097c6dbb42554d541ef8d84d06b7ddf12f"
resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.9.0.tgz#54e485097c6dbb42554d541ef8d84d06b7ddf12f"
...
@@ -5534,19 +5512,6 @@ abort-controller@^3.0.0:
...
@@ -5534,19 +5512,6 @@ abort-controller@^3.0.0:
dependencies:
dependencies:
event-target-shim "^5.0.0"
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:
abstract-leveldown@3.0.0:
version "3.0.0"
version "3.0.0"
resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57"
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:
...
@@ -7086,16 +7051,6 @@ brorand@^1.0.1, brorand@^1.1.0:
resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
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:
browser-stdout@1.3.1:
version "1.3.1"
version "1.3.1"
resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
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:
...
@@ -7528,11 +7483,6 @@ caseless@^0.12.0, caseless@~0.12.0:
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
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:
cbor@^5.0.2:
version "5.2.0"
version "5.2.0"
resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c"
resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c"
...
@@ -7803,17 +7753,6 @@ class-utils@^0.3.5:
...
@@ -7803,17 +7753,6 @@ class-utils@^0.3.5:
isobject "^3.0.0"
isobject "^3.0.0"
static-extend "^0.1.1"
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:
clean-regexp@^1.0.0:
version "1.0.0"
version "1.0.0"
resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7"
resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7"
...
@@ -13089,7 +13028,7 @@ is-buffer@^1.1.5:
...
@@ -13089,7 +13028,7 @@ is-buffer@^1.1.5:
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
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"
version "2.0.5"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
...
@@ -14256,11 +14195,6 @@ level-sublevel@6.6.4:
...
@@ -14256,11 +14195,6 @@ level-sublevel@6.6.4:
typewiselite "~1.0.0"
typewiselite "~1.0.0"
xtend "~4.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:
level-supports@~1.0.0:
version "1.0.1"
version "1.0.1"
resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d"
resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d"
...
@@ -14268,14 +14202,6 @@ level-supports@~1.0.0:
...
@@ -14268,14 +14202,6 @@ level-supports@~1.0.0:
dependencies:
dependencies:
xtend "^4.0.2"
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:
level-ws@0.0.0:
version "0.0.0"
version "0.0.0"
resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b"
resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b"
...
@@ -14311,14 +14237,6 @@ level-ws@^2.0.0:
...
@@ -14311,14 +14237,6 @@ level-ws@^2.0.0:
level-packager "^5.1.0"
level-packager "^5.1.0"
leveldown "^5.4.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:
leveldown@^5.4.0:
version "5.6.0"
version "5.6.0"
resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-5.6.0.tgz#16ba937bb2991c6094e13ac5a6898ee66d3eee98"
resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-5.6.0.tgz#16ba937bb2991c6094e13ac5a6898ee66d3eee98"
...
@@ -15176,15 +15094,6 @@ memdown@~3.0.0:
...
@@ -15176,15 +15094,6 @@ memdown@~3.0.0:
ltgt "~2.2.0"
ltgt "~2.2.0"
safe-buffer "~5.1.1"
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:
memorystream@^0.3.1:
version "0.3.1"
version "0.3.1"
resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
...
@@ -15849,11 +15758,6 @@ modify-values@^1.0.0:
...
@@ -15849,11 +15758,6 @@ modify-values@^1.0.0:
resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022"
resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022"
integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==
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:
morgan@^1.10.0:
version "1.10.0"
version "1.10.0"
resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7"
resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7"
...
@@ -16164,11 +16068,6 @@ node-gyp-build@^4.2.0:
...
@@ -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"
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==
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:
node-gyp-build@~4.1.0:
version "4.1.1"
version "4.1.1"
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.1.1.tgz#d7270b5d86717068d114cc57fff352f96d745feb"
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.1.1.tgz#d7270b5d86717068d114cc57fff352f96d745feb"
...
@@ -18046,7 +17945,7 @@ querystringify@^2.1.1:
...
@@ -18046,7 +17945,7 @@ querystringify@^2.1.1:
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
queue-microtask@^1.2.2
, queue-microtask@^1.2.3
:
queue-microtask@^1.2.2:
version "1.2.3"
version "1.2.3"
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
...
@@ -18818,11 +18717,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
...
@@ -18818,11 +18717,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
hash-base "^3.0.0"
hash-base "^3.0.0"
inherits "^2.0.1"
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:
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"
version "2.2.6"
resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c"
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:
...
@@ -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"
resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
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:
run-parallel@^1.1.9:
version "1.2.0"
version "1.2.0"
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
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