Skip to content

Commit

Permalink
updates to sdk v4 docs (#1279)
Browse files Browse the repository at this point in the history
* updates to sdk v4 docs

* updates to sdk v4 PR

* updates arb-sdk version

* bump sdk

* bump sdk

* update sdk version to test new docs

* update sdk version

* remove orbit sdk

* change sdk version to v4 docs

* update sdk to main

* add support for `.mdx` files for sdk reference

* bump sdk version

* reverts config option for broken links

* restores `/sdk-docs` to `/sdk`

* fix sdk path references

* revert build script

* updates relevant docs pages
  • Loading branch information
douglance authored and anegg0 committed Aug 2, 2024
1 parent f69062e commit 6a6e2c7
Show file tree
Hide file tree
Showing 11 changed files with 75 additions and 69 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
.vscode
arbitrum-docs/sdk-docs
arbitrum-docs/sdk
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Arbitrary L1 to L2 contract calls can be created via the `Inbox`'s `createRetrya

For details and protocol specification, see [L1 to L2 Messages](/how-arbitrum-works/arbos/l1-l2-messaging.md).

For an example of retryable tickets in action, see the [Greeter](https://github.com/OffchainLabs/arbitrum-tutorials/tree/master/packages/greeter) tutorial, which uses the [Arbitrum SDK](./sdk).
For an example of retryable tickets in action, see the [Greeter](https://github.com/OffchainLabs/arbitrum-tutorials/tree/master/packages/greeter) tutorial, which uses the [Arbitrum SDK](../sdk/1-introduction.mdx).

## Arbitrum-to-Ethereum messaging

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ As explained in the conceptual page, there are 2 contracts that we need to be aw

For simplicity, in this how-to we’ll focus on the first case: bridging from Ethereum (L1) to Arbitrum (L2).

We’ll explain below what specific contracts and methods need to be called to bridge your token, but you can abstract this whole process of finding the right addresses by using Arbitrum’s SDK. You can use the [deposit](/sdk/assetBridger_erc20Bridger#deposit) function of the [ERC20Bridger](/sdk/assetBridger_erc20Bridger) class to bridge your tokens, which will use the appropriate router contract based on the network you’re connected to, and will relay the request to the appropriate gateway contract. You can also use the function [getL1GatewayAddress](/sdk/assetBridger_erc20Bridger#getl1gatewayaddress) to get the address of the gateway contract that’s going to be used. But don’t worry about any of this yet, we’ll use those functions in the next steps.
We’ll explain below what specific contracts and methods need to be called to bridge your token, but you can abstract this whole process of finding the right addresses by using Arbitrum’s SDK. You can use the [deposit](../../../sdk/reference/assetBridger/erc20Bridger.md#deposit) function of the [Erc20Bridger](../../../sdk/reference/assetBridger/erc20Bridger.md) class to bridge your tokens, which will use the appropriate router contract based on the network you’re connected to, and will relay the request to the appropriate gateway contract. You can also use the function [getParentGatewayAddress](../../../sdk/reference/assetBridger/erc20Bridger.md#getParentGatewayAddress) to get the address of the gateway contract that’s going to be used. But don’t worry about any of this yet, we’ll use those functions in the next steps.

Now, here’s an explanation of the contracts and methods that need to be called to manually bridge your token:

Expand All @@ -100,28 +100,28 @@ You can find the addresses of the contracts involved in the process in [this pag

The gateway contract will be the one that will transfer the tokens to be bridged over. So the next step is to allow the gateway contract to do so.

We typically do that by using the `approve` method of the token, but you can use Arbitrum’s SDK to abstract this process, by calling the method [approveToken](/sdk/assetBridger_erc20Bridger#approvetoken) of the [ERC20Bridger](/sdk/assetBridger_erc20Bridger) class, which will call the approve method of the token passed by parameter, and set the allowance to the appropriate gateway contract.
We typically do that by using the `approve` method of the token, but you can use Arbitrum’s SDK to abstract this process, by calling the method [approveToken](../../../sdk/reference/assetBridger/erc20Bridger.md#approvetoken) of the [Erc20Bridger](../../../sdk/reference/assetBridger/erc20Bridger.md) class, which will call the approve method of the token passed by parameter, and set the allowance to the appropriate gateway contract.

```tsx
/**
* Use l2Network to create an Arbitrum SDK Erc20Bridger instance
* We'll use Erc20Bridger for its convenience methods around transferring token to L2
*/
const l2Network = await getL2Network(l2Provider);
const l2Network = await getArbitrumNetwork(l2Provider);
const erc20Bridge = new Erc20Bridger(l2Network);

/**
* The Standard Gateway contract will ultimately be making the token transfer call; thus, that's the contract we need to approve.
* erc20Bridger.approveToken handles this approval
* Arguments required are:
* (1) l1Signer: The L1 address transferring token to L2
* (2) erc20L1Address: L1 address of the ERC20 token to be depositted to L2
* (2) erc20L1Address: L1 address of the ERC20 token to be deposited to L2
*/
console.log('Approving:');
const l1Erc20Address = l1DappToken.address;
const approveTx = await erc20Bridger.approveToken({
l1Signer: l1Wallet,
erc20L1Address: l1Erc20Address,
parentSigner: l1Wallet,
erc20ParentAddress: l1Erc20Address,
});

const approveRec = await approveTx.wait();
Expand All @@ -136,7 +136,7 @@ As mentioned before, you can also call the `approve` method of the token and sen

After allowing the gateway contract to transfer the tokens, we can now start the bridging process.

You can use Arbitrum’s SDK to abstract this process, by calling the method [deposit](/sdk/assetBridger_erc20Bridger#deposit) of the [ERC20Bridger](/sdk/assetBridger_erc20Bridger) class, which will estimate the gas parameters (\_maxGas, \_gasPriceBid and maxSubmissionCost, explained below) and call the `outboundTransferCustomRefund` method of the router contract. You will only need to specify the following parameters:
You can use Arbitrum’s SDK to abstract this process, by calling the method [deposit](../../../sdk/reference/assetBridger/erc20Bridger.md#deposit) of the [Erc20Bridger](../../../sdk/reference/assetBridger/erc20Bridger.md) class, which will estimate the gas parameters (\_maxGas, \_gasPriceBid and maxSubmissionCost, explained below) and call the `outboundTransferCustomRefund` method of the router contract. You will only need to specify the following parameters:

- `amount`: Amount of tokens to bridge
- `erc20L1Address`: L1 address of the ERC20 token being bridged
Expand All @@ -156,9 +156,9 @@ You can use Arbitrum’s SDK to abstract this process, by calling the method [de
*/
const depositTx = await erc20Bridger.deposit({
amount: tokenDepositAmount,
erc20L1Address: l1Erc20Address,
l1Signer: l1Wallet,
l2Provider: l2Provider,
erc20ParentAddress: l1Erc20Address,
parentSigner: l1Wallet,
childProvider: l2Provider,
});
```

Expand All @@ -185,7 +185,7 @@ You can programmatically wait for the execution of the transaction on L2 using A
* Now we wait for L1 and L2 side of transactions to be confirmed
*/
const depositRec = await depositTx.wait();
const l2Result = await depositRec.waitForL2(l2Provider);
const l2Result = await depositRec.waitForChildTransactionReceipt(l2Provider);

/**
* The `complete` boolean tells us if the l1 to l2 message was successful
Expand All @@ -201,15 +201,15 @@ If you’re going the manual way, you can verify if the message has been execute

Finally, let’s find the token contract that has been created on L2.

Using Arbitrum’s SDK, you can call method [getL2ERC20Address](/sdk/assetBridger_erc20Bridger#getl2erc20address) of the [ERC20Bridger](/sdk/assetBridger_erc20Bridger) class, which will return the address of the token contract in L2 that corresponds to the L1 token contract sent as parameter.
Using Arbitrum’s SDK, you can call method [getChildErc20Address](../../../sdk/reference/assetBridger/erc20Bridger.md#getChildErc20Address) of the [Erc20Bridger](../../../sdk/reference/assetBridger/erc20Bridger.md) class, which will return the address of the token contract in L2 that corresponds to the L1 token contract sent as parameter.

```tsx
/**
* Check if our l2Wallet DappToken balance has been updated correctly
* To do so, we use erc20Bridge to get the l2Token address and contract
*/
const l2TokenAddress = await erc20Bridger.getL2ERC20Address(l1Erc20Address, l1Provider);
const l2Token = erc20Bridger.getL2TokenContract(l2Provider, l2TokenAddress);
const l2TokenAddress = await erc20Bridger.getChildErc20Address(l1Erc20Address, l1Provider);
const l2Token = erc20Bridger.getChildTokenContract(l2Provider, l2TokenAddress);
```

To do this operation manually, you can call method `calculateL2TokenAddress` of the router contract.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ We now deploy that token to L1.
```tsx
const { ethers } = require('hardhat');
const { providers, Wallet } = require('ethers');
const { getL2Network } = require('@arbitrum/sdk');
const { getArbitrumNetwork } = require('@arbitrum/sdk');
require('dotenv').config();

const walletPrivateKey = process.env.DEVNET_PRIVKEY;
Expand All @@ -178,7 +178,7 @@ const main = async () => {
/**
* Use l2Network to get the token bridge addresses needed to deploy the token
*/
const l2Network = await getL2Network(l2Provider);
const l2Network = await getArbitrumNetwork(l2Provider);

const l1Gateway = l2Network.tokenBridge.l1CustomGateway;
const l1Router = l2Network.tokenBridge.l1GatewayRouter;
Expand Down Expand Up @@ -259,7 +259,7 @@ We now deploy that token to L2.
```tsx
const { ethers } = require('hardhat');
const { providers, Wallet } = require('ethers');
const { getL2Network } = require('@arbitrum/sdk');
const { getArbitrumNetwork } = require('@arbitrum/sdk');
require('dotenv').config();

const walletPrivateKey = process.env.DEVNET_PRIVKEY;
Expand All @@ -275,12 +275,12 @@ const main = async () => {
/**
* Use l2Network to get the token bridge addresses needed to deploy the token
*/
const l2Network = await getL2Network(l2Provider);
const l2Gateway = l2Network.tokenBridge.l2CustomGateway;
const l2Network = await getArbitrumNetwork(l2Provider);
const l2Gateway = l2Network.tokenBridge.childCustomGateway;

/**
* Deploy our custom token smart contract to L2
* We give the custom token contract the address of l2CustomGateway as well as the address of the counterpart L1 token
* We give the custom token contract the address of childCustomGateway as well as the address of the counterpart L1 token
*/
console.log('Deploying the test L2Token to L2:');
const L2Token = await (await ethers.getContractFactory('L2Token')).connect(l2Wallet);
Expand Down Expand Up @@ -309,7 +309,7 @@ When using this function two actions will be performed:
1. Call function `registerTokenToL2` of `L1CustomGateway`. This will change the `l1ToL2Token` internal mapping it holds and will send a retryable ticket to the counterpart `L2CustomGateway` contract in L2, to also set its mapping to the new values.
2. Call function `setGateway` of `L1GatewayRouter`. This will change the `l1TokenToGateway` internal mapping it holds and will send a retryable ticket to the counterpart `L2GatewayRouter` contract in L2, to also set its mapping to the new values.

To simplify the process, we’ll use Arbitrum’s SDK. We’ll call the method [registerCustomToken](/sdk/assetBridger_erc20Bridger#registercustomtoken) of the [AdminErc20Bridger](/sdk/assetBridger_erc20Bridger#adminerc20bridger) class, which will call the registerTokenOnL2 method of the token passed by parameter.
To simplify the process, we’ll use Arbitrum’s SDK. We’ll call the method [registerCustomToken](../../../sdk/reference/assetBridger/erc20Bridger#registercustomtoken) of the [AdminErc20Bridger](../../../sdk/reference/assetBridger/erc20Bridger#adminerc20bridger) class, which will call the registerTokenOnL2 method of the token passed by parameter.

```tsx
/**
Expand All @@ -333,7 +333,7 @@ console.log(
* To compute this txn hash, we need our message's "sequence numbers", unique identifiers of each L1 to L2 message.
* We'll fetch them from the event logs with a helper method.
*/
const l1ToL2Msgs = await registerTokenRec.getL1ToL2Messages(l2Provider);
const l1ToL2Msgs = await registerTokenRec.getParentToChildMessages(l2Provider);

/**
* In principle, a single L1 txn can trigger any number of L1-to-L2 messages (each with its own sequencer number).
Expand All @@ -345,10 +345,10 @@ const l1ToL2Msgs = await registerTokenRec.getL1ToL2Messages(l2Provider);
expect(l1ToL2Msgs.length, 'Should be 2 messages.').to.eq(2);

const setTokenTx = await l1ToL2Msgs[0].waitForStatus();
expect(setTokenTx.status, 'Set token not redeemed.').to.eq(L1ToL2MessageStatus.REDEEMED);
expect(setTokenTx.status, 'Set token not redeemed.').to.eq(ParentToChildMessageStatus.REDEEMED);

const setGateways = await l1ToL2Msgs[1].waitForStatus();
expect(setGateways.status, 'Set gateways not redeemed.').to.eq(L1ToL2MessageStatus.REDEEMED);
expect(setGateways.status, 'Set gateways not redeemed.').to.eq(ParentToChildMessageStatus.REDEEMED);

console.log(
'Your custom token is now registered on our custom gateway 🥳 Go ahead and make the deposit!',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ We now deploy that gateway to L1.
```tsx
const { ethers } = require('hardhat');
const { providers, Wallet, BigNumber } = require('ethers');
const { getL2Network, L1ToL2MessageStatus } = require('@arbitrum/sdk');
const { getArbitrumNetwork, ParentToChildMessageStatus } = require('@arbitrum/sdk');
const {
AdminErc20Bridger,
Erc20Bridger,
Expand All @@ -389,11 +389,11 @@ const main = async () => {
* Use l2Network to create an Arbitrum SDK AdminErc20Bridger instance
* We'll use AdminErc20Bridger for its convenience methods around registering tokens to a custom gateway
*/
const l2Network = await getL2Network(l2Provider);
const l2Network = await getArbitrumNetwork(l2Provider);
const erc20Bridger = new Erc20Bridger(l2Network);
const adminTokenBridger = new AdminErc20Bridger(l2Network);
const l1Router = l2Network.tokenBridge.l1GatewayRouter;
const l2Router = l2Network.tokenBridge.l2GatewayRouter;
const l1Router = l2Network.tokenBridge.parentGatewayRouter;
const l2Router = l2Network.tokenBridge.childGatewayRouter;
const inbox = l2Network.ethBridge.inbox;

/**
Expand Down Expand Up @@ -690,11 +690,12 @@ We now deploy that gateway to L2.
```tsx
const { ethers } = require('hardhat');
const { providers, Wallet, BigNumber } = require('ethers');
const { getL2Network, L1ToL2MessageStatus } = require('@arbitrum/sdk');
const {
const {
getArbitrumNetwork,
ParentToChildMessageStatus,
AdminErc20Bridger,
Erc20Bridger,
} = require('@arbitrum/sdk/dist/lib/assetBridger/erc20Bridger');
Erc20Bridger,
} = require('@arbitrum/sdk');
require('dotenv').config();

/**
Expand All @@ -711,7 +712,7 @@ const main = async () => {
* Use l2Network to create an Arbitrum SDK AdminErc20Bridger instance
* We'll use AdminErc20Bridger for its convenience methods around registering tokens to a custom gateway
*/
const l2Network = await getL2Network(l2Provider);
const l2Network = await getArbitrumNetwork(l2Provider);
const erc20Bridger = new Erc20Bridger(l2Network);
const adminTokenBridger = new AdminErc20Bridger(l2Network);
const l1Router = l2Network.tokenBridge.l1GatewayRouter;
Expand Down Expand Up @@ -789,7 +790,7 @@ In this case, when using this function only one action will be performed:

1. Call function `setGateway` of `L1GatewayRouter`. This will change the `l1TokenToGateway` internal mapping it holds and will send a retryable ticket to the counterpart `L2GatewayRouter` contract in L2, to also set its mapping to the new values.

To simplify the process, we’ll use Arbitrum’s SDK and call the method [registerCustomToken](/sdk/assetBridger_erc20Bridger#registercustomtoken) of the [AdminErc20Bridger](/sdk/assetBridger_erc20Bridger#adminerc20bridger) class, which will call the registerTokenOnL2 method of the token passed by parameter.
To simplify the process, we’ll use Arbitrum’s SDK and call the method [registerCustomToken](../../../sdk/reference/assetBridger/erc20Bridger.md#registercustomtoken) of the [AdminErc20Bridger](../../../sdk/reference/assetBridger/erc20Bridger.md#adminerc20bridger) class, which will call the registerTokenOnL2 method of the token passed by parameter.

```tsx
/**
Expand All @@ -816,7 +817,7 @@ console.log(
* To compute this txn hash, we need our message's "sequence numbers", unique identifiers of each L1 to L2 message.
* We'll fetch them from the event logs with a helper method.
*/
const l1ToL2Msgs = await registerTokenRec.getL1ToL2Messages(l2Provider);
const l1ToL2Msgs = await registerTokenRec.getParentToChildMessages(l2Provider);

/**
* In this case, the registerTokenOnL2 method creates 1 L1-to-L2 messages to set the L1 token to the Custom Gateway via the Router
Expand All @@ -825,7 +826,7 @@ const l1ToL2Msgs = await registerTokenRec.getL1ToL2Messages(l2Provider);
expect(l1ToL2Msgs.length, 'Should be 1 message.').to.eq(1);

const setGateways = await l1ToL2Msgs[0].waitForStatus();
expect(setGateways.status, 'Set gateways not redeemed.').to.eq(L1ToL2MessageStatus.REDEEMED);
expect(setGateways.status, 'Set gateways not redeemed.').to.eq(ParentToChildMessageStatus.REDEEMED);

console.log('Your custom token and gateways are now registered on the token bridge 🥳!');
```
Expand Down
2 changes: 1 addition & 1 deletion arbitrum-sdk
Submodule arbitrum-sdk updated 78 files
+7 −2 .env-sample
+26 −11 .github/workflows/build-test.yml
+0 −4 .gitignore
+73 −100 README.md
+51 −12 audit-ci.jsonc
+198 −0 docs/1-introduction.mdx
+198 −0 docs/2-migrate.mdx
+9 −8 package.json
+1 −1 scripts/cancelRetryable.ts
+0 −256 scripts/deployBridge.ts
+3 −3 scripts/deployStandard.ts
+20 −10 scripts/genAbi.js
+96 −19 scripts/genNetwork.ts
+12 −32 scripts/instantiate_bridge.ts
+18 −17 scripts/lib.ts
+5 −5 scripts/redeemRetryable.ts
+4 −4 scripts/sendL2SignedMsg.ts
+87 −214 scripts/testSetup.ts
+4 −4 scripts/upgrade_weth.ts
+59 −27 src/index.ts
+2,077 −0 src/lib/abi-bold/BoldRollupUserLogic.ts
+2,175 −0 src/lib/abi-bold/factories/BoldRollupUserLogic__factory.ts
+40 −23 src/lib/assetBridger/assetBridger.ts
+618 −308 src/lib/assetBridger/erc20Bridger.ts
+209 −89 src/lib/assetBridger/ethBridger.ts
+1,642 −0 src/lib/assetBridger/l1l3Bridger.ts
+26 −0 src/lib/dataEntities/constants.ts
+1 −1 src/lib/dataEntities/message.ts
+400 −363 src/lib/dataEntities/networks.ts
+1 −1 src/lib/dataEntities/retryableData.ts
+27 −23 src/lib/dataEntities/transactionRequest.ts
+126 −74 src/lib/inbox/inbox.ts
+333 −0 src/lib/message/ChildToParentMessage.ts
+99 −87 src/lib/message/ChildToParentMessageClassic.ts
+768 −0 src/lib/message/ChildToParentMessageNitro.ts
+43 −43 src/lib/message/ChildTransaction.ts
+0 −173 src/lib/message/L1ToL2MessageCreator.ts
+0 −317 src/lib/message/L2ToL1Message.ts
+0 −558 src/lib/message/L2ToL1MessageNitro.ts
+203 −178 src/lib/message/ParentToChildMessage.ts
+231 −0 src/lib/message/ParentToChildMessageCreator.ts
+58 −53 src/lib/message/ParentToChildMessageGasEstimator.ts
+101 −87 src/lib/message/ParentTransaction.ts
+2 −1 src/lib/utils/byte_serialize_params.ts
+32 −0 src/lib/utils/calldata.ts
+31 −31 src/lib/utils/lib.ts
+2 −32 src/lib/utils/multicall.ts
+6 −0 src/lib/utils/types.ts
+6 −3 tests/fork/inbox.test.ts
+50 −21 tests/integration/childTransactionReceipt.test.ts
+283 −0 tests/integration/custom-fee-token/customFeeTokenEthBridger.test.ts
+101 −0 tests/integration/custom-fee-token/customFeeTokenTestHelpers.ts
+27 −0 tests/integration/custom-fee-token/mochaExtensions.ts
+191 −98 tests/integration/customerc20.test.ts
+202 −84 tests/integration/eth.test.ts
+0 −47 tests/integration/ethBridgeAddresses.test.ts
+43 −0 tests/integration/getArbitrumNetworkInformationFromRollup.test.ts
+0 −145 tests/integration/l1ToL2MessageCreator.test.ts
+993 −0 tests/integration/l1l3Bridger.test.ts
+169 −0 tests/integration/parentToChildMessageCreator.test.ts
+68 −0 tests/integration/parentToChildMessageGasEstimator.test.ts
+68 −32 tests/integration/retryableData.test.ts
+86 −72 tests/integration/sanity.test.ts
+149 −0 tests/integration/sendChildmsg.test.ts
+0 −143 tests/integration/sendL2msg.test.ts
+160 −85 tests/integration/standarderc20.test.ts
+199 −133 tests/integration/testHelpers.ts
+51 −46 tests/integration/weth.test.ts
+64 −0 tests/unit/calldata.test.ts
+144 −0 tests/unit/childBlocksForL1Block.test.ts
+27 −24 tests/unit/childToParentMessageEvents.test.ts
+0 −136 tests/unit/l2BlocksForL1Block.test.ts
+12 −9 tests/unit/multicall.test.ts
+223 −0 tests/unit/network.test.ts
+23 −17 tests/unit/parentToChildMessageEvents.test.ts
+16 −0 typedoc.json
+0 −0 typedoc_md.js
+659 −186 yarn.lock
10 changes: 0 additions & 10 deletions vercel.json
Original file line number Diff line number Diff line change
Expand Up @@ -795,16 +795,6 @@
"destination": "/node-running/how-tos/running-an-orbit-node",
"permanent": false
},
{
"source": "/sdk",
"destination": "/sdk-docs",
"permanent": false
},
{
"source": "/sdk/(.*)",
"destination": "/sdk-docs/$1",
"permanent": false
},
{
"source": "/(stylus/how-tos/local-stylus-dev-node/?)",
"destination": "/run-arbitrum-node/run-local-dev-node",
Expand Down
2 changes: 1 addition & 1 deletion website/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
.cache-loader

# Generated docs
sdk-docs
sdk

# Misc
.DS_Store
Expand Down
4 changes: 2 additions & 2 deletions website/docusaurus.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ const config = {
tagline: 'Arbitrum Docs',
url: 'https://docs.arbitrum.io/',
baseUrl: '/',
onBrokenLinks: 'ignore', // TODO: FIX ARBITRUM-SDK LINKS
onBrokenLinks: 'throw',
onBrokenMarkdownLinks: 'throw',
favicon: 'img/logo.svg',
markdown: {
Expand Down Expand Up @@ -79,7 +79,7 @@ const config = {
readme: 'none',

// Output options
out: '../arbitrum-docs/sdk-docs',
out: '../arbitrum-docs/sdk/reference',
hideGenerator: true,
validation: {
notExported: false,
Expand Down
2 changes: 1 addition & 1 deletion website/sidebars.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// @ts-check

const sdkDocsSidebar = require('../arbitrum-docs/sdk-docs/sidebar.js');
const sdkDocsSidebar = require('../arbitrum-docs/sdk/sidebar.js');

/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
const sidebars = {
Expand Down
Loading

0 comments on commit 6a6e2c7

Please sign in to comment.