Commit 767fb0e2 authored by Elena Gesheva's avatar Elena Gesheva Committed by GitHub

Merge branch 'develop' into develop

parents 09c20aef a5001aa1
---
'@eth-optimism/message-relayer': patch
---
Fix docker build
version: 2.1 version: 2.1
orbs: orbs:
gcp-gke: circleci/gcp-gke@1.3.0 gcp-gke: circleci/gcp-gke@1.3.0
slack: circleci/slack@4.5.1
slack-fail-post-step: &slack-fail-post-step
post-steps:
- slack/notify:
channel: $SLACK_DEFAULT_CHANNEL
event: fail
custom: |
{
"text": "",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "🔴 Nightly build failed!"
}
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": {
"type": "plain_text",
"text": "View Job"
},
"url": "${CIRCLE_BUILD_URL}"
}
]
}
]
}
commands: commands:
build-dockerfile: build-dockerfile:
parameters: parameters:
...@@ -109,6 +141,14 @@ jobs: ...@@ -109,6 +141,14 @@ jobs:
kubectl rollout restart statefulset nightly-dtl --namespace nightly kubectl rollout restart statefulset nightly-dtl --namespace nightly
kubectl rollout restart deployment nightly-gas-oracle --namespace nightly kubectl rollout restart deployment nightly-gas-oracle --namespace nightly
kubectl rollout restart deployment edge-proxyd --namespace nightly kubectl rollout restart deployment edge-proxyd --namespace nightly
notify:
docker:
- image: cimg/base:2021.04
steps:
- run:
name: Success
command: |
echo "Dummy job."
workflows: workflows:
...@@ -122,23 +162,50 @@ workflows: ...@@ -122,23 +162,50 @@ workflows:
- develop - develop
jobs: jobs:
- build-dtl: - build-dtl:
context: optimism context:
- optimism
- slack
<<: *slack-fail-post-step
- build-batch-submitter: - build-batch-submitter:
context: optimism context:
- optimism
- slack
<<: *slack-fail-post-step
- build-deployer: - build-deployer:
context: optimism context:
- optimism
- slack
<<: *slack-fail-post-step
- build-l2geth: - build-l2geth:
context: optimism context:
- optimism
- slack
<<: *slack-fail-post-step
- build-gas-oracle: - build-gas-oracle:
context: optimism context:
- optimism
- slack
<<: *slack-fail-post-step
- build-integration-tests: - build-integration-tests:
context: optimism context:
- optimism
- slack
<<: *slack-fail-post-step
- build-go-batch-submitter: - build-go-batch-submitter:
context: optimism context:
- optimism
- slack
<<: *slack-fail-post-step
- build-proxyd: - build-proxyd:
context: optimism context:
- optimism
- slack
<<: *slack-fail-post-step
- deploy-nightly: - deploy-nightly:
context: optimism context:
- optimism
- slack
<<: *slack-fail-post-step
requires: requires:
- build-dtl - build-dtl
- build-batch-submitter - build-batch-submitter
...@@ -147,4 +214,37 @@ workflows: ...@@ -147,4 +214,37 @@ workflows:
- build-l2geth - build-l2geth
- build-gas-oracle - build-gas-oracle
- build-integration-tests - build-integration-tests
- build-proxyd - build-proxyd
\ No newline at end of file - notify:
context: slack
requires:
- deploy-nightly
post-steps:
- slack/notify:
custom: |
{
"text": "",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "✅ Nightly successfully deployed."
}
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": {
"type": "plain_text",
"text": "View Job"
},
"url": "${CIRCLE_BUILD_URL}"
}
]
}
]
}
event: always
\ No newline at end of file
...@@ -57,7 +57,6 @@ ...@@ -57,7 +57,6 @@
"envalid": "^7.1.0", "envalid": "^7.1.0",
"eslint": "^7.27.0", "eslint": "^7.27.0",
"eslint-config-prettier": "^8.3.0", "eslint-config-prettier": "^8.3.0",
"eslint-plugin-ban": "^1.5.2",
"eslint-plugin-import": "^2.23.4", "eslint-plugin-import": "^2.23.4",
"eslint-plugin-jsdoc": "^35.1.2", "eslint-plugin-jsdoc": "^35.1.2",
"eslint-plugin-prefer-arrow": "^1.2.3", "eslint-plugin-prefer-arrow": "^1.2.3",
......
...@@ -28,7 +28,6 @@ COPY --from=builder /optimism/packages/contracts/artifacts ./packages/contracts/ ...@@ -28,7 +28,6 @@ COPY --from=builder /optimism/packages/contracts/artifacts ./packages/contracts/
WORKDIR /opt/optimism/packages/message-relayer WORKDIR /opt/optimism/packages/message-relayer
COPY --from=builder /optimism/packages/message-relayer/dist ./dist COPY --from=builder /optimism/packages/message-relayer/dist ./dist
COPY --from=builder /optimism/packages/message-relayer/package.json . COPY --from=builder /optimism/packages/message-relayer/package.json .
COPY --from=builder /optimism/packages/message-relayer/exec ./exec
COPY --from=builder /optimism/packages/message-relayer/node_modules ./node_modules COPY --from=builder /optimism/packages/message-relayer/node_modules ./node_modules
# copy this over in case you want to run alongside other services # copy this over in case you want to run alongside other services
......
...@@ -63,7 +63,6 @@ ...@@ -63,7 +63,6 @@
"chai": "^4.3.4", "chai": "^4.3.4",
"eslint": "^7.27.0", "eslint": "^7.27.0",
"eslint-config-prettier": "^8.3.0", "eslint-config-prettier": "^8.3.0",
"eslint-plugin-ban": "^1.5.2",
"eslint-plugin-import": "^2.23.4", "eslint-plugin-import": "^2.23.4",
"eslint-plugin-jsdoc": "^35.1.2", "eslint-plugin-jsdoc": "^35.1.2",
"eslint-plugin-prefer-arrow": "^1.2.3", "eslint-plugin-prefer-arrow": "^1.2.3",
......
...@@ -50,7 +50,6 @@ ...@@ -50,7 +50,6 @@
"chai": "^4.3.4", "chai": "^4.3.4",
"eslint": "^7.27.0", "eslint": "^7.27.0",
"eslint-config-prettier": "^8.3.0", "eslint-config-prettier": "^8.3.0",
"eslint-plugin-ban": "^1.5.2",
"eslint-plugin-import": "^2.23.4", "eslint-plugin-import": "^2.23.4",
"eslint-plugin-jsdoc": "^35.1.2", "eslint-plugin-jsdoc": "^35.1.2",
"eslint-plugin-prefer-arrow": "^1.2.3", "eslint-plugin-prefer-arrow": "^1.2.3",
......
module.exports = { module.exports = {
skipFiles: [ skipFiles: [
'./test-helpers', './test-helpers',
'./test-libraries' './test-libraries',
'./L2/predeploys/OVM_DeployerWhitelist.sol'
], ],
mocha: { mocha: {
grep: "@skip-on-coverage", grep: "@skip-on-coverage",
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
"autogen:artifacts": "ts-node scripts/generate-artifacts.ts && ts-node scripts/generate-deployed-artifacts.ts", "autogen:artifacts": "ts-node scripts/generate-artifacts.ts && ts-node scripts/generate-deployed-artifacts.ts",
"test": "yarn test:contracts", "test": "yarn test:contracts",
"test:contracts": "hardhat test --show-stack-traces", "test:contracts": "hardhat test --show-stack-traces",
"test:coverage": "NODE_OPTIONS=--max_old_space_size=8192 hardhat coverage && istanbul check-coverage --statements 88 --branches 76 --functions 84 --lines 88", "test:coverage": "NODE_OPTIONS=--max_old_space_size=8192 hardhat coverage && istanbul check-coverage --statements 90 --branches 84 --functions 88 --lines 90",
"test:slither": "slither .", "test:slither": "slither .",
"pretest:slither": "rm -f @openzeppelin && rm -f @ens && rm -f hardhat && ln -s ../../node_modules/@openzeppelin @openzeppelin && ln -s ../../node_modules/@ens @ens && ln -s ../../node_modules/hardhat hardhat", "pretest:slither": "rm -f @openzeppelin && rm -f @ens && rm -f hardhat && ln -s ../../node_modules/@openzeppelin @openzeppelin && ln -s ../../node_modules/@ens @ens && ln -s ../../node_modules/hardhat hardhat",
"posttest:slither": "rm -f @openzeppelin && rm -f @ens && rm -f hardhat", "posttest:slither": "rm -f @openzeppelin && rm -f @ens && rm -f hardhat",
...@@ -89,7 +89,6 @@ ...@@ -89,7 +89,6 @@
"dotenv": "^10.0.0", "dotenv": "^10.0.0",
"eslint": "^7.27.0", "eslint": "^7.27.0",
"eslint-config-prettier": "^8.3.0", "eslint-config-prettier": "^8.3.0",
"eslint-plugin-ban": "^1.5.2",
"eslint-plugin-import": "^2.23.4", "eslint-plugin-import": "^2.23.4",
"eslint-plugin-jsdoc": "^35.1.2", "eslint-plugin-jsdoc": "^35.1.2",
"eslint-plugin-prefer-arrow": "^1.2.3", "eslint-plugin-prefer-arrow": "^1.2.3",
......
...@@ -244,6 +244,30 @@ describe('L1StandardBridge', () => { ...@@ -244,6 +244,30 @@ describe('L1StandardBridge', () => {
).to.be.revertedWith(ERR_INVALID_X_DOMAIN_MSG_SENDER) ).to.be.revertedWith(ERR_INVALID_X_DOMAIN_MSG_SENDER)
}) })
it('should revert in nothing to withdraw', async () => {
// make sure no balance at start of test
expect(await ethers.provider.getBalance(NON_ZERO_ADDRESS)).to.be.equal(0)
const withdrawalAmount = 100
Mock__L1CrossDomainMessenger.smocked.xDomainMessageSender.will.return.with(
() => DUMMY_L2_BRIDGE_ADDRESS
)
await expect(
L1StandardBridge.finalizeETHWithdrawal(
NON_ZERO_ADDRESS,
NON_ZERO_ADDRESS,
withdrawalAmount,
NON_NULL_BYTES32,
{
from: Mock__L1CrossDomainMessenger.address,
}
)
).to.be.revertedWith(
'TransferHelper::safeTransferETH: ETH transfer failed'
)
})
it('should credit funds to the withdrawer and not use too much gas', async () => { it('should credit funds to the withdrawer and not use too much gas', async () => {
// make sure no balance at start of test // make sure no balance at start of test
expect(await ethers.provider.getBalance(NON_ZERO_ADDRESS)).to.be.equal(0) expect(await ethers.provider.getBalance(NON_ZERO_ADDRESS)).to.be.equal(0)
......
...@@ -679,6 +679,16 @@ describe('CanonicalTransactionChain', () => { ...@@ -679,6 +679,16 @@ describe('CanonicalTransactionChain', () => {
} }
) )
await res.wait() await res.wait()
expect(await CanonicalTransactionChain.getLastTimestamp()).to.equal(
timestamp
)
expect(await CanonicalTransactionChain.getLastBlockNumber()).to.equal(
blockNumber
)
expect(
await CanonicalTransactionChain.getNumPendingQueueElements()
).to.equal(0)
}) })
it(`should return ${size}`, async () => { it(`should return ${size}`, async () => {
...@@ -686,7 +696,17 @@ describe('CanonicalTransactionChain', () => { ...@@ -686,7 +696,17 @@ describe('CanonicalTransactionChain', () => {
size size
) )
}) })
it('should return zero after queue is emptied', async () => {
expect(await CanonicalTransactionChain.getNextQueueIndex()).to.equal(
0
)
})
}) })
} }
it('should return zero', async () => {
expect(await CanonicalTransactionChain.getTotalBatches()).to.equal(0)
})
}) })
}) })
...@@ -181,6 +181,19 @@ describe('StateCommitmentChain', () => { ...@@ -181,6 +181,19 @@ describe('StateCommitmentChain', () => {
}) })
}) })
}) })
describe('when the proposer has not previously staked at the BondManager', () => {
before(() => {
Mock__BondManager.smocked.isCollateralized.will.return.with(false)
})
it('should revert', async () => {
await expect(
StateCommitmentChain.appendStateBatch(batch, 0)
).to.be.revertedWith(
'Proposer does not have enough collateral posted'
)
})
})
}) })
}) })
...@@ -194,6 +207,10 @@ describe('StateCommitmentChain', () => { ...@@ -194,6 +207,10 @@ describe('StateCommitmentChain', () => {
extraData: ethers.constants.HashZero, extraData: ethers.constants.HashZero,
} }
before(() => {
Mock__BondManager.smocked.isCollateralized.will.return.with(true)
})
beforeEach(async () => { beforeEach(async () => {
Mock__CanonicalTransactionChain.smocked.getTotalElements.will.return.with( Mock__CanonicalTransactionChain.smocked.getTotalElements.will.return.with(
batch.length batch.length
...@@ -253,6 +270,25 @@ describe('StateCommitmentChain', () => { ...@@ -253,6 +270,25 @@ describe('StateCommitmentChain', () => {
}) })
}) })
describe('when outside fraud proof window', () => {
beforeEach(async () => {
const FRAUD_PROOF_WINDOW =
await StateCommitmentChain.FRAUD_PROOF_WINDOW()
await increaseEthTime(
ethers.provider,
FRAUD_PROOF_WINDOW.toNumber() + 1
)
})
it('should revert', async () => {
await expect(
StateCommitmentChain.deleteStateBatch(batchHeader)
).to.be.revertedWith(
'State batches can only be deleted within the fraud proof window.'
)
})
})
describe('when the provided batch header is valid', () => { describe('when the provided batch header is valid', () => {
it('should remove the batch and all following batches', async () => { it('should remove the batch and all following batches', async () => {
await expect(StateCommitmentChain.deleteStateBatch(batchHeader)).to await expect(StateCommitmentChain.deleteStateBatch(batchHeader)).to
...@@ -263,6 +299,27 @@ describe('StateCommitmentChain', () => { ...@@ -263,6 +299,27 @@ describe('StateCommitmentChain', () => {
}) })
}) })
describe('insideFraudProofWindow', () => {
const batchHeader = {
batchIndex: 0,
batchRoot: NON_NULL_BYTES32,
batchSize: 1,
prevTotalElements: 0,
extraData: ethers.constants.HashZero,
}
it('should revert when timestamp is zero', async () => {
await expect(
StateCommitmentChain.insideFraudProofWindow({
...batchHeader,
extraData: ethers.utils.defaultAbiCoder.encode(
['uint256', 'address'],
[0, await sequencer.getAddress()]
),
})
).to.be.revertedWith('Batch header timestamp cannot be zero')
})
})
describe('getTotalElements', () => { describe('getTotalElements', () => {
describe('when no batch elements have been inserted', () => { describe('when no batch elements have been inserted', () => {
it('should return zero', async () => { it('should return zero', async () => {
......
...@@ -22,6 +22,12 @@ ...@@ -22,6 +22,12 @@
"0x02" "0x02"
], ],
"revert": true "revert": true
},
"input value > 1 length (should revert)": {
"in": [
"0x0101"
],
"revert": "Invalid RLP boolean value."
} }
}, },
"readAddress": { "readAddress": {
...@@ -32,6 +38,26 @@ ...@@ -32,6 +38,26 @@
"out": [ "out": [
"0x1212121212121212121212121212121212121212" "0x1212121212121212121212121212121212121212"
] ]
},
"address length = 1": {
"in": [
"0x12"
],
"out": [
"0x0000000000000000000000000000000000000000"
]
},
"invalid address length > 21 (should revert)": {
"in": [
"0x94121212121212121212121212121212121212121212121212"
],
"revert": "Invalid RLP address length."
},
"invalid address length < 21 (should revert)": {
"in": [
"0x94121212121212121212121212"
],
"revert": "Invalid RLP address length."
} }
}, },
"readBytes": { "readBytes": {
...@@ -58,6 +84,38 @@ ...@@ -58,6 +84,38 @@
"out": [ "out": [
"0x7f" "0x7f"
] ]
},
"should revert if input is a list item": {
"in": [
"0xc7c0c1c0c3c0c1c0"
],
"revert": "Invalid RLP bytes value."
},
"invalid bytes value, 0xb7 < prefix < 0xbf (should revert)": {
"in": [
"0xb9"
],
"revert": "Invalid RLP long string length."
},
"invalid bytes value, prefix > 0xf7 (should revert)": {
"in": [
"0xff"
],
"revert": "Invalid RLP long list length."
}
},
"readBytes32": {
"should revert if input is a list item": {
"in": [
"0xc7c0c1c0c3c0c1c0"
],
"revert": "Invalid RLP bytes32 value."
},
"invalid length > 33 (should revert)": {
"in": [
"0x11110000000000000000000000000000000000000000000000000000000000000000"
],
"revert": "Invalid RLP bytes32 length."
} }
}, },
"readString": { "readString": {
...@@ -310,6 +368,56 @@ ...@@ -310,6 +368,56 @@
"0xca846b6579348476616c34" "0xca846b6579348476616c34"
] ]
] ]
},
"invalid rlp: not enough bytes for string length": {
"in": ["0xefdebd"],
"revert":"Invalid RLP short list."
},
"invalid rlp: expected string length to be greater than 55": {
"in": ["0xefb83600"],
"revert":"Invalid RLP short list."
},
"invalid rlp: not enough bytes for string": {
"in": ["0xefdebdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"],
"revert":"Invalid RLP long list length."
},
"int32Overflow": {
"in": ["0xbf0f000000000000021111"],
"revert": "Invalid RLP long string."
},
"int32Overflow2": {
"in": ["0xff0f000000000000021111"],
"revert": "Invalid RLP long list."
},
"incorrectLengthInArray": {
"in": ["0xb9002100dc2b275d0f74e8a53e6f4ec61b27f24278820be3f82ea2110e582081b0565df0"],
"revert": "Invalid RLP list value."
},
"leadingZerosInLongLengthArray1": {
"in": ["0xb90040000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f"],
"revert": "Invalid RLP list value."
},
"leadingZerosInLongLengthArray2": {
"in": ["0xb800"],
"revert": "Invalid RLP list value."
},
"leadingZerosInLongLengthList1": {
"in": ["0xfb00000040000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f"],
"revert": "Provided RLP list exceeds max list length."
},
"nonOptimalLongLengthArray1": {
"in": ["0xb81000112233445566778899aabbccddeeff"],
"revert": "Invalid RLP list value."
},
"nonOptimalLongLengthArray2": {
"in": ["0xb801ff"],
"revert": "Invalid RLP list value."
},
"invalid list value, 0x7f < prefix < 0xb7 (should revert)": {
"in": [
"0x91"
],
"revert": "Invalid RLP short string."
} }
} }
} }
......
...@@ -36,6 +36,14 @@ ...@@ -36,6 +36,14 @@
"start > input.length": { "start > input.length": {
"in": ["0x12345678", 5, 1], "in": ["0x12345678", 5, 1],
"revert":"Read out of bounds" "revert":"Read out of bounds"
},
"input.length + 31 >= input.length": {
"in": ["0x12345678", 5, "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"],
"revert":"slice_overflow"
},
"input.start + input.length >= input.start": {
"in": ["0x12345678", "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 1],
"revert":"slice_overflow"
} }
}, },
"toBytes32": { "toBytes32": {
......
...@@ -49,7 +49,6 @@ ...@@ -49,7 +49,6 @@
"babel-eslint": "^10.1.0", "babel-eslint": "^10.1.0",
"eslint": "^7.27.0", "eslint": "^7.27.0",
"eslint-config-prettier": "^8.3.0", "eslint-config-prettier": "^8.3.0",
"eslint-plugin-ban": "^1.5.2",
"eslint-plugin-import": "^2.23.4", "eslint-plugin-import": "^2.23.4",
"eslint-plugin-jsdoc": "^35.1.2", "eslint-plugin-jsdoc": "^35.1.2",
"eslint-plugin-prefer-arrow": "^1.2.3", "eslint-plugin-prefer-arrow": "^1.2.3",
......
...@@ -74,7 +74,6 @@ ...@@ -74,7 +74,6 @@
"chai-as-promised": "^7.1.1", "chai-as-promised": "^7.1.1",
"eslint": "^7.27.0", "eslint": "^7.27.0",
"eslint-config-prettier": "^8.3.0", "eslint-config-prettier": "^8.3.0",
"eslint-plugin-ban": "^1.5.2",
"eslint-plugin-import": "^2.23.4", "eslint-plugin-import": "^2.23.4",
"eslint-plugin-jsdoc": "^35.1.2", "eslint-plugin-jsdoc": "^35.1.2",
"eslint-plugin-prefer-arrow": "^1.2.3", "eslint-plugin-prefer-arrow": "^1.2.3",
......
...@@ -59,7 +59,6 @@ ...@@ -59,7 +59,6 @@
"chai-as-promised": "^7.1.1", "chai-as-promised": "^7.1.1",
"eslint": "^7.27.0", "eslint": "^7.27.0",
"eslint-config-prettier": "^8.3.0", "eslint-config-prettier": "^8.3.0",
"eslint-plugin-ban": "^1.5.2",
"eslint-plugin-import": "^2.23.4", "eslint-plugin-import": "^2.23.4",
"eslint-plugin-jsdoc": "^35.1.2", "eslint-plugin-jsdoc": "^35.1.2",
"eslint-plugin-prefer-arrow": "^1.2.3", "eslint-plugin-prefer-arrow": "^1.2.3",
......
...@@ -43,7 +43,6 @@ ...@@ -43,7 +43,6 @@
"chai-as-promised": "^7.1.1", "chai-as-promised": "^7.1.1",
"eslint": "^7.27.0", "eslint": "^7.27.0",
"eslint-config-prettier": "^8.3.0", "eslint-config-prettier": "^8.3.0",
"eslint-plugin-ban": "^1.5.2",
"eslint-plugin-import": "^2.23.4", "eslint-plugin-import": "^2.23.4",
"eslint-plugin-jsdoc": "^35.1.2", "eslint-plugin-jsdoc": "^35.1.2",
"eslint-plugin-prefer-arrow": "^1.2.3", "eslint-plugin-prefer-arrow": "^1.2.3",
......
...@@ -6578,13 +6578,6 @@ eslint-module-utils@^2.6.2: ...@@ -6578,13 +6578,6 @@ eslint-module-utils@^2.6.2:
debug "^3.2.7" debug "^3.2.7"
pkg-dir "^2.0.0" pkg-dir "^2.0.0"
eslint-plugin-ban@^1.5.2:
version "1.5.2"
resolved "https://registry.yarnpkg.com/eslint-plugin-ban/-/eslint-plugin-ban-1.5.2.tgz#5ca01fa5acdecf79e7422e2876eb330c22b5de9a"
integrity sha512-i6yjMbep866kREX8HfCPM32QyTZG4gfhlEFjL7s04P+sJjsM+oa0pejwyLOz/6s/oiW7BQqc6u3Dcr9tKz+svg==
dependencies:
requireindex "~1.2.0"
eslint-plugin-import@^2.23.4: eslint-plugin-import@^2.23.4:
version "2.24.1" version "2.24.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.24.1.tgz#64aba8b567a1ba9921d5465586e86c491b8e2135" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.24.1.tgz#64aba8b567a1ba9921d5465586e86c491b8e2135"
...@@ -13519,11 +13512,6 @@ require-main-filename@^2.0.0: ...@@ -13519,11 +13512,6 @@ require-main-filename@^2.0.0:
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
requireindex@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef"
integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==
reserved-words@^0.1.2: reserved-words@^0.1.2:
version "0.1.2" version "0.1.2"
resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1" resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment