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
cb5b67f4
Unverified
Commit
cb5b67f4
authored
Apr 21, 2023
by
mergify[bot]
Committed by
GitHub
Apr 21, 2023
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop' into jg/test_pending_gas_limit
parents
ebe91f6d
2c160494
Changes
9
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
288 additions
and
108 deletions
+288
-108
config.yml
.circleci/config.yml
+43
-1
system_fpp_test.go
op-e2e/system_fpp_test.go
+2
-1
program.go
op-program/client/program.go
+67
-0
host.go
op-program/host/host.go
+71
-47
hints.go
op-program/preimage/hints.go
+17
-14
hints_test.go
op-program/preimage/hints_test.go
+75
-32
README.md
packages/atst/src/README.md
+2
-2
optimism-goerli.ts
...ages/contracts-periphery/config/deploy/optimism-goerli.ts
+1
-1
OptimistAllowlist.json
...iphery/deployments/optimism-goerli/OptimistAllowlist.json
+10
-10
No files found.
.circleci/config.yml
View file @
cb5b67f4
...
@@ -660,6 +660,45 @@ jobs:
...
@@ -660,6 +660,45 @@ jobs:
command
:
npx depcheck
command
:
npx depcheck
working_directory
:
integration-tests
working_directory
:
integration-tests
atst-tests
:
docker
:
-
image
:
ethereumoptimism/ci-builder:latest
resource_class
:
large
steps
:
-
checkout
-
attach_workspace
:
{
at
:
'
.'
}
-
check-changed
:
patterns
:
atst,contracts-periphery
-
restore_cache
:
name
:
Restore Yarn Package Cache
keys
:
-
yarn-packages-v2-{{ checksum "yarn.lock" }}
-
run
:
name
:
anvil
background
:
true
command
:
anvil --fork-url $ANVIL_L2_FORK_URL_MAINNET --fork-block-number
92093723
-
run
:
name
:
build
command
:
yarn build
working_directory
:
packages/atst
-
run
:
name
:
typecheck
command
:
yarn typecheck
working_directory
:
packages/atst
-
run
:
name
:
lint
command
:
yarn lint:check
working_directory
:
packages/atst
-
run
:
name
:
make sure anvil is up
command
:
npx wait-on tcp:8545 && cast block-number --rpc-url http://localhost:8545
-
run
:
name
:
test
command
:
yarn test
no_output_timeout
:
5m
working_directory
:
packages/atst
go-lint
:
go-lint
:
parameters
:
parameters
:
module
:
module
:
...
@@ -1094,6 +1133,9 @@ workflows:
...
@@ -1094,6 +1133,9 @@ workflows:
-
op-bindings-build
:
-
op-bindings-build
:
requires
:
requires
:
-
yarn-monorepo
-
yarn-monorepo
-
atst-tests
:
requires
:
-
yarn-monorepo
-
js-lint-test
:
-
js-lint-test
:
name
:
actor-tests-tests
name
:
actor-tests-tests
coverage_flag
:
actor-tests-tests
coverage_flag
:
actor-tests-tests
...
...
op-e2e/system_fpp_test.go
View file @
cb5b67f4
...
@@ -9,6 +9,7 @@ import (
...
@@ -9,6 +9,7 @@ import (
"github.com/ethereum-optimism/optimism/op-node/client"
"github.com/ethereum-optimism/optimism/op-node/client"
"github.com/ethereum-optimism/optimism/op-node/sources"
"github.com/ethereum-optimism/optimism/op-node/sources"
"github.com/ethereum-optimism/optimism/op-node/testlog"
"github.com/ethereum-optimism/optimism/op-node/testlog"
oppcl
"github.com/ethereum-optimism/optimism/op-program/client"
opp
"github.com/ethereum-optimism/optimism/op-program/host"
opp
"github.com/ethereum-optimism/optimism/op-program/host"
oppconf
"github.com/ethereum-optimism/optimism/op-program/host/config"
oppconf
"github.com/ethereum-optimism/optimism/op-program/host/config"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
...
@@ -118,7 +119,7 @@ func TestVerifyL2OutputRoot(t *testing.T) {
...
@@ -118,7 +119,7 @@ func TestVerifyL2OutputRoot(t *testing.T) {
t
.
Log
(
"Running fault proof with invalid claim"
)
t
.
Log
(
"Running fault proof with invalid claim"
)
fppConfig
.
L2Claim
=
common
.
Hash
{
0xaa
}
fppConfig
.
L2Claim
=
common
.
Hash
{
0xaa
}
err
=
opp
.
FaultProofProgram
(
log
,
fppConfig
)
err
=
opp
.
FaultProofProgram
(
log
,
fppConfig
)
require
.
ErrorIs
(
t
,
err
,
opp
.
ErrClaimNotValid
)
require
.
ErrorIs
(
t
,
err
,
opp
cl
.
ErrClaimNotValid
)
}
}
func
waitForSafeHead
(
ctx
context
.
Context
,
safeBlockNum
uint64
,
rollupClient
*
sources
.
RollupClient
)
error
{
func
waitForSafeHead
(
ctx
context
.
Context
,
safeBlockNum
uint64
,
rollupClient
*
sources
.
RollupClient
)
error
{
...
...
op-program/client/program.go
0 → 100644
View file @
cb5b67f4
package
client
import
(
"context"
"errors"
"fmt"
"io"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum-optimism/optimism/op-node/eth"
"github.com/ethereum-optimism/optimism/op-node/rollup"
cldr
"github.com/ethereum-optimism/optimism/op-program/client/driver"
"github.com/ethereum-optimism/optimism/op-program/client/l1"
"github.com/ethereum-optimism/optimism/op-program/client/l2"
"github.com/ethereum-optimism/optimism/op-program/preimage"
)
var
(
ErrClaimNotValid
=
errors
.
New
(
"invalid claim"
)
)
// ClientProgram executes the Program, while attached to an IO based pre-image oracle, to be served by a host.
func
ClientProgram
(
logger
log
.
Logger
,
cfg
*
rollup
.
Config
,
l2Cfg
*
params
.
ChainConfig
,
l1Head
common
.
Hash
,
l2Head
common
.
Hash
,
l2Claim
common
.
Hash
,
l2ClaimBlockNumber
uint64
,
preimageOracle
io
.
ReadWriter
,
preimageHinter
io
.
ReadWriter
,
)
error
{
pClient
:=
preimage
.
NewOracleClient
(
preimageOracle
)
hClient
:=
preimage
.
NewHintWriter
(
preimageHinter
)
l1PreimageOracle
:=
l1
.
NewPreimageOracle
(
pClient
,
hClient
)
l2PreimageOracle
:=
l2
.
NewPreimageOracle
(
pClient
,
hClient
)
return
Program
(
logger
,
cfg
,
l2Cfg
,
l1Head
,
l2Head
,
l2Claim
,
l2ClaimBlockNumber
,
l1PreimageOracle
,
l2PreimageOracle
)
}
// Program executes the L2 state transition, given a minimal interface to retrieve data.
func
Program
(
logger
log
.
Logger
,
cfg
*
rollup
.
Config
,
l2Cfg
*
params
.
ChainConfig
,
l1Head
common
.
Hash
,
l2Head
common
.
Hash
,
l2Claim
common
.
Hash
,
l2ClaimBlockNum
uint64
,
l1Oracle
l1
.
Oracle
,
l2Oracle
l2
.
Oracle
)
error
{
l1Source
:=
l1
.
NewOracleL1Client
(
logger
,
l1Oracle
,
l1Head
)
engineBackend
,
err
:=
l2
.
NewOracleBackedL2Chain
(
logger
,
l2Oracle
,
l2Cfg
,
l2Head
)
if
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to create oracle-backed L2 chain: %w"
,
err
)
}
l2Source
:=
l2
.
NewOracleEngine
(
cfg
,
logger
,
engineBackend
)
logger
.
Info
(
"Starting derivation"
)
d
:=
cldr
.
NewDriver
(
logger
,
cfg
,
l1Source
,
l2Source
,
l2ClaimBlockNum
)
for
{
if
err
=
d
.
Step
(
context
.
Background
());
errors
.
Is
(
err
,
io
.
EOF
)
{
break
}
else
if
err
!=
nil
{
return
err
}
}
if
!
d
.
ValidateClaim
(
eth
.
Bytes32
(
l2Claim
))
{
return
ErrClaimNotValid
}
logger
.
Info
(
"Derivation complete"
,
"head"
,
d
.
SafeHead
())
return
nil
}
op-program/host/host.go
View file @
cb5b67f4
...
@@ -9,23 +9,16 @@ import (
...
@@ -9,23 +9,16 @@ import (
"github.com/ethereum-optimism/optimism/op-node/chaincfg"
"github.com/ethereum-optimism/optimism/op-node/chaincfg"
"github.com/ethereum-optimism/optimism/op-node/client"
"github.com/ethereum-optimism/optimism/op-node/client"
"github.com/ethereum-optimism/optimism/op-node/eth"
"github.com/ethereum-optimism/optimism/op-node/sources"
"github.com/ethereum-optimism/optimism/op-node/sources"
cl
dr
"github.com/ethereum-optimism/optimism/op-program/client/driver
"
cl
"github.com/ethereum-optimism/optimism/op-program/client
"
"github.com/ethereum-optimism/optimism/op-program/host/config"
"github.com/ethereum-optimism/optimism/op-program/host/config"
"github.com/ethereum-optimism/optimism/op-program/host/kvstore"
"github.com/ethereum-optimism/optimism/op-program/host/kvstore"
"github.com/ethereum-optimism/optimism/op-program/host/l1"
"github.com/ethereum-optimism/optimism/op-program/host/l2"
"github.com/ethereum-optimism/optimism/op-program/host/prefetcher"
"github.com/ethereum-optimism/optimism/op-program/host/prefetcher"
"github.com/ethereum-optimism/optimism/op-program/preimage"
"github.com/ethereum-optimism/optimism/op-program/preimage"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/log"
)
)
var
(
ErrClaimNotValid
=
errors
.
New
(
"invalid claim"
)
)
type
L2Source
struct
{
type
L2Source
struct
{
*
sources
.
L2Client
*
sources
.
L2Client
*
sources
.
DebugClient
*
sources
.
DebugClient
...
@@ -51,8 +44,8 @@ func FaultProofProgram(logger log.Logger, cfg *config.Config) error {
...
@@ -51,8 +44,8 @@ func FaultProofProgram(logger log.Logger, cfg *config.Config) error {
kv
=
kvstore
.
NewDiskKV
(
cfg
.
DataDir
)
kv
=
kvstore
.
NewDiskKV
(
cfg
.
DataDir
)
}
}
var
preimageOracle
preimage
.
OracleFn
var
getPreimage
func
(
key
common
.
Hash
)
([]
byte
,
error
)
var
hinter
preimage
.
HinterFn
var
hinter
func
(
hint
string
)
error
if
cfg
.
FetchingEnabled
()
{
if
cfg
.
FetchingEnabled
()
{
logger
.
Info
(
"Connecting to L1 node"
,
"l1"
,
cfg
.
L1URL
)
logger
.
Info
(
"Connecting to L1 node"
,
"l1"
,
cfg
.
L1URL
)
l1RPC
,
err
:=
client
.
NewRPC
(
ctx
,
logger
,
cfg
.
L1URL
)
l1RPC
,
err
:=
client
.
NewRPC
(
ctx
,
logger
,
cfg
.
L1URL
)
...
@@ -80,54 +73,85 @@ func FaultProofProgram(logger log.Logger, cfg *config.Config) error {
...
@@ -80,54 +73,85 @@ func FaultProofProgram(logger log.Logger, cfg *config.Config) error {
logger
.
Info
(
"Setting up pre-fetcher"
)
logger
.
Info
(
"Setting up pre-fetcher"
)
prefetch
:=
prefetcher
.
NewPrefetcher
(
logger
,
l1Cl
,
l2DebugCl
,
kv
)
prefetch
:=
prefetcher
.
NewPrefetcher
(
logger
,
l1Cl
,
l2DebugCl
,
kv
)
preimageOracle
=
asOracleFn
(
func
(
key
common
.
Hash
)
([]
byte
,
error
)
{
getPreimage
=
func
(
key
common
.
Hash
)
([]
byte
,
error
)
{
return
prefetch
.
GetPreimage
(
ctx
,
key
)
}
return
prefetch
.
GetPreimage
(
ctx
,
key
)
hinter
=
prefetch
.
Hint
})
hinter
=
asHinter
(
prefetch
.
Hint
)
}
else
{
}
else
{
logger
.
Info
(
"Using offline mode. All required pre-images must be pre-populated."
)
logger
.
Info
(
"Using offline mode. All required pre-images must be pre-populated."
)
preimageOracle
=
asOracleFn
(
kv
.
Get
)
getPreimage
=
kv
.
Get
hinter
=
func
(
v
preimage
.
Hint
)
{
hinter
=
func
(
hint
string
)
error
{
logger
.
Debug
(
"ignoring prefetch hint"
,
"hint"
,
v
)
logger
.
Debug
(
"ignoring prefetch hint"
,
"hint"
,
hint
)
return
nil
}
}
}
}
l1Source
:=
l1
.
NewSource
(
logger
,
preimageOracle
,
hinter
,
cfg
.
L1Head
)
l2Source
,
err
:=
l2
.
NewEngine
(
logger
,
preimageOracle
,
hinter
,
cfg
)
// Setup pipe for preimage oracle interaction
if
err
!=
nil
{
pClientRW
,
pHostRW
:=
bidirectionalPipe
()
return
fmt
.
Errorf
(
"connect l2 oracle: %w"
,
err
)
oracleServer
:=
preimage
.
NewOracleServer
(
pHostRW
)
}
// Setup pipe for hint comms
hClientRW
,
hHostRW
:=
bidirectionalPipe
()
hHost
:=
preimage
.
NewHintReader
(
hHostRW
)
defer
pHostRW
.
Close
()
defer
hHostRW
.
Close
()
routeHints
(
logger
,
hHost
,
hinter
)
launchOracleServer
(
logger
,
oracleServer
,
getPreimage
)
logger
.
Info
(
"Starting derivation"
)
return
cl
.
ClientProgram
(
d
:=
cldr
.
NewDriver
(
logger
,
cfg
.
Rollup
,
l1Source
,
l2Source
,
cfg
.
L2ClaimBlockNumber
)
logger
,
for
{
cfg
.
Rollup
,
if
err
=
d
.
Step
(
ctx
);
errors
.
Is
(
err
,
io
.
EOF
)
{
cfg
.
L2ChainConfig
,
break
cfg
.
L1Head
,
}
else
if
err
!=
nil
{
cfg
.
L2Head
,
cfg
.
L2Claim
,
cfg
.
L2ClaimBlockNumber
,
pClientRW
,
hClientRW
,
)
}
type
readWritePair
struct
{
io
.
ReadCloser
io
.
WriteCloser
}
func
(
rw
*
readWritePair
)
Close
()
error
{
if
err
:=
rw
.
ReadCloser
.
Close
();
err
!=
nil
{
return
err
return
err
}
}
}
return
rw
.
WriteCloser
.
Close
()
if
!
d
.
ValidateClaim
(
eth
.
Bytes32
(
cfg
.
L2Claim
))
{
return
ErrClaimNotValid
}
return
nil
}
}
func
asOracleFn
(
getter
func
(
key
common
.
Hash
)
([]
byte
,
error
))
preimage
.
OracleFn
{
func
bidirectionalPipe
()
(
a
,
b
io
.
ReadWriteCloser
)
{
return
func
(
key
preimage
.
Key
)
[]
byte
{
ar
,
bw
:=
io
.
Pipe
()
pre
,
err
:=
getter
(
key
.
PreimageKey
())
br
,
aw
:=
io
.
Pipe
()
if
err
!=
nil
{
return
&
readWritePair
{
ReadCloser
:
ar
,
WriteCloser
:
aw
},
&
readWritePair
{
ReadCloser
:
br
,
WriteCloser
:
bw
}
panic
(
fmt
.
Errorf
(
"preimage unavailable for key %v: %w"
,
key
,
err
))
}
func
routeHints
(
logger
log
.
Logger
,
hintReader
*
preimage
.
HintReader
,
hinter
func
(
hint
string
)
error
)
{
go
func
()
{
for
{
if
err
:=
hintReader
.
NextHint
(
hinter
);
err
!=
nil
{
if
err
==
io
.
EOF
||
errors
.
Is
(
err
,
io
.
ErrClosedPipe
)
{
logger
.
Info
(
"closing pre-image hint handler"
)
return
}
logger
.
Error
(
"pre-image hint router error"
,
"err"
,
err
)
return
}
}
return
pre
}
}
}()
}
}
func
asHinter
(
hint
func
(
hint
string
)
error
)
preimage
.
HinterFn
{
func
launchOracleServer
(
logger
log
.
Logger
,
server
*
preimage
.
OracleServer
,
getter
func
(
key
common
.
Hash
)
([]
byte
,
error
))
{
return
func
(
v
preimage
.
Hint
)
{
go
func
()
{
err
:=
hint
(
v
.
Hint
())
for
{
if
err
!=
nil
{
if
err
:=
server
.
NextPreimageRequest
(
getter
);
err
!=
nil
{
panic
(
fmt
.
Errorf
(
"hint rejected %v: %w"
,
v
,
err
))
if
err
==
io
.
EOF
||
errors
.
Is
(
err
,
io
.
ErrClosedPipe
)
{
logger
.
Info
(
"closing pre-image server"
)
return
}
logger
.
Error
(
"pre-image server error"
,
"error"
,
err
)
return
}
}
}
}
}()
}
}
op-program/preimage/hints.go
View file @
cb5b67f4
...
@@ -9,13 +9,13 @@ import (
...
@@ -9,13 +9,13 @@ import (
// HintWriter writes hints to an io.Writer (e.g. a special file descriptor, or a debug log),
// HintWriter writes hints to an io.Writer (e.g. a special file descriptor, or a debug log),
// for a pre-image oracle service to prepare specific pre-images.
// for a pre-image oracle service to prepare specific pre-images.
type
HintWriter
struct
{
type
HintWriter
struct
{
w
io
.
Writer
rw
io
.
Read
Writer
}
}
var
_
Hinter
=
(
*
HintWriter
)(
nil
)
var
_
Hinter
=
(
*
HintWriter
)(
nil
)
func
NewHintWriter
(
w
io
.
Writer
)
*
HintWriter
{
func
NewHintWriter
(
rw
io
.
Read
Writer
)
*
HintWriter
{
return
&
HintWriter
{
w
:
w
}
return
&
HintWriter
{
rw
:
r
w
}
}
}
func
(
hw
*
HintWriter
)
Hint
(
v
Hint
)
{
func
(
hw
*
HintWriter
)
Hint
(
v
Hint
)
{
...
@@ -23,26 +23,29 @@ func (hw *HintWriter) Hint(v Hint) {
...
@@ -23,26 +23,29 @@ func (hw *HintWriter) Hint(v Hint) {
var
hintBytes
[]
byte
var
hintBytes
[]
byte
hintBytes
=
binary
.
BigEndian
.
AppendUint32
(
hintBytes
,
uint32
(
len
(
hint
)))
hintBytes
=
binary
.
BigEndian
.
AppendUint32
(
hintBytes
,
uint32
(
len
(
hint
)))
hintBytes
=
append
(
hintBytes
,
[]
byte
(
hint
)
...
)
hintBytes
=
append
(
hintBytes
,
[]
byte
(
hint
)
...
)
hintBytes
=
append
(
hintBytes
,
0
)
// to block writing on
_
,
err
:=
hw
.
rw
.
Write
(
hintBytes
)
_
,
err
:=
hw
.
w
.
Write
(
hintBytes
)
if
err
!=
nil
{
if
err
!=
nil
{
panic
(
fmt
.
Errorf
(
"failed to write pre-image hint: %w"
,
err
))
panic
(
fmt
.
Errorf
(
"failed to write pre-image hint: %w"
,
err
))
}
}
_
,
err
=
hw
.
rw
.
Read
([]
byte
{
0
})
if
err
!=
nil
{
panic
(
fmt
.
Errorf
(
"failed to read pre-image hint ack: %w"
,
err
))
}
}
}
// HintReader reads the hints of HintWriter and passes them to a router for preparation of the requested pre-images.
// HintReader reads the hints of HintWriter and passes them to a router for preparation of the requested pre-images.
// Onchain the written hints are no-op.
// Onchain the written hints are no-op.
type
HintReader
struct
{
type
HintReader
struct
{
r
io
.
Read
er
r
w
io
.
ReadWrit
er
}
}
func
NewHintReader
(
r
io
.
Read
er
)
*
HintReader
{
func
NewHintReader
(
r
w
io
.
ReadWrit
er
)
*
HintReader
{
return
&
HintReader
{
r
:
r
}
return
&
HintReader
{
r
w
:
rw
}
}
}
func
(
hr
*
HintReader
)
NextHint
(
router
func
(
hint
string
)
error
)
error
{
func
(
hr
*
HintReader
)
NextHint
(
router
func
(
hint
string
)
error
)
error
{
var
length
uint32
var
length
uint32
if
err
:=
binary
.
Read
(
hr
.
r
,
binary
.
BigEndian
,
&
length
);
err
!=
nil
{
if
err
:=
binary
.
Read
(
hr
.
r
w
,
binary
.
BigEndian
,
&
length
);
err
!=
nil
{
if
err
==
io
.
EOF
{
if
err
==
io
.
EOF
{
return
io
.
EOF
return
io
.
EOF
}
}
...
@@ -50,17 +53,17 @@ func (hr *HintReader) NextHint(router func(hint string) error) error {
...
@@ -50,17 +53,17 @@ func (hr *HintReader) NextHint(router func(hint string) error) error {
}
}
payload
:=
make
([]
byte
,
length
)
payload
:=
make
([]
byte
,
length
)
if
length
>
0
{
if
length
>
0
{
if
_
,
err
:=
io
.
ReadFull
(
hr
.
r
,
payload
);
err
!=
nil
{
if
_
,
err
:=
io
.
ReadFull
(
hr
.
r
w
,
payload
);
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to read hint payload (length %d): %w"
,
length
,
err
)
return
fmt
.
Errorf
(
"failed to read hint payload (length %d): %w"
,
length
,
err
)
}
}
}
}
if
err
:=
router
(
string
(
payload
));
err
!=
nil
{
if
err
:=
router
(
string
(
payload
));
err
!=
nil
{
//
stream recovery
//
write back on error to unblock the HintWriter
_
,
_
=
hr
.
r
.
Read
([]
byte
{
0
})
_
,
_
=
hr
.
r
w
.
Write
([]
byte
{
0
})
return
fmt
.
Errorf
(
"failed to handle hint: %w"
,
err
)
return
fmt
.
Errorf
(
"failed to handle hint: %w"
,
err
)
}
}
if
_
,
err
:=
hr
.
r
.
Read
([]
byte
{
0
});
err
!=
nil
{
if
_
,
err
:=
hr
.
r
w
.
Write
([]
byte
{
0
});
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to
read
trailing no-op byte to unblock hint writer: %w"
,
err
)
return
fmt
.
Errorf
(
"failed to
write
trailing no-op byte to unblock hint writer: %w"
,
err
)
}
}
return
nil
return
nil
}
}
op-program/preimage/hints_test.go
View file @
cb5b67f4
...
@@ -5,7 +5,9 @@ import (
...
@@ -5,7 +5,9 @@ import (
"crypto/rand"
"crypto/rand"
"errors"
"errors"
"io"
"io"
"sync"
"testing"
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/require"
)
)
...
@@ -20,16 +22,25 @@ func TestHints(t *testing.T) {
...
@@ -20,16 +22,25 @@ func TestHints(t *testing.T) {
// Note: pretty much every string is valid communication:
// Note: pretty much every string is valid communication:
// length, payload, 0. Worst case you run out of data, or allocate too much.
// length, payload, 0. Worst case you run out of data, or allocate too much.
testHint
:=
func
(
hints
...
string
)
{
testHint
:=
func
(
hints
...
string
)
{
var
buf
bytes
.
Buffer
a
,
b
:=
bidirectionalPipe
()
hw
:=
NewHintWriter
(
&
buf
)
var
wg
sync
.
WaitGroup
wg
.
Add
(
2
)
go
func
()
{
hw
:=
NewHintWriter
(
a
)
for
_
,
h
:=
range
hints
{
for
_
,
h
:=
range
hints
{
hw
.
Hint
(
rawHint
(
h
))
hw
.
Hint
(
rawHint
(
h
))
}
}
hr
:=
NewHintReader
(
&
buf
)
wg
.
Done
()
var
got
[]
string
}()
for
i
:=
0
;
i
<
100
;
i
++
{
// sanity limit
got
:=
make
(
chan
string
,
len
(
hints
))
go
func
()
{
defer
wg
.
Done
()
hr
:=
NewHintReader
(
b
)
for
i
:=
0
;
i
<
len
(
hints
);
i
++
{
err
:=
hr
.
NextHint
(
func
(
hint
string
)
error
{
err
:=
hr
.
NextHint
(
func
(
hint
string
)
error
{
got
=
append
(
got
,
hint
)
got
<-
hint
return
nil
return
nil
})
})
if
err
==
io
.
EOF
{
if
err
==
io
.
EOF
{
...
@@ -37,9 +48,14 @@ func TestHints(t *testing.T) {
...
@@ -37,9 +48,14 @@ func TestHints(t *testing.T) {
}
}
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
}
}
}()
if
waitTimeout
(
&
wg
)
{
t
.
Error
(
"hint read/write stuck"
)
}
require
.
Equal
(
t
,
len
(
hints
),
len
(
got
),
"got all hints"
)
require
.
Equal
(
t
,
len
(
hints
),
len
(
got
),
"got all hints"
)
for
i
,
h
:=
range
hints
{
for
_
,
h
:=
range
hints
{
require
.
Equal
(
t
,
h
,
got
[
i
]
,
"hints match"
)
require
.
Equal
(
t
,
h
,
<-
got
,
"hints match"
)
}
}
}
}
...
@@ -73,11 +89,19 @@ func TestHints(t *testing.T) {
...
@@ -73,11 +89,19 @@ func TestHints(t *testing.T) {
require
.
ErrorIs
(
t
,
err
,
io
.
ErrUnexpectedEOF
)
require
.
ErrorIs
(
t
,
err
,
io
.
ErrUnexpectedEOF
)
})
})
t
.
Run
(
"cb error"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"cb error"
,
func
(
t
*
testing
.
T
)
{
var
buf
bytes
.
Buffer
a
,
b
:=
bidirectionalPipe
()
hw
:=
NewHintWriter
(
&
buf
)
var
wg
sync
.
WaitGroup
wg
.
Add
(
2
)
go
func
()
{
hw
:=
NewHintWriter
(
a
)
hw
.
Hint
(
rawHint
(
"one"
))
hw
.
Hint
(
rawHint
(
"one"
))
hw
.
Hint
(
rawHint
(
"two"
))
hw
.
Hint
(
rawHint
(
"two"
))
hr
:=
NewHintReader
(
&
buf
)
wg
.
Done
()
}()
go
func
()
{
defer
wg
.
Done
()
hr
:=
NewHintReader
(
b
)
cbErr
:=
errors
.
New
(
"fail"
)
cbErr
:=
errors
.
New
(
"fail"
)
err
:=
hr
.
NextHint
(
func
(
hint
string
)
error
{
return
cbErr
})
err
:=
hr
.
NextHint
(
func
(
hint
string
)
error
{
return
cbErr
})
require
.
ErrorIs
(
t
,
err
,
cbErr
)
require
.
ErrorIs
(
t
,
err
,
cbErr
)
...
@@ -88,5 +112,24 @@ func TestHints(t *testing.T) {
...
@@ -88,5 +112,24 @@ func TestHints(t *testing.T) {
})
})
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
readHint
,
"two"
)
require
.
Equal
(
t
,
readHint
,
"two"
)
}()
if
waitTimeout
(
&
wg
)
{
t
.
Error
(
"read/write hint stuck"
)
}
})
})
}
}
// waitTimeout returns true iff wg.Wait timed out
func
waitTimeout
(
wg
*
sync
.
WaitGroup
)
bool
{
done
:=
make
(
chan
struct
{})
go
func
()
{
wg
.
Wait
()
close
(
done
)
}()
select
{
case
<-
time
.
After
(
time
.
Second
*
30
)
:
return
true
case
<-
done
:
return
false
}
}
packages/atst/src/README.md
View file @
cb5b67f4
...
@@ -18,7 +18,7 @@ Vitest snapshots for the vitest tests
...
@@ -18,7 +18,7 @@ Vitest snapshots for the vitest tests
CLI implementations of atst read and write
CLI implementations of atst read and write
## contants
## con
s
tants
Internal and external constants
Internal and external constants
...
...
packages/contracts-periphery/config/deploy/optimism-goerli.ts
View file @
cb5b67f4
...
@@ -12,7 +12,7 @@ const config: DeployConfig = {
...
@@ -12,7 +12,7 @@ const config: DeployConfig = {
optimistAllowlistAllowlistAttestor
:
optimistAllowlistAllowlistAttestor
:
'
0x8F0EBDaA1cF7106bE861753B0f9F5c0250fE0819
'
,
'
0x8F0EBDaA1cF7106bE861753B0f9F5c0250fE0819
'
,
optimistAllowlistCoinbaseQuestAttestor
:
optimistAllowlistCoinbaseQuestAttestor
:
'
0x
8F0EBDaA1cF7106bE861753B0f9F5c0250fE0819
'
,
'
0x
9A75024c09b48B78205dfCf9D9FC5E026CD9A416
'
,
}
}
export
default
config
export
default
config
packages/contracts-periphery/deployments/optimism-goerli/OptimistAllowlist.json
View file @
cb5b67f4
This diff is collapsed.
Click to expand it.
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