diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 25e99260..b917290e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1,3 @@ * @lucas-janon @bbbeeeee @andresaiello @fadeev @brewmaster012 + +/src/pages/nodes/ @CharlieMc0 \ No newline at end of file diff --git a/next.config.js b/next.config.js index a7d3683d..b1721f87 100644 --- a/next.config.js +++ b/next.config.js @@ -21,9 +21,19 @@ const baseNextConfig = { transpilePackages: ["@zetachain/ui-toolkit"], experimental: { externalDir: true, + /** + * Generating source maps consumes extra memory during the build process. + * https://nextjs.org/docs/app/building-your-application/optimizing/memory-usage#disable-source-maps + */ + serverSourceMaps: false, }, trailingSlash: true, basePath: process.env.NEXT_PUBLIC_BASE_PATH, + /** + * Generating source maps consumes extra memory during the build process. + * https://nextjs.org/docs/app/building-your-application/optimizing/memory-usage#disable-source-maps + */ + productionBrowserSourceMaps: false, headers: async () => nextHeadersConfig, webpack(config) { // eslint-disable-next-line no-param-reassign diff --git a/package.json b/package.json index 1f30fff7..7e81dc33 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "lint:fix": "npx eslint --ext .js,.jsx,.ts,.tsx --fix ./src", "lint": "npx eslint --ext .js,.jsx,.ts,.tsx ./src", "start": "next start", - "check-links": "npx linkinator ./out --recurse --verbosity error --skip '/contracts|/developers/architecture/zetacored|^https'", + "check-links": "EXPORT=true yarn build && npx linkinator ./out --recurse --verbosity error --skip '^https' --skip '/developers/architecture/contracts'", "clean": "rimraf .next out", "tsc:watch": "tsc --watch", "typecheck": "tsc --project ./tsconfig.json --noEmit", @@ -37,7 +37,7 @@ "@tailwindcss/line-clamp": "0.4.4", "@types/react-syntax-highlighter": "15.5.13", "@zetachain/addresses": "0.0.13", - "@zetachain/toolkit": "6.0.0", + "@zetachain/toolkit": "^10.0.0", "@zetachain/ui-toolkit": "1.0.3", "ai": "3.2.19", "axios": "1.6.5", diff --git a/public/img/docs/alchemy-0.png b/public/img/docs/alchemy-0.png new file mode 100644 index 00000000..a8ab5a7f Binary files /dev/null and b/public/img/docs/alchemy-0.png differ diff --git a/public/img/docs/alchemy-1.5.png b/public/img/docs/alchemy-1.5.png new file mode 100644 index 00000000..9889cc7c Binary files /dev/null and b/public/img/docs/alchemy-1.5.png differ diff --git a/public/img/docs/alchemy-1.png b/public/img/docs/alchemy-1.png new file mode 100644 index 00000000..91fcad95 Binary files /dev/null and b/public/img/docs/alchemy-1.png differ diff --git a/public/img/docs/alchemy-2.png b/public/img/docs/alchemy-2.png new file mode 100644 index 00000000..8dc15743 Binary files /dev/null and b/public/img/docs/alchemy-2.png differ diff --git a/public/img/docs/alchemy-3.png b/public/img/docs/alchemy-3.png new file mode 100644 index 00000000..86873f70 Binary files /dev/null and b/public/img/docs/alchemy-3.png differ diff --git a/public/img/docs/architecture-1.png b/public/img/docs/architecture-1.png new file mode 100644 index 00000000..2c0a7882 Binary files /dev/null and b/public/img/docs/architecture-1.png differ diff --git a/public/img/docs/components-balances.png b/public/img/docs/components-balances.png new file mode 100644 index 00000000..6f161374 Binary files /dev/null and b/public/img/docs/components-balances.png differ diff --git a/public/img/docs/components-connect-bitcoin.png b/public/img/docs/components-connect-bitcoin.png new file mode 100644 index 00000000..0d5a5511 Binary files /dev/null and b/public/img/docs/components-connect-bitcoin.png differ diff --git a/public/img/docs/components-profile.png b/public/img/docs/components-profile.png new file mode 100644 index 00000000..d9564c34 Binary files /dev/null and b/public/img/docs/components-profile.png differ diff --git a/public/img/docs/components-staking-rewards.png b/public/img/docs/components-staking-rewards.png new file mode 100644 index 00000000..383d444c Binary files /dev/null and b/public/img/docs/components-staking-rewards.png differ diff --git a/public/img/docs/components-swap.png b/public/img/docs/components-swap.png new file mode 100644 index 00000000..1d20e874 Binary files /dev/null and b/public/img/docs/components-swap.png differ diff --git a/public/img/docs/keplr-add-zetachain-mainnet.png b/public/img/docs/keplr-add-zetachain-mainnet.png new file mode 100644 index 00000000..5e48b2ea Binary files /dev/null and b/public/img/docs/keplr-add-zetachain-mainnet.png differ diff --git a/public/img/docs/keplr-approve.png b/public/img/docs/keplr-approve.png index 4119de2b..4dc96187 100644 Binary files a/public/img/docs/keplr-approve.png and b/public/img/docs/keplr-approve.png differ diff --git a/public/img/docs/keplr-assets.png b/public/img/docs/keplr-assets.png index 809e79cf..ac508e38 100644 Binary files a/public/img/docs/keplr-assets.png and b/public/img/docs/keplr-assets.png differ diff --git a/public/img/docs/keplr-balances-mainnet.png b/public/img/docs/keplr-balances-mainnet.png new file mode 100644 index 00000000..7cb56718 Binary files /dev/null and b/public/img/docs/keplr-balances-mainnet.png differ diff --git a/public/img/docs/keplr-governance-dashboard.png b/public/img/docs/keplr-governance-dashboard.png new file mode 100644 index 00000000..15654806 Binary files /dev/null and b/public/img/docs/keplr-governance-dashboard.png differ diff --git a/public/img/docs/keplr-menu.png b/public/img/docs/keplr-menu.png new file mode 100644 index 00000000..27a0aec5 Binary files /dev/null and b/public/img/docs/keplr-menu.png differ diff --git a/public/img/docs/keplr-send.png b/public/img/docs/keplr-send.png index 2248d635..05a6a126 100644 Binary files a/public/img/docs/keplr-send.png and b/public/img/docs/keplr-send.png differ diff --git a/public/img/docs/keplr-staking-approve.png b/public/img/docs/keplr-staking-approve.png new file mode 100644 index 00000000..09718ae8 Binary files /dev/null and b/public/img/docs/keplr-staking-approve.png differ diff --git a/public/img/docs/keplr-staking-confirm.png b/public/img/docs/keplr-staking-confirm.png new file mode 100644 index 00000000..3642ee71 Binary files /dev/null and b/public/img/docs/keplr-staking-confirm.png differ diff --git a/public/img/docs/keplr-staking-dashboard.png b/public/img/docs/keplr-staking-dashboard.png new file mode 100644 index 00000000..4e5ac5b5 Binary files /dev/null and b/public/img/docs/keplr-staking-dashboard.png differ diff --git a/public/img/docs/keplr-staking-result.png b/public/img/docs/keplr-staking-result.png new file mode 100644 index 00000000..e2166d1c Binary files /dev/null and b/public/img/docs/keplr-staking-result.png differ diff --git a/public/img/docs/keplr-staking-validators.png b/public/img/docs/keplr-staking-validators.png new file mode 100644 index 00000000..25fdd719 Binary files /dev/null and b/public/img/docs/keplr-staking-validators.png differ diff --git a/public/img/docs/keplr-staking.png b/public/img/docs/keplr-staking.png new file mode 100644 index 00000000..e3eb8cca Binary files /dev/null and b/public/img/docs/keplr-staking.png differ diff --git a/public/img/docs/keplr-validator-overview.png b/public/img/docs/keplr-validator-overview.png new file mode 100644 index 00000000..a9b3f595 Binary files /dev/null and b/public/img/docs/keplr-validator-overview.png differ diff --git a/public/img/docs/keplr-voting.png b/public/img/docs/keplr-voting.png new file mode 100644 index 00000000..aa8677c0 Binary files /dev/null and b/public/img/docs/keplr-voting.png differ diff --git a/public/img/pages/universalkit.svg b/public/img/pages/universalkit.svg new file mode 100644 index 00000000..87865f44 --- /dev/null +++ b/public/img/pages/universalkit.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/sitemap-0.xml b/public/sitemap-0.xml index 10e2c3e1..af0c50f1 100644 --- a/public/sitemap-0.xml +++ b/public/sitemap-0.xml @@ -1,467 +1,465 @@ -https://www.zetachain.com/docs/2024-06-24T07:33:27.386Zdaily0.7 -https://www.zetachain.com/docs/451/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/about/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/about/token-utility/distribution/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/about/token-utility/gas/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/about/token-utility/liquidity/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/about/token-utility/overview/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/about/token-utility/token/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/about/token-utility/validators/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/community/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/apps/interacting/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/apps/intro/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/README/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/SUMMARY/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/README/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/ERC20Custody.sol/contract.ERC20Custody/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/README/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/Zeta.eth.sol/contract.ZetaEth/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/Zeta.non-eth.sol/contract.ZetaNonEth/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/ZetaConnector.base.sol/contract.ZetaConnectorBase/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/ZetaConnector.eth.sol/contract.ZetaConnectorEth/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/ZetaConnector.non-eth.sol/contract.ZetaConnectorNonEth/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/interfaces/ConnectorErrors.sol/interface.ConnectorErrors/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/interfaces/README/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/interfaces/ZetaErrors.sol/interface.ZetaErrors/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/interfaces/ZetaInteractorErrors.sol/interface.ZetaInteractorErrors/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/interfaces/ZetaInterfaces.sol/interface.ZetaCommonErrors/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/interfaces/ZetaInterfaces.sol/interface.ZetaConnector/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/interfaces/ZetaInterfaces.sol/interface.ZetaInterfaces/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/interfaces/ZetaInterfaces.sol/interface.ZetaReceiver/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/interfaces/ZetaInterfaces.sol/interface.ZetaTokenConsumer/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/interfaces/ZetaNonEthInterface.sol/interface.ZetaNonEthInterface/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/testing/AttackerContract.sol/contract.AttackerContract/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/testing/AttackerContract.sol/interface.Victim/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/testing/ERC20Mock.sol/contract.ERC20Mock/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/testing/README/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/testing/TestUniswapV3Contracts.sol/interface.INonfungiblePositionManager/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/testing/TestUniswapV3Contracts.sol/interface.IPoolInitializer/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/testing/ZetaInteractorMock.sol/contract.ZetaInteractorMock/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/testing/ZetaReceiverMock.sol/contract.ZetaReceiverMock/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ImmutableCreate2Factory.sol/contract.ImmutableCreate2Factory/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ImmutableCreate2Factory.sol/interface.Ownable/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/README/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaInteractor.sol/abstract.ZetaInteractor/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerPancakeV3.strategy.sol/contract.ZetaTokenConsumerPancakeV3/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerPancakeV3.strategy.sol/interface.ISwapRouterPancake/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerPancakeV3.strategy.sol/interface.WETH9/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerPancakeV3.strategy.sol/interface.ZetaTokenConsumerUniV3Errors/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerTrident.strategy.sol/contract.ZetaTokenConsumerTrident/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerTrident.strategy.sol/interface.WETH9/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerTrident.strategy.sol/interface.ZetaTokenConsumerTridentErrors/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerUniV2.strategy.sol/contract.ZetaTokenConsumerUniV2/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerUniV2.strategy.sol/interface.ZetaTokenConsumerUniV2Errors/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerUniV3.strategy.sol/contract.ZetaTokenConsumerUniV3/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerUniV3.strategy.sol/interface.WETH9/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerUniV3.strategy.sol/interface.ZetaTokenConsumerUniV3Errors/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/interfaces/README/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/interfaces/TridentConcentratedLiquidityPoolFactory.sol/interface.ConcentratedLiquidityPoolFactory/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/interfaces/TridentIPoolRouter.sol/interface.IPoolRouter/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/Interfaces.sol/enum.CoinType/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/Interfaces.sol/interface.ISystem/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/Interfaces.sol/interface.IZRC20/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/Interfaces.sol/interface.IZRC20Metadata/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/README/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/SystemContract.sol/contract.SystemContract/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/SystemContract.sol/interface.SystemContractErrors/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/Uniswap.sol/contract.UniswapImports/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/UniswapPeriphery.sol/contract.UniswapImports/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/WZETA.sol/contract.WETH9/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/ZRC20.sol/contract.ZRC20/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/ZRC20.sol/interface.ZRC20Errors/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/ZetaConnectorZEVM.sol/contract.ZetaConnectorZEVM/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/ZetaConnectorZEVM.sol/interface.ZetaInterfaces/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/ZetaConnectorZEVM.sol/interface.ZetaReceiver/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/interfaces/IUniswapV2Router01.sol/interface.IUniswapV2Router01/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/interfaces/IUniswapV2Router02.sol/interface.IUniswapV2Router02/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/interfaces/IWZETA.sol/interface.IWETH9/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/interfaces/IZRC20.sol/interface.IZRC20/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/interfaces/README/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/interfaces/zContract.sol/interface.zContract/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/interfaces/zContract.sol/struct.zContext/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/testing/README/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/testing/SystemContractMock.sol/contract.SystemContractMock/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/testing/SystemContractMock.sol/interface.SystemContractErrors/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/modules/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/modules/crosschain/messages/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/modules/crosschain/overview/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/modules/emissions/overview/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/modules/fungible/messages/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/modules/fungible/overview/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/modules/observer/messages/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/modules/observer/overview/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/observers/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/overview/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/privileged/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/rewards/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/whitelisting/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_add-genesis-account/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_add-observer-list/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_addr-conversion/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_collect-gentxs/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_collect-observer-info/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_config/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_debug/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_debug_addr/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_debug_pubkey/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_debug_pubkey-raw/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_debug_raw-bytes/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_docs/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_export/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_gentx/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_get-pubkey/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_index-eth-tx/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_init/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_add/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_delete/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_export/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_import/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_list/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_migrate/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_mnemonic/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_parse/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_rename/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_show/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_unsafe-export-eth-key/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_unsafe-import-eth-key/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_account/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_auth/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_auth_account/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_auth_accounts/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_auth_address-by-acc-num/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_auth_module-account/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_auth_module-accounts/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_auth_params/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_authz/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_authz_grants/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_authz_grants-by-grantee/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_authz_grants-by-granter/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_bank/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_bank_balances/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_bank_denom-metadata/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_bank_total/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_block/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_get-zeta-accounting/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_in-tx-hash-to-cctx-data/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_last-zeta-height/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_list-all-in-tx-trackers/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_list-cctx/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_list-gas-price/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_list-in-tx-hash-to-cctx/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_list-in-tx-tracker/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_list-out-tx-tracker/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_list-pending-cctx/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_params/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_show-cctx/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_show-gas-price/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_show-in-tx-hash-to-cctx/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_show-out-tx-tracker/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_distribution/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_distribution_commission/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_distribution_community-pool/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_distribution_params/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_distribution_rewards/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_distribution_slashes/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_distribution_validator-outstanding-rewards/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_emissions/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_emissions_get-emmisons-factors/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_emissions_list-pool-addresses/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_emissions_params/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_emissions_show-available-emissions/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_evidence/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_evm/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_evm_code/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_evm_params/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_evm_storage/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_feemarket/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_feemarket_base-fee/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_feemarket_block-gas/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_feemarket_params/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_fungible/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_fungible_code-hash/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_fungible_gas-stability-pool-address/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_fungible_gas-stability-pool-balance/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_fungible_gas-stability-pool-balances/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_fungible_list-foreign-coins/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_fungible_params/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_fungible_show-foreign-coins/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_fungible_system-contract/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov_deposit/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov_deposits/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov_param/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov_params/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov_proposal/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov_proposals/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov_proposer/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov_tally/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov_vote/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov_votes/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_group-info/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_group-members/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_group-policies-by-admin/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_group-policies-by-group/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_group-policy-info/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_groups/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_groups-by-admin/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_groups-by-member/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_proposal/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_proposals-by-group-policy/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_tally-result/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_vote/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_votes-by-proposal/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_votes-by-voter/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_get-historical-tss-address/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_get-tss-address/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_list-blame/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_list-blame-by-msg/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_list-chain-nonces/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_list-chain-params/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_list-chains/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_list-node-account/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_list-observer-set/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_list-pending-nonces/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_list-tss-history/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_params/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_show-ballot/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_show-blame/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_show-chain-nonces/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_show-chain-params/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_show-crosschain-flags/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_show-keygen/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_show-node-account/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_show-observer-count/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_show-tss/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_params/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_params_subspace/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_slashing/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_slashing_params/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_slashing_signing-info/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_slashing_signing-infos/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_delegation/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_delegations/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_delegations-to/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_historical-info/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_params/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_pool/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_redelegation/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_redelegations/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_redelegations-from/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_unbonding-delegation/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_unbonding-delegations/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_unbonding-delegations-from/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_validator/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_validators/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_tendermint-validator-set/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_tx/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_txs/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_upgrade/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_upgrade_applied/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_upgrade_module_versions/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_upgrade_plan/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_rollback/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_rosetta/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_snapshots/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_snapshots_delete/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_snapshots_dump/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_snapshots_export/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_snapshots_list/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_snapshots_load/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_snapshots_restore/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_start/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_status/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tendermint/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tendermint_reset-state/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tendermint_show-address/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tendermint_show-node-id/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tendermint_show-validator/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tendermint_unsafe-reset-all/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tendermint_version/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_testnet/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_testnet_init-files/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_testnet_start/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_authz/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_authz_exec/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_authz_grant/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_authz_revoke/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_bank/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_bank_multi-send/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_bank_send/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_broadcast/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crisis/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crisis_invariant-broken/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_abort-stuck-cctx/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_add-to-in-tx-tracker/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_add-to-out-tx-tracker/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_create-tss-voter/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_gas-price-voter/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_inbound-voter/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_migrate-tss-funds/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_outbound-voter/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_refund-aborted/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_remove-from-out-tx-tracker/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_update-tss-address/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_whitelist-erc20/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_decode/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_distribution/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_distribution_fund-community-pool/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_distribution_set-withdraw-addr/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_distribution_withdraw-all-rewards/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_distribution_withdraw-rewards/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_emissions/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_encode/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_evidence/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_evm/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_evm_raw/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_fungible/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_fungible_deploy-fungible-coin-zrc-4/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_fungible_deploy-system-contracts/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_fungible_remove-foreign-coin/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_fungible_update-contract-bytecode/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_fungible_update-system-contract/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_fungible_update-zrc20-liquidity-cap/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_fungible_update-zrc20-paused-status/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_fungible_update-zrc20-withdraw-fee/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov_deposit/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov_draft-proposal/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov_submit-legacy-proposal/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov_submit-legacy-proposal_cancel-software-upgrade/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov_submit-legacy-proposal_community-pool-spend/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov_submit-legacy-proposal_param-change/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov_submit-legacy-proposal_software-upgrade/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov_submit-proposal/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov_vote/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov_weighted-vote/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_create-group/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_create-group-policy/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_create-group-with-policy/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_draft-proposal/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_exec/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_leave-group/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_submit-proposal/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_update-group-admin/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_update-group-members/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_update-group-metadata/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_update-group-policy-admin/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_update-group-policy-decision-policy/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_update-group-policy-metadata/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_vote/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_withdraw-proposal/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_multi-sign/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_multisign-batch/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_observer/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_observer_add-blame-vote/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_observer_add-observer/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_observer_encode/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_observer_remove-chain-params/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_observer_update-chain-params/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_observer_update-crosschain-flags/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_observer_update-keygen/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_observer_update-observer/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_sign/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_sign-batch/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_slashing/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_slashing_unjail/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_staking/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_staking_cancel-unbond/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_staking_create-validator/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_staking_delegate/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_staking_edit-validator/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_staking_redelegate/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_staking_unbond/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_validate-signatures/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_vesting/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_vesting_create-periodic-vesting-account/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_vesting_create-permanent-locked-account/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_vesting_create-vesting-account/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_validate-genesis/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_version/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/evm/addresses/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/evm/bitcoin/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/evm/connector/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/evm/gas/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/evm/system-contract/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/reference/template/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/reference/transactions/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/services/envio/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/services/goldsky/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/services/particle/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/services/pyth/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/tokens/erc20/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/tokens/zeta/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/tokens/zrc20/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/tutorials/bitcoin/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/tutorials/connector-nft/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/tutorials/erc20/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/tutorials/hello/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/tutorials/message/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/tutorials/multioutput/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/tutorials/nft/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/tutorials/nft/contract/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/tutorials/nft/frontend/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/tutorials/staking/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/tutorials/swap/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/tutorials/swap-zeta/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/developers/tutorials/zeta/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/nodes/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/nodes/start-here/requirements/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/nodes/start-here/setup/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/nodes/start-here/syncing/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/nodes/validate/validator/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/reference/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/reference/apps/explorers/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/reference/apps/get-testnet-zeta/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/reference/apps/services/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/reference/apps/wallets/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/reference/learn/faq/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/reference/learn/glossary/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/reference/network/api/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/reference/network/contracts/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/reference/network/details/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/reference/network/openapi/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/reference/network/proposals/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/support/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/cli/account/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/cli/balances/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/cli/delegate/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/cli/governance/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/cli/governance/deposit/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/cli/governance/overview/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/cli/governance/parameter/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/cli/governance/submit/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/cli/governance/text/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/cli/governance/upgrade/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/cli/governance/voting/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/cli/rewards/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/cli/setup/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/keplr/setup/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/keplr/transfer/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/leap/delegate/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/leap/setup/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/pingpub/delegate/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/zetahub/connect-wallet/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/zetahub/create-wallet/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/zetahub/earn-zeta-xp/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/zetahub/enroll-zeta-xp/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/zetahub/get-zeta/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/zetahub/pool/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/zetahub/send/2024-06-24T07:33:27.387Zdaily0.7 -https://www.zetachain.com/docs/users/zetahub/stake/2024-06-24T07:33:27.387Zdaily0.7 +https://www.zetachain.com/docs/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/451/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/about/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/about/token-utility/distribution/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/about/token-utility/gas/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/about/token-utility/liquidity/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/about/token-utility/overview/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/about/token-utility/token/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/about/token-utility/validators/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/community/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/apps/intro/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/README/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/SUMMARY/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/README/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/ERC20Custody.sol/contract.ERC20Custody/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/README/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/Zeta.eth.sol/contract.ZetaEth/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/Zeta.non-eth.sol/contract.ZetaNonEth/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/ZetaConnector.base.sol/contract.ZetaConnectorBase/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/ZetaConnector.eth.sol/contract.ZetaConnectorEth/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/ZetaConnector.non-eth.sol/contract.ZetaConnectorNonEth/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/interfaces/ConnectorErrors.sol/interface.ConnectorErrors/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/interfaces/README/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/interfaces/ZetaErrors.sol/interface.ZetaErrors/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/interfaces/ZetaInteractorErrors.sol/interface.ZetaInteractorErrors/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/interfaces/ZetaInterfaces.sol/interface.ZetaCommonErrors/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/interfaces/ZetaInterfaces.sol/interface.ZetaConnector/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/interfaces/ZetaInterfaces.sol/interface.ZetaInterfaces/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/interfaces/ZetaInterfaces.sol/interface.ZetaReceiver/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/interfaces/ZetaInterfaces.sol/interface.ZetaTokenConsumer/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/interfaces/ZetaNonEthInterface.sol/interface.ZetaNonEthInterface/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/testing/AttackerContract.sol/contract.AttackerContract/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/testing/AttackerContract.sol/interface.Victim/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/testing/ERC20Mock.sol/contract.ERC20Mock/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/testing/README/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/testing/TestUniswapV3Contracts.sol/interface.INonfungiblePositionManager/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/testing/TestUniswapV3Contracts.sol/interface.IPoolInitializer/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/testing/ZetaInteractorMock.sol/contract.ZetaInteractorMock/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/testing/ZetaReceiverMock.sol/contract.ZetaReceiverMock/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ImmutableCreate2Factory.sol/contract.ImmutableCreate2Factory/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ImmutableCreate2Factory.sol/interface.Ownable/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/README/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaInteractor.sol/abstract.ZetaInteractor/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerPancakeV3.strategy.sol/contract.ZetaTokenConsumerPancakeV3/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerPancakeV3.strategy.sol/interface.ISwapRouterPancake/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerPancakeV3.strategy.sol/interface.WETH9/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerPancakeV3.strategy.sol/interface.ZetaTokenConsumerUniV3Errors/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerTrident.strategy.sol/contract.ZetaTokenConsumerTrident/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerTrident.strategy.sol/interface.WETH9/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerTrident.strategy.sol/interface.ZetaTokenConsumerTridentErrors/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerUniV2.strategy.sol/contract.ZetaTokenConsumerUniV2/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerUniV2.strategy.sol/interface.ZetaTokenConsumerUniV2Errors/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerUniV3.strategy.sol/contract.ZetaTokenConsumerUniV3/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerUniV3.strategy.sol/interface.WETH9/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/ZetaTokenConsumerUniV3.strategy.sol/interface.ZetaTokenConsumerUniV3Errors/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/interfaces/README/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/interfaces/TridentConcentratedLiquidityPoolFactory.sol/interface.ConcentratedLiquidityPoolFactory/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/evm/tools/interfaces/TridentIPoolRouter.sol/interface.IPoolRouter/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/Interfaces.sol/enum.CoinType/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/Interfaces.sol/interface.ISystem/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/Interfaces.sol/interface.IZRC20/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/Interfaces.sol/interface.IZRC20Metadata/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/README/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/SystemContract.sol/contract.SystemContract/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/SystemContract.sol/interface.SystemContractErrors/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/Uniswap.sol/contract.UniswapImports/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/UniswapPeriphery.sol/contract.UniswapImports/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/WZETA.sol/contract.WETH9/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/ZRC20.sol/contract.ZRC20/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/ZRC20.sol/interface.ZRC20Errors/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/ZetaConnectorZEVM.sol/contract.ZetaConnectorZEVM/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/ZetaConnectorZEVM.sol/interface.ZetaInterfaces/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/ZetaConnectorZEVM.sol/interface.ZetaReceiver/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/interfaces/IUniswapV2Router01.sol/interface.IUniswapV2Router01/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/interfaces/IUniswapV2Router02.sol/interface.IUniswapV2Router02/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/interfaces/IWZETA.sol/interface.IWETH9/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/interfaces/IZRC20.sol/interface.IZRC20/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/interfaces/README/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/interfaces/zContract.sol/interface.zContract/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/interfaces/zContract.sol/struct.zContext/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/testing/README/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/testing/SystemContractMock.sol/contract.SystemContractMock/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/contracts/contracts/zevm/testing/SystemContractMock.sol/interface.SystemContractErrors/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/modules/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/modules/crosschain/messages/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/modules/crosschain/overview/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/modules/emissions/overview/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/modules/fungible/messages/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/modules/fungible/overview/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/modules/observer/messages/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/modules/observer/overview/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/observers/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/overview/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/privileged/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/rewards/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/whitelisting/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_add-genesis-account/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_add-observer-list/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_addr-conversion/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_collect-gentxs/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_collect-observer-info/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_config/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_debug/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_debug_addr/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_debug_pubkey/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_debug_pubkey-raw/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_debug_raw-bytes/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_docs/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_export/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_gentx/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_get-pubkey/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_index-eth-tx/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_init/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_add/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_delete/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_export/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_import/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_list/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_migrate/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_mnemonic/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_parse/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_rename/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_show/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_unsafe-export-eth-key/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_keys_unsafe-import-eth-key/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_account/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_auth/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_auth_account/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_auth_accounts/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_auth_address-by-acc-num/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_auth_module-account/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_auth_module-accounts/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_auth_params/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_authz/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_authz_grants/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_authz_grants-by-grantee/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_authz_grants-by-granter/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_bank/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_bank_balances/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_bank_denom-metadata/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_bank_total/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_block/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_get-zeta-accounting/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_in-tx-hash-to-cctx-data/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_last-zeta-height/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_list-all-in-tx-trackers/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_list-cctx/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_list-gas-price/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_list-in-tx-hash-to-cctx/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_list-in-tx-tracker/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_list-out-tx-tracker/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_list-pending-cctx/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_params/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_show-cctx/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_show-gas-price/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_show-in-tx-hash-to-cctx/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_crosschain_show-out-tx-tracker/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_distribution/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_distribution_commission/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_distribution_community-pool/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_distribution_params/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_distribution_rewards/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_distribution_slashes/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_distribution_validator-outstanding-rewards/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_emissions/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_emissions_get-emmisons-factors/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_emissions_list-pool-addresses/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_emissions_params/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_emissions_show-available-emissions/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_evidence/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_evm/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_evm_code/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_evm_params/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_evm_storage/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_feemarket/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_feemarket_base-fee/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_feemarket_block-gas/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_feemarket_params/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_fungible/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_fungible_code-hash/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_fungible_gas-stability-pool-address/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_fungible_gas-stability-pool-balance/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_fungible_gas-stability-pool-balances/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_fungible_list-foreign-coins/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_fungible_params/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_fungible_show-foreign-coins/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_fungible_system-contract/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov_deposit/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov_deposits/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov_param/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov_params/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov_proposal/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov_proposals/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov_proposer/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov_tally/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov_vote/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_gov_votes/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_group-info/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_group-members/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_group-policies-by-admin/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_group-policies-by-group/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_group-policy-info/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_groups/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_groups-by-admin/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_groups-by-member/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_proposal/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_proposals-by-group-policy/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_tally-result/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_vote/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_votes-by-proposal/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_group_votes-by-voter/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_get-historical-tss-address/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_get-tss-address/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_list-blame/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_list-blame-by-msg/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_list-chain-nonces/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_list-chain-params/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_list-chains/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_list-node-account/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_list-observer-set/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_list-pending-nonces/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_list-tss-history/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_params/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_show-ballot/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_show-blame/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_show-chain-nonces/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_show-chain-params/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_show-crosschain-flags/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_show-keygen/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_show-node-account/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_show-observer-count/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_observer_show-tss/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_params/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_params_subspace/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_slashing/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_slashing_params/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_slashing_signing-info/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_slashing_signing-infos/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_delegation/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_delegations/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_delegations-to/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_historical-info/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_params/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_pool/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_redelegation/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_redelegations/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_redelegations-from/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_unbonding-delegation/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_unbonding-delegations/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_unbonding-delegations-from/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_validator/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_staking_validators/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_tendermint-validator-set/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_tx/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_txs/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_upgrade/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_upgrade_applied/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_upgrade_module_versions/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_query_upgrade_plan/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_rollback/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_rosetta/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_snapshots/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_snapshots_delete/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_snapshots_dump/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_snapshots_export/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_snapshots_list/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_snapshots_load/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_snapshots_restore/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_start/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_status/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tendermint/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tendermint_reset-state/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tendermint_show-address/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tendermint_show-node-id/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tendermint_show-validator/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tendermint_unsafe-reset-all/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tendermint_version/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_testnet/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_testnet_init-files/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_testnet_start/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_authz/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_authz_exec/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_authz_grant/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_authz_revoke/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_bank/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_bank_multi-send/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_bank_send/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_broadcast/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crisis/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crisis_invariant-broken/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_abort-stuck-cctx/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_add-to-in-tx-tracker/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_add-to-out-tx-tracker/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_create-tss-voter/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_gas-price-voter/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_inbound-voter/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_migrate-tss-funds/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_outbound-voter/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_refund-aborted/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_remove-from-out-tx-tracker/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_update-tss-address/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_crosschain_whitelist-erc20/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_decode/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_distribution/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_distribution_fund-community-pool/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_distribution_set-withdraw-addr/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_distribution_withdraw-all-rewards/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_distribution_withdraw-rewards/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_emissions/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_encode/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_evidence/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_evm/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_evm_raw/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_fungible/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_fungible_deploy-fungible-coin-zrc-4/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_fungible_deploy-system-contracts/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_fungible_remove-foreign-coin/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_fungible_update-contract-bytecode/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_fungible_update-system-contract/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_fungible_update-zrc20-liquidity-cap/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_fungible_update-zrc20-paused-status/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_fungible_update-zrc20-withdraw-fee/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov_deposit/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov_draft-proposal/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov_submit-legacy-proposal/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov_submit-legacy-proposal_cancel-software-upgrade/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov_submit-legacy-proposal_community-pool-spend/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov_submit-legacy-proposal_param-change/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov_submit-legacy-proposal_software-upgrade/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov_submit-proposal/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov_vote/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_gov_weighted-vote/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_create-group/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_create-group-policy/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_create-group-with-policy/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_draft-proposal/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_exec/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_leave-group/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_submit-proposal/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_update-group-admin/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_update-group-members/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_update-group-metadata/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_update-group-policy-admin/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_update-group-policy-decision-policy/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_update-group-policy-metadata/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_vote/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_group_withdraw-proposal/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_multi-sign/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_multisign-batch/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_observer/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_observer_add-blame-vote/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_observer_add-observer/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_observer_encode/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_observer_remove-chain-params/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_observer_update-chain-params/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_observer_update-crosschain-flags/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_observer_update-keygen/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_observer_update-observer/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_sign/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_sign-batch/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_slashing/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_slashing_unjail/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_staking/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_staking_cancel-unbond/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_staking_create-validator/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_staking_delegate/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_staking_edit-validator/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_staking_redelegate/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_staking_unbond/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_validate-signatures/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_vesting/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_vesting_create-periodic-vesting-account/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_vesting_create-permanent-locked-account/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_tx_vesting_create-vesting-account/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_validate-genesis/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/architecture/zetacored/zetacored_version/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/evm/addresses/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/evm/bitcoin/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/evm/gas/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/evm/system-contract/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/reference/transactions/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/services/alchemy/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/services/envio/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/services/goldsky/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/services/particle/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/services/pyth/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/services/subquery/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/tokens/erc20/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/tokens/zeta/2024-07-26T12:22:23.131Zdaily0.7 +https://www.zetachain.com/docs/developers/tokens/zrc20/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/developers/tutorials/bitcoin/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/developers/tutorials/hello/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/developers/tutorials/intro/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/developers/tutorials/multioutput/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/developers/tutorials/nft/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/developers/tutorials/nft/contract/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/developers/tutorials/nft/frontend/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/developers/tutorials/staking/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/developers/tutorials/swap/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/developers/tutorials/swap-any/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/nodes/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/nodes/start-here/requirements/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/nodes/start-here/setup/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/nodes/start-here/syncing/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/nodes/validate/validator/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/reference/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/reference/apps/explorers/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/reference/apps/get-testnet-zeta/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/reference/apps/services/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/reference/apps/wallets/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/reference/learn/faq/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/reference/learn/glossary/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/reference/network/api/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/reference/network/contracts/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/reference/network/details/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/reference/network/openapi/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/reference/network/proposals/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/support/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/cli/account/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/cli/balances/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/cli/delegate/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/cli/governance/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/cli/governance/deposit/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/cli/governance/overview/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/cli/governance/parameter/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/cli/governance/submit/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/cli/governance/text/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/cli/governance/upgrade/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/cli/governance/voting/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/cli/rewards/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/cli/setup/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/keplr/setup/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/keplr/staking/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/keplr/transfer/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/keplr/voting/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/leap/delegate/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/leap/setup/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/pingpub/delegate/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/zetahub/connect-wallet/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/zetahub/create-wallet/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/zetahub/earn-zeta-xp/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/zetahub/enroll-zeta-xp/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/zetahub/get-zeta/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/zetahub/pool/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/zetahub/send/2024-07-26T12:22:23.132Zdaily0.7 +https://www.zetachain.com/docs/users/zetahub/stake/2024-07-26T12:22:23.132Zdaily0.7 \ No newline at end of file diff --git a/src/components/About/components/RoadmapPillars.tsx b/src/components/About/components/RoadmapPillars.tsx index f2233aeb..6c80f0fb 100644 --- a/src/components/About/components/RoadmapPillars.tsx +++ b/src/components/About/components/RoadmapPillars.tsx @@ -62,7 +62,7 @@ const pillars = [
  • ZRC-20 whitelisting automation and expanded onboarding process.
  • ZRC20-like NFT support for omnichain smart contracts.
  • BRC20/Ordinals support in omnichain smart contracts.
  • -
  • Standardized interactions with external chains beyond fungible tokens (ZRC20 model).
  • +
  • Standardized interactions with connected chains beyond fungible tokens (ZRC20 model).
  • ), }, diff --git a/src/components/Docs/components/Fees.tsx b/src/components/Docs/components/Fees.tsx index 5b7d8003..fcf6c4d0 100644 --- a/src/components/Docs/components/Fees.tsx +++ b/src/components/Docs/components/Fees.tsx @@ -23,33 +23,52 @@ export const Fees: React.FC = ({ type }) => { const [isLoading, setIsLoading] = useState(false); useEffect(() => { - setIsLoading(true); + const fetchFees = async () => { + setIsLoading(true); + + try { + const client = new ZetaChainClient({ + network: activeTab.networkType, + chains: { + zeta_testnet: { + api: [ + { + url: `https://zetachain-athens.g.allthatnode.com/archive/evm`, + type: "evm", + }, + ], + }, + zeta_mainnet: { + api: [ + { + url: `https://zetachain-mainnet.g.allthatnode.com/archive/evm`, + type: "evm", + }, + ], + }, + }, + }); + const data = await client.getFees(500000); - const client = new ZetaChainClient({ network: activeTab.networkType }); - - client - .getFees(500000) - .then((data: any) => { const sortedOmnichainFees = [...data.omnichain].sort((a, b) => a.foreign_chain_id.localeCompare(b.foreign_chain_id) ); const updatedData: FeesState = { - messaging: data.messaging.filter( - (fee: any) => !["18332", "8332"].includes(fee.chainID) // There is a bug in getFees that returns messaging fees for Bitcoin. This filters them out. - ), + messaging: data.messaging, omnichain: sortedOmnichainFees, }; if (activeTab.networkType === "mainnet") setMainnetFees(updatedData); if (activeTab.networkType === "testnet") setTestnetFees(updatedData); - - setIsLoading(false); - }) - .catch((error: any) => { + } catch (error) { console.error("Error fetching fees:", error); + } finally { setIsLoading(false); - }); + } + }; + + fetchFees(); }, [activeTab.networkType]); const fees = useMemo(() => { diff --git a/src/components/Docs/components/GovUpgradeProposals.tsx b/src/components/Docs/components/GovUpgradeProposals.tsx index 5af02c81..80286e4b 100644 --- a/src/components/Docs/components/GovUpgradeProposals.tsx +++ b/src/components/Docs/components/GovUpgradeProposals.tsx @@ -6,8 +6,8 @@ import { LoadingTable, NetworkTypeTabs, networkTypeTabs } from "~/components/sha import { NetworkType } from "~/lib/app.types"; const API: Record = { - testnet: "https://zetachain-testnet-archive.allthatnode.com:1317/cosmos/gov/v1/proposals", - mainnet: "https://zetachain-mainnet-archive.allthatnode.com:1317/cosmos/gov/v1/proposals", + testnet: "https://zetachain-athens.g.allthatnode.com/archive/rest/cosmos/gov/v1/proposals", + mainnet: "https://zetachain-mainnet.g.allthatnode.com/archive/rest/cosmos/gov/v1/proposals", }; const convertIpfsLink = (link: string) => { diff --git a/src/components/Docs/components/OpenAPIBrowser.tsx b/src/components/Docs/components/OpenAPIBrowser.tsx index 104c25a8..988905c8 100644 --- a/src/components/Docs/components/OpenAPIBrowser.tsx +++ b/src/components/Docs/components/OpenAPIBrowser.tsx @@ -2,8 +2,8 @@ import "swagger-ui-react/swagger-ui.css"; import axios from "axios"; import yaml from "js-yaml"; +import dynamic from "next/dynamic"; import { useEffect, useMemo, useState } from "react"; -import SwaggerUI from "swagger-ui-react"; import tw, { styled } from "twin.macro"; import { LoadingTable, NetworkTypeTabs, networkTypeTabs } from "~/components/shared"; @@ -46,6 +46,9 @@ const StyledContainer = styled.div` } `; +// Dynamically import SwaggerUI to disable server-side rendering +const SwaggerUI = dynamic(() => import("swagger-ui-react"), { ssr: false }); + export const OpenAPIBrowser = () => { const [activeTab, setActiveTab] = useState(networkTypeTabs[0]); const [isLoading, setIsLoading] = useState(true); diff --git a/src/pages/about/token-utility/distribution.mdx b/src/pages/about/token-utility/distribution.mdx index c5e0932f..f8408057 100644 --- a/src/pages/about/token-utility/distribution.mdx +++ b/src/pages/about/token-utility/distribution.mdx @@ -89,6 +89,7 @@ ZETA are allocated to Purchasers as well as Core Contributors and Advisors who earned tokens for their contributions to the ZetaChain network. - The above details are the current thinking and models with regard to ZetaChain and ZETA. They are subject to - variations for the ZetaChain mainnet and further developments thereafter. + {" "} + The above details are the current thinking and models with regard to ZetaChain and ZETA. They are subject to variations + for the ZetaChain mainnet and further developments thereafter.{" "} diff --git a/src/pages/about/token-utility/liquidity.mdx b/src/pages/about/token-utility/liquidity.mdx index f30fa27c..47140355 100644 --- a/src/pages/about/token-utility/liquidity.mdx +++ b/src/pages/about/token-utility/liquidity.mdx @@ -9,7 +9,7 @@ The network has ZETA / Managed-Token-Gas pools that are used to pay for gas on outbound transactions. By using ZetaChain cross-chain functionality, the protocol uses these underlying -pools to pay for outbound gas in transactions on external chains. This means +pools to pay for outbound gas in transactions on connected chains. This means that with the increased usage of ZetaChain’s core functionality, comes increased usage and fees of these pools. Arbitrageurs will be able to balance these pools as they are utilized by the network. @@ -23,5 +23,5 @@ to ensure minimal cost or slippage for end-users or developers. ZetaChain needs a [ZETA] / [Gas ZRC-20] Uniswap Pool (on ZetaChain's EVM) to convert ZETA in order to write outbound transactions to that chain. Whenever a chain's support is added, a corresponding pool between ZETA and that chain's -native gas asset is also created. You can read more about how to pool -your ZETA [here](/users/zetahub/pool). \ No newline at end of file +native gas asset is also created. You can read more about how to pool your ZETA +[here](/users/zetahub/pool). diff --git a/src/pages/about/token-utility/overview.mdx b/src/pages/about/token-utility/overview.mdx index 6288ca84..4bd9278d 100644 --- a/src/pages/about/token-utility/overview.mdx +++ b/src/pages/about/token-utility/overview.mdx @@ -31,7 +31,7 @@ token standard called ZRC-20. Liquidity in the Threshold Signature Scheme (TSS) addresses are managed by a distributed network of validators in a decentralized manner. Assets are deposited into TSS addresses and ERC-20 custody contracts on connected chains, and those assets are thereby usable at a native level by logic -in a ZetaChain smart contract. Users on external chains may send messages to +in a ZetaChain smart contract. Users on connected chains may send messages to either simply transfer value and data to other connected chains (”cross-chain messaging”), or to call contracts on ZetaChain’s EVM that can orchestrate liquidity on any connected chain. They may also connect directly to ZetaChain’s @@ -76,7 +76,7 @@ core pillars: destination, not only used for bundling gas but as the **medium** of value transfer between connected chains to facilitate value transfer without the creation of new wrapped assets. -- Core Liquidity Pools comprised of ZETA and other external chain assets let +- Core Liquidity Pools comprised of ZETA and other connected chain assets let users transact on ZetaChain and between connected chains (for gas on outbound transactions) through ZetaChain. The liquidity providers (LPs) receive trading fees and other liquidity incentives to provide liquidity for this in the form diff --git a/src/pages/about/token-utility/validators.mdx b/src/pages/about/token-utility/validators.mdx index 703357ef..e6d76e2d 100644 --- a/src/pages/about/token-utility/validators.mdx +++ b/src/pages/about/token-utility/validators.mdx @@ -5,36 +5,75 @@ description: Validator incentives are structured such that operators are remuner ## Validator types -Validators are comprised of 3 different roles: Core Validators, Observers, and TSS Signers. Fees from transactions and rewards are distributed to Validators in return for their service of processing transactions and keeping the network secure. - -> _Note: in general, Observers and TSS Signers are technically separate but will be batched together for operators such that an operator is either running a Core Validator or an Observer-Signer Validator. Core Validator u prerequisite to being an Observer-Signer (Observer-Signers will run all 3 roles, technically). Observer-Signers receive 25% of block rewards and Core Validators receive the other 75%. At launch, it is planned such that the top 100 Core Validators on total stake will be eligible to participate in consensus. 9 validators will comprise the initial Observer-Signer set. These numbers will increase over time further the decentralization of the network._ - -Here we define the different functions of validators and their allocation of the validator block incentives. +Validators are comprised of 3 different roles: Core Validators, Observers, and +TSS Signers. Fees from transactions and rewards are distributed to Validators in +return for their service of processing transactions and keeping the network +secure. + +> _Note: in general, Observers and TSS Signers are technically separate but will +> be batched together for operators such that an operator is either running a +> Core Validator or an Observer-Signer Validator. Core Validator u prerequisite +> to being an Observer-Signer (Observer-Signers will run all 3 roles, +> technically). Observer-Signers receive 25% of block rewards and Core +> Validators receive the other 75%. At launch, it is planned such that the top +> 100 Core Validators on total stake will be eligible to participate in +> consensus. 9 validators will comprise the initial Observer-Signer set. These +> numbers will increase over time further the decentralization of the network._ + +Here we define the different functions of validators and their allocation of the +validator block incentives. **Core Validators (75%)** -These provide consensus for ZetaCore (ZetaChain’s base blockchain). These will support general PoS mechanics and delegation from users. Anyone will be able to run a validator to earn rewards by securing the network. Users may delegate stake to any existing operator, or run their own validator. +These provide consensus for ZetaCore (ZetaChain’s base blockchain). These will +support general PoS mechanics and delegation from users. Anyone will be able to +run a validator to earn rewards by securing the network. Users may delegate +stake to any existing operator, or run their own validator. **Observer Validators (12.5%)** -These observe external chains and send relevant events to the Core Validators. Observation will eventually become less important with further verification/proof development, so the portion of rewards allocated to Observers will eventually transition more to TSS Signers via governance-based upgrades. +These observe connected chains and send relevant events to the Core Validators. +Observation will eventually become less important with further +verification/proof development, so the portion of rewards allocated to Observers +will eventually transition more to TSS Signers via governance-based upgrades. **TSS Signer Validators (12.5%)** -When ZetaChain wants to write receiving info from Core Validators transactions to different chains, it uses a network of TSS Signers to write in a decentralized manner. +When ZetaChain wants to write receiving info from Core Validators transactions +to different chains, it uses a network of TSS Signers to write in a +decentralized manner. ## Validator block rewards -The initial 10% total supply pool of validator incentives are programmed to distribute over the first 4 years after the launch of the network. Emissions are fixed based on time/block. Validators earn emissions based on this curve and their securing the network. +The initial 10% total supply pool of validator incentives are programmed to +distribute over the first 4 years after the launch of the network. Emissions are +fixed based on time/block. Validators earn emissions based on this curve and +their securing the network. -As this initial genesis pool tends lower, the protocol will introduce a planned 2.5% inflation through validator rewards separate from the emission curve at a certain block height. This inflation rate, at this shift, will replace the existing rate of validator emissions. Beyond this time, the inflation rate will be introduced and adjustable by the network via governance. +As this initial genesis pool tends lower, the protocol will introduce a planned +2.5% inflation through validator rewards separate from the emission curve at a +certain block height. This inflation rate, at this shift, will replace the +existing rate of validator emissions. Beyond this time, the inflation rate will +be introduced and adjustable by the network via governance. -In addition, there is a factor of the bonded ratio and a target bonded ratio that is bounded. If the bonded ratio goes over the target, the emissions will reduce, and if the bonded ratio goes lower, the emissions will increase, helping incentivize more or less staking/bonding over time. However, the core emission curve and pool remains the same. +In addition, there is a factor of the bonded ratio and a target bonded ratio +that is bounded. If the bonded ratio goes over the target, the emissions will +reduce, and if the bonded ratio goes lower, the emissions will increase, helping +incentivize more or less staking/bonding over time. However, the core emission +curve and pool remains the same. ## Unlock Period -Any stake has an unlock period of 21 days. Rewards are allocated to delegators/stakers, but to withdraw them, one must wait 21 days to receive them. +Any stake has an unlock period of 21 days. Rewards are allocated to +delegators/stakers, but to withdraw them, one must wait 21 days to receive them. ## Slashing -To ensure network liveness and safety, deviation from the protocol by the validators will be penalized by slashing their bonded ZETA. This could include standard Cosmos SDK defined slash-able violations such as missed votes on blocks, conflicting votes on blocks, etc., for core validators. Besides that, for observer-signer validators, additional behaviors will be penalized by slashing the accompanying core validator staked ZETA. Such behaviors may include repeatedly failing to observe relevant external events, reporting incorrect events, failing to join the TSS keygen or keysign party, etc. +To ensure network liveness and safety, deviation from the protocol by the +validators will be penalized by slashing their bonded ZETA. This could include +standard Cosmos SDK defined slash-able violations such as missed votes on +blocks, conflicting votes on blocks, etc., for core validators. Besides that, +for observer-signer validators, additional behaviors will be penalized by +slashing the accompanying core validator staked ZETA. Such behaviors may include +repeatedly failing to observe relevant external events, reporting incorrect +events, failing to join the TSS keygen or keysign party, etc. diff --git a/src/pages/developers/_meta.json b/src/pages/developers/_meta.json index b4fda54a..693405bf 100644 --- a/src/pages/developers/_meta.json +++ b/src/pages/developers/_meta.json @@ -1,29 +1,34 @@ { "index": { "title": "Build", - "description": "Start building on ZetaChain, the only decentralized blockchain and smart contract platform built for omnichain interoperability." + "description": "Begin your journey on ZetaChain, the decentralized blockchain and smart contract platform designed for omnichain interoperability." }, "apps": { "title": "Building Universal Apps", - "description": "Dive into the basics of building on ZetaChain" + "description": "Explore the basics of developing on ZetaChain." }, "evm": { "title": "Universal EVM", - "description": "EVM enhanced with omnichain interoperability features, enabling the development of robust universal apps" + "description": "EVM enhanced with omnichain interoperability features, enabling the development of robust universal apps." }, "tutorials": { - "title": "Tutorials" + "title": "Tutorials", + "description": "Step-by-step guides to help you master building on ZetaChain." + }, + "frontend": { + "title": "Frontend Tutorials", + "description": "Build powerful universal web applications with ZetaChain." }, "services": { - "title": "Apps and Services" + "title": "Apps & Services", + "description": "Discover useful developer-focused applications and services to enhance your development process on ZetaChain." }, "tokens": { - "title": "Working with Tokens" - }, - "cli": { - "title": "Using ZetaChain's CLI" + "title": "Working with Tokens", + "description": "Overview of the different types of tokens available on ZetaChain and connected blockchains, and how to work with them." }, "architecture": { - "title": "Architecture" + "title": "Architecture", + "description": "Take an in-depth look into the inner workings and technical architecture of the ZetaChain protocol." } } \ No newline at end of file diff --git a/src/pages/developers/apps/_meta.json b/src/pages/developers/apps/_meta.json index 468074e1..b856063f 100644 --- a/src/pages/developers/apps/_meta.json +++ b/src/pages/developers/apps/_meta.json @@ -2,9 +2,5 @@ "intro": { "title": "Universal App Basics", "description": "What is a universal app and what makes it different" - }, - "interacting": { - "title": "Interacting with a Universal App", - "description": "Making contract calls, sending and withdrawing tokens, and general message passing" } } \ No newline at end of file diff --git a/src/pages/developers/apps/interacting.mdx b/src/pages/developers/apps/interacting.mdx deleted file mode 100644 index fad6f0f1..00000000 --- a/src/pages/developers/apps/interacting.mdx +++ /dev/null @@ -1,177 +0,0 @@ ---- -title: Interacting with a Universal App ---- - -import { Alert } from "~/components/shared"; - -## Calling a Universal App - -To call a universal app and transfer native gas tokens from a connected chain, a -user makes a token transfer transaction to a special address called TSS. - -```mermaid -flowchart LR - subgraph Ethereum ["Ethereum (or other EVM chain)"] - direction LR - User("User") - TSS("TSS Address") - User -- "ETH and message" --> TSS - end - subgraph Bitcoin ["Bitcoin"] - userBTC("User") - TSSBTC("TSS Address") - userBTC -- BTC and message --> TSSBTC - end - subgraph ZetaChain - systemContract("System Contract") - subgraph universalApp ["Universal App"] - onCrossChainCall("onCrossChainCall") - end - TSS --> systemContract - TSSBTC --> systemContract - systemContract --> universalApp - end -``` - -To call a universal app and transfer supported ERC-20 tokens from a connected -chain, a user calls the `deposit` method of the ERC-20 custody contract. - -```mermaid -flowchart LR - subgraph Ethereum ["Ethereum (or other EVM chain)"] - direction LR - User("User") - erc20Custody("ERC-20 Custody") - User -- "ERC-20 and message" --> erc20Custody - end - subgraph ZetaChain - systemContract("System Contract") - subgraph universalApp ["Universal App"] - onCrossChainCall("onCrossChainCall") - end - erc20Custody --> systemContract - systemContract --> universalApp - end -``` - -Calling a universal app executes the `onCrossChainCall` method. - -The message is passed as the `bytes calldata message` argument and can contain -arbitrary data. - -Native gas or supported ERC-20 tokens get locked in the TSS address or ERC-20 -custody contract on connected chain. `onCrossChainCall` receives representations -of these tokens called [ZRC-20](/developers/tokens/zrc20). For example, if you -make a call with 1 ETH on Ethereum, a universal app will receive 1 ZRC-20 ETH. - -Advantages: - -- Bitcoin support -- Sending messages to a TSS address is cheaper than general message passing -- Does not require deploying contracts on connected chains. For example, a user - on Ethereum can call a universal app by sending ETH and a message to a TSS - address. - -Limitations: - -- ERC-20 custody contract accepts only supported tokens. -- Messages can only be sent to universal apps, not from them. - -## Withdrawing ZRC-20 Tokens - -Native gas and tokens ERC-20 tokens transferred to a universal app are -represented as ZRC-20 tokens. ZRC-20 extends ERC-20 with a `withdraw` method. - -```mermaid -flowchart LR - subgraph ZetaChain - User - ZRC20("ZRC-20") - end - subgraph Ethereum ["Connected chain"] - TSS - erc20Custody("ERC-20 Custody") - Recipient1("Recipient") - Recipient2("Recipient") - end - User -- withdraw --> ZRC20 - ZRC20 --> TSS --> Recipient1 - ZRC20 --> erc20Custody --> Recipient2 -``` - -Call the `withdraw` method to send ZRC-20 tokens back to the chain from which -they originate. The withdrawer must have sufficient tokens to cover the -[withdraw fee](/developers/evm/gas). - -## Sending Messages to/from a Universal App - -To send a message to or from a universal app you can also use a connector API. -Connector is an API that offers two features: - -- General message passing to and from universal apps -- Transfer of ZETA tokens to and from universal apps - -```mermaid -flowchart LR - subgraph ZetaChain ["ZetaChain"] - direction LR - subgraph universalApp ["Universal App"] - onZetaMessage("onZetaMessage") - end - connector("Connector") - universalApp -- "ZETA and message" --> connector - end - subgraph connectedChain ["Connected chain"] - TSS - Contract("Contract") - connector --> TSS - TSS --> Contract - end -``` - -```mermaid -flowchart LR - subgraph connectedChain ["Connected chain"] - direction LR - Contract("Contract") - connector("Connector") - Contract -- "ZETA and message" --> connector - end - subgraph ZetaChain ["ZetaChain"] - systemContract("System Contract") - subgraph universalApp ["Universal App"] - onZetaMessage("onZetaMessage") - end - connector --> systemContract - systemContract --> universalApp - end -``` - -Advantages: - -- Messages can be sent to and from universal apps -- Messages can be sent between messaging contracts on connected chains. For - example, a messaging contract on Ethereum can send a message to a contract on - BNB chain. - -Limitations: - -- Contracts need to be deployed on connected chains to receive and send messages - -## Summary - -- Universal apps are contracts deployed on ZetaChain's EVM that can accept - contract calls, messages and token transfers from connected chains. -- Universal apps can contract calls, and make token transfers on connected - chains. -- A universal app can be implemented as a single contract on ZetaChain. You - don't need to have contracts on all connected chains. -- You can use the connector API for general message passing to and from - universal apps. - -## Hands-on Practice - -Eager to start building universal apps? πŸ™Œ - -Jump directly into the tutorials section, and [create your first universal -app](/developers/tutorials/hello). diff --git a/src/pages/developers/apps/intro.mdx b/src/pages/developers/apps/intro.mdx index 74836379..9b83b779 100644 --- a/src/pages/developers/apps/intro.mdx +++ b/src/pages/developers/apps/intro.mdx @@ -31,7 +31,7 @@ pragma solidity 0.8.7; import "@zetachain/protocol-contracts/contracts/zevm/interfaces/zContract.sol"; -contract YourContract is zContract { +contract UniversalApp is zContract { function onCrossChainCall( zContext calldata context, address zrc20, @@ -43,17 +43,111 @@ contract YourContract is zContract { } ``` -It’s implemented in Solidity and uses ZetaChain's universal EVM features (like -`onCrossChainCall`) to handle calls from connected chains. +## Calling Universal Apps - - For a quick hands-on introduction to building omnichain apps check out "[Your First Universal - App](/developers/tutorials/hello)" tutorial. +Users can call universal apps by interacting with a **Gateway contract** on a +connected chain. Each connected chain has a single Gateway contract that exposes +methods to deposit tokens to and call universal apps. Users can pass both data +and tokens when calling universal apps. + + + {" "} + Gateway is an upcoming unified interface that will replace the TSS address and ERC-20 custody contract. Gateway is scheduled + for release towards the end of Q3 2024.{" "} -One of the key advantages of a universal app is that it requires deploying only -a single contract on ZetaChain, eliminating the need for separate contracts on -each connected chain. This reduces development time, lowers deployment costs, -and minimizes the potential for errors. You can focus on creating robust, -feature-rich applications without worrying about the complexities of managing -multiple contracts across different blockchains. +In this example an Ethereum user sends 1 ETH and a message "hello" to a +universal app: + + + +A call to a universal app triggers an `onCrossChainCall` method. + +A universal app receives: + +- a message (in this example, `"hello"`) containing arbitrary data. A message + can include recipient address, a token address, properties of an NFT to be + minted, etc. +- tokens represented as ZRC-20 (in this example, 1 ZRC-20 ETH). + +Each native gas and supported ERC-20 token from connected chains has a +corresponding ZRC-20 token on ZetaChain. ZRC-20 tokens are ERC-20-compatible and +can be permissionlessly transferred back (withdrawn) to their original chain +(ZRC-20 ETH on ZetaChain becomes ETH on Ethereum). + +`onCrossChainCall` also has access to additional context information such as the +original sender address and chain ID. + +Universal apps can also initiate token transfers and contract calls to connected +chains. + +In this example a universal app: + +- accepts 6 ETH and "I want BNB" (bytes that represent the destination token) + from Ethereum +- swaps 6 ZRC-20 ETH for ZRC-20 BNB using a decentralized exchange on ZetaChain +- calls the Gateway contract to withdraw ZRC-20 BNB and call a contract on the + BNB chain + +Of course, a single universal app call can trigger more than one call to +different chains. + + + +With a universal app a complex sequence of transactions and value transfers that +span multiple blockchains can be triggered by a single user-signed transaction. + +## Bitcoin Support + +Universal apps are fully-compatible with Bitcoin. The same universal app +contract can receive calls from any connected chain. + +Users can call universal apps from the Bitcoin network by sending BTC and data +to the **Gateway address**. To make a call to a universal app a Bitcoin user +only needs to sign a single transaction using their wallet of choice. Universal +apps offer gas abstraction, so end-user are not required to have an account on +chains other than Bitcoin or acquire gas tokens. + +## Gas Abstraction + +Incoming calls to universal apps from connected chains do not incur additional +gas costs aside from the initial interaction with the Gateway contract. + +Outgoing calls from universal apps (like contract calls and token withdrawals) +to connected chains require gas. Universal EVM offers tools to query gas, and +it's up to each universal app to make sure that the contract has the right +amount of ZRC-20 gas token to cover the gas fees. + +In practice it means that a universal app would swap a fraction of the incoming +ZRC-20 token to the ZRC-20 of the gas token of the chain to which an outgoing +call is made. When an outgoing call or withdrawal is made, a required amount of +ZRC-20 gas token is deducted to cover the gas fees on the destination chain. + +For end user this system abstracts away the complexities of cross-chain gas. As +long as the user provides a sufficient amount as input (in the token of their +choosing), the gas fees will be covered. + +## Summary + +- Universal apps: + - can receive contract calls and tokens from users and contracts on connected + chains + - can trigger contract calls and token transfers to connected chains + - can automatically handle gas for cross-chain transactions + - are fully compatible with EVM chains (like Ethereum and BNB), Bitcoin. + Support for Polygon, Solana, Cosmos (through IBC) and other chains is coming + soon. +- Native gas and supported ERC-20 tokens are represented as ZRC-20 tokens. A + ZRC-20 token can be permissionlessly withdrawn back to its original chain. diff --git a/src/pages/developers/architecture/_meta.json b/src/pages/developers/architecture/_meta.json index 8e0effbd..f473e019 100644 --- a/src/pages/developers/architecture/_meta.json +++ b/src/pages/developers/architecture/_meta.json @@ -1,9 +1,30 @@ { - "overview": "Architecture", - "observers": "Observer-Signer Validators", - "privileged": "Privileged Actions", - "rewards": "Staking Rewards", - "whitelisting": "Whitelisting ERC-20", - "modules": "Modules", - "zetacored": "Zetacore Daemon" -} + "overview": { + "title": "Architecture", + "description": "Overview of the architecture of ZetaChain" + }, + "observers": { + "title": "Observer-Signer Validators", + "description": "List of currently active observer-signer validators" + }, + "privileged": { + "title": "Privileged Actions", + "description": "Administrative actions that can only be executed by dedicated groups" + }, + "rewards": { + "title": "Staking Rewards", + "description": "How staking rewards are calculated" + }, + "whitelisting": { + "title": "Whitelisting ERC-20", + "description": "How to whitelist an ERC-20 as a supported ZRC-20" + }, + "modules": { + "title": "Modules", + "description": "ZetaChain's Cosmos SDK modules" + }, + "zetacored": { + "title": "ZetaChain Node CLI", + "description": "Command-line interface of the ZetaChain node binary" + } +} \ No newline at end of file diff --git a/src/pages/developers/architecture/modules/crosschain/messages.mdx b/src/pages/developers/architecture/modules/crosschain/messages.mdx index 9e482472..4a027e2d 100644 --- a/src/pages/developers/architecture/modules/crosschain/messages.mdx +++ b/src/pages/developers/architecture/modules/crosschain/messages.mdx @@ -4,9 +4,10 @@ title: Messages ## MsgAddToOutTxTracker -AddToOutTxTracker adds a new record to the outbound transaction tracker. -only the admin policy account and the observer validators are authorized to broadcast this message without proof. -If no pending cctx is found, the tracker is removed, if there is an existed tracker with the nonce & chainID. +AddToOutTxTracker adds a new record to the outbound transaction tracker. only +the admin policy account and the observer validators are authorized to broadcast +this message without proof. If no pending cctx is found, the tracker is removed, +if there is an existed tracker with the nonce & chainID. Authorized: admin policy group 1, observer. @@ -42,7 +43,8 @@ message MsgAddToInTxTracker { ## MsgRemoveFromOutTxTracker -RemoveFromOutTxTracker removes a record from the outbound transaction tracker by chain ID and nonce. +RemoveFromOutTxTracker removes a record from the outbound transaction tracker by +chain ID and nonce. Authorized: admin policy group 1. @@ -56,9 +58,9 @@ message MsgRemoveFromOutTxTracker { ## MsgGasPriceVoter -GasPriceVoter submits information about the connected chain's gas price at a specific block -height. Gas price submitted by each validator is recorded separately and a -median index is updated. +GasPriceVoter submits information about the connected chain's gas price at a +specific block height. Gas price submitted by each validator is recorded +separately and a median index is updated. Only observer validators are authorized to broadcast this message. @@ -74,26 +76,23 @@ message MsgGasPriceVoter { ## MsgVoteOnObservedOutboundTx -VoteOnObservedOutboundTx casts a vote on an outbound transaction observed on a connected chain (after -it has been broadcasted to and finalized on a connected chain). If this is -the first vote, a new ballot is created. When a threshold of votes is -reached, the ballot is finalized. When a ballot is finalized, the outbound -transaction is processed. +VoteOnObservedOutboundTx casts a vote on an outbound transaction observed on a +connected chain (after it has been broadcasted to and finalized on a connected +chain). If this is the first vote, a new ballot is created. When a threshold of +votes is reached, the ballot is finalized. When a ballot is finalized, the +outbound transaction is processed. -If the observation is successful, the difference between zeta burned -and minted is minted by the bank module and deposited into the module -account. +If the observation is successful, the difference between zeta burned and minted +is minted by the bank module and deposited into the module account. -If the observation is unsuccessful, the logic depends on the previous -status. +If the observation is unsuccessful, the logic depends on the previous status. If the previous status was `PendingOutbound`, a new revert transaction is created. To cover the revert transaction fee, the required amount of tokens submitted with the CCTX are swapped using a Uniswap V2 contract instance on -ZetaChain for the ZRC20 of the gas token of the receiver chain. The ZRC20 -tokens are then -burned. The nonce is updated. If everything is successful, the CCTX status is -changed to `PendingRevert`. +ZetaChain for the ZRC20 of the gas token of the receiver chain. The ZRC20 tokens +are then burned. The nonce is updated. If everything is successful, the CCTX +status is changed to `PendingRevert`. If the previous status was `PendingRevert`, the CCTX is aborted. @@ -135,28 +134,28 @@ message MsgVoteOnObservedOutboundTx { ## MsgVoteOnObservedInboundTx -VoteOnObservedInboundTx casts a vote on an inbound transaction observed on a connected chain. If this -is the first vote, a new ballot is created. When a threshold of votes is -reached, the ballot is finalized. When a ballot is finalized, a new CCTX is -created. - -If the receiver chain is ZetaChain, `HandleEVMDeposit` is called. If the -tokens being deposited are ZETA, `MintZetaToEVMAccount` is called and the -tokens are minted to the receiver account on ZetaChain. If the tokens being -deposited are gas tokens or ERC20 of a connected chain, ZRC20's `deposit` -method is called and the tokens are deposited to the receiver account on -ZetaChain. If the message is not empty, system contract's `depositAndCall` -method is also called and an omnichain contract on ZetaChain is executed. -Omnichain contract address and arguments are passed as part of the message. -If everything is successful, the CCTX status is changed to `OutboundMined`. +VoteOnObservedInboundTx casts a vote on an inbound transaction observed on a +connected chain. If this is the first vote, a new ballot is created. When a +threshold of votes is reached, the ballot is finalized. When a ballot is +finalized, a new CCTX is created. + +If the receiver chain is ZetaChain, `HandleEVMDeposit` is called. If the tokens +being deposited are ZETA, `MintZetaToEVMAccount` is called and the tokens are +minted to the receiver account on ZetaChain. If the tokens being deposited are +gas tokens or ERC20 of a connected chain, ZRC20's `deposit` method is called and +the tokens are deposited to the receiver account on ZetaChain. If the message is +not empty, system contract's `depositAndCall` method is also called and an +omnichain contract on ZetaChain is executed. Omnichain contract address and +arguments are passed as part of the message. If everything is successful, the +CCTX status is changed to `OutboundMined`. If the receiver chain is a connected chain, the `FinalizeInbound` method is -called to prepare the CCTX to be processed as an outbound transaction. To -cover the outbound transaction fee, the required amount of tokens submitted -with the CCTX are swapped using a Uniswap V2 contract instance on ZetaChain -for the ZRC20 of the gas token of the receiver chain. The ZRC20 tokens are -then burned. The nonce is updated. If everything is successful, the CCTX -status is changed to `PendingOutbound`. +called to prepare the CCTX to be processed as an outbound transaction. To cover +the outbound transaction fee, the required amount of tokens submitted with the +CCTX are swapped using a Uniswap V2 contract instance on ZetaChain for the ZRC20 +of the gas token of the receiver chain. The ZRC20 tokens are then burned. The +nonce is updated. If everything is successful, the CCTX status is changed to +`PendingOutbound`. ```mermaid stateDiagram-v2 @@ -199,7 +198,7 @@ message MsgVoteOnObservedInboundTx { ## MsgWhitelistERC20 WhitelistERC20 deploys a new zrc20, create a foreign coin object for the ERC20 -and emit a crosschain tx to whitelist the ERC20 on the external chain +and emit a crosschain tx to whitelist the ERC20 on the connected chain Authorized: admin policy group 1. @@ -240,14 +239,15 @@ message MsgMigrateTssFunds { ## MsgCreateTSSVoter -CreateTSSVoter votes on creating a TSS key and recording the information about it (public -key, participant and operator addresses, finalized and keygen heights). +CreateTSSVoter votes on creating a TSS key and recording the information about +it (public key, participant and operator addresses, finalized and keygen +heights). -If the vote passes, the information about the TSS key is recorded on chain -and the status of the keygen is set to "success". +If the vote passes, the information about the TSS key is recorded on chain and +the status of the keygen is set to "success". -Fails if the keygen does not exist, the keygen has been already -completed, or the keygen has failed. +Fails if the keygen does not exist, the keygen has been already completed, or +the keygen has failed. Only node accounts are authorized to broadcast this message. @@ -262,8 +262,7 @@ message MsgCreateTSSVoter { ## MsgAbortStuckCCTX -AbortStuckCCTX aborts a stuck CCTX -Authorized: admin policy group 2 +AbortStuckCCTX aborts a stuck CCTX Authorized: admin policy group 2 ```proto message MsgAbortStuckCCTX { @@ -274,11 +273,11 @@ message MsgAbortStuckCCTX { ## MsgRefundAbortedCCTX -RefundAbortedCCTX refunds the aborted CCTX. -It verifies if the CCTX is aborted and not refunded, and if the refund address is valid. -It refunds the amount to the refund address and sets the CCTX as refunded. -Refer to documentation for GetRefundAddress for the refund address logic. -Refer to documentation for GetAbortedAmount for the aborted amount logic. +RefundAbortedCCTX refunds the aborted CCTX. It verifies if the CCTX is aborted +and not refunded, and if the refund address is valid. It refunds the amount to +the refund address and sets the CCTX as refunded. Refer to documentation for +GetRefundAddress for the refund address logic. Refer to documentation for +GetAbortedAmount for the aborted amount logic. ```proto message MsgRefundAbortedCCTX { diff --git a/src/pages/developers/architecture/observers.mdx b/src/pages/developers/architecture/observers.mdx index 1416f231..b8c91d58 100644 --- a/src/pages/developers/architecture/observers.mdx +++ b/src/pages/developers/architecture/observers.mdx @@ -9,14 +9,13 @@ import { Alert } from "~/components/shared"; ZetaChain has two types of validators: core validators and observer-signer validators (observer-signers). - - {" "} - ZetaChain is designed to have two types of validators: observers and signers. Observers monitor activities on connected - chains, while signers handle the signing of transactions from the Threshold Signature Scheme (TSS) address on behalf of - the protocol. However, currently, all observer-signer validators on ZetaChain perform both roles, acting as both observers - and signers. This means each observer-signer validator simultaneously observes transactions on connected chains and participates - in transaction signing.{" "} - +ZetaChain is designed to have two types of validators: observers and signers. +Observers monitor activities on connected chains, while signers handle the +signing of transactions from the Threshold Signature Scheme (TSS) address on +behalf of the protocol. However, currently, all observer-signer validators on +ZetaChain perform both roles, acting as both observers and signers. This means +each observer-signer validator simultaneously observes transactions on +connected chains and participates in transaction signing. Observer-signers are tasked with running nodes of connected chains, observing them with `zetaclient` and writing transactions to connected chains. diff --git a/src/pages/developers/architecture/overview.mdx b/src/pages/developers/architecture/overview.mdx index 108ce45e..2c9b6f3e 100644 --- a/src/pages/developers/architecture/overview.mdx +++ b/src/pages/developers/architecture/overview.mdx @@ -2,76 +2,70 @@ title: Architecture --- -import Image from "next/image"; - -import { basePath } from "~/lib/app.constants"; +import { Alert } from "~/components/shared"; ## Overview At a high level, ZetaChain is a Proof of Stake (PoS) blockchain built on the -Cosmos SDK and Tendermint PBFT consensus engine. As a result, ZetaChain enjoys -fast block time (~5s) and instant finality (no confirmation needed, no -re-organization allowed). The Tendermint PBFT consensus engine has shown to -scale to ~300 nodes in production. With future upgrades with BLS threshold -signatures the number can potentially increase to 1000+. The throughput of -transactions on ZetaChain can potentially reach 100 TPS due to the efficient -Tendermint consensus protocol. +Cosmos SDK and Comet BFT consensus engine. As a result, ZetaChain enjoys fast +block time (~5s) and instant finality (no confirmation needed, no +re-organization allowed). The Comet BFT consensus engine has shown to scale to +~300 nodes in production. With future upgrades with BLS threshold signatures the +number can potentially increase to 1000+. The throughput of transactions on +ZetaChain can potentially reach 100 transactions per second TPS due to the +efficiency of the consensus protocol. The ZetaChain architecture consists of a distributed network of nodes, often referred to as validators. Validators act as decentralized observers that reach -consensus on relevant external state and events, and can also update external -chain state via distributed key signing. ZetaChain accomplishes these functions -in a decentralized (without a single point of failure, trustless, -permissionless), transparent, and efficient way. +consensus on relevant connected chain state and events, and can also +update connected chain state via distributed key signing. ZetaChain accomplishes +these functions in a decentralized (without a single point of failure, +trustless, permissionless), transparent, and efficient way. Contained within each validator is the ZetaCore and ZetaClient. ZetaCore is responsible for producing the blockchain and maintaining the replicated state -machine. ZetaClient is responsible for observing events on external chains and +machine. ZetaClient is responsible for observing events on connected chains and signing outbound transactions. ZetaCore and ZetaClient are bundled together and run by node operators. Anyone can become a node operator to participate in validation provided that enough bonds are staked. -high-level-architecture +![](/img/docs/architecture-1.png) ## Validators -Validators are comprised of 3 different roles: Basic Validators, Observers, and -TSS signer. Fees from transactions and rewards are distributed to Validators in -return for their service of processing transactions and keeping the network -secure. Observers and TSS Signers scale separately from Basic Validators due to -varying security and bond requirements. - -### Basic Validators +Validators are comprised of 2 different roles: Core Validators and +Observer-Signer Validators. Fees from transactions and rewards are distributed +to validators in return for their service of processing transactions and keeping +the network secure. -ZetaChain uses the Tendermint consensus protocol which is a partially -synchronous Byzantine Fault Tolerant (BFT) consensus algorithm. Each validator -node can vote on block proposals with voting power proportional to the staking -coins (ZETA) bonded/delegated. Each validator is identified by its consensus -public key. Validators need to be online all the time, ready to participate in -the constantly growing block production. In exchange for their service, -validators will receive block rewards and transaction fees. +### Core Validators -### Observers +ZetaChain uses the Comet BFT consensus protocol which is a partially synchronous +Byzantine Fault Tolerant (BFT) consensus algorithm. Each validator node can vote +on block proposals with voting power proportional to the staking coins (ZETA), +bonded/delegated. Each validator is identified by its consensus public key. +Validators need to be online all the time, ready to participate in the +constantly growing block production. In exchange for their service, validators +will receive block rewards and transaction fees. -Another set of important participants for ZetaChain consensus are the observers -who reach consensus on external chain events and states. The observers watch -externally connected chains for certain relevant transactions/events/states at -particular addresses via their full nodes of external chains. +### Observer-Signer Validators -### TSS Signers +Another set of important participants for ZetaChain consensus are the +observer-signer validators who reach consensus on connected chain events and +states. The observer-signers watch connected chains for certain relevant +transactions/events/states at particular addresses via their full nodes of +connected chains. ZetaChain collectively holds standard ECDSA/EdDSA keys for authenticated -interaction with external chains. The keys are distributed among multiple -signers in such a way that only a super majority of them can sign on behalf of -the ZetaChain. It’s important to ensure that at no time is any single entity or -small fraction of nodes able to sign messages on behalf of ZetaChain on external -chains. The ZetaChain system uses bonded stakes and positive/negative incentives -to ensure economic safety. +interaction with connected chains. The keys are distributed among multiple +observer-signers in such a way that only a super majority of them can sign on +behalf of the ZetaChain. The ZetaChain system uses bonded stakes and +positive/negative incentives to ensure economic safety. + + + {" "} + It's important to note that at no time is any single entity or small fraction of nodes able to sign messages on behalf + of ZetaChain on connected chains.{" "} + diff --git a/src/pages/developers/architecture/privileged.mdx b/src/pages/developers/architecture/privileged.mdx index b4cd4535..5cec4dae 100644 --- a/src/pages/developers/architecture/privileged.mdx +++ b/src/pages/developers/architecture/privileged.mdx @@ -39,11 +39,12 @@ To learn which policy accounts can send which privileged messages, check the module documentation and look for "Authorized" notice next to each message. - You may notice that policy accounts below are called "Group1" and "Group2". These are just names that indicate the - level of permissions and are not related to the actual groups associated with policy accounts. As you can see in - testnet there are two entries ("Group1" and "Group2") and both point to the same policy account. This means that right - now even though there are two levels of permissions ("Group1" and "Group2") there is only one policy account that is - authorized to perform privileged actions. On mainnet this might change. + {" "} + Notice that policy accounts below are called "Group1" and "Group2". These are just names that indicate the level of permissions + and are not related to the actual groups associated with policy accounts. As you can see in testnet there are two entries + ("Group1" and "Group2") and both point to the same policy account. This means that right now even though there are two + levels of permissions ("Group1" and "Group2") there is only one policy account that is authorized to perform privileged + actions. On mainnet this might change.{" "} diff --git a/src/pages/developers/architecture/rewards.mdx b/src/pages/developers/architecture/rewards.mdx index 7fe5a28c..7e0c2d39 100644 --- a/src/pages/developers/architecture/rewards.mdx +++ b/src/pages/developers/architecture/rewards.mdx @@ -15,8 +15,8 @@ Currently, staking rewards are comprised of transaction fees collected each block and fixed rewards coming from the emissions pool. $$ -StakingRewards = TransactionFees + {EmissionsPool \over NumberOfBlocksPerYear Γ— -4} Γ— ValidatorRewardsPercentage +StakingRewards = TransactionFees + {EmissionsPool \over NumberOfBlocksPerYear +Γ— 4} Γ— ValidatorRewardsPercentage $$ Emissions pool address: @@ -29,5 +29,5 @@ https://zetachain.blockpi.network/lcd/v1/public/cosmos/bank/v1beta1/balances/zet - The emission pool is currently funded manually - Currently, there is no inflation in the network -Learn more about the tokenomics in the -[ZETA Token Utility](/about/token-utility/distribution) section of the docs. +Learn more about the tokenomics in the [ZETA Token +Utility](/about/token-utility/distribution) section of the docs. diff --git a/src/pages/developers/architecture/whitelisting.mdx b/src/pages/developers/architecture/whitelisting.mdx index 406972e3..cff4ce27 100644 --- a/src/pages/developers/architecture/whitelisting.mdx +++ b/src/pages/developers/architecture/whitelisting.mdx @@ -20,8 +20,8 @@ be proposed through governance. ## Background The `zetacored` state maintains a list of whitelisted foreign fungible assets, -including ERC20 tokens on external chains in the `foreign_coins` construct. Each -of the `foreign_coin` is manageable by a ZRC20 contract on Zeta EVM. +including ERC20 tokens on connected chains in the `foreign_coins` construct. +Each of the `foreign_coin` is manageable by a ZRC20 contract on Zeta EVM. By default all native gas assets on connected chains will be whitelisted. Other fungible tokens need to be whitelisted. @@ -72,7 +72,7 @@ the following procedure: 2. Add an entry to the state variable viewable at `{IP}:1317/zeta-chain/fungible/foreign_coins`; 3. Whitelist the ERC20 contract address on the `ERC20Custody` contract on that - external chain; + connected chain; After these steps are done, the ERC20 whitelisting is finished. Liquidity for the given asset should promptly begin deposits in order to provide a smooth diff --git a/src/pages/developers/evm/_meta.json b/src/pages/developers/evm/_meta.json index 609d2a84..a7299c57 100644 --- a/src/pages/developers/evm/_meta.json +++ b/src/pages/developers/evm/_meta.json @@ -18,5 +18,9 @@ "addresses": { "title": "Account Addresses", "description": "Learn about types of account address, how to use and convert between them" + }, + "throughput": { + "title": "Liquidity Throughput", + "description": "Liquidity caps on tokens and rate limiting" } } \ No newline at end of file diff --git a/src/pages/developers/evm/bitcoin.mdx b/src/pages/developers/evm/bitcoin.mdx index 0c79c6b3..c3c4ff9e 100644 --- a/src/pages/developers/evm/bitcoin.mdx +++ b/src/pages/developers/evm/bitcoin.mdx @@ -67,8 +67,8 @@ and not recoverable. In summary, a ZetaChain's EVM BTC transaction would look like this: 1. A user sends 1 BTC on Bitcoin network to the Bitcoin [TSS - address](/reference/contracts) , adding a memo (via `OP_RETURN`) in the tx - saying (colloquially) β€œdeposit to 0x1337”. + address](/reference/network/contracts) , adding a memo (via `OP_RETURN`) in + the tx saying (colloquially) β€œdeposit to 0x1337”. 2. Upon receiving this tx, the ZetaCore state machine calls the deposit (0x1337, 1e8) to mint and credit 0x1337 with 1 zBTC minus fees. 3. If 0x1337 is an Externally Owned Account (EOA), that's it. If it’s a diff --git a/src/pages/developers/evm/connector.mdx b/src/pages/developers/evm/connector.mdx deleted file mode 100644 index ffbb1d8f..00000000 --- a/src/pages/developers/evm/connector.mdx +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Connector ---- - -The connector contract enables contracts to send messages of arbitrary data and -ZETA tokens between smart contract-enabled connected chains. - -| Network | Connector contract address | -| ------------ | ------------------------------------------ | -| Testnet | 0x239e96c8f17C85c30100AC26F635Ea15f23E9c67 | -| Mainnet Beta | 0x239e96c8f17C85c30100AC26F635Ea15f23E9c67 | - -To create a contract that uses ZetaChain's connector, use: - -- `connector.send` to send a message -- implement a `onZetaMessage` function to handle incoming messages -- implement a `onZetaRevert` function to handle reverted messages - -You can find in-depth tutorials on how to use connector to send messages in the -"Tutorials" section of the docs: - -- [Connector: Send ZETA](/developers/tutorials/zeta) -- [Connector: Messaging](/developers/tutorials/message) -- [Connector: ERC-20](/developers/tutorials/erc20) -- [Connector: NFTs](/developers/tutorials/connector-nft) - -Please, note that the connector API is separate from the `onCrossChainCall` -functionality. - -A universal app must implement `onCrossChainCall`, but it may also use the -connector API to send and receive messages to and from ZetaChain's Universal -EVM. - -- When sending messages to ZetaChain or native gas or supported ERC-20 tokens, - use `onCrossChainCall`. -- When sending messages from ZetaChain or transferring ZETA, use the connector. diff --git a/src/pages/developers/evm/gas.mdx b/src/pages/developers/evm/gas.mdx index c6facf06..341d52ee 100644 --- a/src/pages/developers/evm/gas.mdx +++ b/src/pages/developers/evm/gas.mdx @@ -16,9 +16,7 @@ that of [Ethermint](https://docs.ethermint.zone/basics/gas.html) and follows Ethereum's EIP 1559 gas fee structure. This system is designed to deter spamming activities on the network. -## Omnichain Contract Fees - -### Deposit +## Deposit When depositing tokens to ZetaChain by sending them to the TSS (Threshold Signature Scheme) address on a connected chain, you will pay the fee in the @@ -29,10 +27,10 @@ be in ETH, comparable to a regular token transfer on the Ethereum network. For more information on Ethereum gas and fees, refer to the [official documentation](https://ethereum.org/en/developers/docs/gas/). -### Withdraw +## Withdraw -When withdrawing ZRC-20 tokens back to a connected external chain, the "withdraw -gas fee" is applicable (listed as "Total fee" in the table below). +When withdrawing ZRC-20 tokens back to a connected connected chain, the +"withdraw gas fee" is applicable (listed as "Total fee" in the table below). To find out the fee amount, call the `withdrawGasFee` function on the [ZRC-20 contract](https://github.com/zeta-chain/protocol-contracts/blob/main/contracts/zevm/ZRC20.sol) @@ -42,7 +40,7 @@ native gas token of the connected chain. The `withdraw` function will deduct this gas fee from your ZRC-20 balance and proceed with the withdrawal to the destination chain. -### Current omnichain fees +## Current omnichain fees In the table below you can see the current fees. The fees are defined in native gas tokens on the destination chain (the chain to which ZRC-20 tokens are @@ -57,140 +55,3 @@ command in the smart-contract ``` npx hardhat fees ``` - -## Cross-Chain Messaging Fees - -To send data and value across chains through ZetaChain, users (wallets, -contracts) must pay fees. These fees are paid by sending ZETA (along with the -message data) on a connected chain to a Connector contract. This ZETA is used to -compensate validators, stakers, and ecosystem pools, as well as to cover the gas -fees on the destination chain. For users, this process is simplified into a -single transaction. - -When sending a cross-chain message, you incur two types of fees: - -- Outbound Gas Fee: This fee is calculated dynamically based on the gas prices - for the destination chain, the gas limit provided by the user, and the token - prices in the liquidity pools on ZetaChain. -- Protocol Fee: This is a fixed value defined in the ZetaChain source code. - -### Current Cross-Chain Messaging Fees - -The table below shows the current cross-chain messaging fees, defined in ZETA -tokens. These fees are calculated for the destination chain (the chain to which -the message is sent) with a gas limit of 500,000. - - - -To calculate fees for a different gas limit, use the fees command in the -smart-contract [template](https://github.com/zeta-chain/template): - -``` -npx hardhat fees -``` - -### Different Approaches to Paying the Fees - -When you write a smart contract that uses cross chain messages this contract -needs to pay fees in ZETA for every cross chain transaction. There are several -ways to handle this. - -#### Sending ZETA to the Connector - -In your cross-chain messaging contract approve `zetaValueAndGas` amount of ZETA -tokens to the connector and then transfer them to the connector contract. - -The main disadvantage with this approach is that the user must approve your -contract before and they have to have enough ZETA in his wallet. - -```solidity -function sendMessage(uint256 destinationChainId, bytes calldata destinationAddress, uint256 zetaValueAndGas) external { - if (zetaValueAndGas == 0) revert InvalidZetaValueAndGas(); - - bool success1 = ZetaEth(zetaToken).approve(address(connector), zetaValueAndGas); - bool success2 = ZetaEth(zetaToken).transferFrom(msg.sender, address(this), zetaValueAndGas); - if (!(success1 && success2)) revert ErrorTransferringZeta(); - - connector.send( - ZetaInterfaces.SendInput({ - destinationChainId: destinationChainId, - destinationAddress: destinationAddress, - destinationGasLimit: 300000, - message: abi.encode(), - zetaValueAndGas: zetaValueAndGas, - zetaParams: abi.encode("") - }) - ); -} -``` - -#### Pay With ZETA From the Contract - -You can add ZETA tokens to the contract and the contract will use these tokens -when sending cross chain messages. - -This is easier for end-users, because they don't have to think about using ZETA -tokens, but it’s more complex for the contract developer because they have to -ensure that the contract has enough ZETA tokens. - -```solidity -function sendMessage(uint256 destinationChainId, bytes calldata destinationAddress) external { - bool success1 = ZetaEth(zetaToken).approve(address(connector), ZETA_GAS); - if (!success1) revert ErrorApprovingZeta(); - - connector.send( - ZetaInterfaces.SendInput({ - destinationChainId: destinationChainId, - destinationAddress: destinationAddress, - destinationGasLimit: 300000, - message: abi.encode(), - zetaValueAndGas: ZETA_GAS, - zetaParams: abi.encode("") - }) - ); -} -``` - -#### Pay With Any Token and Swap to ZETA - -Your contract can accept any token and swap it to ZETA internally. - -This approach is more complex, because you need to add a swap logic to your -contract and take market price fluctuations into account. But it’s more -convenient for end-users, because they can use any token to pay for cross chain -messages without even knowing that ZETA is being used under the hood. - -To make it eaier you can use ZetaConsumer's `getZetaFromEth` to swap any token -to ZETA. - -```solidity -function sendMessage(uint256 destinationChainId, bytes calldata destinationAddress) external payable{ - uint256 crossChainGas = 2 * (10 ** 18); - uint256 zetaValueAndGas = _zetaConsumer.getZetaFromEth{value: msg.value}(address(this), crossChainGas); - bool success1 = ZetaEth(zetaToken).approve(address(connector), zetaValueAndGas); - if (!success1) revert ErrorApprovingZeta(); - - connector.send( - ZetaInterfaces.SendInput({ - destinationChainId: destinationChainId, - destinationAddress: destinationAddress, - destinationGasLimit: 300000, - message: abi.encode(), - zetaValueAndGas: zetaValueAndGas, - zetaParams: abi.encode("") - }) - ); -} -``` - -[ZetaTokenConsumer](https://github.com/zeta-chain/protocol-contracts/blob/main/contracts/evm/interfaces/ZetaInterfaces.sol) -is an interface with several implementations that handles all the logic you need -to swap ZETA from/to another token. Right now we have three implementations -([Uniswap -V2](https://github.com/zeta-chain/protocol-contracts/blob/main/contracts/evm/tools/ZetaTokenConsumerUniV2.strategy.sol), -[Uniswap -V3](https://github.com/zeta-chain/protocol-contracts/blob/main/contracts/evm/tools/ZetaTokenConsumerUniV3.strategy.sol), -and -[Trident](https://github.com/zeta-chain/protocol-contracts/blob/main/contracts/evm/tools/ZetaTokenConsumerTrident.strategy.sol)) -using different DEX. You can include it in your contract and just call the -appropriate method. diff --git a/src/pages/developers/evm/system-contract.mdx b/src/pages/developers/evm/system-contract.mdx index a7915f45..6bbe84a2 100644 --- a/src/pages/developers/evm/system-contract.mdx +++ b/src/pages/developers/evm/system-contract.mdx @@ -26,8 +26,7 @@ Useful values and functions in the system contract: - `gasPriceByChainId`: helper to estimate gas for transactions on connected chains. - `zetaConnectorZEVMAddress`: address of the connector contract. (please, note - that this value is currently empty, but will be set with the actual connector - address in the next protocol upgrade) + that the connector contract will be deprecated in the future) The system contract is inherited from `ZetaChain`, making it easily accessible from your universal app contract: diff --git a/src/pages/developers/evm/throughput.mdx b/src/pages/developers/evm/throughput.mdx new file mode 100644 index 00000000..a5dfed1d --- /dev/null +++ b/src/pages/developers/evm/throughput.mdx @@ -0,0 +1,40 @@ +ZetaChain uses two mechanisms to manage liquidity throughput and ensure secure transactions: + +- Liquidity caps for incoming transactions +- Rate limiting for outgoing transactions + +These mechanisms maintain network stability and reliability, especially during high transaction volumes. By using liquidity caps for incoming transactions and rate limiting for outgoing transactions, ZetaChain controls the flow of tokens into and out of the network. This prevents abuse, safeguards the network from potential liquidity shocks, and ensures the system can handle high transaction loads without compromising performance or security. + +## Incoming Transactions: Liquidity Caps + +For transactions coming into ZetaChain from a connected chain, ZetaChain uses a +mechanism called liquidity caps. Each supported token on ZetaChain has a +predefined maximum amount, or cap, that can be sent to ZetaChain. If the cap is +reached, any further transactions attempting to send more tokens to ZetaChain +will be reverted. Each supported token has its own cap, and transactions +exceeding the cap are reverted. The current liquidity caps for supported tokens +can be accessed through the chain's API: on +[testnet](https://zetachain-athens.blockpi.network/lcd/v1/public/zeta-chain/fungible/foreign_coins) +and [mainnet +beta](https://zetachain.blockpi.network/lcd/v1/public/zeta-chain/fungible/foreign_coins). + +## Outgoing Transactions: Rate Limiter + +For transactions from ZetaChain to a connected chain, ZetaChain employs a rate +limiter mechanism. This mechanism ensures that the total number of tokens +withdrawn within a specified sliding window of ZetaChain blocks does not exceed +a predefined global limit. The rate limiter operates within a sliding window +defined in ZetaChain blocks, and there is a global limit denominated in ZETA +(rate) per block. The total amount of withdrawals for all tokens combined within +a single window cannot exceed the rate multiplied by the number of window +blocks. + +Each ZRC-20 token has a conversion rate to ZETA. For example, if a ZRC-20 token +XYZ has a conversion rate of 2, withdrawing 10 XYZ will be counted as 20 ZETA +towards the limit. The current rate limiter parameters can be accessed through +the rate limiter flags endpoint: on +[testnet](https://zetachain-athens.blockpi.network/lcd/v1/public/zeta-chain/crosschain/rateLimiterFlags) +and [mainnet +beta](https://zetachain.blockpi.network/lcd/v1/public/zeta-chain/crosschain/rateLimiterFlags). + +These mechanisms ensure ZetaChain efficiently manages liquidity, prevents abuse, and maintains network stability during high transaction volumes. diff --git a/src/pages/developers/frontend/_meta.json b/src/pages/developers/frontend/_meta.json new file mode 100644 index 00000000..2d747c67 --- /dev/null +++ b/src/pages/developers/frontend/_meta.json @@ -0,0 +1,8 @@ +{ + "universalkit": { + "title": "UniversalKit", + "description": "A set of ready to use React components that lets you build user interfaces for universal apps on ZetaChain", + "readType": "Beginner", + "readTime": "30 min" + } +} \ No newline at end of file diff --git a/src/pages/developers/frontend/universalkit.mdx b/src/pages/developers/frontend/universalkit.mdx new file mode 100644 index 00000000..27b7b951 --- /dev/null +++ b/src/pages/developers/frontend/universalkit.mdx @@ -0,0 +1,309 @@ +--- +heroImgUrl: /img/pages/universalkit.svg +heroImgWidth: 549 +--- + +import { Alert } from "~/components/shared"; + +# Start Here + +UniversalKit by ZetaChain provides a set of React components designed to make +building universal applications easier. + +The components are expected to work with +[Next.js](https://github.com/vercel/next.js), +[RainbowKit](https://github.com/rainbow-me/rainbowkit/) and +[wagmi](https://github.com/wevm/wagmi). + +Start from a template (recommended): + +``` +git clone https://github.com/zeta-chain/template +cd template/web +yarn +``` + +Or add UniversalKit to your existing app: + +``` +yarn add @zetachain/universalkit +``` + + The component library is in under active development and currently is recommended for testnet use only. + +## UniversalKit Provider + +UniversalKit Provider is a React context provider that initializes and provides +shared state between components. + +To initialize the provider, wrap your application with the +`UniversalKitProvider`: + +```tsx filename="src/app/providers.tsx" +import { UniversalKitProvider } from "@zetachain/universalkit"; + +{children}; +``` + +If you're using the [template](https://github.com/zeta-chain/template), the +provider is already initialized. + +## ZetaChain Client + +ZetaChain Client is a client that provides access to useful methods for +interacting with ZetaChain. The client is powered by the +[Toolkit](https://github.com/zeta-chain/toolkit) library. + +Some of the components require a ZetaChain Client to be passed as a prop. To +initialize the client, use the `useZetaChainClient` hook: + +```tsx filename="src/app/page.tsx" +import { useZetaChainClient } from "@zetachain/universalkit"; + +const client = useZetaChainClient({ network: "testnet", signer }); +``` + +Instantiating a client manually allows you to configure it, for example, +specifying a different RPC endpoint: + +```ts +const client = useZetaChainClient({ + signer, + network: "testnet", + chains: { + zeta_testnet: { + api: [ + { + url: `https://zetachain-athens.g.allthatnode.com/archive/evm/${process.env.KEY}`, + type: "evm", + }, + ], + }, + }, +}); +``` + +## Bitcoin Wallet Provider + +Bitcoin Wallet Provider is a React context provider that initializes and +provides functionality for connecting a Bitcoin wallet to the application: +address of the connected Bitcoin wallet, connection status, connected wallet +type, method to connect a wallet, method to disconnect a wallet, and method to +send a transaction. + +```ts +import { useBitcoinWallet } from "@zetachain/universalkit"; + +const { address, loading, connectedWalletType, connectWallet, disconnect, sendTransaction } = useBitcoinWallet(); +``` + +## Connect Bitcoin + +![](/img/docs/components-connect-bitcoin.png) + +Connect Bitcoin is a component that allows users to connect their Bitcoin wallet +to the application. Currently, OKX, XDEFI and UniSat wallets are supported. + +After a Bitcoin wallet is connected, the current address becomes available from +the `BitcoinWalletProvider`. + +```tsx filename="src/app/page.tsx" +"use client"; + +import { ConnectButton } from "@rainbow-me/rainbowkit"; +import { ConnectBitcoin } from "@zetachain/universalkit"; + +const Page = () => { + return ( +
    +
    + + +
    +
    +
    {/* Add components here */}
    +
    +
    + ); +}; + +export default Page; +``` + +## Swap + +![](/img/docs/components-swap.png) + +The Swap component provides the following functionality: + +- Swap between connected chains (for example, Ethereum and BNB) +- Deposit native gas and supported ERC-20 tokens from a connected chain to + ZetaChain +- Withdraw ZRC-20 tokens from ZetaChain to a connected chain +- Send ZETA between chains +- Transfer native gas and ERC-20 tokens on connected chains + +For cross-chain swaps the component depends on a universal swap contract. +Complete [the swap tutorial](/developers/tutorials/swap-any) and deploy your own contract, or use the contract address from the example below. +contract or use the contract address from the example below. + +```tsx filename="src/app/page.tsx" +"use client"; + +import { ConnectButton } from "@rainbow-me/rainbowkit"; +import { Swap, useEthersSigner, useZetaChainClient, ConnectBitcoin, useBitcoinWallet } from "@zetachain/universalkit"; +import { useAccount, useChainId, useWalletClient } from "wagmi"; + +const contract = "0xb459F14260D1dc6484CE56EB0826be317171e91F"; // universal swap contract + +const Page = () => { + const account = useAccount(); + const chainId = useChainId(); + const { data: walletClient } = useWalletClient({ chainId }); + const signer = useEthersSigner({ walletClient }); + const client = useZetaChainClient({ network: "testnet", signer }); + const { address: bitcoinAddress } = useBitcoinWallet(); + + return ( +
    +
    + + +
    +
    +
    + {client && } +
    +
    +
    + ); +}; + +export default Page; +``` + +## Balances + +![](/img/docs/components-balances.png) + +The Balances component provides a list of token balances on all chains connected +to ZetaChain, with the ability to search the list and filter tokens by chain. + +```tsx filename="src/app/page.tsx" +"use client"; + +import { ConnectButton } from "@rainbow-me/rainbowkit"; +import { + Balances, + useEthersSigner, + useZetaChainClient, + ConnectBitcoin, + useBitcoinWallet, +} from "@zetachain/universalkit"; +import { useAccount, useChainId, useWalletClient } from "wagmi"; + +const Page = () => { + const account = useAccount(); + const chainId = useChainId(); + const { data: walletClient } = useWalletClient({ chainId }); + const signer = useEthersSigner({ walletClient }); + const client = useZetaChainClient({ network: "testnet", signer }); + const { address: bitcoinAddress } = useBitcoinWallet(); + + return ( +
    +
    + + +
    +
    +
    + {client && } +
    +
    +
    + ); +}; + +export default Page; +``` + +## Profile + +![](/img/docs/components-profile.png) + +The Profile component resolves an address to a domain name and displays it as a +button. For resolving addresses the component uses [Space ID Web3 Name +SDK](https://docs.space.id/developer-guide/web3-name-sdk/web3-name-sdk). + +```tsx filename="src/app/page.tsx" +"use client"; + +import { ConnectButton } from "@rainbow-me/rainbowkit"; +import { Profile, ConnectBitcoin } from "@zetachain/universalkit"; +import { useAccount } from "wagmi"; + +const Page = () => { + const account = useAccount(); + return ( +
    +
    + + +
    +
    +
    + +
    +
    +
    + ); +}; + +export default Page; +``` + +## Staking Rewards + +![](/img/docs/components-staking-rewards.png) + +The Staking Rewards component displays the staked amount, number of tokens being +unstaked, and the number of rewards earned. The component also allows users to +claim staking rewards. + +```tsx filename="src/app/page.tsx" +"use client"; + +import { ConnectButton } from "@rainbow-me/rainbowkit"; +import { + StakingRewards, + useEthersSigner, + useZetaChainClient, + ConnectBitcoin, + useBitcoinWallet, +} from "@zetachain/universalkit"; +import { useAccount, useChainId, useWalletClient } from "wagmi"; + +const Page = () => { + const account = useAccount(); + const chainId = useChainId(); + const { data: walletClient } = useWalletClient({ chainId }); + const signer = useEthersSigner({ walletClient }); + const client = useZetaChainClient({ network: "testnet", signer }); + const { address: bitcoinAddress } = useBitcoinWallet(); + + return ( +
    +
    + + +
    +
    +
    {client && }
    +
    +
    + ); +}; + +export default Page; +``` diff --git a/src/pages/developers/reference/_meta.json b/src/pages/developers/reference/_meta.json new file mode 100644 index 00000000..302ef5fd --- /dev/null +++ b/src/pages/developers/reference/_meta.json @@ -0,0 +1,10 @@ +{ + "transactions": { + "title": "Types of Transactions", + "description": "Examples of different kinds of transactions when interacting with universal apps on ZetaChain" + }, + "template": { + "title": "Universal App Template", + "description": "Hardhat-based template for building universal apps" + } +} \ No newline at end of file diff --git a/src/pages/developers/reference/template.mdx b/src/pages/developers/reference/template.mdx deleted file mode 100644 index 2696a579..00000000 --- a/src/pages/developers/reference/template.mdx +++ /dev/null @@ -1,192 +0,0 @@ ---- -title: Universal App Template ---- - -## Overview - -ZetaChain comes with [a smart contract -template](https://github.com/zeta-chain/template) that makes it easy to get -started building dapps. - -``` -git clone https://github.com/zeta-chain/template -``` - -The template uses [Hardhat](https://hardhat.org/) to compile, test, and deploy -contracts. It also imports -[`@zetachain/toolkit`](https://github.com/zeta-chain/toolkit/) that provides a -useful set of utilities for creating contracts, querying balances, tracking -cross-chain transactions, accessing the faucet, and more. The template exposes -most of the features available in the toolkit through Hardhat tasks. - -## Generating a Random Wallet - -To generate a random wallet: - -``` -npx hardhat account --save -``` - -This command generates a random wallet, prints information about the wallet to -the terminal, and saves the private key to a `.env` file to make it accessible -to Hardhat. If you don't want to save the wallet (for example, if you just need -an address to send tokens to for testing purposes), you can run the command -without the `--save` flag. - -If you already have a private key or a mnemonic you want to import, you can use -the `--recover` flag: - -``` -npx hardhat account --save --recover -``` - -The `account` command will prompt you for a private key or a mnemonic, print the -derived addresses and save the private key into the `.env` file. - -The `account` command shows derived addresses in hexacecimal (for EVM-based -chains), bech32 with `zeta` prefix for ZetaChain, and bech32 for Bitcoin. - -## Querying for Token Balances - -To query for token balances: - -``` -npx hardhat balances -``` - -This command queries token balances for the account address derived from the -private key specified in the `.env`. - -If you need to query for balances as part of a script, you can also use a -`--json` flag to output the balances in JSON format: - -``` -npx hardhat balances --json -``` - -If you want to query for token balances for a different account, you can use the -`--address` flag: - -``` -npx hardhat balances --address ADDRESS -``` - -The `balances` command supports querying for native gas tokens, wrapped ZETA on -all connected chains as well as ZetaChain, ZRC-20 tokens, and BTC on Bitcoin. - -## Requesting Tokens from the Faucet - -To request ZETA tokens from the faucet: - -``` -npx hardhat faucet -``` - -This command requests tokens from the faucet for the account address derived -from the private key specified in the `.env`. Tokens sent to the address on -ZetaChain. - -You can specify a different address to send the tokens to: - -``` -npx hardhat faucet --address ADDRESS -``` - -Alternatively, you can install a standalone faucet CLI: - -``` -yarn global add @zetachain/faucet-cli -``` - -You can then use it with the following command: - -``` -zetafaucet -h -``` - -## Creating an Omnichain Contract - -The template includes a set of commands for generating code for smart contracts -and helper tasks. - -To create a new omnichain contract: - -``` -npx hardhat omnichain MyContract -``` - -This command creates a new omnichain contract in `contracts/MyContract.sol`, a -task to deploy the contract in `tasks/deploy.ts`, and a task to interact with -the contract in `tasks/interact.ts`. - -When an omnichain contract is called, it can receive data in the `data` field of -a transaction. This data is passed to the `message` parameter of the contract's -`onCrossChainCall` function. To specify the fields of the `message` parameter, -use positional arguments: - -``` -npx hardhat omnichain MyContract recepient:address description quantity:uint256 -``` - -A field may have a type specified after the field name, separated by a colon. If -no type is specified, the type defaults to `string`. - -Supported types are: `address`, `bool`, `bytes32`, `string`, -`int`,`int8`,`int16`,`int128`,`int256`,`uint`,`uint8`,`uint16`,`uint128`,`uint256`. - -Learn more about omnichain contracts by following the -[tutorials](/developers/tutorials/hello/). - -## Creating a Cross-Chain Messaging Contract - -To create a new cross-chain messaging contract: - -``` -npx hardhat messaging MyContract -``` - -This command creates a new cross-chain messaging contract in -`contracts/MyContract.sol`, a task to deploy the contract in `tasks/deploy.ts`, -and a task to interact with the contract in `tasks/interact.ts`. - -You can pass additional optional arguments to the `messaging` command to specify -the data that will be sent in the message. - -``` -npx hardhat messaging MyContract token:uint256 sender:address to:address description -``` - -A field may have a type specified after the field name, separated by a colon. If -no type is specified, the type defaults to `string`. - -The list of supported types is the same as for omnichain contracts. - -Learn more about cross-chain messaging by following the -[tutorials](/developers/tutorials/hello). - -## Tracking a Cross-Chain Transaction - -After broadcasting a cross-chain transaction on a connected chain either to a -cross-chain messaging contract or to trigger an omnichain contract, you can -track its status: - -``` -npx hardhat cctx TX_HASH -``` - -## Querying Cross-Chain Fees - -To query cross-chain fees: - -``` -npx hardhat fees -``` - -This command will query the latest omnichain withdrawal fees as well as -cross-chain messaging fees. - -To calculate the fees for a different gas limit use the `--gas` flag: - -``` -npx hardhat fees --gas 300000 -``` diff --git a/src/pages/developers/reference/transactions.mdx b/src/pages/developers/reference/transactions.mdx index 093fac9e..bfb37d25 100644 --- a/src/pages/developers/reference/transactions.mdx +++ b/src/pages/developers/reference/transactions.mdx @@ -140,7 +140,7 @@ npx hardhat withdraw --amount 1 --zrc20 0xcC683A782f4B30c138787CB5576a86AF66fdc3 https://athens.explorer.zetachain.com/evm/tx/0x540738849a6414809aeb0a9c959e3401b460aeae87c86bc9fd55bd6c1009b014 -## Sending ZETA with the Connector +## Sending ZETA ### βœ… ZETA Between Connected Chains @@ -173,9 +173,3 @@ npx hardhat send-zeta --amount 3 --network zeta_testnet --destination mumbai_tes ``` https://athens.explorer.zetachain.com/cc/tx/0xa28ff75a237afcdc3a5ee7a8c79a4e813e899ab6d9b0c22d20e5cdf10e028a6a - -## Sending Messages with the Connector - -### βœ… Cross-chain messaging - -https://goerli.etherscan.io/tx/0x681173b17e4ddc557d496114601845edf4666087027e77f33df7bffe4954619f diff --git a/src/pages/developers/services/_meta.json b/src/pages/developers/services/_meta.json index 6b687757..46b53e14 100644 --- a/src/pages/developers/services/_meta.json +++ b/src/pages/developers/services/_meta.json @@ -1,4 +1,8 @@ { + "alchemy": { + "title": "Alchemy", + "description": "Node API and Subgraphs" + }, "goldsky": { "title": "Goldsky", "description": "Subgraph indexer" @@ -14,5 +18,9 @@ "envio": { "title": "Envio", "description": "Real-time data indexer" + }, + "subquery": { + "title": "SubQuery", + "description": "Open-source, flexible, multi-chain data indexer" } } \ No newline at end of file diff --git a/src/pages/developers/services/alchemy.mdx b/src/pages/developers/services/alchemy.mdx new file mode 100644 index 00000000..84f74cc6 --- /dev/null +++ b/src/pages/developers/services/alchemy.mdx @@ -0,0 +1,115 @@ +# Alchemy + +Alchemy is a blockchain development platform that provides tools and +infrastructure to build and scale decentralized applications. As a +developer-focused platform, Alchemy helps companies create scalable and reliable +dApps without the difficulty of managing blockchain infrastructure in-house. It +simplifies the development process by offering a suite of APIs and services that +enable developers to interact with blockchain networks efficiently. + +One of Alchemy's standout offerings is the Alchemy Supernode, which provides a +reliable and scalable way to connect and build on the ZetaChain blockchain. This +ensures that developers can focus on innovation and functionality without +worrying about the complexities of node management. + +With Alchemy, developers can access real-time blockchain data, manage smart +contracts, and monitor the performance of their dApps across various +blockchains, making it a versatile choice for building robust, scalable, and +secure blockchain-based applications. + +## Sign Up for an Alchemy Account + +Go to https://auth.alchemy.com/signup and sign up for an Alchemy or sign in with +your existing account. + +![](/img/docs/alchemy-0.png) + +## Create a New ZetaChain Project + +In the Alchemy dashboard you have an overview of all projects currently set up +in your account. + +Click "Create new app" to name your project and give it a description. + +![](/img/docs/alchemy-1.png) + +![](/img/docs/alchemy-1.5.png) + +All apps on Alchemy are multichain by default. This means that your dApp +immediately has access to all available Alchemy network chains upon creation. +You can view all available networks and the related API URLs in the β€œNetworks” +tab. You also have access to switch between Mainnet or Testnet, if available. + +![](/img/docs/alchemy-2.png) + +## API Key and RPC Endpoints + +Interactions with your Alchemy RPC instance are protected by an API key. Your +API key is automatically generated for you and can be copied from the top-right +of your app page. + +On this page you will also find RPC Endpoints, HTTP and WSS, for all available +chains. Search for the ZetaChain network and take note of the Mainnet URL. You +will use this later to make a request to ZetaChain. + +![](/img/docs/alchemy-3.png) + +## Connect to Alchemy + +If you're starting from scratch, create a new directory and initialize an npm +project: + +``` +mkdir zetachain-app +cd zetachain-app +npm init -y +``` + +Use npm to install `axios`. Axios is a widely-used HTTP client allowing you to +make API requests. + +``` +npm install axios +``` + +Create an `index.js` file in your project directory and paste the code below +into the file to send a request to the ZetaChain network. Make sure to replace +YOUR_API_KEY with your actual API key found on your Alchemy app dashboard. + +```ts +const axios = require("axios"); + +const url = `https://zetachain-mainnet.g.alchemy.com/v2/${YOUR_API_KEY}`; + +const payload = { + jsonrpc: "2.0", + id: 1, + method: "eth_blockNumber", + params: [], +}; + +axios + .post(url, payload) + .then((response) => { + console.log("Block Number:", parseInt(response.data.result)); + }) + .catch((error) => { + console.error(error); + }); +``` + +Run the script with Node.js: + +``` +node index.js +``` + +You should a see the current block number on ZetaChain outputted to your +console: + +``` +Block Number: 3688095 +``` + +You can find the full list of JSON-RPC methods available on ZetaChain in the +[Alchemy Docs](https://docs.alchemy.com/reference/zetachain-api-endpoints). diff --git a/src/pages/developers/services/subquery.mdx b/src/pages/developers/services/subquery.mdx new file mode 100644 index 00000000..8738ae86 --- /dev/null +++ b/src/pages/developers/services/subquery.mdx @@ -0,0 +1,26 @@ +--- +title: "SubQuery Indexer" +--- + +SubQuery is a leading blockchain data indexer empowering developers with fast, flexible, and universal decentralized APIs for their web3 projects. With the SubQuery SDK, developers can access rich indexed data and create immersive decentralized applications with efficiency and speed. SubQuery supports numerous ecosystems including ZetaChain, Ethereum, Cosmos, Near, Polygon, Polkadot, Algorand, and more. + +One of SubQuery's competitive advantages is the ability to aggregate data across multiple blockchains within a single project. This allows for the creation of feature-rich dashboard analytics and multichain block scanners, not just within a single chain but across various blockchains. + +Superior performance is guaranteed with multiple RPC endpoint configurations, multi-worker capabilities, and a customisable caching architecture. To learn more, explore the comprehensive [documentation](https://academy.subquery.network/). + +Useful resources: + +- SubQuery Docs: [SubQuery Academy (Documentation)](https://academy.subquery.network/) +- [Intro Quick Start Guide](https://academy.subquery.network/quickstart/quickstart.html) +- [ZetaChain Starter](https://github.com/subquery/ethereum-subql-starter/tree/main/Zetachain/zetachain-starter) +- [ZetaChain Testnet Starter](https://github.com/subquery/ethereum-subql-starter/tree/main/Zetachain/zetachain-testnet-starter) + +For technical questions and support reach out to `start@subquery.network`. + +## Running and Hosting ZetaChain SubQuery APIs + +SubQuery is committed to open-source principles, offering the flexibility to run it in three ways: + +- Locally (or a cloud provider). Refer to the [instructions](https://academy.subquery.network/run_publish/run.html) on how to set this up. +- Utilise enterprise-level [Managed Service](https://managedservice.subquery.network/), where the project is hosted with production-ready services, ensuring zero-downtime blue/green deployments and a generous free tier. Discover [how to get started](https://academy.subquery.network/run_publish/publish.html). +- Publish it to the [decentralised network](https://subquery.network/network), the ultimate data service for dApp developers, combining openness, performance, reliability, and scalability. SubQuery Network indexes and delivers data to the global community in a verifiable and incentivised manner and has supported ZetaChain from launch. \ No newline at end of file diff --git a/src/pages/developers/tokens/erc20.mdx b/src/pages/developers/tokens/erc20.mdx index 746145b8..587a264e 100644 --- a/src/pages/developers/tokens/erc20.mdx +++ b/src/pages/developers/tokens/erc20.mdx @@ -8,10 +8,8 @@ ZetaChain is fully compatible with the Ethereum Virtual Machine (EVM) and [ERC-20](https://ethereum.org/en/developers/docs/standards/tokens/erc-20) token contracts can be deployed to ZetaChain permissionlessly. - An ERC-20 token deployed to ZetaChain **does not** have - the properties of [ZRC-20](/developers/tokens/zrc20), specifically, it can't - be withdrawn from ZetaChain to a connected chain. - -If a specific ERC-20 token on a connected chain is not a supported ZRC-20, you -can still transfer this ERC-20 to and from a universal app using the connector -API. Check out the [ERC-20 tutorial](/developers/tutorials/erc20) to learn more. + + {" "} + An ERC-20 token deployed to ZetaChain **does not** have the properties of [ZRC-20](/developers/tokens/zrc20), specifically, + it can't be withdrawn from ZetaChain to a connected chain.{" "} + diff --git a/src/pages/developers/tokens/zrc20.mdx b/src/pages/developers/tokens/zrc20.mdx index 5ad9ca38..c389b8e7 100644 --- a/src/pages/developers/tokens/zrc20.mdx +++ b/src/pages/developers/tokens/zrc20.mdx @@ -227,6 +227,6 @@ confirmations, for example, when the value transfer exceeds a specified amount. ## Liquidity Cap Each ZRC-20 has a total cap on the number of deposited tokens that the protocol -can accept. Any assets beyond this deposited to ZetaChain from external chains +can accept. Any assets beyond this deposited to ZetaChain from connected chains will be returned to the sender. You can view the caps on the explorer [here](https://explorer.zetachain.com/liquidity). diff --git a/src/pages/developers/tutorials/_meta.json b/src/pages/developers/tutorials/_meta.json index c2124d51..18c206bf 100644 --- a/src/pages/developers/tutorials/_meta.json +++ b/src/pages/developers/tutorials/_meta.json @@ -1,46 +1,42 @@ { + "intro": { + "title": "Getting Started", + "readTime": "10 min", + "description": "Learn how to set up a smart contract template, create an account, and use faucet" + }, "hello": { "title": "First Universal App", + "readTime": "10 min", "description": "Learn how to create, deploy and interact with a universal app" }, "swap": { "title": "Swap", + "readTime": "30 min", "description": "Implement an omnichain swap app compatible with chains like Ethereum, BNB and Bitcoin" }, - "swap-zeta": { - "title": "Swap to ZETA", - "description": "Enhance the omnichain swap app with the ability to swap any token to ZETA" + "swap-any": { + "title": "Swap Any Token", + "readTime": "60 min", + "description": "Enhance the omnichain swap app with the ability to swap to any token" }, "staking": { "title": "Staking", + "readTime": "60 min", "description": "Explore how universal apps can be used for omnichain staking" }, "nft": { "title": "NFT", + "readTime": "60 min", "description": "Learn how to create a client-side UI for your universal app with Next.js and TypeScript" }, "bitcoin": { "title": "Bitcoin Frontend", + "readTime": "20 min", "description": "Learn how to make calls to universal apps from Bitcoin with wallets like XDEFI and UniSat" }, "multioutput": { "title": "Single Input, Multiple Outputs", + "readTime": "60 min", "description": "Learn how a single call to a universal app can create multiple outbound transactions" - }, - "zeta": { - "title": "Connector: Send ZETA", - "description": "Learn how to send ZETA tokens to and from a universal app using the Connector API" - }, - "message": { - "title": "Connector: Messaging", - "description": "Use the Connector API to send arbitrary messages to and from a universal app" - }, - "erc20": { - "title": "Connector: ERC-20", - "description": "Use the Connector API to send any ERC-20 token to and from a universal app" - }, - "connector-nft": { - "title": "Connector: NFTs", - "description": "Use the Connector API to send any NFTs to and from a universal app" } -} +} \ No newline at end of file diff --git a/src/pages/developers/tutorials/bitcoin.mdx b/src/pages/developers/tutorials/bitcoin.mdx index a544aa5b..f6c857a5 100644 --- a/src/pages/developers/tutorials/bitcoin.mdx +++ b/src/pages/developers/tutorials/bitcoin.mdx @@ -66,8 +66,8 @@ This HTML page contains a simple form with three inputs: ## Send Transaction Handler To call an omnichain contract from Bitcoin you need to send a token transfer -transaction to the ZetaChain's [TSS address](/reference/contracts) on Bitcoin -with a memo that conforms to [the required +transaction to the ZetaChain's [TSS address](/reference/network/contracts) on +Bitcoin with a memo that conforms to [the required format](/developers/evm/bitcoin). The memo is composed of two parts: @@ -87,8 +87,9 @@ would look like: c79E6DC99C5928C5b08ae7a0f79412521996938e3724C896Cdc958611873D81547A98565c8cb849d ``` -The list of TSS address is available in [the docs](/reference/network/contracts), for -the purposes of this tutorial we will use a hard-coded value. +The list of TSS address is available in [the +docs](/reference/network/contracts), for the purposes of this tutorial we will +use a hard-coded value. Get the contract address and parameters from the form and ensure that the `0x` prefix is removed. @@ -202,8 +203,8 @@ npx http-server Open the page in your browser and fill in the form. You can test functionality with your own contract address or follow one of the provided tutorials, for -example, the [Staking](/developers/tutorials/staking/) tutorial to -deploy a contract that you can call from Bitcoin. +example, the [Staking](/developers/tutorials/staking/) tutorial to deploy a +contract that you can call from Bitcoin. Fill out the form and click the "Send transaction" button. You will be prompted to confirm the transaction. diff --git a/src/pages/developers/tutorials/connector-nft.mdx b/src/pages/developers/tutorials/connector-nft.mdx deleted file mode 100644 index 9cead1ed..00000000 --- a/src/pages/developers/tutorials/connector-nft.mdx +++ /dev/null @@ -1,317 +0,0 @@ ---- -title: Cross-Chain NFT -description: In this tutorial you will learn how to create a contract capable of minting NFTs and sending them to a contract on a different chain using cross-chain messaging. ---- - -## Set up your environment - -``` -git clone https://github.com/zeta-chain/template -cd template -yarn -``` - -## Create the Contract - -To create a new cross-chain messaging contract you will use the `messaging` -Hardhat task available by default in the template. - -``` -npx hardhat messaging CrossChainNFT to:address token:uint256 -``` - -- `to`: address of the recipient on the destination chain -- `token` - an ID of the NFT being transferred - -Modify the contract to implement NFT logic: - -```solidity filename="contracts/CrossChainNFT.sol" {8,11,20,26,31-32,49,56,71,79-82,84,89-95} -// SPDX-License-Identifier: MIT -pragma solidity 0.8.7; - -import "@openzeppelin/contracts/interfaces/IERC20.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; -import "@zetachain/protocol-contracts/contracts/evm/tools/ZetaInteractor.sol"; -import "@zetachain/protocol-contracts/contracts/evm/interfaces/ZetaInterfaces.sol"; -import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; - -contract CrossChainNFT is - ERC721("CrossChainNFT", "CCNFT"), - ZetaInteractor, - ZetaReceiver -{ - event CrossChainNFTEvent(address, uint256); - event CrossChainNFTRevertedEvent(address, uint256); - - ZetaTokenConsumer private immutable _zetaConsumer; - IERC20 internal immutable _zetaToken; - uint256 private _tokenIds; - - constructor( - address connectorAddress, - address zetaTokenAddress, - address zetaConsumerAddress, - bool useEven - ) ZetaInteractor(connectorAddress) { - _zetaToken = IERC20(zetaTokenAddress); - _zetaConsumer = ZetaTokenConsumer(zetaConsumerAddress); - - _tokenIds++; - if (useEven) _tokenIds++; - } - - function sendMessage( - uint256 destinationChainId, - address to, - uint256 token - ) external payable { - if (!_isValidChainId(destinationChainId)) - revert InvalidDestinationChainId(); - - uint256 crossChainGas = 2 * (10 ** 18); - uint256 zetaValueAndGas = _zetaConsumer.getZetaFromEth{ - value: msg.value - }(address(this), crossChainGas); - _zetaToken.approve(address(connector), zetaValueAndGas); - - _burn(token); - - connector.send( - ZetaInterfaces.SendInput({ - destinationChainId: destinationChainId, - destinationAddress: interactorsByChainId[destinationChainId], - destinationGasLimit: 300000, - message: abi.encode(to, token, msg.sender), - zetaValueAndGas: zetaValueAndGas, - zetaParams: abi.encode("") - }) - ); - } - - function onZetaMessage( - ZetaInterfaces.ZetaMessage calldata zetaMessage - ) external override isValidMessageCall(zetaMessage) { - (address to, uint256 token) = abi.decode( - zetaMessage.message, - (address, uint256) - ); - - _safeMint(to, token); - - emit CrossChainNFTEvent(to, token); - } - - function onZetaRevert( - ZetaInterfaces.ZetaRevert calldata zetaRevert - ) external override isValidRevertCall(zetaRevert) { - (address to, uint256 token, address from) = abi.decode( - zetaRevert.message, - (address, uint256, address) - ); - - _safeMint(from, token); - - emit CrossChainNFTRevertedEvent(to, token); - } - - function mint(address to) public returns (uint256) { - _tokenIds++; - _tokenIds++; - - _safeMint(to, _tokenIds); - return _tokenIds; - } -} -``` - -To integrate NFT functionality, import the `ERC721` contract from OpenZeppelin. - -Initialize the ERC-721 token by setting a name and a symbol using the `ERC721` -constructor. - -Initialize a `_tokenIds` counter for managing NFT IDs. - -Add a `bool useEven` parameter to the constructor. The contract will be deployed -on two chains (in this example) and you need to ensure that IDs of tokens minted -on different chains do not clash. Using this constructor parameter on one chain -IDs will be odd, on the other chain IDs will be even. Inside the constructor -increment the initial token IDs. - -In the sendMessage function, burn the specified NFT by calling `_burn`. Add -`msg.sender` to the message by passing it as a third argument to `abi.decode`. -This is necessary in case the transaction is reverted, so the same NFT can be -minted and transferred back to the original sender. - -In the `onZetaMessage` function, decode the incoming message to retrieve the -recipient address and NFT ID. Mint the specified NFT to the recipient using -`_safeMint`. - -In the `onZetaRevert` function, decode the revert message to obtain the -recipient, NFT ID, and the original sender. Reimburse the original sender by -minting the NFT back to their account using `_safeMint`. - -## Create a Mint Task - -The mint task accepts a contract address as an argument, calls the `mint` -function on it, searches the events for a "Transfer" event and prints out the -token ID. - -```ts filename="tasks/mint.ts" -import { task } from "hardhat/config"; -import { HardhatRuntimeEnvironment } from "hardhat/types"; - -const contractName = "CrossChainNFT"; - -const main = async (args: any, hre: HardhatRuntimeEnvironment) => { - const [signer] = await hre.ethers.getSigners(); - - const factory = await hre.ethers.getContractFactory(contractName); - const contract = factory.attach(args.contract); - - const tx = await contract.connect(signer).mint(signer.address); - - const receipt = await tx.wait(); - const event = receipt.events?.find((event) => event.event === "Transfer"); - const nftId = event?.args?.tokenId.toString(); - - if (args.json) { - console.log(nftId); - } else { - console.log(`πŸ”‘ Using account: ${signer.address}\n`); - console.log(`βœ… "mint" transaction has been broadcasted to ${hre.network.name} -πŸ“ Transaction hash: ${receipt.transactionHash} -🌠 Minted NFT ID: ${nftId} -`); - } -}; - -task("mint", "Mint a new NFT.", main).addParam("contract", "Contract address").addFlag("json", "Output JSON"); -``` - -Import the mint task in the Hardhat config file: - -```ts filename="hardhat.config.ts" -import "./tasks/mint"; -``` - -## Update the Deploy Task - -Modify the deploy task by adding a new argument `parity` and passing it to the -`deployContract` function. The `parity` argument is used to determine the parity -of NFT IDs on different chains: even IDs on one chain and odd IDs on another. - -```ts filename="tasks/deploy.ts" {5-14,23,32} -const main = async (args: any, hre: HardhatRuntimeEnvironment) => { - const networks = args.networks.split(","); - const contracts: { [key: string]: string } = {}; - await Promise.all( - networks.map(async (networkName: string, i: number) => { - const parity = i % 2 == 0; - contracts[networkName] = await deployContract( - hre, - networkName as ParamChainName, - parity, - args.json, - args.gasLimit - ); - }) - ); - - // ... -}; - -const deployContract = async ( - hre: HardhatRuntimeEnvironment, - networkName: string, - parity: boolean, - json: boolean = false, - gasLimit: number -) => { - //... - const contract = await factory.deploy( - connector, - zetaToken, - zetaTokenConsumerUniV2 || zetaTokenConsumerUniV3, - parity, - { gasLimit } - ); - //... -}; -``` - -## Deploy the Contract - -Clear the cache and artifacts, then compile the contract: - -``` -npx hardhat compile --force -``` - -Run the following command to deploy the contract to two networks: - -``` -npx hardhat deploy --networks sepolia_testnet,bsc_testnet -``` - -``` -πŸš€ Successfully deployed contract on bsc_testnet -πŸ“œ Contract address: 0x345b7a0ecd2faecF980db7fC1E645b960450E8E4 - -πŸš€ Successfully deployed contract on sepolia_testnet -πŸ“œ Contract address: 0x8A0061fFb4572e4D57D260C3c2a99DD25e8Ab66C - -πŸ”— Setting interactors for a contract on bsc_testnet -βœ… Interactor address for 11155111 (sepolia_testnet) is set to 0x8a0061ffb4572e4d57d260c3c2a99dd25e8ab66c - -πŸ”— Setting interactors for a contract on sepolia_testnet -βœ… Interactor address for 97 (bsc_testnet) is set to 0x345b7a0ecd2faecf980db7fc1e645b960450e8e4 -``` - -## Mint an NFT - -``` -npx hardhat mint --contract 0x8A0061fFb4572e4D57D260C3c2a99DD25e8Ab66C --network sepolia_testnet -``` - -``` -πŸ”‘ Using account: 0x4955a3F38ff86ae92A914445099caa8eA2B9bA32 - -βœ… "mint" transaction has been broadcasted to sepolia_testnet -πŸ“ Transaction hash: 0xd29edcb4a785fb237965cee63ad415a4a3d091eb022241583ddc30eda49b1d0c -🌠 Minted NFT ID: 4 -``` - -## Send the NFT to the Destination Chain - -``` -npx hardhat interact --to 0x4955a3F38ff86ae92A914445099caa8eA2B9bA32 --token 4 --contract 0x8A0061fFb4572e4D57D260C3c2a99DD25e8Ab66C --network sepolia_testnet --amount 0.01 --destination bsc_testnet -``` - -``` -πŸ”‘ Using account: 0x4955a3F38ff86ae92A914445099caa8eA2B9bA32 - -βœ… The transaction has been broadcasted to sepolia_testnet -πŸ“ Transaction hash: 0x132d6312be65590a66eae59df835528b74b6a46ded59b67712c0646280ceac33 -``` - -You can check the broadcasted transaction on Sepolia's Etherscan: - -https://sepolia.etherscan.io/tx/0x132d6312be65590a66eae59df835528b74b6a46ded59b67712c0646280ceac33 - -Next, you can track the progress of the cross-chain transaction: - -``` -npx hardhat cctx 0x132d6312be65590a66eae59df835528b74b6a46ded59b67712c0646280ceac33 -``` - -``` -βœ“ CCTXs on ZetaChain found. - -βœ“ 0xb1ee24fb046397a8fd8444ad2e1ab4762b8d98e091e88bfa6dc7bf1a3a93c70f: 11155111 β†’ 97: OutboundMined -``` - -## Source Code - -You can find the source code for the example in this tutorial here: - -https://github.com/zeta-chain/example-contracts/tree/main/messaging/nft diff --git a/src/pages/developers/tutorials/erc20.mdx b/src/pages/developers/tutorials/erc20.mdx deleted file mode 100644 index da54198a..00000000 --- a/src/pages/developers/tutorials/erc20.mdx +++ /dev/null @@ -1,213 +0,0 @@ ---- -title: Cross-Chain ERC-20 -description: In this tutorial you will learn how to create a contract capable of minting ERC-20 tokens and sending them to a contract on a different chain using cross-chain messaging. ---- - -import { CodeBlock } from "~/components/shared"; - -## Set up your environment - -``` -git clone https://github.com/zeta-chain/template -cd template -yarn -``` - -## Create the Contract - -To create a new cross-chain messaging contract you will use the `messaging` -Hardhat task available by default in the template. - -``` -npx hardhat messaging CrossChainERC20 to:address value:uint256 -``` - -- `to`: address of the recipient on the destination chain -- `value`: the amount of ERC-20 tokens transferred - -## Cross-Chain Messaging Contract - -Let's review and make changes to the contract: - - - -By default the generated contract is a standard cross-chain messaging contract -with functions to send a message, message handler and revert handler. - -Let's modify the contract to make it ERC-20 compatible. - -To enable ERC-20 token features, import the necessary OpenZeppelin contracts: -`ERC20` for standard token functionality and `ERC20Burnable` to enable burning -tokens. - -In the contract's constructor, initialize the ERC-20 token by setting a name and -a symbol using the `ERC20` constructor. Then, pre-mint an initial supply of -tokens to the deploying address by calling the `_mint` function. - -In the `sendMessage` function, ensure the sender has sufficient tokens to send -by checking their balance. If they have enough, burn the required amount from -their balance using `_burn`. Add `msg.sender` to the message by passing it as a -third argument to `abi.decode`. This is necessary in case the transaction is -reverted, so the sender can be reimbursed. - -To handle the cross-chain message, decode the incoming message in -`onZetaMessage` and mint tokens to the intended recipient using the `_mint` -function. - -In the event of a message revert, decode the original message in `onZetaRevert` -to identify the sender and the amount. Reimburse the sender by minting the -tokens back to their account with `_mint`. Use the `from` address, as this is -the original sender who should receive the reimbursement. - -## Deploy the Contract - -Clear the cache and artifacts, then compile the contract: - -``` -npx hardhat compile --force -``` - -Run the following command to deploy the contract to two networks: - -``` -npx hardhat deploy --networks sepolia_testnet,bsc_testnet -``` - -``` -πŸš€ Successfully deployed contract on sepolia_testnet -πŸ“œ Contract address: 0x18B6f0aB98429F00eDD44D5900090D71e3747e10 - -πŸš€ Successfully deployed contract on bsc_testnet -πŸ“œ Contract address: 0x7eA3054e5086FeE43D745975d171d3a850A94304 - -πŸ”— Setting interactors for a contract on sepolia_testnet -βœ… Interactor address for 97 (bsc_testnet) is set to 0x7ea3054e5086fee43d745975d171d3a850a94304 - -πŸ”— Setting interactors for a contract on bsc_testnet -βœ… Interactor address for 11155111 (sepolia_testnet) is set to 0x18b6f0ab98429f00edd44d5900090d71e3747e10 -``` - -## Send an ERC-20 Token - -Use the interact task to call the `sendMessage` method of the contract and send -ERC-20 tokens from Sepolia to BSC Testnet - -``` -npx hardhat interact --to 0x4955a3F38ff86ae92A914445099caa8eA2B9bA32 --value 1000000000 --contract 0x18B6f0aB98429F00eDD44D5900090D71e3747e10 --network sepolia_testnet --amount 0.01 --destination bsc_testnet -``` - -``` -πŸ”‘ Using account: 0x4955a3F38ff86ae92A914445099caa8eA2B9bA32 - -βœ… The transaction has been broadcasted to sepolia_testnet -πŸ“ Transaction hash: 0x25cfda972e255480e15b47472ae6c8d8842201855776fedaa446f75cab7a0e86 -``` - -You can check the broadcasted transaction on Sepolia's Etherscan: - -https://sepolia.etherscan.io/tx/0x25cfda972e255480e15b47472ae6c8d8842201855776fedaa446f75cab7a0e86 - -Next, you can track the progress of the cross-chain transaction: - -``` -npx hardhat cctx 0x25cfda972e255480e15b47472ae6c8d8842201855776fedaa446f75cab7a0e86 -``` - -``` -βœ“ CCTXs on ZetaChain found. - -βœ“ 0x258d3ad9adf92ac5b7d59354435adfadac0af6430737f388ebf2664c22c71158: 11155111 β†’ 97: OutboundMined -``` - -## Source Code - -You can find the source code for the example in this tutorial here: - -https://github.com/zeta-chain/example-contracts/tree/main/messaging/erc20 diff --git a/src/pages/developers/tutorials/hello.mdx b/src/pages/developers/tutorials/hello.mdx index 96dd1a68..7281c55f 100644 --- a/src/pages/developers/tutorials/hello.mdx +++ b/src/pages/developers/tutorials/hello.mdx @@ -1,13 +1,33 @@ --- title: Your First Univeral App -description: In this tutorial you will create a simple universal app contract, deploy it on ZetaChain and make a contract call from a connected chain. --- +In this tutorial, you will create a simple universal app contract that accepts a +message with a string and emits an event with that string when called from a +connected chain. For example, a user on Ethereum will be able to send a message +"alice" and the universal contract on ZetaChain will emit a "Greet" event with a +value "alice". + +You will learn how to: + +- Use the Hardhat template to create a new universal app using a single command +- Define your universal app contract to handle messages from connected chains +- Deploy the contract to ZetaChain +- Interact with the contract by sending a message from Ethereum testnet +- Track an incoming cross-chain transaction + + + ## Prerequisites -- [Node.js](https://nodejs.org/en/) (version 18 or above) -- [Yarn](https://yarnpkg.com/) -- [Git](https://git-scm.com/) +- [Introduction to Universal Apps](/developers/apps/intro/) +- [Getting Started](/developers/tutorials/intro) ## Set Up Your Environment @@ -15,33 +35,40 @@ Clone the Hardhat contract template: ``` git clone https://github.com/zeta-chain/template -``` -Install dependencies: - -``` -cd template +cd template/contracts yarn ``` +Make sure that you've followed the [Getting +Started](/developers/tutorials/intro) tutorial to set up your development +environment, create an account and request testnet tokens. + ## Create the Contract -To create a new universal app contract, use the `omnichain` Hardhat task -available by default in the template. +To create a new universal app contract, use the `omnichain` Hardhat task: ``` -npx hardhat omnichain MyContract +npx hardhat omnichain Greeting name ``` -The `omnichain` task can also accept a list of arguments (optionally with types) -to create a contract that accepts specific data from a connected chain. You can -learn more about passing arguments in the following tutorials. In this tutorial -you will create a contract that does not accept any arguments. +The `omnichain` task accepts a contract name (`Greeting`) and a list of fields. +The list of fields defines the values that will be included in the message +passed to a universal app contract. + +A field may have a type specified after the field name, separated by a colon. If +no type is specified, the type defaults to `string`. + +Supported types are: `address`, `bool`, `bytes32`, `string`, +`int`,`int8`,`int16`,`int128`,`int256`,`uint`,`uint8`,`uint16`,`uint128`,`uint256`. + +In this example, the message will contain only one value: `name` of type +`string`. The `omnichain` task has created: -- `contracts/MyContract.sol`: a Solidity universal app contract +- `contracts/Greeting.sol`: a Solidity universal app contract - `tasks/deploy.ts`: a Hardhat task to deploy the contract - `tasks/interact.ts`: a Hardhat task to interact with the contract @@ -50,9 +77,9 @@ tasks. ## Universal App Contract -Let's review the contents of the `MyContract` contract: +Let's review the contents of the `Greeting` contract: -```solidity filename="contracts/MyContract.sol" +```solidity filename="contracts/Greeting.sol" // SPDX-License-Identifier: MIT pragma solidity 0.8.7; @@ -60,7 +87,7 @@ import "@zetachain/protocol-contracts/contracts/zevm/SystemContract.sol"; import "@zetachain/protocol-contracts/contracts/zevm/interfaces/zContract.sol"; import "@zetachain/toolkit/contracts/OnlySystem.sol"; -contract MyContract is zContract, OnlySystem { +contract Greeting is zContract, OnlySystem { SystemContract public systemContract; constructor(address systemContractAddress) { @@ -73,12 +100,16 @@ contract MyContract is zContract, OnlySystem { uint256 amount, bytes calldata message ) external virtual override onlySystem(systemContract) { + (string memory name) = abi.decode( + message, + (string) + ); // TODO: implement the logic } } ``` -`MyContract` is a simple contract that inherits from the [`zContract` +`Greeting` is a simple contract that inherits from the [`zContract` interface](https://github.com/zeta-chain/protocol-contracts/blob/main/contracts/zevm/interfaces/zContract.sol). The contract declares a state variable of type `SystemContract` that stores a @@ -117,6 +148,39 @@ the TSS address or an ERC-20 custody contract. By default, the `onCrossChainCall` function doesn't do anything else. You will implement the logic yourself based on your use case. +Modify the contract to emit an event after parsing the `message`: + +```solidity filename="contracts/Greeting.sol" {10,26} +// SPDX-License-Identifier: MIT +pragma solidity 0.8.7; + +import "@zetachain/protocol-contracts/contracts/zevm/SystemContract.sol"; +import "@zetachain/protocol-contracts/contracts/zevm/interfaces/zContract.sol"; +import "@zetachain/toolkit/contracts/OnlySystem.sol"; + +contract Greeting is zContract, OnlySystem { + SystemContract public systemContract; + event Greet(string message); + + constructor(address systemContractAddress) { + systemContract = SystemContract(systemContractAddress); + } + + function onCrossChainCall( + zContext calldata context, + address zrc20, + uint256 amount, + bytes calldata message + ) external virtual override onlySystem(systemContract) { + (string memory name) = abi.decode( + message, + (string) + ); + emit Greet(name); + } +} +``` + ## Deploy Task The `omnichain` task has created a Hardhat task to deploy the contract: @@ -165,7 +229,7 @@ const main = async (args: any, hre: HardhatRuntimeEnvironment) => { task("deploy", "Deploy the contract", main) .addFlag("json", "Output in JSON") - .addOptionalParam("name", "Contract to deploy", "MyContract"); + .addOptionalParam("name", "Contract to deploy", "Greeting"); ``` Omnichain contracts are supposed to be deployed to ZetaChain, so the task checks @@ -194,7 +258,7 @@ import ERC20 from "@openzeppelin/contracts/build/contracts/ERC20.json"; const main = async (args: any, hre: HardhatRuntimeEnvironment) => { const [signer] = await hre.ethers.getSigners(); - const data = prepareData(args.contract, [], []); + const data = prepareData(args.contract, ["string"], [args.name]); let tx; @@ -234,7 +298,8 @@ task("interact", "Interact with the contract", main) .addParam("contract", "The address of the withdraw contract on ZetaChain") .addParam("amount", "Amount of tokens to send") .addOptionalParam("token", "The address of the token to send") - .addFlag("json", "Output in JSON"); + .addFlag("json", "Output in JSON") + .addParam("name"); ``` The task uses the `prepareData` function from `@zetachain/toolkit/helpers` to @@ -283,58 +348,18 @@ address. The transaction contains the following information: - `to`: the address of the TSS - `value`: the amount of tokens to transfer -## Create an Account - -To deploy and interact with the contract you will need a wallet with tokens. - -Create a new wallet account: - -``` -npx hardhat account --save -``` - -This command generates a random wallet, prints information about the wallet to -the terminal, and saves the private key to a `.env` file to make it accessible -to Hardhat. - -## Use the Faucet to Request Tokens - -Request testnet ZETA tokens from the ZetaChain faucet: - -``` -npx hardhat faucet -``` - -This command requests tokens from the faucet for the account address derived -from the private key specified in the `.env`. Tokens sent to the address on -ZetaChain. - -Using the `faucet` task you can get ZETA tokens on ZetaChain as well as ZETA -tokens on connected chains. - -You will, however, need to request native tokens on connected chains from one of -the [publicly available faucets](/reference/apps/get-testnet-zeta). - -## Check Token Balances - -Check token balances to ensure you have tokens on ZetaChain and at least one of -the connected chains: - -``` -npx hardhat balances -``` - -Learn more about these and other ZetaChain toolkit commands [avaialble in the -template](/developers/reference/template/). +* `value`: the number of tokens to transfer ## Deploy the Contract -Clear the cache and artifacts, then compile the contract: +Compile the contract: ``` npx hardhat compile --force ``` +Use the `--force` flag to clear the cache and artifacts. + Deploy the contract to ZetaChain: ``` @@ -342,19 +367,20 @@ npx hardhat deploy --network zeta_testnet ``` ``` -πŸ”‘ Using account: 0x1bE17D79b60182D7F3573576B7807F6C20Ae7C99 +πŸ”‘ Using account: 0x4955a3F38ff86ae92A914445099caa8eA2B9bA32 -πŸš€ Successfully deployed contract on ZetaChain. -πŸ“œ Contract address: 0xE26F2e102E2f3267777F288389435d3037D14bb3 -🌍 Explorer: https://athens3.explorer.zetachain.com/address/0xE26F2e102E2f3267777F288389435d3037D14bb3 +πŸš€ Successfully deployed contract on zeta_testnet. +πŸ“œ Contract address: 0x2C0201B9DFdC6Dcc23524Ab29c51c38dcc8afF54 +🌍 ZetaScan: https://athens.explorer.zetachain.com/address/0x2C0201B9DFdC6Dcc23524Ab29c51c38dcc8afF54 +🌍 Blockcsout: https://zetachain-athens-3.blockscout.com/address/0x2C0201B9DFdC6Dcc23524Ab29c51c38dcc8afF54 ``` ## Interact with the Contract -Call the `interact` task to interact with the contract: +Use the `interact` task to send a transaction on Ethereum Sepolia testnet: ``` -npx hardhat interact --contract 0xE26F2e102E2f3267777F288389435d3037D14bb3 --amount 0.1 --network sepolia_testnet +npx hardhat interact --name alice --contract 0x2C0201B9DFdC6Dcc23524Ab29c51c38dcc8afF54 --network sepolia_testnet --amount 0 ``` ``` @@ -364,34 +390,50 @@ npx hardhat interact --contract 0xE26F2e102E2f3267777F288389435d3037D14bb3 --amo πŸ“ Transaction hash: 0x93b441dc2ddb751a60a2f4c0fc52dbbd447ed70eb962b1a01072328aa6872b73 ``` +The `interact` task has sent a transaction to the TSS address on Sepolia. + +The `data` field of the transaction contains the following data: + +``` +0x2c0201b9dfdc6dcc23524ab29c51c38dcc8aff5400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000005616c696365000000000000000000000000000000000000000000000000000000 +``` + +The first 20 bytes is the universal app contract on ZetaChain, the rest are +bytes that will be passed to the universal contract as `message`. In this +example, the `message` is a string `alice`. + +The `value` (amount) of the transaction is 0 because you're not sending any ETH +in this example, you're just sending a message. + Track the transaction: ``` -npx hardhat cctx 0x93b441dc2ddb751a60a2f4c0fc52dbbd447ed70eb962b1a01072328aa6872b73 +npx hardhat cctx 0x1d32177e6cdedbabd5f587ed0de80e8b4734636b329d88d24d015676257c330d +``` + +``` βœ“ CCTXs on ZetaChain found. -βœ“ 0x31310706ac4b33aa468e62a77d5db358e52a60dad3854210db8fc06c870186b6: 5 β†’ 7001: -OutboundMined (Remote omnichain contract call completed) +βœ“ 0xb672ea88abd2c35e4ee4a094969799259773a89e5d93906e46829632837106a5: 11155111 β†’ 7001: OutboundMined (Remote omnichain contract call completed) ``` -Once the transaction is finalized on ZetaChain, you should be able to review the -transaction on the ZetaChain explorer: +You can also track the cross-chain transaction on ZetaScan: + +https://athens.explorer.zetachain.com/cc/tx/0xb672ea88abd2c35e4ee4a094969799259773a89e5d93906e46829632837106a5 -https://explorer.zetachain.com/cc/tx/0x31310706ac4b33aa468e62a77d5db358e52a60dad3854210db8fc06c870186b6 +Once the transaction is finalized on ZetaChain, you should be able to see the +event emitted by the contract on ZetaChain. Go to the "Logs tab" to see: -The `interact` task has sent a token transfer transaction to the TSS address on -Sepolia. The transaction contains the address of the contract on ZetaChain in -the `data` field. ZetaChain detects the transaction and triggers the -`onCrossChainCall` function of the contract. The `onCrossChainCall` function -does nothing in this example, but you can modify it to implement your own logic. +``` +Method id efdeaaf5 +Call Greet(string message) +Name Type Indexed? Data +message string false alice +``` -Congratulations! πŸŽ‰ In this tutorial you have: +https://zetachain-athens-3.blockscout.com/address/0x2C0201B9DFdC6Dcc23524Ab29c51c38dcc8afF54 -- cloned the Hardhat contract template -- used `npx hardhat omnichain` to create a new omnichain contract -- reviewed the contents of the generated contract and the tasks to deploy and - interact with the contract -- successfully deployed the contract to ZetaChain -- interacted with the contract by sending a token transfer transaction to the - TSS address on a connected chain and triggering the `onCrossChainCall` - function of the omnichain contract on ZetaChain +Congratulations! πŸŽ‰ You've successfully created a universal app contract, +deployed it on ZetaChain and made a call to it with a message sent from Ethereum +testnet. Now you know the basics of how to handle calls and parse messages from +connected chains and can move on to build more exciting apps! diff --git a/src/pages/developers/tutorials/intro.mdx b/src/pages/developers/tutorials/intro.mdx new file mode 100644 index 00000000..f7671331 --- /dev/null +++ b/src/pages/developers/tutorials/intro.mdx @@ -0,0 +1,138 @@ +# Getting Started + +This introductory tutorial will guide you through the essential steps to set up +your smart contract template, create and configure your account, and request +tokens for testing on ZetaChain. + +## Prerequisites + +- A Unix-like environment (for example, macOS) +- [Node.js](https://nodejs.org/en/) (version 18 or above) +- [Yarn](https://yarnpkg.com/) +- [Git](https://git-scm.com/) + +## Universal App Template + +ZetaChain provides [a smart contract +template](https://github.com/zeta-chain/template) to help you start building +universal apps quickly. First, clone the template from GitHub: + +``` +git clone https://github.com/zeta-chain/template +``` + +Next, navigate to the template directory and install the necessary dependencies: + +``` +cd template/contracts +yarn +``` + +The template uses [Hardhat](https://hardhat.org/) for compiling, testing, and +deploying contracts. It also uses +[`@zetachain/toolkit`](https://github.com/zeta-chain/toolkit/), which offers +various utilities for creating contracts, querying balances, tracking +cross-chain transactions, accessing the faucet, and more. The template exposes +most of the features available in the toolkit through Hardhat tasks. + +## Create an Account + +To interact with a blockchain, you'll need an account. If you don't have an +account, you can generate a new one using the following command: + +``` +npx hardhat account --save +``` + +This command creates a random wallet, displays the wallet information in the +terminal, and saves the private key to a `.env` file, making it accessible to +Hardhat. + +If you don't want to save the wallet (for example, if you just need an address +to send tokens to for testing purposes), you can run the command without the +`--save` flag. + +If you already have a private key or mnemonic, you can import it with the +`--recover` flag: + +``` +npx hardhat account --save --recover +``` + +This will prompt you to enter the private key or mnemonic, derive the addresses, +and save the private key into the `.env` file. + +The `account` command shows derived addresses in hexadecimal (for EVM-based +chains), bech32 with `zeta` prefix for ZetaChain, and bech32 for Bitcoin. + +## Query Token Balances + +To check the token balances: + +``` +npx hardhat balances +``` + +This command queries token balances for the account address derived from the +private key specified in the `.env`. + +If you need to query for balances as part of a script, you can also use a +`--json` flag to output the balances in JSON format: + +``` +npx hardhat balances --json +``` + +If you want to query for token balances for a different account, you can use the +`--address` flag: + +``` +npx hardhat balances --address ADDRESS +``` + +The `balances` command supports querying for native gas tokens, wrapped ZETA on +all connected chains as well as ZetaChain, ZRC-20 tokens, and BTC on Bitcoin. + +## Request Tokens from the Faucet + +To request ZETA tokens from the faucet: + +``` +npx hardhat faucet +``` + +This command requests tokens from the faucet for the account address derived +from the private key specified in the `.env`. To prevent abuse, the faucet will +prompt you to sign in with GitHub. Once the process is complete, you will +receive native ZETA tokens on ZetaChain testnet. It may take a few minutes for +your request to be processed. + +To send tokens to a different address, use: + +``` +npx hardhat faucet --address ADDRESS +``` + +Alternatively, you can install a standalone faucet CLI: + +``` +yarn global add @zetachain/faucet-cli +``` + +You can then use it with the following command: + +``` +zetafaucet -h +``` + +If the faucet is throwing an error, delete the `access_token` file from the +project and try again. + +In addition to ZETA tokens on ZetaChain, you might need tokens on connected +blockchains like Ethereun, BNB and Bitcoin testnets. + +- https://www.bnbchain.org/en/testnet-faucet +- https://www.alchemy.com/faucets/ethereum-sepolia +- https://www.infura.io/faucet/sepolia +- https://bitcoinfaucet.uo1.net/ +- https://cloud.google.com/application/web3/faucet/ethereum/sepolia diff --git a/src/pages/developers/tutorials/message.mdx b/src/pages/developers/tutorials/message.mdx deleted file mode 100644 index 54b97001..00000000 --- a/src/pages/developers/tutorials/message.mdx +++ /dev/null @@ -1,241 +0,0 @@ ---- -title: Cross-Chain Message -description: In this tutorial you will learn how to create a contract capable of sending a message with arbitrary data between contracts on connected chains using cross-chain messaging. ---- - -
    - -
    - -## Set up your environment - -``` -git clone https://github.com/zeta-chain/template -cd template -yarn -``` - -## Create the Contract - -To create a new cross-chain messaging contract you will use the `messaging` -Hardhat task available by default in the template. - -``` -npx hardhat messaging CrossChainMessage message:string -``` - -The `messaging` task accepts one or more arguments: the name of the contract and -a list of arguments (optionally with types). The arguments define the contents -of the message that will be sent across chains. - -In the example above the message will have only one field: `message` of type -`string`. If the type is not specified it is assumed to be `string`. - -The optional `--fees` flag is missing, which means this contract will accept -native gas tokens as input and swap it for ZETA. - -## Cross-Chain Messaging Contract - -Let's review the contract: - -```solidity filename="contracts/CrossChainMessage.sol" -// SPDX-License-Identifier: MIT -pragma solidity 0.8.7; - -import "@openzeppelin/contracts/interfaces/IERC20.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; -import "@zetachain/protocol-contracts/contracts/evm/tools/ZetaInteractor.sol"; -import "@zetachain/protocol-contracts/contracts/evm/interfaces/ZetaInterfaces.sol"; - -contract CrossChainMessage is ZetaInteractor, ZetaReceiver { - - event CrossChainMessageEvent(string); - event CrossChainMessageRevertedEvent(string); - - ZetaTokenConsumer private immutable _zetaConsumer; - IERC20 internal immutable _zetaToken; - - constructor(address connectorAddress, address zetaTokenAddress, address zetaConsumerAddress) ZetaInteractor(connectorAddress) { - _zetaToken = IERC20(zetaTokenAddress); - _zetaConsumer = ZetaTokenConsumer(zetaConsumerAddress); - } - - function sendMessage(uint256 destinationChainId, string memory message) external payable { - if (!_isValidChainId(destinationChainId)) - revert InvalidDestinationChainId(); - - uint256 crossChainGas = 2 * (10 ** 18); - uint256 zetaValueAndGas = _zetaConsumer.getZetaFromEth{ - value: msg.value - }(address(this), crossChainGas); - _zetaToken.approve(address(connector), zetaValueAndGas); - - connector.send( - ZetaInterfaces.SendInput({ - destinationChainId: destinationChainId, - destinationAddress: interactorsByChainId[destinationChainId], - destinationGasLimit: 300000, - message: abi.encode(message), - zetaValueAndGas: zetaValueAndGas, - zetaParams: abi.encode("") - }) - ); - } - - - function onZetaMessage( - ZetaInterfaces.ZetaMessage calldata zetaMessage - ) external override isValidMessageCall(zetaMessage) { - (string memory message ) = abi.decode( - zetaMessage.message, (string) - ); - - emit CrossChainMessageEvent(message); - } - - function onZetaRevert( - ZetaInterfaces.ZetaRevert calldata zetaRevert - ) external override isValidRevertCall(zetaRevert) { - (string memory message) = abi.decode( - zetaRevert.message, - (string) - ); - - emit CrossChainMessageRevertedEvent(message); - } - -} -``` - -The contract: - -- inherits from - [`ZetaInteractor`](https://github.com/zeta-chain/protocol-contracts/blob/main/contracts/evm/tools/ZetaInteractor.sol), - which provides two modifiers that are used to validate the message and revert - calls: `isValidMessageCall` and `isValidRevertCall`. -- implements - [`ZetaReceiver`](https://github.com/zeta-chain/protocol-contracts/blob/main/contracts/evm/interfaces/ZetaInterfaces.sol), - which defines two functions: `onZetaMessage` and `onZetaRevert`. - -State Variables: - -- `_zetaConsumer`: a private immutable state variable that stores the address of - `ZetaTokenConsumer`, which is used amond other things for getting ZETA tokens - from native tokens to pay for gas when sending a message. -- `_zetaToken`: an internal immutable state variable that stores the address of - the ZETA token contract. - -The contract defines two events: `CrossChainMessageEvent` emitted when a message -is processed on the destination chain and `CrossChainMessageRevertedEvent` -emitted when a message is reverted on the destination chain. - -The constructor passes `connectorAddress` to the `ZetaInteractor` constructor -and initializes both `_zetaToken` and `_zetaConsumer` state variables. - -The `sendMessage` function is used to send a message to a recipient contract on -the destination chain. It first checks that the destination chain ID is valid. -Then it uses ZETA consumer to get the needed amount of ZETA tokens from the -provided `msg.value` (amount of native gas assets sent with the function call), -and approves the `ZetaConnector` to spend the `zetaValueAndGas` amount of ZETA -tokens. - -The `sendMessage` function uses `connector.send` to send a crosss-chain message -with the following arguments wrapped in a struct: - -- `destinationChainId`: chain ID of the destination chain -- `destinationAddress`: address of the contract receiving the message on the - destination chain (expressed in bytes since it can be non-EVM) -- `destinationGasLimit`: gas limit for the destination chain's transaction -- `message`: arbitrary message to be parsed by the receiving contract on the - destination chain -- `zetaValueAndGas`: amount of ZETA tokens to be sent to the destination chain, - ZetaChain gas fees, and destination chain gas fees (expressed in ZETA tokens) -- `zetaParams`: optional ZetaChain parameters. - -The `onZetaMessage` function processes incoming cross-chain messages. The -function uses `abi.decode` to decode the contents of the `message`. After -decoding the functions emits `CrossChainMessageEvent` event with the message -content. - -The `onZetaRevert` function handles the reverts of cross-chain messages. This -function is triggered on the source chain if the message passing failed. - -Both `onZetaMessage` and `onZetaRevert` use the `isValidRevertCall` modifier to -ensure that the revert message is genuine and originates from the trusted -source. - -## Deploy the Contract - -Clear the cache and artifacts, then compile the contract: - -``` -npx hardhat compile --force -``` - -Run the following command to deploy the contract to two networks: - -``` -npx hardhat deploy --networks sepolia_testnet,bsc_testnet -``` - -``` -πŸš€ Successfully deployed contract on bsc_testnet -πŸ“œ Contract address: 0x4036009aa206a5c4d3bDABaC7242b18ACc5655D5 - -πŸš€ Successfully deployed contract on sepolia_testnet -πŸ“œ Contract address: 0x5d5c88B669337686af75f97C817365164786C88a - -πŸ”— Setting interactors for a contract on bsc_testnet -βœ… Interactor address for 11155111 (sepolia_testnet) is set to 0x5d5c88b669337686af75f97c817365164786c88a - -πŸ”— Setting interactors for a contract on sepolia_testnet -βœ… Interactor address for 97 (bsc_testnet) is set to 0x4036009aa206a5c4d3bdabac7242b18acc5655d5 -``` - -## Send a Message - -Send a message from Sepolia to BSC testnet using the contract address (see the -output of the `deploy` task). Make sure to submit enough native gas tokens with -`--amount` to pay for the transaction fees. - -``` -npx hardhat interact --message hello --contract 0x5d5c88B669337686af75f97C817365164786C88a --network sepolia_testnet --amount 0.01 --destination bsc_testnet - -``` - -``` -πŸ”‘ Using account: 0x4955a3F38ff86ae92A914445099caa8eA2B9bA32 - -βœ… The transaction has been broadcasted to sepolia_testnet -πŸ“ Transaction hash: 0x798f15cc214e8d5d595ba1944099134330439a4a30b76cc791e1ca60cd85d696 -``` - -You can check the broadcasted transaction on Sepolia's Etherscan: - -https://sepolia.etherscan.io/tx/0x798f15cc214e8d5d595ba1944099134330439a4a30b76cc791e1ca60cd85d696 - -Next, you can track the progress of the cross-chain transaction: - -``` -npx hardhat cctx 0x798f15cc214e8d5d595ba1944099134330439a4a30b76cc791e1ca60cd85d696 -``` - -``` -βœ“ CCTXs on ZetaChain found. - -βœ“ 0x9f3dfff6b1373a6717ce6a0e20d3e6e1591cf13e75634f385550d3e1a226c604: 11155111 β†’ 97: OutboundMined -``` - -## Source Code - -You can find the source code for the example in this tutorial here: - -https://github.com/zeta-chain/example-contracts/tree/main/messaging/message diff --git a/src/pages/developers/tutorials/nft/contract.mdx b/src/pages/developers/tutorials/nft/contract.mdx index ec2afa35..519c519d 100644 --- a/src/pages/developers/tutorials/nft/contract.mdx +++ b/src/pages/developers/tutorials/nft/contract.mdx @@ -32,7 +32,7 @@ git clone https://github.com/zeta-chain/template Install dependencies: ``` -cd template +cd template/contracts yarn ``` diff --git a/src/pages/developers/tutorials/staking.mdx b/src/pages/developers/tutorials/staking.mdx index c2b42e82..15839209 100644 --- a/src/pages/developers/tutorials/staking.mdx +++ b/src/pages/developers/tutorials/staking.mdx @@ -49,7 +49,7 @@ git clone https://github.com/zeta-chain/template Install dependencies: ``` -cd template +cd template/contracts yarn ``` diff --git a/src/pages/developers/tutorials/swap-any.mdx b/src/pages/developers/tutorials/swap-any.mdx new file mode 100644 index 00000000..525a59d5 --- /dev/null +++ b/src/pages/developers/tutorials/swap-any.mdx @@ -0,0 +1,340 @@ +--- +title: Swap To Any Token +--- + +In the previous [Swap](/developers/tutorials/swap) tutorial, you learned how to +create universal swap contracts that enable users to exchange tokens from one +connected blockchain for a token on another blockchain, with the target token +always withdrawn to the destination chain. + +In this tutorial, you will enhance the swap contract to support swapping tokens +to any token (such as ZRC-20, ERC-20, or ZETA) and provide the flexibility to +either withdraw the token to the destination chain or keep it on ZetaChain. + +Keeping swapped tokens on ZetaChain is useful if you want to use ZRC-20 in +non-universal contracts that don't yet have the capacity to accept tokens from +connected chains directly, or if the destination token is ZETA, which you want +to keep on ZetaChain. + +## Omnichain Contract + +Copy the existing swap example into a new file `SwapToAnyToken.sol` and make the +necessary changes: + +```solidity filename="contracts/SwapToAnyToken.sol" {8,11,23,37,45-47,49-56,64,73,79,94,99-114,117-127} +// SPDX-License-Identifier: MIT +pragma solidity 0.8.7; + +import "@zetachain/protocol-contracts/contracts/zevm/SystemContract.sol"; +import "@zetachain/protocol-contracts/contracts/zevm/interfaces/zContract.sol"; +import "@zetachain/toolkit/contracts/SwapHelperLib.sol"; +import "@zetachain/toolkit/contracts/BytesHelperLib.sol"; +import "@zetachain/protocol-contracts/contracts/zevm/interfaces/IWZETA.sol"; +import "@zetachain/toolkit/contracts/OnlySystem.sol"; + +contract SwapToAnyToken is zContract, OnlySystem { + SystemContract public systemContract; + + uint256 constant BITCOIN = 18332; + + constructor(address systemContractAddress) { + systemContract = SystemContract(systemContractAddress); + } + + struct Params { + address target; + bytes to; + bool withdraw; + } + + receive() external payable {} + + function onCrossChainCall( + zContext calldata context, + address zrc20, + uint256 amount, + bytes calldata message + ) external virtual override onlySystem(systemContract) { + Params memory params = Params({ + target: address(0), + to: bytes(""), + withdraw: true + }); + + if (context.chainID == BITCOIN) { + params.target = BytesHelperLib.bytesToAddress(message, 0); + params.to = abi.encodePacked( + BytesHelperLib.bytesToAddress(message, 20) + ); + if (message.length >= 41) { + params.withdraw = BytesHelperLib.bytesToBool(message, 40); + } + } else { + ( + address targetToken, + bytes memory recipient, + bool withdrawFlag + ) = abi.decode(message, (address, bytes, bool)); + params.target = targetToken; + params.to = recipient; + params.withdraw = withdrawFlag; + } + + swapAndWithdraw( + zrc20, + amount, + params.target, + params.to, + params.withdraw + ); + } + + function swapAndWithdraw( + address inputToken, + uint256 amount, + address targetToken, + bytes memory recipient, + bool withdraw + ) internal { + uint256 inputForGas; + address gasZRC20; + uint256 gasFee; + + if (withdraw) { + (gasZRC20, gasFee) = IZRC20(targetToken).withdrawGasFee(); + + inputForGas = SwapHelperLib.swapTokensForExactTokens( + systemContract, + inputToken, + gasFee, + gasZRC20, + amount + ); + } + + uint256 outputAmount = SwapHelperLib.swapExactTokensForTokens( + systemContract, + inputToken, + withdraw ? amount - inputForGas : amount, + targetToken, + 0 + ); + + if (withdraw) { + IZRC20(gasZRC20).approve(targetToken, gasFee); + IZRC20(targetToken).withdraw(recipient, outputAmount); + } else { + address wzeta = systemContract.wZetaContractAddress(); + if (targetToken == wzeta) { + IWETH9(wzeta).withdraw(outputAmount); + address payable recipientAddress = payable( + address(uint160(bytes20(recipient))) + ); + recipientAddress.transfer(outputAmount); + } else { + address recipientAddress = address(uint160(bytes20(recipient))); + IWETH9(targetToken).transfer(recipientAddress, outputAmount); + } + } + } + + function swap( + address inputToken, + uint256 amount, + address targetToken, + bytes memory recipient, + bool withdraw + ) public { + IZRC20(inputToken).transferFrom(msg.sender, address(this), amount); + + swapAndWithdraw(inputToken, amount, targetToken, recipient, withdraw); + } +} +``` + +Add the `WZETA` interface import, which allows interacting with ERC-20 +compatible tokens (such as ZRC-20) as well as unwrapping WZETA into native ZETA. + +Change the contract name from `Swap` to `SwapToAnyToken`. + +Add `bool withdraw` to the `Params` struct. This value determines if a user +wants to withdraw the swapped token to the destination chain (`true`) or keep +the token on ZetaChain (`false`). By default the value will be set to `true`. + +If the contract is being called from Bitcoin, use `bytesToBool` to decode the +last value in the `message`, and set it as the value of `params.withdraw`. + +If the contract is being called from an EVM chain, use `abi.decode` to decode +all values: target token, recipient and the withdraw flag. + +Next, add `params.withdraw` as the last argument to the `swapAndWithdraw` +function call. + +### Swap and Withdraw Function + +Add `bool withdraw` as the last parameter to the function definition. + +If a user wants to withdraw the tokens, query the gas token and the gas fee. +Since a user now has an option to not withdraw, this step has become optional. + +Modify the amount passed to `swapExactTokensForTokens`. If a user withdraws +token, subtract the withdraw fee in input token amount. + +Finally, add a conditional to either withdraw ZRC-20 tokens to a connected chain +or transfer the target token to the recipient on ZetaChain. If a user doesn't +want to withdraw a token you need to consider two scenarios: + +- If the target token is WZETA, unwrap it and transfer native ZETA to the + recipient. +- If the target token is not WZETA, transfer it to the recipient as any other + ERC-20-compatible token. + +### Swap Function + +Create a new public `swap` function to make it possible for users to call the +"swap and withdraw" function. Compared to "swap and withdraw", which is internal +and is not meant to be called directly, the "swap" function is public and is +meant to be called from ZetaChain. The purpose of "swap" is to allow users to +swap tokens they have on ZetaChain for other tokens and optionally also withdraw +them. For example, when a user has a ZRC-20 ETH and they want to swap it for +ZRC-20 BTC (without withdrawing), or swap it for ZRC-20 BNB and withdraw it to +the BNB chain as a native BNB token. + +## Update the Interact Task + +```ts filename="tasks/interact.ts" +let withdraw = true; +if (args.withdraw != undefined) { + withdraw = JSON.parse(args.withdraw); +} + +const data = prepareData(args.contract, ["address", "bytes", "bool"], [args.targetToken, recipient, withdraw]); + +//... + .addOptionalParam("withdraw"); +``` + +Add an optional parameter `withdraw`, which determines if a user wants to +withdraw the target token to the destination chain. By default set the value to +`true`, and pass withdraw as the third value in the message. + +## Add a Swap Task + +While the interact task is meant to be called on a connected chain to trigger a +universal contract, the swap task is meant to be called on ZetaChain directly to +swap an asset already on ZetaChain for a different asset optionally withdrawing +it. + +``` +import { task } from "hardhat/config"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import { parseEther } from "@ethersproject/units"; +import { ethers } from "ethers"; + +const main = async (args: any, hre: HardhatRuntimeEnvironment) => { + const [signer] = await hre.ethers.getSigners(); + + if (!/zeta_(testnet|mainnet)/.test(hre.network.name)) { + throw new Error('🚨 Please use either "zeta_testnet" or "zeta_mainnet".'); + } + + const factory = await hre.ethers.getContractFactory("SwapToAnyToken"); + const contract = factory.attach(args.contract); + + const amount = parseEther(args.amount); + const inputToken = args.inputToken; + const targetToken = args.targetToken; + const recipient = ethers.utils.arrayify(args.recipient); + const withdraw = JSON.parse(args.withdraw); + + const erc20Factory = await hre.ethers.getContractFactory("ERC20"); + const inputTokenContract = erc20Factory.attach(args.inputToken); + + const approval = await inputTokenContract.approve(args.contract, amount); + await approval.wait(); + + const tx = await contract.swap( + inputToken, + amount, + targetToken, + recipient, + withdraw + ); + + await tx.wait(); + console.log(`Transaction hash: ${tx.hash}`); +}; + +task("swap", "Interact with the Swap contract from ZetaChain", main) + .addFlag("json", "Output JSON") + .addParam("contract", "Contract address") + .addParam("amount", "Token amount to send") + .addParam("inputToken", "Input token address") + .addParam("targetToken", "Target token address") + .addParam("recipient", "Recipient address") + .addParam("withdraw", "Withdraw flag (true/false)"); +``` + +## Compile and Deploy the Contract + +``` +npx hardhat compile --force +``` + +When deploying use the `--name` flag to specify which contract you want to +deploy: + +``` +npx hardhat deploy --network zeta_testnet --name SwapToZeta +``` + +``` +πŸ”‘ Using account: 0x4955a3F38ff86ae92A914445099caa8eA2B9bA32 + +πŸš€ Successfully deployed contract on zeta_testnet. +πŸ“œ Contract address: 0x48D512595699A1c1c40C7B5Fc378512Ab0dCFAd7 +🌍 ZetaScan: https://athens.explorer.zetachain.com/address/0x48D512595699A1c1c40C7B5Fc378512Ab0dCFAd7 +🌍 Blockcsout: https://zetachain-athens-3.blockscout.com/address/0x48D512595699A1c1c40C7B5Fc378512Ab0dCFAd7 +``` + +## Swap Tokens Without Withdrawing + +When using the `interact` task specify ZETA token contract address as the value +of `--target-token`: + +``` +npx hardhat interact --contract 0x1767A93A96D339EeC8E0325D94B5d3E4454d542f --network bsc_testnet --amount 0.01 --target-token 0xcC683A782f4B30c138787CB5576a86AF66fdc31d --recipient 0x6093537Aa6C8C8bf4705bda40aC9193977208B39 --withdraw false +``` + +Track the transaction: + +``` +npx hardhat cctx 0x3f22de7a6d6669ce55ce2a95adaee46b8fd8a751b145c903c62300f9e7e44e4d +``` + +``` +βœ“ CCTXs on ZetaChain found. + +βœ“ 0x7f7f7051dd9da2037b7fc01c43b18649b923c522e9ff3934e28647da59fffe79: 97 β†’ 7001: OutboundMined (Remote omnichain contract call completed) +``` + +Notice that an outbound CCTX is not created, because when swapping without +withdrawing, target tokens remain on ZetaChain and are not withdrawn. + +## Swap Token And Withdraw + +``` +npx hardhat interact --contract 0x1767A93A96D339EeC8E0325D94B5d3E4454d542f --network bsc_testnet --amount 0.1 --target-token 0xcC683A782f4B30c138787CB5576a86AF66fdc31d --recipient 0x6093537Aa6C8C8bf4705bda40aC9193977208B39 +``` + +``` +npx hardhat cctx 0x8323982f778ab14a5c37b10a80c5837da74ccdc8dba6ab4368f8b00612da8e1e +``` + +``` +βœ“ CCTXs on ZetaChain found. + + +βœ“ 0x86c66514209a23499d23fea4c2d7177e87bff5199d273a3592fb685d7d945da8: 97 β†’ 7001: OutboundMined (Remote omnichain contract call completed) +βœ“ 0x4a1d7df81e11c4273c0d105a23f049409d06f0bbc03e286014276adb247e208f: 7001 β†’ 11155111: OutboundMined (ZRC20 withdrawal event setting to pending outbound directly : Outbound succeeded, mined) +``` diff --git a/src/pages/developers/tutorials/swap-zeta.mdx b/src/pages/developers/tutorials/swap-zeta.mdx deleted file mode 100644 index 431c0a2c..00000000 --- a/src/pages/developers/tutorials/swap-zeta.mdx +++ /dev/null @@ -1,167 +0,0 @@ ---- -title: Swap To ZETA ---- - -## Overview - -In the previous tutorial you've learned how to create an omnichain swap -contracts that allows users to swap between tokens between connected -blockchains. The target token was always on a connected blockchain. - -In this tutorial you will modify the swap example to support swapping tokens for -wrapped ZETA (WZETA). By design WZETA tokens will be transferred to recipient on -ZetaChain. - -## Omnichain Contract - -Copy the existing swap example into a new file `SwapToZeta.sol` and make the -necessary changes: - -```solidity filename="contracts/SwapToZeta.sol" {8,11,41-45,47,62,67-72} -// SPDX-License-Identifier: MIT -pragma solidity 0.8.7; - -import "@zetachain/protocol-contracts/contracts/zevm/SystemContract.sol"; -import "@zetachain/protocol-contracts/contracts/zevm/interfaces/zContract.sol"; -import "@zetachain/toolkit/contracts/SwapHelperLib.sol"; -import "@zetachain/toolkit/contracts/BytesHelperLib.sol"; -import "@zetachain/protocol-contracts/contracts/zevm/interfaces/IWZETA.sol"; -import "@zetachain/toolkit/contracts/OnlySystem.sol"; - -contract SwapToZeta is zContract, OnlySystem { - SystemContract public systemContract; - - uint256 constant BITCOIN = 18332; - - constructor(address systemContractAddress) { - systemContract = SystemContract(systemContractAddress); - } - - function onCrossChainCall( - zContext calldata context, - address zrc20, - uint256 amount, - bytes calldata message - ) external virtual override onlySystem(systemContract) { - address target; - bytes memory to; - - if (context.chainID == BITCOIN) { - target = BytesHelperLib.bytesToAddress(message, 0); - to = abi.encodePacked(BytesHelperLib.bytesToAddress(message, 20)); - } else { - (address targetToken, bytes memory recipient) = abi.decode( - message, - (address, bytes) - ); - target = targetToken; - to = recipient; - } - - address wzeta = systemContract.wZetaContractAddress(); - bool isTargetZeta = target == wzeta; - uint256 inputForGas; - address gasZRC20; - uint256 gasFee; - - if (!isTargetZeta) { - (gasZRC20, gasFee) = IZRC20(target).withdrawGasFee(); - - inputForGas = SwapHelperLib.swapTokensForExactTokens( - systemContract, - zrc20, - gasFee, - gasZRC20, - amount - ); - } - - uint256 outputAmount = SwapHelperLib.swapExactTokensForTokens( - systemContract, - zrc20, - isTargetZeta ? amount : amount - inputForGas, - target, - 0 - ); - - if (isTargetZeta) { - IWETH9(wzeta).transfer(address(uint160(bytes20(to))), outputAmount); - } else { - IZRC20(gasZRC20).approve(target, gasFee); - IZRC20(target).withdraw(to, outputAmount); - } - } -} -``` - -Add the `IWZETA` interface to interact seamlessly with the WZETA wrapped token -contract. This import enables the new features introduced in the updated version -of the contract. - -Change the contract name from `Swap` to `SwapToZeta`. - -Add a conditional to check if the target token's address matches WZETA token -address. You can get WZETA token address from the system contract. - -Introduce a conditional to skip querying the withdrawal gas fee and swapping for -a gas token when the target is WZETA. This step is only necessary for -transactions involving ZRC-20 tokens that will be withdrawn. For transactions -with WZETA, these steps are unnecessary as the token remains within the -ZetaChain. - -Add logic to swap the entire incoming amount when the target is WZETA and to -swap `amount - inputForGas` when dealing with ZRC-20 tokens. This ensures that -the correct amount is swapped based on the token type involved. - -Finally, insert a conditional operation to either transfer swapped WZETA -directly to the recipient on the ZetaChain or to withdraw ZRC-20 tokens to the -designated destination chain. - -## Compile and Deploy the Contract - -``` -npx hardhat compile --force -``` - -When deploying use the `--name` flag to specify which contract you want to -deploy: - -``` -npx hardhat deploy --network zeta_testnet --name SwapToZeta -``` - -``` -πŸ”‘ Using account: 0x4955a3F38ff86ae92A914445099caa8eA2B9bA32 - -πŸš€ Successfully deployed contract on zeta_testnet. -πŸ“œ Contract address: 0x48D512595699A1c1c40C7B5Fc378512Ab0dCFAd7 -🌍 ZetaScan: https://athens.explorer.zetachain.com/address/0x48D512595699A1c1c40C7B5Fc378512Ab0dCFAd7 -🌍 Blockcsout: https://zetachain-athens-3.blockscout.com/address/0x48D512595699A1c1c40C7B5Fc378512Ab0dCFAd7 -``` - -## Swap Native Gas Tokens For WZETA - -When using the `interact` task specify ZETA token contract address as the value -of `--target-token`: - -``` -npx hardhat interact --contract 0x48D512595699A1c1c40C7B5Fc378512Ab0dCFAd7 --network bsc_testnet --amount 0.01 --target-token 0x5F0b1a82749cb4E2278EC87F8BF6B618dC71a8bf --recipient 0x4955a3F38ff86ae92A914445099caa8eA2B9bA32 -``` - -Track the transaction: - -``` -npx hardhat cctx 0xe8f3aa508fcd204939343eb9dd8e7e6e7425bf920b14bdbb64743c0f27e7981e -``` - -``` -βœ“ CCTXs on ZetaChain found. - -βœ“ 0xb83ca0b837ae812033dd06c46c979582415085faa47158875fbf04198152a203: 97 β†’ 7001: OutboundMined (Remote omnichain contract call completed) -``` - -Notice that an outbound CCTX is not created, because when swapping for WZETA, -WZETA tokens remains on ZetaChain and isn't being withdrawn. - -You can now open the recipient's address page on Blockscout and check for an -incoming WZETA token transfer. diff --git a/src/pages/developers/tutorials/swap.mdx b/src/pages/developers/tutorials/swap.mdx index 20924229..25baf126 100644 --- a/src/pages/developers/tutorials/swap.mdx +++ b/src/pages/developers/tutorials/swap.mdx @@ -2,16 +2,52 @@ title: Swap --- -## Overview - -In this tutorial you will write a cross-chain swap contract that allows users to -swap a native gas or ERC-20 token from one of the connected chains for a token -on another chain. - -The swap process involves depositing a token from a connected chain to -ZetaChain, triggering a swap omnichain contract to swap between ZRC-20 -representations of the tokens and then withdrawing the swapped token to the -recipient address on the destination chain. +import { Alert } from "~/components/shared"; + +In this tutorial you will create a cross-chain swap contract. This contract will +enable users to exchange a native gas token or a supported ERC-20 token from one +connected blockchain for a token on another blockchain. For example, a user will +be able to swap USDC from Ethereum to BTC on Bitcoin in a single transaction. + +You will learn how to: + +- Decode incoming messages from both EVM chains and Bitcoin. +- Work with the ZRC-20 representation of tokens transferred from connected + chains. +- Use the swap helper function to swap tokens using Uniswap v2 pools. +- Withdraw ZRC-20 tokens to a connected chain, accounting for cross-chain gas + fees. + +The swap contract will be implemented as a universal app and deployed on +ZetaChain. + +Universal apps can accept token transfers and contract calls from connected +chains. Tokens transferred from connected chains to a universal app contract are +represented as [ZRC-20](/developers/tokens/zrc20). For example, ETH transferred +from Ethereum is represented as ZRC-20 ETH. ZRC-20 tokens have the unique +property of being able to be withdrawn back to their original chain as native +assets. + +The swap contract will: + +- Accept a contract call from a connected chain containing native gas or + supported ERC-20 tokens and a message. +- Decode the message, which should include: + - Target token address (represented as ZRC-20) + - Recipient address on the destination chain +- Query withdraw gas fee of the target token. +- Swap a fraction of the input token for a ZRC-20 gas tokens to cover the + withdrawal fee using the Uniswap v2 liquidity pools. +- Swap the remaining input token amount for the target token ZRC-20. +- Withdraw ZRC-20 tokens to the destination chain + + ## Set Up Your Environment @@ -19,26 +55,28 @@ Clone the Hardhat contract template: ``` git clone https://github.com/zeta-chain/template -``` -Install dependencies: +cd template/contracts -``` -cd template yarn ``` +Make sure that you've followed the [Getting +Started](/developers/tutorials/intro) tutorial to set up your development +environment, create an account and request testnet tokens. + ## Create the contract -Run the following command to create a new omnichain contract called `Swap`. +Run the following command to create a new universal omnichain contract called +`Swap` with two values in the message: target token address and recipient. ``` npx hardhat omnichain Swap targetToken:address recipient ``` -## Omnichain Contract +## Universal App Contract -```solidity filename="contracts/Swap.sol" {6-7,12,24-61} +```solidity filename="contracts/Swap.sol" {6-7,12,18-21,29-45,48-78} // SPDX-License-Identifier: MIT pragma solidity 0.8.7; @@ -56,18 +94,22 @@ contract Swap is zContract, OnlySystem { systemContract = SystemContract(systemContractAddress); } + struct Params { + address target; + bytes to; + } + function onCrossChainCall( zContext calldata context, address zrc20, uint256 amount, bytes calldata message ) external virtual override onlySystem(systemContract) { - address targetTokenAddress; - bytes memory recipientAddress; + Params memory params = Params({target: address(0), to: bytes("")}); if (context.chainID == BITCOIN) { - targetTokenAddress = BytesHelperLib.bytesToAddress(message, 0); - recipientAddress = abi.encodePacked( + params.target = BytesHelperLib.bytesToAddress(message, 0); + params.to = abi.encodePacked( BytesHelperLib.bytesToAddress(message, 20) ); } else { @@ -75,16 +117,28 @@ contract Swap is zContract, OnlySystem { message, (address, bytes) ); - targetTokenAddress = targetToken; - recipientAddress = recipient; + params.target = targetToken; + params.to = recipient; } - (address gasZRC20, uint256 gasFee) = IZRC20(targetTokenAddress) - .withdrawGasFee(); + swapAndWithdraw(zrc20, amount, params.target, params.to); + } - uint256 inputForGas = SwapHelperLib.swapTokensForExactTokens( + function swapAndWithdraw( + address inputToken, + uint256 amount, + address targetToken, + bytes memory recipient + ) internal { + uint256 inputForGas; + address gasZRC20; + uint256 gasFee; + + (gasZRC20, gasFee) = IZRC20(targetToken).withdrawGasFee(); + + inputForGas = SwapHelperLib.swapTokensForExactTokens( systemContract, - zrc20, + inputToken, gasFee, gasZRC20, amount @@ -92,56 +146,83 @@ contract Swap is zContract, OnlySystem { uint256 outputAmount = SwapHelperLib.swapExactTokensForTokens( systemContract, - zrc20, + inputToken, amount - inputForGas, - targetTokenAddress, + targetToken, 0 ); - IZRC20(gasZRC20).approve(targetTokenAddress, gasFee); - IZRC20(targetTokenAddress).withdraw(recipientAddress, outputAmount); + IZRC20(gasZRC20).approve(targetToken, gasFee); + IZRC20(targetToken).withdraw(recipient, outputAmount); } } ``` -The contract expects to receive two values in the `message`: +### Decoding the Message -- `address targetTokenAddress`: the address of the ZRC-20 version of the - destination token. -- `bytes memory recipientAddress`: the recipient address on the destination - chain. We're using `bytes`, because the recipient address can be either on an - EVM chain or Bitcoin. +Create a `Params` struct, which will hold two values: -When the contract is called from an EVM chain, the `message` is encoded as a -`bytes` array using the ABI encoding. +- `address target`: target token ZRC-20 address. +- `bytes to`: recipient address on the destination chain. We're using `bytes`, + because the recipient can be either on EVM (like Ethereum or BNB) or on + Bitcoin. -When the contract is called from Bitcoin it’s up to us to encode and then decode -the message. +First, decode the incoming `message` to get the parameter values. The message +might be encoded differently depending on the source chain. For example, on +Bitcoin there is a upper limit of 80 bytes, so you might want to encode the +message in the most efficient way possible. On EVM don't have this limit, so +it's fine to use `abi.encode` to encode the message. Use `context.chainID` to determine the connected chain from which the contract is called. -If it’s Bitcoin, the first 20 bytes of the `message` are the -`targetTokenAddress` encoded as an `address`. Use `bytesToAddress` helper method -to get the target token address. To get the recipient address, use the same -helper method with an offset of 20 bytes and then use `abi.encodePacked` to -convert the address to `bytes`. +If it's Bitcoin, the first 20 bytes of the `message` are the `params.target` +encoded as an `address`. Use `bytesToAddress` helper method to get the target +token address. To get the recipient address, use the same helper method with an +offset of 20 bytes and then use `abi.encodePacked` to convert the address to +`bytes`. + +If it's an EVM chain, use `abi.decode` to decode the `message` into the +`params.target` and `params.to`. -If it’s an EVM chain, use `abi.decode` to decode the `message` into the -`targetToken` and `recipient` variables. +### Swap and Withdraw Function -Next, get the gas fee and the gas coin address from the target token. The gas -coin is the token that will be used to pay for the gas on the destination chain. +#### Swapping for Gas Token -Use the `SwapHelperLib.swapTokensForExactTokens` helper method to swap the -incoming token for the gas coin using the internal liquidity pools. The method -returns the amount of the incoming token that was used to pay for the gas. +Create a new function called `swapAndWithdraw`. Use the `withdrawGasFee` method +of the target token ZRC-20 to get the gas fee token address and the gas fee +amount. If the target token is the gas token of the destination chain (for +example, BNB), `gasZRC20` will be the same `params.target`. However, if the +target token is an ERC-20, like USDC on BNB, `gasZRC20` will tell you the +address of the ZRC-20 of the destination chain. + +Use the `swapTokensForExactTokens` helper method to swap the incoming token for +the gas coin using the internal liquidity pools. The method returns the amount +of the incoming token that was used to pay for the gas. + +#### Swapping for Target Token Next, swap the incoming amount minus the amount spent swapping for a gas fee for -the target token on the destination chain using the `SwapHelperLib._doSwap` +the target token on the destination chain using the `swapExactTokensForTokens` helper method. -Finally, withdraw the tokens to the recipient address on the destination chain. +#### Withdraw Target Token to Connected Chain + +At this point the contract has the required `gasFee` amount of `gasZRC20` token +of the connected chain and an `outputAmount` amount of `params.target` token. + +To withdraw tokens to a connected chain you will be calling the `withdraw` +method of ZRC-20. The `withdraw` method expects the caller (in our case the +contract) to have the required amount of gas tokens ZRC-20. Approve the target +token ZRC-20 contract to spend the `gasFee` amount. Finally, call the `withdraw` +method of the target token ZRC-20 to send the tokens to the recipient on the +connected chain. + + + {" "} + Note that you don't have to tell which chain to withdraw to because each ZRC-20 contract knows which connected chain it + is associated with. For example, ZRC-20 Ethereum USDC can only be withdrawn to Ethereum. + ## Update the Interact Task @@ -153,7 +234,7 @@ To support both EVM and Bitcoin addresses, we need to check if the recipient is a valid Bitcoin address. If it is, we need to encode it as `bytes` using `utils.solidityPack`. -If it’s not a valid bech32 address, then we assume it’s an EVM address and use +If it’s not a valid bech32 address, then we assume it's an EVM address and use `args.recipient` as the value for the recipient. Finally, update the `prepareData` function call to use the `bytes` type for the @@ -181,9 +262,9 @@ const main = async (args: any, hre: HardhatRuntimeEnvironment) => { ## Create an Account and Request Tokens from the Faucet -Before proceeding with the next steps, make sure you have -[created an account and requested ZETA tokens](/developers/tutorials/hello#create-an-account) -from the faucet. +Before proceeding with the next steps, make sure you have [created an account +and requested ZETA tokens](/developers/tutorials/hello#create-an-account) from +the faucet. ## Compile and Deploy the Contract @@ -206,66 +287,67 @@ npx hardhat deploy --network zeta_testnet ## Swap Native Gas Tokens Between EVM Chains Use the `interact` task to perform a cross-chain swap. In this example, we're -swapping native sETH from Sepolia for tMATIC on Polygon Mumbai. The contract -will deposit sETH to ZetaChain as ZRC-20, swap it for ZRC-20 tMATIC and then -withdraw native tMATIC Polygon Mumbai. To get the value of the `--target-token` -find the ZRC-20 contract address of the destination token in the -[ZRC-20 section of the docs](/developers/tokens/zrc20). +swapping native sETH from Sepolia for BNB on BNB chain. The contract will +deposit sETH to ZetaChain as ZRC-20, swap it for ZRC-20 BNB and then withdraw +native BNB to the BNB chain. To get the value of the `--target-token` find the +ZRC-20 contract address of the destination token in the [ZRC-20 section of the +docs](/developers/tokens/zrc20). ``` -npx hardhat interact --contract 0xf6CDd83AB44E4d947FE52c2637ee4A04F330328E --amount 0.01 --network sepolia_testnet --target-token 0x48f80608B672DC30DC7e3dbBd0343c5F02C738Eb --recipient 0x2cD3D070aE1BD365909dD859d29F387AA96911e1 +npx hardhat interact --contract 0x175DeE06ca605674e49F1FADfC6B399D6ab31726 --amount 0.3 --network sepolia_testnet --target-token 0xd97B1de3619ed2c6BEb3860147E30cA8A7dC9891 --recipient 0x4955a3F38ff86ae92A914445099caa8eA2B9bA32 ``` ``` -πŸ”‘ Using account: 0x2cD3D070aE1BD365909dD859d29F387AA96911e1 +πŸ”‘ Using account: 0x4955a3F38ff86ae92A914445099caa8eA2B9bA32 -πŸš€ Successfully broadcasted a token transfer transaction on sepolia_testnet network. -πŸ“ Transaction hash: 0x6b4156c195d955d1325a5e6275214db63ff2e3642838607333e74abd74b8fc13 +πŸš€ Successfully broadcasted a token transfer transaction on sepolia_testnet +network. πŸ“ Transaction hash: +0xc4b2bbd3b3090e14797463af1965a00318cc39a50fce53a5d5856d09fe67410d ``` Track your cross-chain transaction: ``` -npx hardhat cctx 0x6b4156c195d955d1325a5e6275214db63ff2e3642838607333e74abd74b8fc13 +npx hardhat cctx +0xc4b2bbd3b3090e14797463af1965a00318cc39a50fce53a5d5856d09fe67410d ``` ``` βœ“ CCTXs on ZetaChain found. -βœ“ 0xb263483d61d0b1c89685364324c32438a3546b3f732a3d37840e6042e4837357: 5 β†’ 7001: OutboundMined (Remote omnichain contract call completed) -βœ“ 0xcad3a0b8949b1bd39c51e80ff6be9a5c6d337df8a04b39a48667d2c688172e35: 7001 β†’ 80001: PendingOutbound β†’ OutboundMined +βœ“ 0xf6419c8d850314a436a3cfc7bc5cd487e29bad9c8fae0d8be9a913d622599980: 11155111 β†’ 7001: OutboundMined (Remote omnich +ain contract call completed) +β § 0x5e533d781ddc9760784ba9c1887f77a80d3ca0d771ea41f02bc4d0a1c9412dc2: 7001 β†’ 97: PendingOutbound (ZRC20 withdrawal +event setting to pending outbound directly) ``` ## Swap ERC-20 Tokens Between EVM Chains -Now let's swap USDC from Sepolia to MATIC on Polygon Mumbai. To send USDC -specify the ERC-20 token contract address (on Sepolia) in the `--token` -parameter. You can find the address of the token in the -[ZRC-20 section of the docs](/developers/tokens/zrc20). +Now let's swap USDC from Sepolia to BNB on BNB chain. To send USDC specify the +ERC-20 token contract address (on Sepolia) in the `--token` parameter. You can +find the address of the token in the [ZRC-20 section of the +docs](/developers/tokens/zrc20). ``` -npx hardhat interact --contract 0xf6CDd83AB44E4d947FE52c2637ee4A04F330328E --amount 10 --token 0x07865c6e87b9f70255377e024ace6630c1eaa37f --network sepolia_testnet --target-token 0x48f80608B672DC30DC7e3dbBd0343c5F02C738Eb --recipient 0x2cD3D070aE1BD365909dD859d29F387AA96911e1 +npx hardhat interact --contract 0xf6CDd83AB44E4d947FE52c2637ee4A04F330328E --amount 5 --token 0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238 --network sepolia_testnet --target-token 0xd97B1de3619ed2c6BEb3860147E30cA8A7dC9891 --recipient 0x4955a3F38ff86ae92A914445099caa8eA2B9bA32 ``` ``` πŸ”‘ Using account: 0x2cD3D070aE1BD365909dD859d29F387AA96911e1 -πŸš€ Successfully broadcasted a token transfer transaction on sepolia_testnet -network. -πŸ“ Transaction hash: 0xff32dd2391c4f62694cc99afd0da1c2a1352c8caf29846cc366aab54a631e8f8 +πŸš€ Successfully broadcasted a token transfer transaction on sepolia_testnet network. +πŸ“ Transaction hash: 0xce8832232639d29d40078e14d0a5b20c055123d6df1e1d39f90cfd130c33466d ``` ``` -npx hardhat cctx -0xff32dd2391c4f62694cc99afd0da1c2a1352c8caf29846cc366aab54a631e8f8 +npx hardhat cctx 0xce8832232639d29d40078e14d0a5b20c055123d6df1e1d39f90cfd130c33466d ``` ``` -npx hardhat cctx 0xff32dd2391c4f62694cc99afd0da1c2a1352c8caf29846cc366aab54a631e8f8 βœ“ CCTXs on ZetaChain found. -βœ“ 0xa4cb698122916f10c932e146c45517b4f47de1e16be493ea66f28b5a34c7bfb5: 5 β†’ 7001: OutboundMined (Remote omnichain contract call completed) -βœ“ 0xad18c759713ce5604683aeb389fc9a1a91f537c0abbb8d9f9fc6cfc11e55fdc7: 7001 β†’ 80001: PendingOutbound β†’ OutboundMined +βœ“ 0x1ae1436358ef755c1c782d0a249ae99e857b0aecb91dcd8da4a4e7171f5d9459: 11155111 β†’ 7001: OutboundMined (Remote omnichain contract call completed) +βœ“ 0xbefe99d3e17d16fc88762f85b1becd1396b01956c04b5ec037abc2c63d821caa: 7001 β†’ 97: OutboundMined (ZRC20 withdrawal event setting to pending outbound directly : Outbound succeeded, mined) ``` ## Swap from Bitcoin @@ -274,23 +356,16 @@ Use the `send-btc` task to send Bitcoin to the TSS address with a memo. The memo should contain the following: - Omnichain contract address on ZetaChain: - `f6CDd83AB44E4d947FE52c2637ee4A04F330328E` -- Target token address: `48f80608B672DC30DC7e3dbBd0343c5F02C738Eb` -- Recipient address: `2cD3D070aE1BD365909dD859d29F387AA96911e1` + `175DeE06ca605674e49F1FADfC6B399D6ab31726` +- Target token address: `05BA149A7bd6dC1F937fA9046A9e05C05f3b18b0` +- Recipient address: `4955a3F38ff86ae92A914445099caa8eA2B9bA32` ``` -npx hardhat send-btc --amount 0.001 --memo f6CDd83AB44E4d947FE52c2637ee4A04F330328E48f80608B672DC30DC7e3dbBd0343c5F02C738Eb2cD3D070aE1BD365909dD859d29F387AA96911e1 --recipient tb1qy9pqmk2pd9sv63g27jt8r657wy0d9ueeh0nqur +npx hardhat send-btc --amount 0.001 --memo 175DeE06ca605674e49F1FADfC6B399D6ab3172605BA149A7bd6dC1F937fA9046A9e05C05f3b18b04955a3F38ff86ae92A914445099caa8eA2B9bA32 --recipient tb1qy9pqmk2pd9sv63g27jt8r657wy0d9ueeh0nqur ``` ``` -npx hardhat cctx 3c2eeee38fafbfbcdceca0d595c1433c48c738aaa6e1df407a681aeeeb1da3d6 -``` - -``` -βœ“ CCTXs on ZetaChain found. - -βœ“ 0xa7d4a46545806a5aff4d4fc20cb37295f426b70f0f6b2a123f67cbdb3014c995: 18332 β†’ 7001: OutboundMined (Remote omnichain contract call completed) -βœ“ 0x963cf8890b3da9e84379eca06a2e4835aba3a027bca6560e76d19945b75b2c39: 7001 β†’ 80001: PendingOutbound β†’ OutboundMined +npx hardhat cctx 29d6a0af11aa6164e83c17d9f129e4ec504d327fb94429732d95c16ddfcce999 ``` ## Source Code diff --git a/src/pages/developers/tutorials/zeta.mdx b/src/pages/developers/tutorials/zeta.mdx deleted file mode 100644 index 1c4b3b69..00000000 --- a/src/pages/developers/tutorials/zeta.mdx +++ /dev/null @@ -1,418 +0,0 @@ ---- -title: Cross-Chain ZETA Transfer ---- - -## Overview - -In this tutorial you will learn how to create a contract capable of sending ZETA -tokens between contracts on connected chains using cross-chain messaging. - -- This tutorial uses ZetaChain cross-chain messaging, but in this example we're - only sending ZETA. You will learn how to send arbitrary data in a message in - the [Message](/developers/tutorials/message) tutorial. -- Since this contract's purpose is to send ZETA, the contract in this example - will accept ZETA as input. Example contracts in other tutorials will use - native gas assets as input for convenience. -- All the code will be generated for you by the template. - -## Prerequisites - -- [Node.js](https://nodejs.org/en/) (version 18 or above) -- [Yarn](https://yarnpkg.com/) -- [Git](https://git-scm.com/) - -## Set up your environment - -``` -git clone https://github.com/zeta-chain/template -cd template -yarn -``` - -## Create the Contract - -To create a new cross-chain messaging contract you will use the `messaging` -Hardhat task available by default in the template. - -``` -npx hardhat messaging CrossChainZETA --fees zeta -``` - -The `messaging` task accepts one or more arguments: the name of the contract and -a list of arguments (optionally with types). The arguments define the contents -of the message that will be sent across chains. In this example the contract -will only be sending ZETA, so the list of arguments is empty. - -Use the `--fee zeta` to specify that this contract will be accepting ZETA -tokens. You will learn more about this flag later in this tutorial. - -The `messaging` task has created: - -- `contracts/CrossChainMessage.sol`: a Solidity cross-chain messaging contract -- `tasks/deploy.ts`: a Hardhat task to deploy the contract on one or more chains -- `tasks/interact.ts`: a Hardhat task to interact with the contract - -It also modified `hardhat.config.ts` to import both `deploy` and `interact` -tasks. - -Let's review the contract: - -```solidity filename="contracts/CrossChainZeta.sol" -// SPDX-License-Identifier: MIT -pragma solidity 0.8.7; - -import "@openzeppelin/contracts/interfaces/IERC20.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; -import "@zetachain/protocol-contracts/contracts/evm/tools/ZetaInteractor.sol"; -import "@zetachain/protocol-contracts/contracts/evm/interfaces/ZetaInterfaces.sol"; -import "@zetachain/protocol-contracts/contracts/evm/Zeta.eth.sol"; - -contract CrossChainZeta is ZetaInteractor { - error ErrorTransferringZeta(); - - event CrossChainZetaEvent(); - event CrossChainZetaRevertedEvent(); - - IERC20 internal immutable _zetaToken; - - constructor(address connectorAddress, address zetaTokenAddress) ZetaInteractor(connectorAddress) { - _zetaToken = IERC20(zetaTokenAddress); - } - - function sendMessage(uint256 destinationChainId, uint256 zetaValueAndGas) external payable { - if (!_isValidChainId(destinationChainId)) - revert InvalidDestinationChainId(); - - bool success1 = _zetaToken.approve(address(connector), zetaValueAndGas); - bool success2 = _zetaToken.transferFrom(msg.sender, address(this), zetaValueAndGas); - if (!(success1 && success2)) revert ErrorTransferringZeta(); - - connector.send( - ZetaInterfaces.SendInput({ - destinationChainId: destinationChainId, - destinationAddress: interactorsByChainId[destinationChainId], - destinationGasLimit: 300000, - message: abi.encode(), - zetaValueAndGas: zetaValueAndGas, - zetaParams: abi.encode("") - }) - ); - } -} -``` - -The contract: - -- inherits from - [`ZetaInteractor`](https://github.com/zeta-chain/protocol-contracts/blob/main/contracts/evm/tools/ZetaInteractor.sol), - which provides the connector functionality and helper functions like - `_isValidChainId`. - -State Variables: - -- `_zetaToken`: an internal immutable state variable that stores the address of - the ZETA token contract. - -The constructor passes `connectorAddress` to the `ZetaInteractor` constructor -and initializes the `_zetaToken` state variables. - -The `sendMessage` function is used to send ZETA tokens to a recipient contract -on the destination chain. It first checks that the destination chain ID is -valid. Then it approves the contract to spend an amount of ZETA - -## Cross-Chain Fees - -[Cross-chain messaging fees](/developers/evm/gas/#cross-chain-messaging-fees) are -paid in ZETA tokens. This is convenient if the caller has ZETA tokens on the -source chain. However, many users might only have native gas tokens. In this -case it’s more convenient for a contract to accept native gas token, and swap it -for ZETA. - -To choose which token your contract accepts, use the `--fees` flag. - -To make the contract accept ZETA, use `--fees zeta`. This value was used to -create a contract above. Since the contract's only purpose is to send ZETA, it -makes sense to also accept ZETA as a fee token. - -To make the contract accept native gas tokens, use `--fees native` or skip this -flag completely as this is the default option. - -## Sending ZETA - -The `sendMessage` function uses `connector.send` to send a crosss-chain message -with the following arguments wrapped in a struct: - -- `destinationChainId`: chain ID of the destination chain -- `destinationAddress`: address of the contract receiving the message on the - destination chain (expressed in bytes since it can be non-EVM) -- `destinationGasLimit`: gas limit for the destination chain's transaction -- `message`: arbitrary message to be parsed by the receiving contract on the - destination chain. In this example it’s empty as we're only sending ZETA, not - arbitrary data. -- `zetaValueAndGas`: amount of ZETA tokens to be sent to the destination chain, - ZetaChain gas fees, and destination chain gas fees (expressed in ZETA tokens) -- `zetaParams`: optional ZetaChain parameters. Currently, not being used. - -After handling the fees the contract calls `connector.send` to send -`zetaValueAndGas` amount of ZETA to the `destinationAddress` contract on the -`destinationChainId` blockchain. The message is empty as only ZETA tokens are -being transferred. - -## Deploy Task - -The `messaging` task has created a Hardhat task to deploy the contract. - -```ts filename="tasks/deploy.ts" -import { getAddress } from "@zetachain/protocol-contracts"; -import { ethers } from "ethers"; -import { task, types } from "hardhat/config"; -import { HardhatRuntimeEnvironment } from "hardhat/types"; -import type { ParamChainName } from "@zetachain/protocol-contracts"; - -const contractName = "CrossChainZeta"; - -const main = async (args: any, hre: HardhatRuntimeEnvironment) => { - const networks = args.networks.split(","); - const contracts: { [key: string]: string } = {}; - await Promise.all( - networks.map(async (networkName: ParamChainName) => { - contracts[networkName] = await deployContract(hre, networkName, args.json, args.gasLimit); - }) - ); - - for (const source in contracts) { - await setInteractors(hre, source as ParamChainName, contracts, args.json, args.gasLimit); - } - - if (args.json) { - console.log(JSON.stringify(contracts, null, 2)); - } -}; - -const initWallet = (hre: HardhatRuntimeEnvironment, networkName: ParamChainName) => { - const { url } = hre.config.networks[networkName] as any; - const provider = new ethers.providers.JsonRpcProvider(url); - const wallet = new ethers.Wallet(process.env.PRIVATE_KEY as string, provider); - - return wallet; -}; - -const deployContract = async ( - hre: HardhatRuntimeEnvironment, - networkName: ParamChainName, - json: boolean = false, - gasLimit: number -) => { - const wallet = initWallet(hre, networkName); - - const connector = getAddress("connector", networkName); - const zetaToken = getAddress("zetaToken", networkName); - - const { abi, bytecode } = await hre.artifacts.readArtifact(contractName); - const factory = new ethers.ContractFactory(abi, bytecode, wallet); - const contract = await factory.deploy(connector, zetaToken, { gasLimit }); - - await contract.deployed(); - if (!json) { - console.log(` -πŸš€ Successfully deployed contract on ${networkName} -πŸ“œ Contract address: ${contract.address}`); - } - return contract.address; -}; - -const setInteractors = async ( - hre: HardhatRuntimeEnvironment, - source: ParamChainName, - contracts: { [key: string]: string }, - json: boolean = false, - gasLimit: number -) => { - if (!json) { - console.log(` -πŸ”— Setting interactors for a contract on ${source}`); - } - const wallet = initWallet(hre, source); - - const { abi, bytecode } = await hre.artifacts.readArtifact(contractName); - const factory = new ethers.ContractFactory(abi, bytecode, wallet); - const contract = factory.attach(contracts[source]); - - for (const counterparty in contracts) { - if (counterparty === source) continue; - - const counterpartyContract = ethers.utils.solidityPack(["address"], [contracts[counterparty]]); - const chainId = hre.config.networks[counterparty].chainId; - await ( - await contract.setInteractorByChainId(chainId, counterpartyContract, { - gasLimit, - }) - ).wait(); - if (!json) { - console.log(`βœ… Interactor address for ${chainId} (${counterparty}) is set to ${counterpartyContract}`); - } - } -}; - -task("deploy", "Deploy the contract", main) - .addParam("networks", "Comma separated list of networks to deploy to") - .addOptionalParam("gasLimit", "Gas limit", 10000000, types.int) - .addFlag("json", "Output JSON"); -``` - -To establish cross-chain messaging between blockchains via ZetaChain, you need -to deploy contracts capable of sending and receiving cross-chain messages to two -or more blockchains connected to ZetaChain. - -You can specify the desired chains by using a `--networks` parameter of the -`deploy` task, which accepts a list of network names separated by commas. For -instance, `--networks sepolia_testnet,bsc_testnet`. - -The `main` function maintains a mapping of network names to their corresponding -deployed contract addresses, iterating over the networks to deploy the contract -on each one. - -The contract's constructor requires three arguments: the connector contract's -address, the ZETA token's address, and the ZETA token consumer contract's -address. These addresses are obtained using ZetaChain's `getAddress`. - -The `main` function subsequently sets interactors for each contract. An -interactor is a mapping between a chain ID of the destination and the contract -address on that chain. - -When deploying to two chains (like Sepolia and BSC testnet), you will invoke -`setInteractorByChainId` on a Sepolia contract and pass the BSC testnet chain ID -(97) and the BSC testnet contract address. You then perform the same operation -on a BSC testnet contract, passing the Sepolia chain ID (11155111) and the -Sepolia contract address. If deploying to more than two chains, you must call -`setInteractorByChainId` for each link between the chains. - -## Interact Task - -The `messaging` task has also created a Hardhat task to interact with the -contract: - -```ts filename="tasks/interact.ts" -import { task } from "hardhat/config"; -import { HardhatRuntimeEnvironment } from "hardhat/types"; -import { parseEther } from "@ethersproject/units"; -import { getAddress } from "@zetachain/protocol-contracts"; - -const main = async (args: any, hre: HardhatRuntimeEnvironment) => { - const [signer] = await hre.ethers.getSigners(); - - const factory = await hre.ethers.getContractFactory("CrossChainZeta"); - const contract = factory.attach(args.contract); - - const destination = hre.config.networks[args.destination]?.chainId; - if (destination === undefined) { - throw new Error(`${args.destination} is not a valid destination chain`); - } - - const value = parseEther(args.amount); - - const zetaTokenAddress = getAddress("zetaToken", hre.network.name as any); - const zetaFactory = await hre.ethers.getContractFactory("ZetaEth"); - const zetaToken = zetaFactory.attach(zetaTokenAddress); - - await (await zetaToken.approve(args.contract, value)).wait(); - - const tx = await contract.connect(signer).sendMessage(destination, value); - - const receipt = await tx.wait(); - if (args.json) { - console.log(JSON.stringify(tx, null, 2)); - } else { - console.log(`πŸ”‘ Using account: ${signer.address}\n`); - console.log(`βœ… The transaction has been broadcasted to ${hre.network.name} -πŸ“ Transaction hash: ${receipt.transactionHash} -`); - } -}; - -task("interact", "Sends a message from one chain to another.", main) - .addFlag("json", "Output JSON") - .addParam("contract", "Contract address") - .addParam("amount", "Token amount to send") - .addParam("destination", "Destination chain"); -``` - -The task accepts the following arguments: - -- `contract`: address of the contract on the source chain -- `amount`: amount of native tokens to send with the transaction -- `destination`: name of the destination chain - -The `main` function uses the `contract` argument to attach to the contract on -the source chain. It then uses the `destination` argument to obtain the -destination chain's chain ID. The function subsequently calls the `sendMessage` -contract method passing `destination` and `value`. - -## Deploy the Contract - -Clear the cache and artifacts, then compile the contract: - -``` -npx hardhat compile --force -``` - -Run the following command to deploy the contract to two networks: - -``` -npx hardhat deploy --networks sepolia_testnet,bsc_testnet -``` - -``` -πŸš€ Successfully deployed contract on bsc_testnet -πŸ“œ Contract address: 0x65D661B68ff1466dedf80685450ac4c684b522BB - -πŸš€ Successfully deployed contract on sepolia_testnet -πŸ“œ Contract address: 0xDEB42ce9d2F32caaA38Bf3107a054951E11575DF - -πŸ”— Setting interactors for a contract on bsc_testnet -βœ… Interactor address for 11155111 (sepolia_testnet) is set to 0xdeb42ce9d2f32caaa38bf3107a054951e11575df - -πŸ”— Setting interactors for a contract on sepolia_testnet -βœ… Interactor address for 97 (bsc_testnet) is set to 0x65d661b68ff1466dedf80685450ac4c684b522bb -``` - -## Send ZETA - -Run the following command to send ZETA tokens from Sepolia to BSC testnet. -Please, note that since the contract expect ZETA tokens as fees, the value of -the `--amount` param is denominated in ZETA tokens. A fraction of the amount -will be deducted as a cross-chain fee, the rest will be sent to the recipient on -the destination chain. - -``` -npx hardhat interact --contract 0xDEB42ce9d2F32caaA38Bf3107a054951E11575DF --network sepolia_testnet --amount 3 --destination bsc_testnet -``` - -``` -πŸ”‘ Using account: 0x4955a3F38ff86ae92A914445099caa8eA2B9bA32 - -βœ… The transaction has been broadcasted to sepolia_testnet -πŸ“ Transaction hash: 0x90db3fa9e6e169eadae84b2dbfac15c6829807029f7198f1fcf515e6fb4d04cb -``` - -You can check the broadcasted transaction on Sepolia's Etherscan: - -https://sepolia.etherscan.io/tx/0x90db3fa9e6e169eadae84b2dbfac15c6829807029f7198f1fcf515e6fb4d04cb - -Next, you can track the progress of the cross-chain transaction: - -``` -npx hardhat cctx 0x90db3fa9e6e169eadae84b2dbfac15c6829807029f7198f1fcf515e6fb4d04cb -``` - -``` -βœ“ CCTXs on ZetaChain found. - -βœ“ 0xbf258794df4475fc79fec38f9afe3a92bee82477c3af1c9e61912e6b21408bb0: 11155111 β†’ 97: OutboundMined -``` - -## Source Code - -You can find the source code for the example in this tutorial here: - -https://github.com/zeta-chain/example-contracts/tree/main/messaging/zeta diff --git a/src/pages/reference/apps/get-testnet-zeta.mdx b/src/pages/reference/apps/get-testnet-zeta.mdx index 47a16d53..f6a84e73 100644 --- a/src/pages/reference/apps/get-testnet-zeta.mdx +++ b/src/pages/reference/apps/get-testnet-zeta.mdx @@ -13,9 +13,7 @@ across all connected chains. You can view the addresses on respective chains [here](/reference/network/contracts). Check out [Omnichain Smart Contacts](/developers/apps/intro) for more information about developing smart -contracts on ZetaChain, where ZETA is used for gas fees. Check out the -[Connector docs](/developers/evm/connector) for information on how to send ZETA -as well as any data or value via ZetaChain. +contracts on ZetaChain, where ZETA is used for gas fees. ## How to get testnet ZETA diff --git a/src/pages/reference/learn/faq.mdx b/src/pages/reference/learn/faq.mdx index 8aac009f..ee0fdd1d 100644 --- a/src/pages/reference/learn/faq.mdx +++ b/src/pages/reference/learn/faq.mdx @@ -91,18 +91,6 @@ developer and user alike need only trust the network for the delivery of their data and value. Read more about other interoperability solutions and how they compare to ZetaChain in the [whitepaper](https://zetachain.com/whitepaper.pdf). -### How do I develop on ZetaChain? - -You can start building now, and add powerful cross-chain messaging capabilities -to your dApp using ZetaChain's [Connector](/developers/evm/connector) or build -an [omnichain dapp](/developers/apps/intro) that can manage assets on different -chain from a single contract. - -Stay tuned on our Twitter and Discord for the latest updates in our protocol. - ### Is ZetaChain a bridge? How is it different from a bridge? ZetaChain is not a bridge. At its core, ZetaChain is a blockchain and @@ -118,8 +106,8 @@ wrapping/locking. ### What's the difference between ZetaChain messaging and smart contracts? Messaging allows a developer to send data and value between smart contracts, -whether they are on ZetaChain or on external chains. One can deploy smart -contracts on external chains and just pass messages between them through +whether they are on ZetaChain or on connected chains. One can deploy smart +contracts on connected chains and just pass messages between them through ZetaChain in a similar manner to other interoperability messaging protocols like LayerZero, but ZetaChain's interoperable smart contracts let developers maintain omnichain logic within a single place, reducing overhead and enabling smart @@ -136,12 +124,6 @@ ZetaChain validators and team, dApps developers, and end users. The dApps developers should build in the capability to resolve inconsistent states due to the very deep re-organization. -### What happens if a TX on the destination chain doesn't have enough gas? - -Same answer as above. The transaction is reverted and funds are returned to the -sender if the destination transaction is unable to successfully send. dApps can -handle reverts easily with the [Connector docs](/developers/evm/connector). - ### Is there an interface where we can run a PoS validator? Check out the validator docs [here](/nodes/start-here/requirements). diff --git a/src/pages/reference/learn/glossary.mdx b/src/pages/reference/learn/glossary.mdx index 0f433a60..5a1a64a9 100644 --- a/src/pages/reference/learn/glossary.mdx +++ b/src/pages/reference/learn/glossary.mdx @@ -10,12 +10,6 @@ Every EVM chain has their own, unique id, represented by a number. [Chainlist](https://chainlist.org/) is a great resource to find EVM chain ids by chain name. -## Connector Contract - -Smart contracts on connected chains like Ethereum or Arbitrum interact with -ZetaChain by passing/receiving messages from ZetaChain's Connector Contracts, -which are deployed on each connected chain. - ## Core Validator ZetaChain uses the Tendermint consensus protocol which is a partially @@ -53,7 +47,7 @@ Blanket term for apps or concepts that span multiple blockchains. The observers watch externally connected chains for certain relevant transactions/events/states at particular addresses via their full nodes of -external chains. +connected chains. ## Omnichain @@ -68,7 +62,7 @@ Messaging value and/or data between chains seamlessly (via ZetaChain). ## Omnichain smart contracts ZetaChain's native smart contracts are omnichain, meaning that they can manage, -read, and write state to/from external chains. These smart contracts are the +read, and write state to/from connected chains. These smart contracts are the first of their kind, and unlock a new paradigm of dApps that transcend individual chains and layers. @@ -82,12 +76,12 @@ source chain. ## Signer Validator The ZetaChain collectively holds standard ECDSA/EdDSA keys for authenticated -interaction with external chains. The keys are distributed among multiple +interaction with connected chains. The keys are distributed among multiple signers in such a way that only a super majority of them can sign on behalf of the ZetaChain. Its important to ensure that at no time is any single entity or -small fraction of nodes able to sign messages on behalf of ZetaChain on external -chains. The ZetaChain system uses bonded stakes and positive/negative incentives -to ensure economic safety +small fraction of nodes able to sign messages on behalf of ZetaChain on +connected chains. The ZetaChain system uses bonded stakes and positive/negative +incentives to ensure economic safety ## TSS diff --git a/src/pages/users/keplr/setup.mdx b/src/pages/users/keplr/setup.mdx index 7d1db55f..6006ceec 100644 --- a/src/pages/users/keplr/setup.mdx +++ b/src/pages/users/keplr/setup.mdx @@ -17,7 +17,9 @@ either create a new account, import an existing one or use a hardware wallet. ![Keplr - Connect Wallet](/img/docs/keplr-setup.png) -To add ZetaChain to Keplr: +# Add ZetaChain Testnet + +To add ZetaChain Testnet to Keplr: - go to https://chains.keplr.app/ - Type "ZetaChain" in the search box @@ -28,3 +30,23 @@ To add ZetaChain to Keplr: Now open the Keplr extension and you should see your ZetaChain balance: Keplr extension + + +# Add ZetaChain Mainnet + +To add ZetaChain Mainnet to Keplr: + +Go to the menu in the extension and click "Manage Chain Visibility". + +Keplr menu + +It will jump to the browser, then: + +- Type "ZetaChain" in the search box +- Check ZetaChain and click the "Save" button + +![Keplr](/img/docs/keplr-add-zetachain-mainnet.png) + +Now open the Keplr extension and you should see your ZetaChain Mainnet balance: + +Keplr balance \ No newline at end of file diff --git a/src/pages/users/keplr/staking.mdx b/src/pages/users/keplr/staking.mdx new file mode 100644 index 00000000..ddcb62d4 --- /dev/null +++ b/src/pages/users/keplr/staking.mdx @@ -0,0 +1,50 @@ +--- +title: Staking Tokens +--- + +import Image from "next/image"; + +import { basePath } from "~/lib/app.constants"; + +Staking tokens is a crucial part of participating in the ZetaChain network. By staking your ZETA tokens, you contribute to the network's security and stability, while also earning rewards. This guide will walk you through the process of staking your ZETA tokens using the Keplr extension. + +To stake your ZETA tokens, start by opening the Keplr extension and switching to the "Staked" interface: + +Keplr staking + + +Next, click on "Stake with Keplr Dashboard". This will open a new browser window. In the search bar, type "ZetaChain": + +![Keplr Staking Dashboard](/img/docs/keplr-staking-dashboard.png) + + +From the search results, click on "ZetaChain", which will take you to the "Validators" page: + +![Keplr Staking Validators](/img/docs/keplr-staking-validators.png) + + +Select the validator you wish to stake with and click on it. This will display some basic information about the chosen validator on the right side of the screen: + +![Keplr Validator Overview](/img/docs/keplr-validator-overview.png) + + +Click the "Stake" button to proceed to the staking interface. Enter the amount of ZETA you want to stake and click the "Stake" button again to confirm your staking: + +Keplr staking confirm + + +Review the transaction details and click "Approve" to sign and broadcast the +transaction: + +Keplr extension - Confirm Transaction + + +Return to the Staked interface in Keplr, and you will see the amount of ZETA you just staked along with your rewards. + +Keplr staking result + diff --git a/src/pages/users/keplr/voting.mdx b/src/pages/users/keplr/voting.mdx new file mode 100644 index 00000000..fcf571c7 --- /dev/null +++ b/src/pages/users/keplr/voting.mdx @@ -0,0 +1,36 @@ +--- +title: Voting on Governance Proposals +--- + +import Image from "next/image"; + +import { basePath } from "~/lib/app.constants"; + +Voting on proposals is an important part of participating in the governance of ZetaChain, allowing you to have a say in the future direction and decisions of the network. Your vote matters, and this guide will help you navigate the voting process using Keplr extension. + +To vote on proposals for ZetaChain, follow these steps: + +Visit the [Keplr ZetaChain Governance](https://wallet.keplr.app/chains/zetachain?tab=governance). + +![Keplr ZetaChain Governance Dashboard](/img/docs/keplr-governance-dashboard.png) + +Proposals can have three statuses: "Passed", "Rejected", and "Voting". To view only the proposals that are currently open for voting, select "Voting-Period" from the filter box in the upper-right corner of the proposals list. + +Click on the proposal you are interested in to view its details. + +Once you are on the proposal details page, you can read the full description of the proposal, including its goals, potential impacts, and any additional information provided by the proposer. After reviewing the proposal, you will see options to cast your vote. + +To vote: + +- Click the "Vote" button in the upper-right corner. +- Select your voting option (e.g., Yes, No, No with Veto, Abstain). + - Yes: Support the proposal. + - No: Oppose the proposal. + - No with Veto: Strongly oppose the proposal and believe it is harmful; can lead to a veto if a significant portion of votes are "No with Veto". + - Abstain: Neutral stance; neither supports nor opposes the proposal but contributes to the voting process. +- Click the "Confirm" button. +- Approve the transaction in your Keplr extension to submit your vote. + +![Keplr Voting](/img/docs/keplr-voting.png) + +After voting, you can monitor the status of the proposal and see the results once the voting period ends. Staying engaged with the governance process helps ensure that the decisions made reflect the collective will of the ZetaChain community. \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index b2fbb228..6f8bd93d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2960,7 +2960,7 @@ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0" integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== -"@openzeppelin/contracts@^4.9.2": +"@openzeppelin/contracts@^4.9.6": version "4.9.6" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.6.tgz#2a880a24eb19b4f8b25adc2a5095f2aa27f39677" integrity sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA== @@ -5267,31 +5267,31 @@ typescript "5.0.4" zod "3.22.4" -"@zetachain/networks@6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@zetachain/networks/-/networks-6.0.0.tgz#ae5d3cd1678b32510edfaa71f8f4a6f4cbc1d9ab" - integrity sha512-yKFVP/yJDp76Q5lBGfZSpY/KO3TZ9ldo0lhE4MpBW43EsBxOZWixg6sqb56mcU/gg1lbWG8sHHWtYFK51SByjQ== +"@zetachain/networks@7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@zetachain/networks/-/networks-7.0.0.tgz#a5f8a188d633e2064ee7c77499351381ba891441" + integrity sha512-/amSq+KNJe+EGj0ioZS+DZJtsnbPSDotp9LsrAbaEVMAxKvBK/XkvggH73sJyRWWeMpfhHrNPlrKTLrN+mRkIg== dependencies: dotenv "^16.1.4" -"@zetachain/protocol-contracts@7.0.0-rc1": - version "7.0.0-rc1" - resolved "https://registry.yarnpkg.com/@zetachain/protocol-contracts/-/protocol-contracts-7.0.0-rc1.tgz#588483d1ec70e572b7e40e84ef5b34282b0ab375" - integrity sha512-vgS+Pjh4MysOyw8WbqTQVBsHJYqKvMcdV7cNVqxaTJd/dl2ak7NNvsIeaeUnxQrp8XfQol2B8GXJpVLM6MK/dg== +"@zetachain/protocol-contracts@7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@zetachain/protocol-contracts/-/protocol-contracts-7.0.0.tgz#20eb6c62d805d7470408ccdff0e3614684bca174" + integrity sha512-8JTNFZxVZYmDtAXJIEr+tkakuML12X42Fya4bJ1NkfWiVMkcSej92BSTl/35qYtHdjY7vXy9uMrfXEqfw5rsPw== -"@zetachain/toolkit@6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@zetachain/toolkit/-/toolkit-6.0.0.tgz#385cfd11f1ac39cbb6ca6410109523e2ab6f8841" - integrity sha512-JAtl7CX8cMJ+iw/byjcbLqgCfPS87vkdYCZOPBBOudqUySPTz4owqVgGZB/xYRyXBsF0KW0F6R65sc+fleQ86A== +"@zetachain/toolkit@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@zetachain/toolkit/-/toolkit-10.0.0.tgz#aceb196d139d7c697e20a48012e0674130e1c0b9" + integrity sha512-+Gk5lokCWfqK4Nhm3+TjQb9EgrEyuHcezzxDwvvfjohB0dBor+aRnRyNO1/9+eTqX45M0Cvx4tS51yJCGm0G/g== dependencies: "@inquirer/prompts" "^2.1.1" "@inquirer/select" "1.1.3" "@nomiclabs/hardhat-ethers" "^2.2.3" - "@openzeppelin/contracts" "^4.9.2" + "@openzeppelin/contracts" "^4.9.6" "@uniswap/v2-periphery" "^1.1.0-beta.0" "@zetachain/faucet-cli" "^4.0.1" - "@zetachain/networks" "6.0.0" - "@zetachain/protocol-contracts" "7.0.0-rc1" + "@zetachain/networks" "7.0.0" + "@zetachain/protocol-contracts" "7.0.0" axios "^1.4.0" bech32 "^2.0.0" bip39 "^3.1.0" @@ -13327,6 +13327,7 @@ streamx@^2.15.0, streamx@^2.16.1: bare-events "^2.2.0" "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + name string-width-cjs version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -14594,6 +14595,7 @@ workerpool@6.2.1: integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + name wrap-ansi-cjs version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==