diff --git a/.changeset/config.json b/.changeset/config.json index d18f3a96e5afa..b3008c6a2fc01 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -4,7 +4,7 @@ "commit": false, "linked": [], "access": "public", - "baseBranch": "develop", + "baseBranch": "master", "updateInternalDependencies": "patch", "ignore": [] } diff --git a/.changeset/eleven-experts-crash.md b/.changeset/eleven-experts-crash.md new file mode 100644 index 0000000000000..44f1044da268a --- /dev/null +++ b/.changeset/eleven-experts-crash.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/contracts-bedrock': patch +--- + +contracts-bedrock was exporting hardhat when it didn't need to be diff --git a/.changeset/friendly-kids-fly.md b/.changeset/friendly-kids-fly.md new file mode 100644 index 0000000000000..83522a824acbc --- /dev/null +++ b/.changeset/friendly-kids-fly.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/contracts-periphery': patch +--- + +Add faucet contract diff --git a/.changeset/mighty-cameras-check.md b/.changeset/mighty-cameras-check.md new file mode 100644 index 0000000000000..65e18108c9cf7 --- /dev/null +++ b/.changeset/mighty-cameras-check.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/sdk': patch +--- + +add eco bridge adapter diff --git a/.changeset/new-mails-explain.md b/.changeset/new-mails-explain.md new file mode 100644 index 0000000000000..e8fdc079099f2 --- /dev/null +++ b/.changeset/new-mails-explain.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/contracts-bedrock': minor +--- + +Bump XDM semver after #5444 diff --git a/.changeset/nine-pugs-fix.md b/.changeset/nine-pugs-fix.md new file mode 100644 index 0000000000000..e8165d0402506 --- /dev/null +++ b/.changeset/nine-pugs-fix.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/sdk': patch +--- + +Fix firefox bug with getTokenPair diff --git a/.changeset/old-poets-camp.md b/.changeset/old-poets-camp.md new file mode 100644 index 0000000000000..d7dccdc25184a --- /dev/null +++ b/.changeset/old-poets-camp.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/chain-mon': patch +--- + +Fixes a bug in the wd-mon service where a node connection failure event was not handled correctly diff --git a/.changeset/plenty-moles-shout.md b/.changeset/plenty-moles-shout.md new file mode 100644 index 0000000000000..af7269ff15278 --- /dev/null +++ b/.changeset/plenty-moles-shout.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/contracts-bedrock': minor +--- + +Increase precision in `SafeCall.hasMinGas` diff --git a/.changeset/rare-moose-itch.md b/.changeset/rare-moose-itch.md new file mode 100644 index 0000000000000..85995191a8a8a --- /dev/null +++ b/.changeset/rare-moose-itch.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/sdk': patch +--- + +Update the migrated withdrawal gas limit for non goerli networks diff --git a/.changeset/strange-bugs-talk.md b/.changeset/strange-bugs-talk.md new file mode 100644 index 0000000000000..adc14626adf31 --- /dev/null +++ b/.changeset/strange-bugs-talk.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/contracts-periphery': patch +--- + +Change type for auth id on Faucet contracts from bytes to bytes32 diff --git a/.changeset/three-colts-march.md b/.changeset/three-colts-march.md new file mode 100644 index 0000000000000..7a0b7c2671176 --- /dev/null +++ b/.changeset/three-colts-march.md @@ -0,0 +1,7 @@ +--- +'@eth-optimism/contracts-bedrock': minor +'@eth-optimism/contracts': minor +'@eth-optimism/sdk': minor +--- + +Update sdk contract addresses for bedrock diff --git a/.changeset/tough-flies-fetch.md b/.changeset/tough-flies-fetch.md new file mode 100644 index 0000000000000..6c66167c8fc47 --- /dev/null +++ b/.changeset/tough-flies-fetch.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/sdk': patch +--- + +Add warning if bedrock is not turned on diff --git a/.circleci/config.yml b/.circleci/config.yml index 16b8eff463e7a..1eeab21904751 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,6 +3,7 @@ version: 2.1 orbs: go: circleci/go@1.5.0 gcp-cli: circleci/gcp-cli@3.0.1 + slack: circleci/slack@4.10.1 commands: gcp-oidc-authenticate: description: "Authenticate with GCP using a CircleCI OIDC token." @@ -60,8 +61,8 @@ commands: jobs: yarn-monorepo: docker: - - image: ethereumoptimism/ci-builder:latest - resource_class: xlarge + - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest + resource_class: large steps: - checkout - check-changed: @@ -142,7 +143,7 @@ jobs: default: "oplabs-tools-artifacts/images" machine: image: ubuntu-2204:2022.07.1 - resource_class: xlarge + resource_class: medium steps: - checkout - run: @@ -207,7 +208,7 @@ jobs: default: "linux/amd64" machine: image: ubuntu-2204:2022.07.1 - resource_class: xlarge + resource_class: medium steps: - gcp-oidc-authenticate # Below is CircleCI recommended way of specifying nameservers on an Ubuntu box: @@ -247,6 +248,10 @@ jobs: docker_context: description: Docker build context type: string + docker_target: + description: "target build stage" + type: string + default: "" registry: description: Docker registry type: string @@ -261,7 +266,7 @@ jobs: default: "linux/amd64" machine: image: ubuntu-2204:2022.07.1 - resource_class: xlarge + resource_class: medium steps: - gcp-cli/install - gcp-oidc-authenticate @@ -277,7 +282,7 @@ jobs: DOCKER_TAGS=$(echo -ne <> | sed "s/,/\n/g" | sed "s/[^a-zA-Z0-9\n]/-/g" | sed -e "s|^|-t ${IMAGE_BASE}:|") docker context create buildx-build docker buildx create --use buildx-build - docker buildx build --platform=<> --push \ + docker buildx build --platform=<> --target "<>" --push \ $(echo -ne $DOCKER_TAGS | tr '\n' ' ') \ -f <> \ <> @@ -286,9 +291,9 @@ jobs: command: | ./ops/scripts/ci-docker-tag-op-stack-release.sh <>/<> $CIRCLE_TAG $CIRCLE_SHA1 - contracts-bedrock-tests: + contracts-bedrock-coverage: docker: - - image: ethereumoptimism/ci-builder:latest + - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest resource_class: large steps: - checkout @@ -304,9 +309,8 @@ jobs: command: forge --version working_directory: packages/contracts-bedrock - run: - name: test and generate coverage + name: generate coverage report command: yarn coverage:lcov - no_output_timeout: 18m environment: FOUNDRY_PROFILE: ci working_directory: packages/contracts-bedrock @@ -316,9 +320,33 @@ jobs: environment: FOUNDRY_PROFILE: ci + contracts-bedrock-tests: + docker: + - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest + resource_class: large + steps: + - checkout + - attach_workspace: { at: "." } + - restore_cache: + name: Restore Yarn Package Cache + keys: + - yarn-packages-v2-{{ checksum "yarn.lock" }} + - check-changed: + patterns: contracts-bedrock,hardhat-deploy-config + - run: + name: print forge version + command: forge --version + working_directory: packages/contracts-bedrock + - run: + name: run tests + command: yarn test + environment: + FOUNDRY_PROFILE: ci + working_directory: packages/contracts-bedrock + contracts-bedrock-checks: docker: - - image: ethereumoptimism/ci-builder:latest + - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest steps: - checkout - attach_workspace: { at: "." } @@ -341,6 +369,13 @@ jobs: environment: FOUNDRY_PROFILE: ci working_directory: packages/contracts-bedrock + - run: + name: validate deploy configs + command: | + yarn validate-deploy-configs || echo "export DEPLOY_CONFIG_STATUS=1" >> "$BASH_ENV" + environment: + FOUNDRY_PROFILE: ci + working_directory: packages/contracts-bedrock - run: name: storage snapshot command: | @@ -364,6 +399,10 @@ jobs: FAILED=1 echo "Gas snapshot failed, see job output for details." fi + if [[ "$DEPLOY_CONFIG_STATUS" -ne 0 ]]; then + FAILED=1 + echo "Deploy configs invalid, see job output for details." + fi if [[ "$STORAGE_SNAPSHOT_STATUS" -ne 0 ]]; then echo "Storage snapshot failed, see job output for details." FAILED=1 @@ -378,8 +417,8 @@ jobs: contracts-bedrock-slither: docker: - - image: ethereumoptimism/ci-builder:latest - resource_class: xlarge + - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest + resource_class: large steps: - checkout - attach_workspace: { at: "." } @@ -398,7 +437,7 @@ jobs: contracts-bedrock-validate-spaces: docker: - - image: ethereumoptimism/ci-builder:latest + - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest steps: - checkout - attach_workspace: { at: "." } @@ -415,7 +454,7 @@ jobs: bedrock-echidna-build: docker: - - image: ethereumoptimism/ci-builder:latest + - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest steps: - checkout - attach_workspace: { at: "." } @@ -433,7 +472,7 @@ jobs: bedrock-echidna-run: docker: - - image: ethereumoptimism/ci-builder:latest + - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest parameters: echidna_target: description: Which echidna fuzz contract to run @@ -460,7 +499,7 @@ jobs: op-bindings-build: docker: - - image: ethereumoptimism/ci-builder:latest + - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest resource_class: medium steps: - checkout @@ -489,7 +528,7 @@ jobs: description: Coverage flag name type: string docker: - - image: ethereumoptimism/ci-builder:latest + - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest resource_class: large steps: - checkout @@ -512,6 +551,55 @@ jobs: name: Upload coverage command: codecov --verbose --clean --flags <> + sdk-next-tests: + docker: + - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest + resource_class: large + steps: + - checkout + - attach_workspace: { at: "." } + - check-changed: + patterns: sdk,contracts-bedrock,contracts + - restore_cache: + name: Restore Yarn Package Cache + keys: + - yarn-packages-v2-{{ checksum "yarn.lock" }} + - run: + name: anvil-l1 + background: true + # atm this is goerli but we should use mainnet after bedrock is live + command: anvil --fork-url $ANVIL_L1_FORK_URL --fork-block-number 9023108 + - run: + name: anvil-l2 + background: true + # atm this is goerli but we should use mainnet after bedrock is live + command: anvil --fork-url $ANVIL_L2_FORK_URL --port 9545 --fork-block-number 9504811 + - run: + name: build + command: yarn build + working_directory: packages/sdk + - run: + name: lint + command: yarn lint:check + working_directory: packages/sdk + - run: + name: make sure anvil l1 is up + command: npx wait-on tcp:8545 && cast block-number --rpc-url http://localhost:8545 + - run: + name: make sure anvil l2 is up + command: npx wait-on tcp:9545 && cast block-number --rpc-url http://localhost:9545 + - run: + name: test:next + command: yarn test:next:run + no_output_timeout: 5m + working_directory: packages/sdk + environment: + # anvil[0] test private key + VITE_E2E_PRIVATE_KEY: "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" + VITE_E2E_RPC_URL_L1: http://localhost:8545 + VITE_E2E_RPC_URL_L2: http://localhost:9545 + + bedrock-markdown: machine: image: ubuntu-2204:2022.07.1 @@ -528,14 +616,24 @@ jobs: - run: name: markdown lint command: yarn lint:specs:check + + bedrock-markdown-links: + machine: + image: ubuntu-2204:2022.07.1 + steps: + - checkout - run: name: link lint command: | - docker run --init -it -v `pwd`:/input lycheeverse/lychee --verbose --no-progress --exclude-loopback --exclude twitter.com --exclude-mail /input/README.md "/input/specs/**/*.md" + make bedrock-markdown-links + - slack/notify: + channel: C055R639XT9 #notify-link-check + event: fail + template: basic_fail_1 fuzz-op-node: docker: - - image: ethereumoptimism/ci-builder:latest + - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest steps: - checkout - check-changed: @@ -545,9 +643,21 @@ jobs: command: make fuzz working_directory: op-node + fuzz-op-chain-ops: + docker: + - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest + steps: + - checkout + - check-changed: + patterns: op-chain-ops,op-bindings + - run: + name: Fuzz + command: make fuzz + working_directory: op-chain-ops + depcheck: docker: - - image: ethereumoptimism/ci-builder:latest + - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest steps: - checkout - attach_workspace: { at: "." } @@ -588,6 +698,47 @@ jobs: command: npx depcheck working_directory: integration-tests + atst-tests: + docker: + - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/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 + environment: + CI: true + + go-lint: parameters: module: @@ -600,7 +751,7 @@ jobs: - run: name: run lint command: | - golangci-lint run -E goimports,sqlclosecheck,bodyclose,asciicheck,misspell,errorlint --timeout 2m -e "errors.As" -e "errors.Is" ./... + golangci-lint run -E goimports,sqlclosecheck,bodyclose,asciicheck,misspell,errorlint --timeout 5m -e "errors.As" -e "errors.Is" ./... working_directory: <> go-test: @@ -609,7 +760,7 @@ jobs: description: Go Module Name type: string docker: - - image: ethereumoptimism/ci-builder:latest # only used to enable codecov. + - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest # only used to enable codecov. resource_class: xlarge steps: - checkout @@ -637,7 +788,7 @@ jobs: description: If the op-e2e package should use HTTP clients type: string docker: - - image: ethereumoptimism/ci-builder:latest + - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest resource_class: xlarge steps: - checkout @@ -676,7 +827,7 @@ jobs: type: string default: this-package-does-not-exist docker: - - image: ethereumoptimism/ci-builder:latest + - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest - image: cimg/postgres:14.1 steps: - checkout @@ -705,7 +856,7 @@ jobs: geth-tests: docker: - - image: ethereumoptimism/ci-builder:latest + - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest steps: - checkout - check-changed: @@ -900,7 +1051,7 @@ jobs: docker: - image: returntocorp/semgrep - resource_class: xlarge + resource_class: medium steps: - checkout - unless: @@ -925,7 +1076,7 @@ jobs: go-mod-tidy: docker: - - image: ethereumoptimism/ci-builder:latest + - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest steps: - checkout - run: @@ -942,7 +1093,7 @@ jobs: machine: image: ubuntu-2204:2022.07.1 docker_layer_caching: true - resource_class: xlarge + resource_class: large steps: - attach_workspace: at: /tmp/docker_images @@ -963,7 +1114,7 @@ jobs: ./hive \ -sim=<> \ -sim.loglevel=5 \ - -client=go-ethereum,op-geth_optimism,op-proposer_<>,op-batcher_<>,op-node_<> |& tee /tmp/hive.log || echo "failed." + -client=go-ethereum_v1.11.6,op-geth_optimism,op-proposer_<>,op-batcher_<>,op-node_<> |& tee /tmp/hive.log || echo "failed." - run: command: | tar -cvf /tmp/workspace.tgz -C /home/circleci/project /home/circleci/project/workspace @@ -981,6 +1132,21 @@ jobs: steps: - run: echo Done + fpp-verify: + docker: + - image: cimg/go:1.19 + steps: + - checkout + - run: + name: verify-goerli + command: | + make verify-goerli + working_directory: op-program + - slack/notify: + channel: C03N11M0BBN + event: fail + template: basic_fail_1 + workflows: main: jobs: @@ -1007,6 +1173,9 @@ workflows: - contracts-bedrock-tests: requires: - yarn-monorepo + - contracts-bedrock-coverage: + requires: + - yarn-monorepo - contracts-bedrock-checks: requires: - yarn-monorepo @@ -1019,6 +1188,9 @@ workflows: - op-bindings-build: requires: - yarn-monorepo + - atst-tests: + requires: + - yarn-monorepo - js-lint-test: name: actor-tests-tests coverage_flag: actor-tests-tests @@ -1068,6 +1240,10 @@ workflows: dependencies: "(common-ts|core-utils)" requires: - yarn-monorepo + - sdk-next-tests: + name: sdk-next-tests + requires: + - yarn-monorepo - js-lint-test: name: sdk-tests coverage_flag: sdk-tests @@ -1122,6 +1298,7 @@ workflows: - semgrep-scan - go-mod-tidy - fuzz-op-node + - fuzz-op-chain-ops - bedrock-markdown - go-lint: name: op-batcher-lint @@ -1141,6 +1318,9 @@ workflows: - go-lint: name: op-proposer-lint module: op-proposer + - go-lint: + name: op-challenger-lint + module: op-challenger - go-lint: name: op-program-lint module: op-program @@ -1166,6 +1346,9 @@ workflows: - go-test: name: op-proposer-tests module: op-proposer + - go-test: + name: op-challenger-tests + module: op-challenger - go-test: name: op-program-tests module: op-program @@ -1188,6 +1371,7 @@ workflows: - op-e2e-lint - op-node-lint - op-proposer-lint + - op-challenger-lint - op-program-lint - op-service-lint - op-batcher-tests @@ -1195,6 +1379,7 @@ workflows: - op-chain-ops-tests - op-node-tests - op-proposer-tests + - op-challenger-tests - op-program-tests - op-service-tests - op-e2e-WS-tests @@ -1227,6 +1412,20 @@ workflows: context: - oplabs-gcr platforms: "linux/amd64,linux/arm64" + - docker-build: + name: op-program-docker-build + docker_file: op-program/Dockerfile + docker_name: op-program + docker_tags: <>,<> + docker_context: . + - docker-publish: + name: op-program-docker-publish + docker_file: op-program/Dockerfile + docker_name: op-program + docker_tags: <>,<> + context: + - oplabs-gcr + platforms: "linux/amd64,linux/arm64" - docker-build: name: op-proposer-docker-build docker_file: op-proposer/Dockerfile @@ -1241,6 +1440,20 @@ workflows: context: - oplabs-gcr platforms: "linux/amd64,linux/arm64" + - docker-build: + name: op-challenger-docker-build + docker_file: op-challenger/Dockerfile + docker_name: op-challenger + docker_tags: <>,<> + docker_context: . + - docker-publish: + name: op-challenger-docker-publish + docker_file: op-challenger/Dockerfile + docker_name: op-challenger + docker_tags: <>,<> + context: + - oplabs-gcr + platforms: "linux/amd64,linux/arm64" - docker-build: name: op-heartbeat-docker-build docker_file: op-heartbeat/Dockerfile @@ -1275,6 +1488,14 @@ workflows: docker_target: wd-mon context: - oplabs-gcr + - docker-publish: + name: fault-detector-docker-publish + docker_file: ./ops/docker/Dockerfile.packages + docker_name: fault-detector + docker_tags: <>,<> + docker_target: fault-detector + context: + - oplabs-gcr - hive-test: name: hive-test-rpc version: <> @@ -1283,6 +1504,7 @@ workflows: - op-node-docker-build - op-batcher-docker-build - op-proposer-docker-build + - op-challenger-docker-build - hive-test: name: hive-test-p2p version: <> @@ -1291,6 +1513,7 @@ workflows: - op-node-docker-build - op-batcher-docker-build - op-proposer-docker-build + - op-challenger-docker-build - hive-test: name: hive-test-l1ops version: <> @@ -1299,13 +1522,14 @@ workflows: - op-node-docker-build - op-batcher-docker-build - op-proposer-docker-build + - op-challenger-docker-build release: jobs: - hold: type: approval filters: tags: - only: /^op-[a-z0-9\-]*\/v.*/ + only: /^(fault-detector|proxyd|op-[a-z0-9\-]*)\/v.*/ branches: ignore: /.*/ - docker-release: @@ -1356,6 +1580,39 @@ workflows: - oplabs-gcr-release requires: - hold + - docker-release: + name: op-challenger-docker-release + filters: + tags: + only: /^op-challenger\/v.*/ + branches: + ignore: /.*/ + docker_file: op-challenger/Dockerfile + docker_name: op-challenger + docker_tags: <>,<> + docker_context: . + platforms: "linux/amd64,linux/arm64" + context: + - oplabs-gcr-release + requires: + - hold + - docker-release: + name: fault-detector-docker-release + filters: + tags: + only: /^fault-detector\/v.*/ + branches: + ignore: /.*/ + docker_file: ./ops/docker/Dockerfile.packages + docker_name: fault-detector + docker_tags: <>,<> + docker_target: fault-detector + docker_context: . + platforms: "linux/amd64,linux/arm64" + context: + - oplabs-gcr-release + requires: + - hold - docker-build: name: op-migrate-docker-release filters: @@ -1371,3 +1628,58 @@ workflows: - oplabs-gcr-release requires: - hold + - docker-release: + name: proxyd-docker-release + filters: + tags: + only: /^proxyd\/v.*/ + branches: + ignore: /.*/ + docker_file: proxyd/Dockerfile + docker_name: proxyd + docker_tags: <>,<> + docker_context: . + context: + - oplabs-gcr-release + requires: + - hold + release-ci-builder: + jobs: + - docker-publish: + name: ci-builder-docker-publish + filters: + tags: + only: /^ci-builder\/v.*/ + branches: + ignore: /.*/ + docker_file: ./ops/docker/ci-builder/Dockerfile + docker_name: ci-builder + docker_tags: <>,latest + docker_context: ./ops/docker/ci-builder + context: + - oplabs-gcr + scheduled-fpp: + triggers: + - schedule: + # run every 4 hours + cron: "0 0,6,12,18 * * *" + filters: + branches: + only: [ "develop" ] + jobs: + - fpp-verify: + context: + - slack + - oplabs-fpp-nodes + + scheduled-link-check: + triggers: + - schedule: + # Run once a day, only on the develop branch + cron: "0 0 * * *" + filters: + branches: + only: [ "develop" ] + jobs: + - bedrock-markdown-links: + context: slack diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 2172e08cfb2a0..002b8170f0e3f 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -13,13 +13,13 @@ /packages/core-utils @ethereum-optimism/legacy-reviewers /packages/data-transport-layer @ethereum-optimism/legacy-reviewers /packages/chain-mon @smartcontracts -/packages/fault-detector @ethereum-optimism/legacy-reviewers +/packages/fault-detector @ethereum-optimism/devxpod /packages/hardhat-deploy-config @ethereum-optimism/legacy-reviewers /packages/message-relayer @ethereum-optimism/legacy-reviewers /packages/migration-data @ethereum-optimism/legacy-reviewers /packages/replica-healthcheck @ethereum-optimism/legacy-reviewers -/packages/sdk @ethereum-optimism/ecopod -/packages/atst @ethereum-optimism/ecopod +/packages/sdk @ethereum-optimism/devxpod +/packages/atst @ethereum-optimism/devxpod # Bedrock codebases /bedrock-devnet @ethereum-optimism/go-reviewers @@ -42,7 +42,7 @@ # Misc /proxyd @ethereum-optimism/infra-reviewers -/indexer @ethereum-optimism/infra-reviewers +/indexer @ethereum-optimism/devxpod /infra @ethereum-optimism/infra-reviewers /specs @ethereum-optimism/contract-reviewers @ethereum-optimism/go-reviewers /endpoint-monitor @ethereum-optimism/infra-reviewers diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 814bb83c3c1be..7b44c3e040f09 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,6 +5,9 @@ on: branches: - master +# Always wait for previous release to finish before releasing again +concurrency: ${{ github.workflow }}-${{ github.ref }} + jobs: release: name: Release @@ -27,7 +30,6 @@ jobs: op-exporter: ${{ steps.packages.outputs.op-exporter }} l2geth-exporter: ${{ steps.packages.outputs.l2geth-exporter }} batch-submitter-service: ${{ steps.packages.outputs.batch-submitter-service }} - ci-builder: ${{ steps.packages.outputs.ci-builder }} foundry: ${{ steps.packages.outputs.foundry }} endpoint-monitor: ${{ steps.packages.outputs.endpoint-monitor }} @@ -63,6 +65,9 @@ jobs: with: version: nightly + # Makes a pr to publish the changesets that when + # merged will publish to npm + # see https://github.com/changesets/action - name: Publish To NPM or Create Release Pull Request uses: changesets/action@v1 id: changesets @@ -159,32 +164,6 @@ jobs: push: true tags: ethereumoptimism/hardhat-node:${{ needs.release.outputs.hardhat-node }},ethereumoptimism/hardhat-node:latest - ci-builder: - name: Publish ci-builder ${{ needs.release.outputs.ci-builder }} - needs: release - if: needs.release.outputs.ci-builder != '' - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Login to Docker Hub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }} - password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }} - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Publish ci-builder - uses: docker/build-push-action@v2 - with: - context: ./ops/docker/ci-builder - file: ./ops/docker/ci-builder/Dockerfile - push: true - tags: ethereumoptimism/ci-builder:${{ needs.release.outputs.ci-builder }},ethereumoptimism/ci-builder:latest - foundry: name: Publish foundry ${{ needs.release.outputs.foundry }} needs: release diff --git a/.github/workflows/tag-service.yml b/.github/workflows/tag-service.yml index d7a24fb1d0995..24cd63c92a7f5 100644 --- a/.github/workflows/tag-service.yml +++ b/.github/workflows/tag-service.yml @@ -23,6 +23,7 @@ on: - op-proposer - proxyd - indexer + - fault-detector prerelease: description: Increment major/minor/patch as prerelease? required: false diff --git a/Makefile b/Makefile index fb6ba7049db51..3f6f3a9b37f11 100644 --- a/Makefile +++ b/Makefile @@ -40,6 +40,10 @@ op-proposer: make -C ./op-proposer op-proposer .PHONY: op-proposer +op-challenger: + make -C ./op-challenger op-challenger +.PHONY: op-challenger + op-program: make -C ./op-program op-program .PHONY: op-program @@ -116,3 +120,6 @@ tag-bedrock-go-modules: update-op-geth: ./ops/scripts/update-op-geth.py .PHONY: update-op-geth + +bedrock-markdown-links: + docker run --init -it -v `pwd`:/input lycheeverse/lychee --verbose --no-progress --exclude-loopback --exclude twitter.com --exclude explorer.optimism.io --exclude-mail /input/README.md "/input/specs/**/*.md" diff --git a/README.md b/README.md index 767fce6e619ad..c08fa8beb37df 100644 --- a/README.md +++ b/README.md @@ -4,23 +4,21 @@
Optimism
-

Optimism is a low-cost and lightning-fast Ethereum L2 blockchain.

+

Optimism is Ethereum, scaled.


## What is Optimism? -Optimism is a low-cost and lightning-fast Ethereum L2 blockchain, **but it's also so much more than that**. +[Optimism](https://www.optimism.io/) is a project dedicated to scaling Ethereum's technology and expanding its ability to coordinate people from across the world to build effective decentralized economies and governance systems. The [Optimism Collective](https://app.optimism.io/announcement) builds open-source software for running L2 blockchains and aims to address key governance and economic challenges in the wider cryptocurrency ecosystem. Optimism operates on the principle of **impact=profit**, the idea that individuals who positively impact the Collective should be proportionally rewarded with profit. **Change the incentives and you change the world.** -Optimism is the technical foundation for [the Optimism Collective](https://app.optimism.io/announcement), a band of communities, companies, and citizens united by a mutually beneficial pact to adhere to the axiom of **impact=profit** — the principle that positive impact to the collective should be rewarded with profit to the individual. -We're trying to solve some of the most critical coordination failures facing the crypto ecosystem today. -**We're particularly focused on creating a sustainable funding stream for the public goods and infrastructure upon which the ecosystem so heavily relies but has so far been unable to adequately reward.** -We'd love for you to check out [The Optimistic Vision](https://www.optimism.io/vision) to understand more about why we do what we do. +In this repository, you'll find numerous core components of the OP Stack, the decentralized software stack maintained by the Optimism Collective that powers Optimism and forms the backbone of blockchains like [OP Mainnet](https://explorer.optimism.io/) and [Base](https://base.org). Designed to be "aggressively open source," the OP Stack encourages you to explore, modify, extend, and test the code as needed. Although not all elements of the OP Stack are contained here, many of its essential components can be found within this repository. By collaborating on free, open software and shared standards, the Optimism Collective aims to prevent siloed software development and rapidly accelerate the development of the Ethereum ecosystem. Come contribute, build the future, and redefine power, together. ## Documentation -If you want to build on top of Optimism, take a look at the extensive documentation on the [Optimism Community Hub](http://community.optimism.io/). -If you want to build Optimism, check out the [Protocol Specs](./specs/). +- If you want to build on top of OP Mainnet, refer to the [Optimism Community Hub](https://community.optimism.io) +- If you want to build your own OP Stack based blockchain, refer to the [OP Stack docs](https://stack.optimism.io) +- If you want to contribute to the OP Stack, check out the [Protocol Specs](./specs) ## Community @@ -29,20 +27,19 @@ Governance discussion can also be found on the [Optimism Governance Forum](https ## Contributing -Read through [CONTRIBUTING.md](./CONTRIBUTING.md) for a general overview of our contribution process. +Read through [CONTRIBUTING.md](./CONTRIBUTING.md) for a general overview of the contributing process for this repository. Use the [Developer Quick Start](./CONTRIBUTING.md#development-quick-start) to get your development environment set up to start working on the Optimism Monorepo. -Then check out our list of [good first issues](https://github.com/ethereum-optimism/optimism/contribute) to find something fun to work on! +Then check out the list of [Good First Issues](https://github.com/ethereum-optimism/optimism/contribute) to find something fun to work on! ## Security Policy and Vulnerability Reporting -Please refer to our canonical [Security Policy](https://github.com/ethereum-optimism/.github/blob/master/SECURITY.md) document for detailed information about how to report vulnerabilities in this codebase. -Bounty hunters are encouraged to check out [our Immunefi bug bounty program](https://immunefi.com/bounty/optimism/). -We offer up to $2,000,042 for in-scope critical vulnerabilities and [we pay our maximum bug bounty rewards](https://medium.com/ethereum-optimism/disclosure-fixing-a-critical-bug-in-optimisms-geth-fork-a836ebdf7c94). +Please refer to the canonical [Security Policy](https://github.com/ethereum-optimism/.github/blob/master/SECURITY.md) document for detailed information about how to report vulnerabilities in this codebase. +Bounty hunters are encouraged to check out [the Optimism Immunefi bug bounty program](https://immunefi.com/bounty/optimism/). +The Optimism Immunefi program offers up to $2,000,042 for in-scope critical vulnerabilities. ## The Bedrock Upgrade -Optimism is currently preparing for [its next major upgrade called Bedrock](https://dev.optimism.io/introducing-optimism-bedrock/). -Bedrock significantly revamps how Optimism works under the hood and will help make Optimism the fastest, cheapest, and most reliable rollup yet. +OP Mainnet is currently preparing for [its next major upgrade, Bedrock](https://dev.optimism.io/introducing-optimism-bedrock/). You can find detailed specifications for the Bedrock upgrade within the [specs folder](./specs) in this repository. Please note that a significant number of packages and folders within this repository are part of the Bedrock upgrade and are NOT currently running in production. @@ -69,7 +66,7 @@ Refer to the Directory Structure section below to understand which packages are ├── indexer: indexes and syncs transactions ├── infra/op-replica: Deployment examples and resources for running an Optimism replica ├── integration-tests: Various integration tests for the Optimism network -├── l2geth: Optimism client software, a fork of geth v1.9.10 (deprecated for BEDROCK upgrade) +├── l2geth: Optimism client software, a fork of geth v1.9.10 ├── l2geth-exporter: A prometheus exporter to collect/serve metrics from an L2 geth node ├── op-exporter: A prometheus exporter to collect/serve metrics from an Optimism node ├── proxyd: Configurable RPC request router and proxy @@ -93,27 +90,25 @@ Refer to the Directory Structure section below to understand which packages are | Branch | Status | | --------------- | -------------------------------------------------------------------------------- | -| [master](https://github.com/ethereum-optimism/optimism/tree/master/) | Accepts PRs from `develop` when we intend to deploy to mainnet. | +| [master](https://github.com/ethereum-optimism/optimism/tree/master/) | Accepts PRs from `develop` when intending to deploy to production. | | [develop](https://github.com/ethereum-optimism/optimism/tree/develop/) | Accepts PRs that are compatible with `master` OR from `release/X.X.X` branches. | | release/X.X.X | Accepts PRs for all changes, particularly those not backwards compatible with `develop` and `master`. | ### Overview -We generally follow [this Git branching model](https://nvie.com/posts/a-successful-git-branching-model/). -Please read the linked post if you're planning to make frequent PRs into this repository (e.g., people working at/with Optimism). +This repository generally follows [this Git branching model](https://nvie.com/posts/a-successful-git-branching-model/). +Please read the linked post if you're planning to make frequent PRs into this repository. ### Production branch -Our production branch is `master`. -The `master` branch contains the code for our latest "stable" releases. +The production branch is `master`. +The `master` branch contains the code for latest "stable" releases. Updates from `master` **always** come from the `develop` branch. -We only ever update the `master` branch when we intend to deploy code within the `develop` to the Optimism mainnet. -Our update process takes the form of a PR merging the `develop` branch into the `master` branch. ### Development branch -Our primary development branch is [`develop`](https://github.com/ethereum-optimism/optimism/tree/develop/). -`develop` contains the most up-to-date software that remains backwards compatible with our latest experimental [network deployments](https://community.optimism.io/docs/useful-tools/networks/). +The primary development branch is [`develop`](https://github.com/ethereum-optimism/optimism/tree/develop/). +`develop` contains the most up-to-date software that remains backwards compatible with the latest experimental [network deployments](https://community.optimism.io/docs/useful-tools/networks/). If you're making a backwards compatible change, please direct your pull request towards `develop`. **Changes to contracts within `packages/contracts/contracts` are usually NOT considered backwards compatible and SHOULD be made against a release candidate branch**. diff --git a/docs/op-stack/package.json b/docs/op-stack/package.json index fe7768c2eeeb5..9816a12552ebf 100644 --- a/docs/op-stack/package.json +++ b/docs/op-stack/package.json @@ -5,12 +5,14 @@ "main": "index.js", "scripts": { "dev": "vuepress dev src", - "build": "vuepress build src" + "build": "vuepress build src", + "preview": "yarn build && serve -s src/.vuepress/dist -p 8080" }, "license": "MIT", "devDependencies": { "@vuepress/plugin-medium-zoom": "^1.8.2", "@vuepress/plugin-pwa": "^1.9.7", + "serve": "^14.2.0", "vuepress": "^1.8.2", "vuepress-plugin-plausible-analytics": "^0.2.1", "vuepress-theme-hope": "^1.22.0" diff --git a/docs/op-stack/src/.vuepress/config.js b/docs/op-stack/src/.vuepress/config.js index fdde6b5b003a0..ff5ce71df2fcc 100644 --- a/docs/op-stack/src/.vuepress/config.js +++ b/docs/op-stack/src/.vuepress/config.js @@ -187,7 +187,8 @@ module.exports = { children: [ '/docs/security/faq.md', '/docs/security/policy.md', - '/docs/security/pause.md' + '/docs/security/pause.md', + '/docs/security/forced-withdrawal.md', ] }, ], // end of sidebar diff --git a/docs/op-stack/src/.vuepress/enhanceApp.js b/docs/op-stack/src/.vuepress/enhanceApp.js index 89bc2f0e60422..8580ae33bbbc0 100644 --- a/docs/op-stack/src/.vuepress/enhanceApp.js +++ b/docs/op-stack/src/.vuepress/enhanceApp.js @@ -13,7 +13,12 @@ export default ({ router }) => { // the refresh button. For more details see: // https://linear.app/optimism/issue/FE-1003/investigate-archive-issue-on-docs const registerAutoReload = () => { - event.$on('sw-updated', e => e.skipWaiting().then(() => { - location.reload(true); - })) + event.$on('sw-updated', e => { + e.skipWaiting().then(() => + { + if (typeof location !== 'undefined') + location.reload(true); + } + ) + }) } diff --git a/docs/op-stack/src/.vuepress/theme/assets/hero.jpg b/docs/op-stack/src/.vuepress/theme/assets/hero.jpg new file mode 100644 index 0000000000000..7f3f61accdc62 Binary files /dev/null and b/docs/op-stack/src/.vuepress/theme/assets/hero.jpg differ diff --git a/docs/op-stack/src/.vuepress/theme/components/AlgoliaSearch/Dropdown.d.ts b/docs/op-stack/src/.vuepress/theme/components/AlgoliaSearch/Dropdown.d.ts new file mode 100644 index 0000000000000..0d618a51d6864 --- /dev/null +++ b/docs/op-stack/src/.vuepress/theme/components/AlgoliaSearch/Dropdown.d.ts @@ -0,0 +1,11 @@ +import Vue from "vue"; +import type { AlgoliaOption } from "@mr-hope/vuepress-types"; +declare const _default: import("vue/types/vue").ExtendedVue; +export default _default; diff --git a/docs/op-stack/src/.vuepress/theme/components/AlgoliaSearch/Dropdown.js.map b/docs/op-stack/src/.vuepress/theme/components/AlgoliaSearch/Dropdown.js.map new file mode 100644 index 0000000000000..2e68e39b0414c --- /dev/null +++ b/docs/op-stack/src/.vuepress/theme/components/AlgoliaSearch/Dropdown.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Dropdown.js","sourceRoot":"","sources":["Dropdown.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AAKtB,eAAe,GAAG,CAAC,MAAM,CAAC;IACxB,IAAI,EAAE,uBAAuB;IAE7B,KAAK,EAAE;QACL,OAAO,EAAE,EAAE,IAAI,EAAE,MAAiC,EAAE,QAAQ,EAAE,IAAI,EAAE;KACrE;IAED,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACX,WAAW,EAAE,EAAE;KAChB,CAAC;IAEF,KAAK,EAAE;QACL,KAAK,CAAC,QAAgB;YACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,CAAC,QAAuB;YAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;KACF;IAED,OAAO;QACL,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,WAAW;YACb,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,iBAA4B,IAAI,EAAE,CAAC;IAC/D,CAAC;IAED,OAAO,EAAE;QACP,UAAU,CAAC,WAA0B,EAAE,IAAY;YACjD,KAAK,OAAO,CAAC,GAAG,CAAC;gBACf,MAAM;gBACJ,mCAAmC,CAAC,wCAAwC,CAC7E;gBACD,MAAM;gBACJ,mCAAmC,CAAC,yCAAyC,CAC9E;aACF,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE;gBACtB,2BAA2B;gBAC1B,SAAiB,CAAC,OAAO,iCACrB,WAAW,KACd,aAAa,EAAE,uBAAuB;oBACtC,8CAA8C;oBAC9C,cAAc,EAAE;wBACd,YAAY,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM;wBACnC,2BAA2B;wBACzB,WAAmB,CAAC,YAAyB,IAAI,EAAE,CACtD;qBACF,EACD,cAAc,EAAE,CACd,MAAwB,EACxB,MAAa,EACb,UAA2B,EAC3B,EAAE;wBACF,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;wBACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;wBAEzD,IACE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;4BAElE,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;4BAC/D,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;oBACnC,CAAC,IACD,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,CAAC,OAAsB,EAAE,IAAY;YACzC,IAAI,CAAC,GAAG,CAAC,SAAS;gBAChB,wDAAwD,CAAC;YAC3D,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACjC,CAAC;KACF;CACF,CAAC,CAAC"} \ No newline at end of file diff --git a/docs/op-stack/src/.vuepress/theme/components/AlgoliaSearch/Full.d.ts b/docs/op-stack/src/.vuepress/theme/components/AlgoliaSearch/Full.d.ts new file mode 100644 index 0000000000000..01f17f062c533 --- /dev/null +++ b/docs/op-stack/src/.vuepress/theme/components/AlgoliaSearch/Full.d.ts @@ -0,0 +1,10 @@ +import Vue from "vue"; +import type { AlgoliaOption } from "@mr-hope/vuepress-types"; +declare const _default: import("vue/types/vue").ExtendedVue; +export default _default; diff --git a/docs/op-stack/src/.vuepress/theme/components/AlgoliaSearch/Full.js.map b/docs/op-stack/src/.vuepress/theme/components/AlgoliaSearch/Full.js.map new file mode 100644 index 0000000000000..72aa33e95e3a6 --- /dev/null +++ b/docs/op-stack/src/.vuepress/theme/components/AlgoliaSearch/Full.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Full.js","sourceRoot":"","sources":["Full.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/docs/op-stack/src/.vuepress/theme/components/Anchor.d.ts b/docs/op-stack/src/.vuepress/theme/components/Anchor.d.ts new file mode 100644 index 0000000000000..7a44c2a000290 --- /dev/null +++ b/docs/op-stack/src/.vuepress/theme/components/Anchor.d.ts @@ -0,0 +1,6 @@ +import Vue from "vue"; +import { SidebarHeader } from "@theme/utils/sidebar"; +declare const _default: import("vue/types/vue").ExtendedVue; +export default _default; diff --git a/docs/op-stack/src/.vuepress/theme/components/Anchor.js b/docs/op-stack/src/.vuepress/theme/components/Anchor.js index a4e30894b9c92..6be9c6a6882b3 100644 --- a/docs/op-stack/src/.vuepress/theme/components/Anchor.js +++ b/docs/op-stack/src/.vuepress/theme/components/Anchor.js @@ -57,16 +57,16 @@ export default Vue.extend({ "Support" ]), h("div", { class: "anchor-support-links" }, [ - h("a", { attrs: { href: "https://discord.gg/optimism", target: "_blank" } }, [ + h("a", { attrs: { href: "https://discord.optimism.io", target: "_blank" } }, [ h("div", [ h("i", { attrs: { class: "fab fa-discord" } }), - " Discord community " + " Discord community" ]) ]), - h("a", { attrs: { href: "https://forms.monday.com/forms/055862bfb7f4091be3db2567288296f8?r=use1", target: "_blank" } }, [ + h("a", { attrs: { href: "https://forms.monday.com/forms/c867f3f357707ff1fb4af0d3d5080710?r=use1", target: "_blank" } }, [ h("div", [ h("i", { attrs: { class: "far fa-comment-dots" } }), - " Join the Superchain " + " Get support for going live" ]) ]), h("a", { attrs: { href: "https://github.com/ethereum-optimism/optimism/issues", target: "_blank" } }, [ diff --git a/docs/op-stack/src/.vuepress/theme/components/Anchor.js.map b/docs/op-stack/src/.vuepress/theme/components/Anchor.js.map new file mode 100644 index 0000000000000..cf3c20e77f68b --- /dev/null +++ b/docs/op-stack/src/.vuepress/theme/components/Anchor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Anchor.js","sourceRoot":"","sources":["Anchor.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAW7C,MAAM,UAAU,GAAG,CACjB,CAAgB,EAChB,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAc,EAC1B,EAAE,CACT,CAAC,CACC,YAAY,EACZ;IACE,KAAK,EAAE;QACL,EAAE,EAAE,IAAI;QACR,WAAW,EAAE,EAAE;QACf,gBAAgB,EAAE,EAAE;KACrB;IACD,KAAK,EAAE;QACL,aAAa,EAAE,IAAI;QACnB,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK;KACxC;CACF,EACD,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CACvB,CAAC;AAOJ,MAAM,cAAc,GAAG,CACrB,CAAgB,EAChB,EAAE,QAAQ,EAAE,KAAK,EAAyB,EACnC,EAAE,CACT,CAAC,CACC,IAAI,EACJ,EAAE,KAAK,EAAE,aAAa,EAAE,EACxB,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAoB,EAAE,EAAE;IACpC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAE9D,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;QAClD,UAAU,CAAC,CAAC,EAAE;YACZ,IAAI,EAAE,KAAK,CAAC,KAAK;YACjB,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE;YACnC,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC;KACH,CAAC,CAAC;AACL,CAAC,CAAC,CACH,CAAC;AAEJ,eAAe,GAAG,CAAC,MAAM,CAAC;IACxB,IAAI,EAAE,QAAQ;IAEd,UAAU,EAAE,IAAI;IAEhB,KAAK,EAAE;QACL,KAAK,EAAE;YACL,IAAI,EAAE,KAAkC;YACxC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;SAClB;KACF;IAED,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC5C,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,EAAE;YAC3D,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;gBACtC,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE;oBACpC,KAAK,CAAC,KAAK,CAAC,MAAM;wBAChB,CAAC,CAAC,cAAc,CAAC,CAAC,EAAE;4BAChB,QAAQ,EAAE,KAAK,CAAC,KAAK;4BACrB,KAAK,EAAE,MAAM;yBACd,CAAC;wBACJ,CAAC,CAAC,KAAK,CAAC,OAAO;4BACf,CAAC,CAAC,cAAc,CAAC,CAAC,EAAE;gCAChB,QAAQ,EAAE,KAAK,CAAC,OAAO;gCACvB,KAAK,EAAE,MAAM;6BACd,CAAC;4BACJ,CAAC,CAAC,IAAI;iBACT,CAAC;aACH,CAAC;SACH,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC"} \ No newline at end of file diff --git a/docs/op-stack/src/.vuepress/theme/components/Blog/ArticleInfo.d.ts b/docs/op-stack/src/.vuepress/theme/components/Blog/ArticleInfo.d.ts new file mode 100644 index 0000000000000..178d651dbdee2 --- /dev/null +++ b/docs/op-stack/src/.vuepress/theme/components/Blog/ArticleInfo.d.ts @@ -0,0 +1,16 @@ +import Vue from "vue"; +import type { PageComputed } from "@mr-hope/vuepress-types"; +declare const _default: import("vue/types/vue").ExtendedVue; +export default _default; diff --git a/docs/op-stack/src/.vuepress/theme/components/Blog/ArticleInfo.js b/docs/op-stack/src/.vuepress/theme/components/Blog/ArticleInfo.js new file mode 100644 index 0000000000000..cf26f73635a14 --- /dev/null +++ b/docs/op-stack/src/.vuepress/theme/components/Blog/ArticleInfo.js @@ -0,0 +1,70 @@ +import Vue from "vue"; +import { capitalize } from "@mr-hope/vuepress-shared"; +import AuthorIcon from "@mr-hope/vuepress-plugin-comment/lib/client/icons/AuthorIcon.vue"; +import CalendarIcon from "@mr-hope/vuepress-plugin-comment/lib/client/icons/CalendarIcon.vue"; +import CategoryInfo from "@mr-hope/vuepress-plugin-comment/lib/client/CategoryInfo.vue"; +import TagInfo from "@mr-hope/vuepress-plugin-comment/lib/client/TagInfo.vue"; +import TimerIcon from "@mr-hope/vuepress-plugin-comment/lib/client/icons/TimerIcon.vue"; +export default Vue.extend({ + name: "ArticleInfo", + components: { + AuthorIcon, + CalendarIcon, + CategoryInfo, + TagInfo, + TimerIcon, + }, + props: { + article: { type: Object, required: true }, + }, + computed: { + author() { + return (this.article.frontmatter.author || + (this.$themeConfig.author && this.article.frontmatter.author !== false + ? this.$themeConfig.author + : "")); + }, + time() { + const { date, time = date } = this.article.frontmatter; + if (typeof time === "string") { + if (time.indexOf("T") !== -1) { + const [dateString, temp] = time.split("T"); + const [times] = temp.split("."); + return `${dateString} ${times === "00:00:00" ? "" : times}`; + } + return time; + } + return this.article.createTime || ""; + }, + tags() { + const { tag, tags = tag } = this.article.frontmatter; + if (typeof tags === "string") + return [capitalize(tags)]; + if (Array.isArray(tags)) + return tags.map((item) => capitalize(item)); + return []; + }, + readingTimeContent() { + return `PT${Math.max(Math.round(this.$page.readingTime.minutes), 1)}M`; + }, + readingTime() { + const { minute, time } = READING_TIME_I18N[this.$localePath || "/"]; + return this.article.readingTime.minutes < 1 + ? minute + : time.replace("$time", Math.round(this.article.readingTime.minutes).toString()); + }, + authorText() { + return PAGE_INFO_I18N[this.$localePath || "/"].author; + }, + timeText() { + return PAGE_INFO_I18N[this.$localePath || "/"].time; + }, + tagText() { + return PAGE_INFO_I18N[this.$localePath || "/"].tag; + }, + readingTimeText() { + return PAGE_INFO_I18N[this.$localePath || "/"].readingTime; + }, + }, +}); +//# sourceMappingURL=ArticleInfo.js.map \ No newline at end of file diff --git a/docs/op-stack/src/.vuepress/theme/components/Blog/ArticleInfo.js.map b/docs/op-stack/src/.vuepress/theme/components/Blog/ArticleInfo.js.map new file mode 100644 index 0000000000000..3b86016f04bf3 --- /dev/null +++ b/docs/op-stack/src/.vuepress/theme/components/Blog/ArticleInfo.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ArticleInfo.js","sourceRoot":"","sources":["ArticleInfo.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/docs/op-stack/src/.vuepress/theme/components/Blog/ArticleInfo.vue b/docs/op-stack/src/.vuepress/theme/components/Blog/ArticleInfo.vue new file mode 100644 index 0000000000000..0a9741c39e530 --- /dev/null +++ b/docs/op-stack/src/.vuepress/theme/components/Blog/ArticleInfo.vue @@ -0,0 +1,74 @@ + + + - diff --git a/docs/op-stack/src/.vuepress/theme/components/PageFooter.d.ts b/docs/op-stack/src/.vuepress/theme/components/PageFooter.d.ts new file mode 100644 index 0000000000000..ccf77e3e9561a --- /dev/null +++ b/docs/op-stack/src/.vuepress/theme/components/PageFooter.d.ts @@ -0,0 +1,9 @@ +import Vue from "vue"; +import type { HopeFooterConfig } from "../types"; +declare const _default: import("vue/types/vue").ExtendedVue>; +export default _default; diff --git a/docs/op-stack/src/.vuepress/theme/components/PageFooter.js b/docs/op-stack/src/.vuepress/theme/components/PageFooter.js new file mode 100644 index 0000000000000..f6037d2a11643 --- /dev/null +++ b/docs/op-stack/src/.vuepress/theme/components/PageFooter.js @@ -0,0 +1,36 @@ +import Vue from "vue"; +import MediaLinks from "@theme/components/MediaLinks.vue"; +export default Vue.extend({ + name: "PageFooter", + components: { MediaLinks }, + computed: { + footerConfig() { + return this.$themeLocaleConfig.footer || this.$themeConfig.footer || {}; + }, + enable() { + const { copyrightText, footer, medialink } = this.$page.frontmatter; + return (footer !== false && + Boolean(copyrightText || footer || medialink || this.footerConfig.display)); + }, + footerContent() { + const { footer } = this.$page.frontmatter; + return footer === false + ? false + : typeof footer === "string" + ? footer + : this.footerConfig.content || ""; + }, + copyright() { + return this.$frontmatter.copyrightText === false + ? false + : this.$frontmatter.copyrightText || + (this.footerConfig.copyright === false + ? false + : this.footerConfig.copyright || + (this.$themeConfig.author + ? `Copyright © ${new Date().getFullYear()} ${this.$themeConfig.author}` + : "")); + }, + }, +}); +//# sourceMappingURL=PageFooter.js.map \ No newline at end of file diff --git a/docs/op-stack/src/.vuepress/theme/components/PageFooter.js.map b/docs/op-stack/src/.vuepress/theme/components/PageFooter.js.map new file mode 100644 index 0000000000000..c5c0a99a2cd6a --- /dev/null +++ b/docs/op-stack/src/.vuepress/theme/components/PageFooter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PageFooter.js","sourceRoot":"","sources":["PageFooter.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,UAAU,MAAM,kCAAkC,CAAC;AAI1D,eAAe,GAAG,CAAC,MAAM,CAAC;IACxB,IAAI,EAAE,YAAY;IAElB,UAAU,EAAE,EAAE,UAAU,EAAE;IAE1B,QAAQ,EAAE;QACR,YAAY;YACV,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,EAAE,CAAC;QAC1E,CAAC;QAED,MAAM;YACJ,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;YAEpE,OAAO,CACL,MAAM,KAAK,KAAK;gBAChB,OAAO,CACL,aAAa,IAAI,MAAM,IAAI,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAClE,CACF,CAAC;QACJ,CAAC;QAED,aAAa;YACX,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;YAE1C,OAAO,MAAM,KAAK,KAAK;gBACrB,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,OAAO,MAAM,KAAK,QAAQ;oBAC5B,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC;QACtC,CAAC;QAED,SAAS;YACP,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,KAAK,KAAK;gBAC9C,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa;oBAC7B,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,KAAK,KAAK;wBACpC,CAAC,CAAC,KAAK;wBACP,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS;4BAC3B,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM;gCACvB,CAAC,CAAC,eAAe,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,IACrC,IAAI,CAAC,YAAY,CAAC,MACpB,EAAE;gCACJ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrB,CAAC;KACF;CACF,CAAC,CAAC"} \ No newline at end of file diff --git a/docs/op-stack/src/.vuepress/theme/components/PageFooter.vue b/docs/op-stack/src/.vuepress/theme/components/PageFooter.vue new file mode 100644 index 0000000000000..a7eda4476ef6b --- /dev/null +++ b/docs/op-stack/src/.vuepress/theme/components/PageFooter.vue @@ -0,0 +1,47 @@ + + +