diff --git a/404.html b/404.html index 325db685ed..ebd878b2ed 100644 --- a/404.html +++ b/404.html @@ -14,13 +14,13 @@ Page Not Found | Giveth Docs - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- - + + \ No newline at end of file diff --git a/angelVault/index.html b/angelVault/index.html index 4d656053af..9e1c7e26fe 100644 --- a/angelVault/index.html +++ b/angelVault/index.html @@ -14,17 +14,17 @@ The Angel Vault (Deprecated) | Giveth Docs - - + +
-
Skip to main content

The Angel Vault (Deprecated)

Then Angel Vault has been deprecated. This documentation will remain purely for historical reference.

The Angel Vault is a strategically managed Univ3 position structured to protect GIV from downward volatility. It is managed by our Angel Vault multisig, a 4/7 multisig of Giveth core team members and two members for ICHI. To learn more about Angel Vaults and how they work, please refer to ICHI’s documentation.

Contracts

  • Angel Vault (ICHI) LM (Unipool): 0xA4b727DF6fD608d1835e3440288c73fB28c4eF16
  • Angel Vault (ICHI) LP: 0xc3151A58d519B94E915f66B044De3E55F77c2dd9

oneGIV

oneGIV is a Giveth Branded Dollar (by ICHI) that can be minted using DAI at a 1:1 ratio. This can be done via ICHI’s website. To learn more about ICHI’s branded dollar, please refer to their documentation.

oneGIV is minted using 100% DAI, and is also over-collateralized by GIV. The contract holds GIV as additional collateral in case there is some issue with the DAI. All mints & burns of oneGIV happen via a contract managed by our Angel Vault multisig.

Over time, the Giveth DAO may vote to change the minting ratio from 100% DAI to a combination of DAI and GIV (e.g. 80% DAI, 20% GIV). However, to keep the peg to the dollar, burning oneGIV to redeem DAI will always result in 100% DAI.

Providing & Removing Liquidity

Liquidity providers can add liquidity to the Angel Vault using oneGIV via ICHI’s website, and then stake their LP tokens in the GIVfarm. Because this oneGIV is added to a oneGIV / GIV Univ3 position, when you remove liquidity you will get oneGIV & GIV proportional to the holdings in the Angel Vault.

Earning Rewards

Rewards are given to liquidity providers in proportion to the liquidity provided. When you stake your LP tokens, you earn rewards in two parts:

  1. The 1% Uniswap fee which automatically increase your Angel Vault position (IRR).
  2. GIV incentives from within the GIVfarm, which as always, are distributed according to the GIVstream. Check out the GIViverse Expansion to understand how much your claimable rewards will be.

The APR shown in the GIVfarm oneGIV/GIV staking pool is the sum of these two reward rates.

angel vault staking farm staking card

Distribution of GIV rewards to Angel Vault LP Stakers

A total of 6 Million GIV has been allocated to run a rewards program for Angel Vault LP stakers for 26 weeks from the start date August 4, 2022. The amount of rewards being sent out throughout each two week period is as follows:

WeekGIV Rewarded (within the 2 week period)% of rewards
Week 1485,1438.09%
Week 3569,1439.49%
Week 5140,0002.33%
Week 7653,14310.89%
Week 9140,0002.33%
Week 11737,14312.29%
Week 13140,0002.33%
Week 15821,14313.69%
Week 17140,0002.33%
Week 19905,14315.09%
Week 21140,0002.33%
Week 23989,14316.49%
Week 25140,0002.32%

Incentives Plan — The Jagged Staircase

When the Angel Vault is initialized, the entirety of its liquidity will be in oneGIV. This is beneficial as the Angel Vault works best when there is a high percentage of oneGIV in the vault, but this percentage does not stay stable over time. +

The Angel Vault (Deprecated)

Then Angel Vault has been deprecated. This documentation will remain purely for historical reference.

The Angel Vault is a strategically managed Univ3 position structured to protect GIV from downward volatility. It is managed by our Angel Vault multisig, a 4/7 multisig of Giveth core team members and two members for ICHI. To learn more about Angel Vaults and how they work, please refer to ICHI’s documentation.

Contracts

  • Angel Vault (ICHI) LM (Unipool): 0xA4b727DF6fD608d1835e3440288c73fB28c4eF16
  • Angel Vault (ICHI) LP: 0xc3151A58d519B94E915f66B044De3E55F77c2dd9

oneGIV

oneGIV is a Giveth Branded Dollar (by ICHI) that can be minted using DAI at a 1:1 ratio. This can be done via ICHI’s website. To learn more about ICHI’s branded dollar, please refer to their documentation.

oneGIV is minted using 100% DAI, and is also over-collateralized by GIV. The contract holds GIV as additional collateral in case there is some issue with the DAI. All mints & burns of oneGIV happen via a contract managed by our Angel Vault multisig.

Over time, the Giveth DAO may vote to change the minting ratio from 100% DAI to a combination of DAI and GIV (e.g. 80% DAI, 20% GIV). However, to keep the peg to the dollar, burning oneGIV to redeem DAI will always result in 100% DAI.

Providing & Removing Liquidity

Liquidity providers can add liquidity to the Angel Vault using oneGIV via ICHI’s website, and then stake their LP tokens in the GIVfarm. Because this oneGIV is added to a oneGIV / GIV Univ3 position, when you remove liquidity you will get oneGIV & GIV proportional to the holdings in the Angel Vault.

Earning Rewards

Rewards are given to liquidity providers in proportion to the liquidity provided. When you stake your LP tokens, you earn rewards in two parts:

  1. The 1% Uniswap fee which automatically increase your Angel Vault position (IRR).
  2. GIV incentives from within the GIVfarm, which as always, are distributed according to the GIVstream. Check out the GIViverse Expansion to understand how much your claimable rewards will be.

The APR shown in the GIVfarm oneGIV/GIV staking pool is the sum of these two reward rates.

angel vault staking farm staking card

Distribution of GIV rewards to Angel Vault LP Stakers

A total of 6 Million GIV has been allocated to run a rewards program for Angel Vault LP stakers for 26 weeks from the start date August 4, 2022. The amount of rewards being sent out throughout each two week period is as follows:

WeekGIV Rewarded (within the 2 week period)% of rewards
Week 1485,1438.09%
Week 3569,1439.49%
Week 5140,0002.33%
Week 7653,14310.89%
Week 9140,0002.33%
Week 11737,14312.29%
Week 13140,0002.33%
Week 15821,14313.69%
Week 17140,0002.33%
Week 19905,14315.09%
Week 21140,0002.33%
Week 23989,14316.49%
Week 25140,0002.32%

Incentives Plan — The Jagged Staircase

When the Angel Vault is initialized, the entirety of its liquidity will be in oneGIV. This is beneficial as the Angel Vault works best when there is a high percentage of oneGIV in the vault, but this percentage does not stay stable over time. The ratio of GIV goes up when there is sell pressure in the market on the GIV token. The ratio of oneGIV goes up when new Angel Vault LP positions are created. The ratio of GIV/oneGIV stays the same when Angel Vault LP positions are removed. -We therefore want to encourage liquidity providers to periodically withdraw liquidity —  removing some % of GIV from the pool — and then re-add liquidity in oneGIV, increasing the total concentration of stables in the Angel Vault. This will help to support the strength of the Angel Vault buy-wall.

rewards distribution schedule for jagged staircase
- - +We therefore want to encourage liquidity providers to periodically withdraw liquidity —  removing some % of GIV from the pool — and then re-add liquidity in oneGIV, increasing the total concentration of stables in the Angel Vault. This will help to support the strength of the Angel Vault buy-wall.

rewards distribution schedule for jagged staircase
+ + \ No newline at end of file diff --git a/assets/js/01b09a56.90e2eaa2.js b/assets/js/01b09a56.90e2eaa2.js deleted file mode 100644 index e5fc1f16a2..0000000000 --- a/assets/js/01b09a56.90e2eaa2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[739],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>m});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),o=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=o(e.components);return n.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,d=c(e,["components","mdxType","originalType","parentName"]),u=o(a),m=r,f=u["".concat(s,".").concat(m)]||u[m]||p[m]||i;return a?n.createElement(f,l(l({ref:t},d),{},{components:a})):n.createElement(f,l({ref:t},d))}));function m(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=u;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,l[1]=c;for(var o=2;o{a.d(t,{ZP:()=>l});var n=a(7462),r=(a(7294),a(3905));const i={toc:[]};function l(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},i,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},(0,r.kt)("strong",{parentName:"em"},"Giveth TRACE has officially been deprecated. After 5 years of faithful service, Giveth and its platform, services and products have fully migrated to ",(0,r.kt)("a",{parentName:"strong",href:"https://giveth.io"},"Giveth.io"),". With the deprecation of the Rinkeby network and low user activity, the Giveth DAO decided to sunset its original dApp in Q3 of 2022. The code has and will forever be open-source, and you can find it in ",(0,r.kt)("a",{parentName:"strong",href:"https://github.com/Giveth"},"Giveth's Github repositories"),"."))),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},(0,r.kt)("strong",{parentName:"em"},"This documentation will remain available for historical reference."))),(0,r.kt)("hr",null))}l.isMDXComponent=!0},3914:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>c,default:()=>u,frontMatter:()=>l,metadata:()=>s,toc:()=>d});var n=a(7462),r=(a(7294),a(3905)),i=a(8932);const l={id:"traceContracts",title:"Contracts, Bridges and Multisigs Technical Information",slug:"dapps/traceContracts"},c=void 0,s={unversionedId:"traceContracts",id:"traceContracts",title:"Contracts, Bridges and Multisigs Technical Information",description:"Contracts:",source:"@site/dapps/traceContracts.md",sourceDirName:".",slug:"/dapps/traceContracts",permalink:"/dapps/traceContracts",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/traceContracts.md",tags:[],version:"current",lastUpdatedBy:"Mitch Oz",lastUpdatedAt:1693588589,formattedLastUpdatedAt:"Sep 1, 2023",frontMatter:{id:"traceContracts",title:"Contracts, Bridges and Multisigs Technical Information",slug:"dapps/traceContracts"},sidebar:"dapps",previous:{title:"Exchange Rates",permalink:"/dapps/exchangeRates"}},o={},d=[{value:"Contracts:",id:"contracts",level:2},{value:"Mainnet multisigs:",id:"mainnet-multisigs",level:4},{value:"Rinkeby multisigs:",id:"rinkeby-multisigs",level:4},{value:"Contract Roles/params:",id:"contract-rolesparams",level:2},{value:"Mainnet",id:"mainnet",level:3},{value:"Rinkeby",id:"rinkeby",level:3},{value:"Liquid Pledging Contracts (Rinkeby)",id:"liquid-pledging-contracts-rinkeby",level:4}],p={toc:d};function u(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)(i.ZP,{mdxType:"TraceDeprecated"}),(0,r.kt)("h2",{id:"contracts"},"Contracts:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"GivethBridge on Mainnet"),(0,r.kt)("li",{parentName:"ul"},"ForeignGivethBridge on Rinkeby"),(0,r.kt)("li",{parentName:"ul"},"LiquidPledging contracts on Rinkeby"),(0,r.kt)("li",{parentName:"ul"},"Escapable contracts to Mainnet for each contract on Rinkeby")),(0,r.kt)("h4",{id:"mainnet-multisigs"},"Mainnet multisigs:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://etherscan.io/address/0x4D9339dd97db55e3B9bCBE65dE39fF9c04d1C2cd"},"Giveth Mainnet: 0x4D9339dd97db55e3B9bCBE65dE39fF9c04d1C2cd")," (6 of 13 multisig)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://etherscan.io/address/0x16fda2fcc887dd7ac65c46be144473067cff8654"},"Giveth Overflow: 0x16fda2fcc887dd7ac65c46be144473067cff8654")," (4 of 7 multisig)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://etherscan.io/address/0x1e9f6746147e937e8e1c29180e15af0bd5fd64bb"},"EscapeHatch Caller: 0x1e9f6746147e937e8e1c29180e15af0bd5fd64bb")," (1 of x multisig)")),(0,r.kt)("h4",{id:"rinkeby-multisigs"},"Rinkeby multisigs:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0xc3b2128ca330871037d35fdc5f7b05e195aac5ce"},"EscapeHatch Caller: 0xc3b2128ca330871037d35fdc5f7b05e195aac5ce")," (1 of x multisig)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0x20fc2ec2518dec7041b4c3e82663d6071bae953f"},"Dapp God/EscapeHatch Destination: 0x20fc2ec2518dec7041b4c3e82663d6071bae953f")," (3 of 6 multisig)")),(0,r.kt)("h2",{id:"contract-rolesparams"},"Contract Roles/params:"),(0,r.kt)("h3",{id:"mainnet"},"Mainnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://etherscan.io/address/0x30f938fED5dE6e06a9A7Cd2Ac3517131C317B1E7"},(0,r.kt)("strong",{parentName:"a"},"GivethBridge"),": 0x30f938fED5dE6e06a9A7Cd2Ac3517131C317B1E7"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Owns the bridge."),(0,r.kt)("li",{parentName:"ul"},"Receives and deals with donations."),(0,r.kt)("li",{parentName:"ul"},"Can cancel payments in the bridge."),(0,r.kt)("li",{parentName:"ul"},"Can pause and unpause the bridge."),(0,r.kt)("li",{parentName:"ul"},"Add tokens to whitelist."),(0,r.kt)("li",{parentName:"ul"},"Can change the max security guard delay."),(0,r.kt)("li",{parentName:"ul"},"Can change the security guard."),(0,r.kt)("li",{parentName:"ul"},"Can change the 2 day time lock in the bridge."),(0,r.kt)("li",{parentName:"ul"},"Can change the escape hatch caller."),(0,r.kt)("li",{parentName:"ul"},"Can remove/change ownership."),(0,r.kt)("li",{parentName:"ul"},"Can call the ",(0,r.kt)("inlineCode",{parentName:"li"},"escapeHatch(address _token)")," in an emergency to move all the money out of the bridge for the specified token."),(0,r.kt)("li",{parentName:"ul"},"Can call ",(0,r.kt)("inlineCode",{parentName:"li"},"escapeFunds(address _token, uint _amount) ")," to move some of the money out of the bridge to be extra cautious."),(0,r.kt)("li",{parentName:"ul"},"Has all the powers needed to decentralize the bridge."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://etherscan.io/address/0x16fda2fcc887dd7ac65c46be144473067cff8654"},(0,r.kt)("strong",{parentName:"a"},"Giveth Overflow"),": 0x16fda2fcc887dd7ac65c46be144473067cff8654"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Receives overflow/escaped funds from the bridge."),(0,r.kt)("li",{parentName:"ul"},"Sends funds back to the bridge when funds get low using ",(0,r.kt)("inlineCode",{parentName:"li"},"depositEscapedFunds()"),"."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://etherscan.io/address/0x1e9f6746147e937e8e1c29180e15af0bd5fd64bb"},(0,r.kt)("strong",{parentName:"a"},"EscapeHatch Caller"),": 0x1e9f6746147e937e8e1c29180e15af0bd5fd64bb"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Can call the ",(0,r.kt)("inlineCode",{parentName:"li"},"escapeHatch(address _token)")," in an emergency to move all the money out of the bridge for the specified token."),(0,r.kt)("li",{parentName:"ul"},"Can call ",(0,r.kt)("inlineCode",{parentName:"li"},"escapeFunds(address _token, uint _amount) ")," to move some of the money out of the bridge to be extra cautious."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://etherscan.io/address/0xDAa172456F5815256831aeE19C8A370a83522871"},(0,r.kt)("strong",{parentName:"a"},"SecurityGuard"),": 0xDAa172456F5815256831aeE19C8A370a83522871"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"MaxSecurityGuardDelay: 1 month")))),(0,r.kt)("h3",{id:"rinkeby"},"Rinkeby"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0xff9cd5140e79377feb23f6dfaf1f8b558c0fe621"},(0,r.kt)("strong",{parentName:"a"},"ForeignGivethBridge"),": 0xfF9CD5140e79377feB23f6DFaF1f8b558C0FE621"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Mints tokens on Rinkeby."),(0,r.kt)("li",{parentName:"ul"},"Can delegate tokens to Liquidpledging."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0xc3b2128ca330871037d35fdc5f7b05e195aac5ce"},(0,r.kt)("strong",{parentName:"a"},"EscapeHatch Caller"),": 0xc3b2128ca330871037d35fdc5f7b05e195aac5ce"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"In case there is a weird unexpected movement of Rinkeby tokens (which represent our accounting in the bridge), this Multisig would be able to get the tokens out to maintain our accounting."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0x20fc2ec2518dec7041b4c3e82663d6071bae953f"},(0,r.kt)("strong",{parentName:"a"},"Dapp God/EscapeHatch Destination"),": 0x20fc2ec2518dec7041b4c3e82663d6071bae953f"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"This multisig has a special place in the AragonApp it: authorizes upgrades to any smart contract in our system."),(0,r.kt)("li",{parentName:"ul"},"Also acts as the escape hatch destination for the Rinkeby LP Vault."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0xf3012a211facf4a1590086a14482aaa88397af15"},(0,r.kt)("strong",{parentName:"a"},"Token Factory:")," 0xf3012a211fAcf4a1590086A14482Aaa88397aF15"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Mints Minime tokens to be sent to Liquid Pledging.")))),(0,r.kt)("h4",{id:"liquid-pledging-contracts-rinkeby"},"Liquid Pledging Contracts (Rinkeby)"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0xa2b1485bd9ad623b9e51fc41952b226313250ada"},"LPVault: 0xA2B1485Bd9ad623b9e51FC41952B226313250Ada"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Constructor params: None"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0x8eb047585abed935a73ba4b9525213f126a0c979"},"LiquidPledging: 0x8eB047585ABeD935a73ba4b9525213F126A0c979"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Constructor params: None"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0x71408CE2125b1F07f614b93C8Bd0340e8Fc31CFA"},"LPPCampaignFactory: 0x71408CE2125b1F07f614b93C8Bd0340e8Fc31CFA"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Constructor params: 000000000000000000000000a018199569d94c9dfb6de1d8e8cb37928f20d444"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0x8e8d4840568c786e2e4c83c761ca002f256ad9c2"},"milestoneFactoryAddress: 0x8E8d4840568c786E2e4c83C761ca002F256aD9c2"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Constructor params: 000000000000000000000000a018199569d94c9dfb6de1d8e8cb37928f20d444"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0x19e88e279844f0201079b39c736a94b87b32b6b6"},"LPPCappedMilestoneFactory: 0x19e88e279844f0201079b39c736a94b87b32b6b6"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Constructor params: 000000000000000000000000a018199569d94c9dfb6de1d8e8cb37928f20d444")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"NOTE:")," All escapeHatches for liquidPledging contracts (not bridge) have been replaced with the recoveryVault functionality of AragonOS. We will register 1 recoveryVault (Giveth Multisig on Rinkeby) in the kernel and all app will be \u201cescapable\u201d to that vault."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Wallet Funding Account:")," 0xf94230D278b36a29fD1363Bd57D12AEb8b8D426B"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/01b09a56.b6d304e7.js b/assets/js/01b09a56.b6d304e7.js new file mode 100644 index 0000000000..4075081770 --- /dev/null +++ b/assets/js/01b09a56.b6d304e7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[739],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>m});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=n.createContext({}),s=function(e){var t=n.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=s(e.components);return n.createElement(o.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,o=e.parentName,d=c(e,["components","mdxType","originalType","parentName"]),u=s(a),m=r,f=u["".concat(o,".").concat(m)]||u[m]||p[m]||i;return a?n.createElement(f,l(l({ref:t},d),{},{components:a})):n.createElement(f,l({ref:t},d))}));function m(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=u;var c={};for(var o in t)hasOwnProperty.call(t,o)&&(c[o]=t[o]);c.originalType=e,c.mdxType="string"==typeof e?e:r,l[1]=c;for(var s=2;s{a.d(t,{ZP:()=>l});var n=a(7462),r=(a(7294),a(3905));const i={toc:[]};function l(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},i,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},(0,r.kt)("strong",{parentName:"em"},"Giveth TRACE has officially been deprecated. After 5 years of faithful service, Giveth and its platform, services and products have fully migrated to ",(0,r.kt)("a",{parentName:"strong",href:"https://giveth.io"},"Giveth.io"),". With the deprecation of the Rinkeby network and low user activity, the Giveth DAO decided to sunset its original dApp in Q3 of 2022. The code has and will forever be open-source, and you can find it in ",(0,r.kt)("a",{parentName:"strong",href:"https://github.com/Giveth"},"Giveth's Github repositories"),"."))),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},(0,r.kt)("strong",{parentName:"em"},"This documentation will remain available for historical reference."))),(0,r.kt)("hr",null))}l.isMDXComponent=!0},3914:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>c,default:()=>u,frontMatter:()=>l,metadata:()=>o,toc:()=>d});var n=a(7462),r=(a(7294),a(3905)),i=a(8932);const l={id:"traceContracts",title:"Contracts, Bridges and Multisigs Technical Information",slug:"dapps/traceContracts"},c=void 0,o={unversionedId:"traceContracts",id:"traceContracts",title:"Contracts, Bridges and Multisigs Technical Information",description:"Contracts:",source:"@site/dapps/traceContracts.md",sourceDirName:".",slug:"/dapps/traceContracts",permalink:"/dapps/traceContracts",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/traceContracts.md",tags:[],version:"current",lastUpdatedBy:"Mitch Oz",lastUpdatedAt:1693588589,formattedLastUpdatedAt:"Sep 1, 2023",frontMatter:{id:"traceContracts",title:"Contracts, Bridges and Multisigs Technical Information",slug:"dapps/traceContracts"},sidebar:"dapps",previous:{title:"Exchange Rates",permalink:"/dapps/exchangeRates"},next:{title:"$nice Token (Depcrecated)",permalink:"/giveconomy/niceToken"}},s={},d=[{value:"Contracts:",id:"contracts",level:2},{value:"Mainnet multisigs:",id:"mainnet-multisigs",level:4},{value:"Rinkeby multisigs:",id:"rinkeby-multisigs",level:4},{value:"Contract Roles/params:",id:"contract-rolesparams",level:2},{value:"Mainnet",id:"mainnet",level:3},{value:"Rinkeby",id:"rinkeby",level:3},{value:"Liquid Pledging Contracts (Rinkeby)",id:"liquid-pledging-contracts-rinkeby",level:4}],p={toc:d};function u(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)(i.ZP,{mdxType:"TraceDeprecated"}),(0,r.kt)("h2",{id:"contracts"},"Contracts:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"GivethBridge on Mainnet"),(0,r.kt)("li",{parentName:"ul"},"ForeignGivethBridge on Rinkeby"),(0,r.kt)("li",{parentName:"ul"},"LiquidPledging contracts on Rinkeby"),(0,r.kt)("li",{parentName:"ul"},"Escapable contracts to Mainnet for each contract on Rinkeby")),(0,r.kt)("h4",{id:"mainnet-multisigs"},"Mainnet multisigs:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://etherscan.io/address/0x4D9339dd97db55e3B9bCBE65dE39fF9c04d1C2cd"},"Giveth Mainnet: 0x4D9339dd97db55e3B9bCBE65dE39fF9c04d1C2cd")," (6 of 13 multisig)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://etherscan.io/address/0x16fda2fcc887dd7ac65c46be144473067cff8654"},"Giveth Overflow: 0x16fda2fcc887dd7ac65c46be144473067cff8654")," (4 of 7 multisig)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://etherscan.io/address/0x1e9f6746147e937e8e1c29180e15af0bd5fd64bb"},"EscapeHatch Caller: 0x1e9f6746147e937e8e1c29180e15af0bd5fd64bb")," (1 of x multisig)")),(0,r.kt)("h4",{id:"rinkeby-multisigs"},"Rinkeby multisigs:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0xc3b2128ca330871037d35fdc5f7b05e195aac5ce"},"EscapeHatch Caller: 0xc3b2128ca330871037d35fdc5f7b05e195aac5ce")," (1 of x multisig)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0x20fc2ec2518dec7041b4c3e82663d6071bae953f"},"Dapp God/EscapeHatch Destination: 0x20fc2ec2518dec7041b4c3e82663d6071bae953f")," (3 of 6 multisig)")),(0,r.kt)("h2",{id:"contract-rolesparams"},"Contract Roles/params:"),(0,r.kt)("h3",{id:"mainnet"},"Mainnet"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://etherscan.io/address/0x30f938fED5dE6e06a9A7Cd2Ac3517131C317B1E7"},(0,r.kt)("strong",{parentName:"a"},"GivethBridge"),": 0x30f938fED5dE6e06a9A7Cd2Ac3517131C317B1E7"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Owns the bridge."),(0,r.kt)("li",{parentName:"ul"},"Receives and deals with donations."),(0,r.kt)("li",{parentName:"ul"},"Can cancel payments in the bridge."),(0,r.kt)("li",{parentName:"ul"},"Can pause and unpause the bridge."),(0,r.kt)("li",{parentName:"ul"},"Add tokens to whitelist."),(0,r.kt)("li",{parentName:"ul"},"Can change the max security guard delay."),(0,r.kt)("li",{parentName:"ul"},"Can change the security guard."),(0,r.kt)("li",{parentName:"ul"},"Can change the 2 day time lock in the bridge."),(0,r.kt)("li",{parentName:"ul"},"Can change the escape hatch caller."),(0,r.kt)("li",{parentName:"ul"},"Can remove/change ownership."),(0,r.kt)("li",{parentName:"ul"},"Can call the ",(0,r.kt)("inlineCode",{parentName:"li"},"escapeHatch(address _token)")," in an emergency to move all the money out of the bridge for the specified token."),(0,r.kt)("li",{parentName:"ul"},"Can call ",(0,r.kt)("inlineCode",{parentName:"li"},"escapeFunds(address _token, uint _amount) ")," to move some of the money out of the bridge to be extra cautious."),(0,r.kt)("li",{parentName:"ul"},"Has all the powers needed to decentralize the bridge."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://etherscan.io/address/0x16fda2fcc887dd7ac65c46be144473067cff8654"},(0,r.kt)("strong",{parentName:"a"},"Giveth Overflow"),": 0x16fda2fcc887dd7ac65c46be144473067cff8654"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Receives overflow/escaped funds from the bridge."),(0,r.kt)("li",{parentName:"ul"},"Sends funds back to the bridge when funds get low using ",(0,r.kt)("inlineCode",{parentName:"li"},"depositEscapedFunds()"),"."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://etherscan.io/address/0x1e9f6746147e937e8e1c29180e15af0bd5fd64bb"},(0,r.kt)("strong",{parentName:"a"},"EscapeHatch Caller"),": 0x1e9f6746147e937e8e1c29180e15af0bd5fd64bb"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Can call the ",(0,r.kt)("inlineCode",{parentName:"li"},"escapeHatch(address _token)")," in an emergency to move all the money out of the bridge for the specified token."),(0,r.kt)("li",{parentName:"ul"},"Can call ",(0,r.kt)("inlineCode",{parentName:"li"},"escapeFunds(address _token, uint _amount) ")," to move some of the money out of the bridge to be extra cautious."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://etherscan.io/address/0xDAa172456F5815256831aeE19C8A370a83522871"},(0,r.kt)("strong",{parentName:"a"},"SecurityGuard"),": 0xDAa172456F5815256831aeE19C8A370a83522871"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"MaxSecurityGuardDelay: 1 month")))),(0,r.kt)("h3",{id:"rinkeby"},"Rinkeby"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0xff9cd5140e79377feb23f6dfaf1f8b558c0fe621"},(0,r.kt)("strong",{parentName:"a"},"ForeignGivethBridge"),": 0xfF9CD5140e79377feB23f6DFaF1f8b558C0FE621"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Mints tokens on Rinkeby."),(0,r.kt)("li",{parentName:"ul"},"Can delegate tokens to Liquidpledging."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0xc3b2128ca330871037d35fdc5f7b05e195aac5ce"},(0,r.kt)("strong",{parentName:"a"},"EscapeHatch Caller"),": 0xc3b2128ca330871037d35fdc5f7b05e195aac5ce"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"In case there is a weird unexpected movement of Rinkeby tokens (which represent our accounting in the bridge), this Multisig would be able to get the tokens out to maintain our accounting."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0x20fc2ec2518dec7041b4c3e82663d6071bae953f"},(0,r.kt)("strong",{parentName:"a"},"Dapp God/EscapeHatch Destination"),": 0x20fc2ec2518dec7041b4c3e82663d6071bae953f"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"This multisig has a special place in the AragonApp it: authorizes upgrades to any smart contract in our system."),(0,r.kt)("li",{parentName:"ul"},"Also acts as the escape hatch destination for the Rinkeby LP Vault."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0xf3012a211facf4a1590086a14482aaa88397af15"},(0,r.kt)("strong",{parentName:"a"},"Token Factory:")," 0xf3012a211fAcf4a1590086A14482Aaa88397aF15"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Mints Minime tokens to be sent to Liquid Pledging.")))),(0,r.kt)("h4",{id:"liquid-pledging-contracts-rinkeby"},"Liquid Pledging Contracts (Rinkeby)"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0xa2b1485bd9ad623b9e51fc41952b226313250ada"},"LPVault: 0xA2B1485Bd9ad623b9e51FC41952B226313250Ada"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Constructor params: None"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0x8eb047585abed935a73ba4b9525213f126a0c979"},"LiquidPledging: 0x8eB047585ABeD935a73ba4b9525213F126A0c979"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Constructor params: None"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0x71408CE2125b1F07f614b93C8Bd0340e8Fc31CFA"},"LPPCampaignFactory: 0x71408CE2125b1F07f614b93C8Bd0340e8Fc31CFA"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Constructor params: 000000000000000000000000a018199569d94c9dfb6de1d8e8cb37928f20d444"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0x8e8d4840568c786e2e4c83c761ca002f256ad9c2"},"milestoneFactoryAddress: 0x8E8d4840568c786E2e4c83C761ca002F256aD9c2"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Constructor params: 000000000000000000000000a018199569d94c9dfb6de1d8e8cb37928f20d444"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://rinkeby.etherscan.io/address/0x19e88e279844f0201079b39c736a94b87b32b6b6"},"LPPCappedMilestoneFactory: 0x19e88e279844f0201079b39c736a94b87b32b6b6"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Constructor params: 000000000000000000000000a018199569d94c9dfb6de1d8e8cb37928f20d444")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"NOTE:")," All escapeHatches for liquidPledging contracts (not bridge) have been replaced with the recoveryVault functionality of AragonOS. We will register 1 recoveryVault (Giveth Multisig on Rinkeby) in the kernel and all app will be \u201cescapable\u201d to that vault."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Wallet Funding Account:")," 0xf94230D278b36a29fD1363Bd57D12AEb8b8D426B"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2f9f396f.17ea4bdb.js b/assets/js/2f9f396f.17ea4bdb.js new file mode 100644 index 0000000000..3d1774f1cb --- /dev/null +++ b/assets/js/2f9f396f.17ea4bdb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[4138],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>f});var n=r(7294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var p=n.createContext({}),l=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},d=function(e){var t=l(e.components);return n.createElement(p.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,p=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),h=l(r),f=i,c=h["".concat(p,".").concat(f)]||h[f]||m[f]||a;return r?n.createElement(c,o(o({ref:t},d),{},{components:r})):n.createElement(c,o({ref:t},d))}));function f(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);o[0]=h;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s.mdxType="string"==typeof e?e:i,o[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>p,toc:()=>d});var n=r(7462),i=(r(7294),r(3905)),a=r(4996);const o={id:"regenFarms",title:"Regen Farms"},s=void 0,p={unversionedId:"regenFarms",id:"regenFarms",title:"Regen Farms",description:"RegenFarms is the next generation of ReFi liquidity mining opportunities for DAOs and regens alike. Using our contracts for the GIVfarm and the GIVstream, we are empowering other for-good DAOs to launch liquidity mining incentive programs, \u201cRegenFarms\u201d, with streams of their own.",source:"@site/dapps/regenfarms.md",sourceDirName:".",slug:"/regenFarms",permalink:"/regenFarms",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/regenfarms.md",tags:[],version:"current",lastUpdatedBy:"Lauren",lastUpdatedAt:1649102263,formattedLastUpdatedAt:"Apr 4, 2022",frontMatter:{id:"regenFarms",title:"Regen Farms"},sidebar:"dapps",previous:{title:"GIVfarm",permalink:"/giveconomy/givfarm"},next:{title:"GIVdrop (Finished)",permalink:"/giveconomy/givdrop"}},l={},d=[{value:"Background",id:"background",level:2},{value:"For Interested DAOs",id:"for-interested-daos",level:2},{value:"Funding",id:"funding",level:2},{value:"RegenFarms UI",id:"regenfarms-ui",level:2}],m={toc:d};function h(e){let{components:t,...r}=e;return(0,i.kt)("wrapper",(0,n.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://giveth.io/givfarm"},"RegenFarms")," is the next generation of ReFi liquidity mining opportunities for DAOs and regens alike. Using our contracts for the ",(0,i.kt)("a",{parentName:"p",href:"https://giveth.io/givfarm"},"GIVfarm")," and the ",(0,i.kt)("a",{parentName:"p",href:"https://giveth.io/givstream"},"GIVstream"),", we are empowering other for-good DAOs to launch liquidity mining incentive programs, \u201cRegenFarms\u201d, with streams of their own."),(0,i.kt)("h2",{id:"background"},"Background"),(0,i.kt)("p",null,"Utilizing the ",(0,i.kt)("a",{parentName:"p",href:"https://docs.giveth.io/giveconomy/givstream"},"GIVstream"),", all rewards earned in the ",(0,i.kt)("a",{parentName:"p",href:"https://giveth.io/givfarm"},"GIVfarm")," (until December 23, 2026) include some part liquid and some part streaming. This allows the GIVfarm to offer high APRs without creating excessive sell pressure. Thanks to the GIVstream, Giveth has pioneered an elegant evolution to traditional liquidity mining that offers lucrative rewards while attracting and rewarding long-term hodlers, and keeping participants invested in the project for years to come."),(0,i.kt)("h2",{id:"for-interested-daos"},"For Interested DAOs"),(0,i.kt)("p",null,"We are now offering this technology ",(0,i.kt)("a",{parentName:"p",href:"https://forum.giveth.io/t/crazy-idea-stream-as-a-service-giviverse-multiverse-now-called-regenfarms/295"},"as a service")," to other ",(0,i.kt)("a",{parentName:"p",href:"https://twitter.com/search?q=%23blockchain4good&src=typed_query"},"Blockchain4Good")," DAOs! Interested DAOs must be able to prove that they are a \u201cRegen Economy\u201d, i.e., are creating a positive impact for society such as by supporting or building public goods in some way. ",(0,i.kt)("strong",{parentName:"p"},"If your DAO is interested in applying to kickstart a RegenFarm, ",(0,i.kt)("a",{parentName:"strong",href:"https://giveth.typeform.com/regenfarms"},"fill out this form"),"."),"\nWe use ",(0,i.kt)("a",{parentName:"p",href:"https://snapshot.org/#/giv.eth/"},"snapshot")," to get approval from GIV token holders before accepting a new DAO for RegenFarms. Once accepted, the interested DAO will need to work with our team to provide their RegenFarm ",(0,i.kt)("a",{parentName:"p",href:"https://www.notion.so/giveth/Regen-Farm-Parameters-a5b474e75f334d03ad1c1c43f5d923d4"},"parameters")," and the funds to kickstart their farm."),(0,i.kt)("h2",{id:"funding"},"Funding"),(0,i.kt)("p",null,"To justify the cost of initiating the farm, a base fee of $5000 (equivalent USD value in the DAO\u2019s token) is provided by the RegenFarm DAO to Giveth. $2500 of this will be sent to donation.eth for the ",(0,i.kt)("a",{parentName:"p",href:"https://giveth.io/project/donation-eth"},"Giveth Matching Pool")," to fund donations to verified for-good projects. The remaining $2500 will be sent to the ",(0,i.kt)("a",{parentName:"p",href:"https://blockscout.com/xdai/mainnet/address/0xf924fF0f192f0c7c073161e0d62CE7635114e74f/transactions"},"Giveth liquidity multisig")," and will be used by Giveth provide $GIV / ","[DAO token]"," liquidity."),(0,i.kt)("p",null,"RegenFarm DAOs also provide the funds to reward their Liquidity Providers. Before initiating the farm, 1% of these funds are sent to the ",(0,i.kt)("a",{parentName:"p",href:"https://blockscout.com/xdai/mainnet/address/0xf924fF0f192f0c7c073161e0d62CE7635114e74f/transactions"},"Giveth liquidity multisig")," to be used, as above, for liquidity, and an additional 1% of these funds are sent to the ",(0,i.kt)("a",{parentName:"p",href:"https://giveth.io/project/donation-eth"},"Giveth Matching Pool")," to fund donations to verified projects."),(0,i.kt)("h2",{id:"regenfarms-ui"},"RegenFarms UI"),(0,i.kt)("img",{alt:"shapeshift",src:(0,a.Z)("img/Regenfarm1.png")}),(0,i.kt)("p",null,"Liquidity mining opportunities for RegenFarms can be found on the ",(0,i.kt)("a",{parentName:"p",href:"https://giveth.io/givfarm"},"GIVfarm page"),". You can provide liquidity (by following the ",(0,i.kt)("inlineCode",{parentName:"p"},"provide liquidity"),' link at the bottom of the card) and stake LP tokens to begin earning rewards. When you "harvest" your earnings, the liquid part will be sent to your wallet, and the streaming part will kickstart your corresponding RegenStream. Liquid rewards earned from your RegenStream are claimable at the bottom right. Note that when you harvest rewards from the RegenFarm card, all liquid rewards from your RegenStream are also sent to your wallet.'),(0,i.kt)("img",{alt:"foxfarm",src:(0,a.Z)("img/Regenfarm2.png")}),(0,i.kt)("p",null,"To learn more about the RegenFarm's mission, click the ",(0,i.kt)("inlineCode",{parentName:"p"},"?")," in the top right corner of the Regen Farm Card."),(0,i.kt)("hr",null),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://docs.giveth.io/whatisgiveth/"},"Our mission")," at Giveth is to reward and empower those who give. RegenFarms is creating win-win opportunities for everyone who interacts with them. To summarize the benefits:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Blockchain4good DAOs benefit from the ready-made UI, network effects of offering incentives among other Regen Economies, and the novel benefits of combining rewards with a streaming service."),(0,i.kt)("li",{parentName:"ul"},"Stakers benefit from high yields and a wealth of farming opportunities, as well as the opportunity to explore for-good web3 projects."),(0,i.kt)("li",{parentName:"ul"},"Verified projects benefit from boosted Giveth Matching Pool contributions, courtesy of for-good DAOs."),(0,i.kt)("li",{parentName:"ul"},"The GIVeconomy benefits from additional liquidity and strengthened partnerships in the Blockchain4Good ecosystem.")),(0,i.kt)("p",null,"Explore ",(0,i.kt)("a",{parentName:"p",href:"https://giveth.io/givfarm"},"RegenFarms")," today."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2f9f396f.8b5c426e.js b/assets/js/2f9f396f.8b5c426e.js deleted file mode 100644 index dcbe1f6025..0000000000 --- a/assets/js/2f9f396f.8b5c426e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[4138],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>f});var n=r(7294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},d=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),h=p(r),f=i,c=h["".concat(l,".").concat(f)]||h[f]||m[f]||a;return r?n.createElement(c,o(o({ref:t},d),{},{components:r})):n.createElement(c,o({ref:t},d))}));function f(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);o[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:i,o[1]=s;for(var p=2;p{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var n=r(7462),i=(r(7294),r(3905)),a=r(4996);const o={id:"regenFarms",title:"Regen Farms"},s=void 0,l={unversionedId:"regenFarms",id:"regenFarms",title:"Regen Farms",description:"RegenFarms is the next generation of ReFi liquidity mining opportunities for DAOs and regens alike. Using our contracts for the GIVfarm and the GIVstream, we are empowering other for-good DAOs to launch liquidity mining incentive programs, \u201cRegenFarms\u201d, with streams of their own.",source:"@site/dapps/regenfarms.md",sourceDirName:".",slug:"/regenFarms",permalink:"/regenFarms",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/regenfarms.md",tags:[],version:"current",lastUpdatedBy:"Lauren",lastUpdatedAt:1649102263,formattedLastUpdatedAt:"Apr 4, 2022",frontMatter:{id:"regenFarms",title:"Regen Farms"},sidebar:"dapps",previous:{title:"GIVfarm",permalink:"/giveconomy/givfarm"},next:{title:"The Angel Vault (Deprecated)",permalink:"/angelVault"}},p={},d=[{value:"Background",id:"background",level:2},{value:"For Interested DAOs",id:"for-interested-daos",level:2},{value:"Funding",id:"funding",level:2},{value:"RegenFarms UI",id:"regenfarms-ui",level:2}],m={toc:d};function h(e){let{components:t,...r}=e;return(0,i.kt)("wrapper",(0,n.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://giveth.io/givfarm"},"RegenFarms")," is the next generation of ReFi liquidity mining opportunities for DAOs and regens alike. Using our contracts for the ",(0,i.kt)("a",{parentName:"p",href:"https://giveth.io/givfarm"},"GIVfarm")," and the ",(0,i.kt)("a",{parentName:"p",href:"https://giveth.io/givstream"},"GIVstream"),", we are empowering other for-good DAOs to launch liquidity mining incentive programs, \u201cRegenFarms\u201d, with streams of their own."),(0,i.kt)("h2",{id:"background"},"Background"),(0,i.kt)("p",null,"Utilizing the ",(0,i.kt)("a",{parentName:"p",href:"https://docs.giveth.io/giveconomy/givstream"},"GIVstream"),", all rewards earned in the ",(0,i.kt)("a",{parentName:"p",href:"https://giveth.io/givfarm"},"GIVfarm")," (until December 23, 2026) include some part liquid and some part streaming. This allows the GIVfarm to offer high APRs without creating excessive sell pressure. Thanks to the GIVstream, Giveth has pioneered an elegant evolution to traditional liquidity mining that offers lucrative rewards while attracting and rewarding long-term hodlers, and keeping participants invested in the project for years to come."),(0,i.kt)("h2",{id:"for-interested-daos"},"For Interested DAOs"),(0,i.kt)("p",null,"We are now offering this technology ",(0,i.kt)("a",{parentName:"p",href:"https://forum.giveth.io/t/crazy-idea-stream-as-a-service-giviverse-multiverse-now-called-regenfarms/295"},"as a service")," to other ",(0,i.kt)("a",{parentName:"p",href:"https://twitter.com/search?q=%23blockchain4good&src=typed_query"},"Blockchain4Good")," DAOs! Interested DAOs must be able to prove that they are a \u201cRegen Economy\u201d, i.e., are creating a positive impact for society such as by supporting or building public goods in some way. ",(0,i.kt)("strong",{parentName:"p"},"If your DAO is interested in applying to kickstart a RegenFarm, ",(0,i.kt)("a",{parentName:"strong",href:"https://giveth.typeform.com/regenfarms"},"fill out this form"),"."),"\nWe use ",(0,i.kt)("a",{parentName:"p",href:"https://snapshot.org/#/giv.eth/"},"snapshot")," to get approval from GIV token holders before accepting a new DAO for RegenFarms. Once accepted, the interested DAO will need to work with our team to provide their RegenFarm ",(0,i.kt)("a",{parentName:"p",href:"https://www.notion.so/giveth/Regen-Farm-Parameters-a5b474e75f334d03ad1c1c43f5d923d4"},"parameters")," and the funds to kickstart their farm."),(0,i.kt)("h2",{id:"funding"},"Funding"),(0,i.kt)("p",null,"To justify the cost of initiating the farm, a base fee of $5000 (equivalent USD value in the DAO\u2019s token) is provided by the RegenFarm DAO to Giveth. $2500 of this will be sent to donation.eth for the ",(0,i.kt)("a",{parentName:"p",href:"https://giveth.io/project/donation-eth"},"Giveth Matching Pool")," to fund donations to verified for-good projects. The remaining $2500 will be sent to the ",(0,i.kt)("a",{parentName:"p",href:"https://blockscout.com/xdai/mainnet/address/0xf924fF0f192f0c7c073161e0d62CE7635114e74f/transactions"},"Giveth liquidity multisig")," and will be used by Giveth provide $GIV / ","[DAO token]"," liquidity."),(0,i.kt)("p",null,"RegenFarm DAOs also provide the funds to reward their Liquidity Providers. Before initiating the farm, 1% of these funds are sent to the ",(0,i.kt)("a",{parentName:"p",href:"https://blockscout.com/xdai/mainnet/address/0xf924fF0f192f0c7c073161e0d62CE7635114e74f/transactions"},"Giveth liquidity multisig")," to be used, as above, for liquidity, and an additional 1% of these funds are sent to the ",(0,i.kt)("a",{parentName:"p",href:"https://giveth.io/project/donation-eth"},"Giveth Matching Pool")," to fund donations to verified projects."),(0,i.kt)("h2",{id:"regenfarms-ui"},"RegenFarms UI"),(0,i.kt)("img",{alt:"shapeshift",src:(0,a.Z)("img/Regenfarm1.png")}),(0,i.kt)("p",null,"Liquidity mining opportunities for RegenFarms can be found on the ",(0,i.kt)("a",{parentName:"p",href:"https://giveth.io/givfarm"},"GIVfarm page"),". You can provide liquidity (by following the ",(0,i.kt)("inlineCode",{parentName:"p"},"provide liquidity"),' link at the bottom of the card) and stake LP tokens to begin earning rewards. When you "harvest" your earnings, the liquid part will be sent to your wallet, and the streaming part will kickstart your corresponding RegenStream. Liquid rewards earned from your RegenStream are claimable at the bottom right. Note that when you harvest rewards from the RegenFarm card, all liquid rewards from your RegenStream are also sent to your wallet.'),(0,i.kt)("img",{alt:"foxfarm",src:(0,a.Z)("img/Regenfarm2.png")}),(0,i.kt)("p",null,"To learn more about the RegenFarm's mission, click the ",(0,i.kt)("inlineCode",{parentName:"p"},"?")," in the top right corner of the Regen Farm Card."),(0,i.kt)("hr",null),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://docs.giveth.io/whatisgiveth/"},"Our mission")," at Giveth is to reward and empower those who give. RegenFarms is creating win-win opportunities for everyone who interacts with them. To summarize the benefits:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Blockchain4good DAOs benefit from the ready-made UI, network effects of offering incentives among other Regen Economies, and the novel benefits of combining rewards with a streaming service."),(0,i.kt)("li",{parentName:"ul"},"Stakers benefit from high yields and a wealth of farming opportunities, as well as the opportunity to explore for-good web3 projects."),(0,i.kt)("li",{parentName:"ul"},"Verified projects benefit from boosted Giveth Matching Pool contributions, courtesy of for-good DAOs."),(0,i.kt)("li",{parentName:"ul"},"The GIVeconomy benefits from additional liquidity and strengthened partnerships in the Blockchain4Good ecosystem.")),(0,i.kt)("p",null,"Explore ",(0,i.kt)("a",{parentName:"p",href:"https://giveth.io/givfarm"},"RegenFarms")," today."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/32ce0e8a.aace47a8.js b/assets/js/32ce0e8a.b05848a9.js similarity index 53% rename from assets/js/32ce0e8a.aace47a8.js rename to assets/js/32ce0e8a.b05848a9.js index 1eb64f9454..3ef79ef255 100644 --- a/assets/js/32ce0e8a.aace47a8.js +++ b/assets/js/32ce0e8a.b05848a9.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[8221],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>y});var i=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=i.createContext({}),u=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=u(e.components);return i.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},d=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=u(r),y=n,m=d["".concat(s,".").concat(y)]||d[y]||p[y]||a;return r?i.createElement(m,o(o({ref:t},c),{},{components:r})):i.createElement(m,o({ref:t},c))}));function y(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:n,o[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>l,toc:()=>u});var i=r(7462),n=(r(7294),r(3905));const a={id:"disclosure",title:"Responsible Disclosure",slug:"security/responsible-disclosure"},o="Reporting a Security Issue or Vulnerability",l={unversionedId:"disclosure",id:"disclosure",title:"Responsible Disclosure",description:"Smart Contract security",source:"@site/dapps/submit-vulnerability.md",sourceDirName:".",slug:"/security/responsible-disclosure",permalink:"/security/responsible-disclosure",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/submit-vulnerability.md",tags:[],version:"current",lastUpdatedBy:"geleeroyale",lastUpdatedAt:1702894289,formattedLastUpdatedAt:"Dec 18, 2023",frontMatter:{id:"disclosure",title:"Responsible Disclosure",slug:"security/responsible-disclosure"},sidebar:"dapps",previous:{title:"$nice Token",permalink:"/giveconomy/niceToken"},next:{title:"Troubleshooting",permalink:"/dapps/troubleshooting"}},s={},u=[{value:"Smart Contract security",id:"smart-contract-security",level:2},{value:"Service vulnerability",id:"service-vulnerability",level:2}],c={toc:u};function p(e){let{components:t,...r}=e;return(0,n.kt)("wrapper",(0,i.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"reporting-a-security-issue-or-vulnerability"},"Reporting a Security Issue or Vulnerability"),(0,n.kt)("h2",{id:"smart-contract-security"},"Smart Contract security"),(0,n.kt)("p",null,"If you believe you\u2019ve identified a smart contract issue or vulnerability, please submit a report via ",(0,n.kt)("a",{parentName:"p",href:"https://app.hats.finance/vulnerability"},"Hats.finance anon-friendly submission portal")," "),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"On that page, under \u2018Select Project\u2019, search for \u2018Giveth\u2019"),(0,n.kt)("li",{parentName:"ol"},"enter the details of the security issue via the form.")),(0,n.kt)("p",null,(0,n.kt)("em",{parentName:"p"},"Using this method will encrypt your communications with Giveth\u2019s security team, and will use the Hat\u2019s bug bounty system which you can learn more about ",(0,n.kt)("a",{parentName:"em",href:"https://docs.hats.finance/"},"in the hats.finance documentation"),".")),(0,n.kt)("h2",{id:"service-vulnerability"},"Service vulnerability"),(0,n.kt)("p",null,"If you believe you have identified a security vulnerability on the backend or in the way our deployments work, you are also welcome to email the security team directly at ",(0,n.kt)("inlineCode",{parentName:"p"},"security@giveth.io"),", with the subject line \u201cResponsible Disclosure\u201d.\nThe email should include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"a detailed description of the vulnerability and steps to reproduce it. "),(0,n.kt)("li",{parentName:"ul"},"Please also include your Ethereum wallet address for reward distribution. "),(0,n.kt)("li",{parentName:"ul"},"If you wish to encrypt your message to us, our public PGP key is available ",(0,n.kt)("a",{parentName:"li",href:"https://gist.github.com/geleeroyale/bd50ed3bcac66e54c6c53954b4f0841f"},"HERE"),". ")),(0,n.kt)("p",null,"Once the report is received, the Giveth security team will review the vulnerability and respond with a determination of its validity and severity. If the report is valid, the team will work to fix the vulnerability and - in cases where a reward from our side is offered - distribute the reward to the reporter."))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[8221],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>y});var i=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=i.createContext({}),u=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=u(e.components);return i.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},d=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=u(r),y=n,m=d["".concat(s,".").concat(y)]||d[y]||p[y]||a;return r?i.createElement(m,o(o({ref:t},c),{},{components:r})):i.createElement(m,o({ref:t},c))}));function y(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:n,o[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>l,toc:()=>u});var i=r(7462),n=(r(7294),r(3905));const a={id:"disclosure",title:"Responsible Disclosure",slug:"security/responsible-disclosure"},o="Reporting a Security Issue or Vulnerability",l={unversionedId:"disclosure",id:"disclosure",title:"Responsible Disclosure",description:"Smart Contract security",source:"@site/dapps/submit-vulnerability.md",sourceDirName:".",slug:"/security/responsible-disclosure",permalink:"/security/responsible-disclosure",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/submit-vulnerability.md",tags:[],version:"current",lastUpdatedBy:"geleeroyale",lastUpdatedAt:1702894289,formattedLastUpdatedAt:"Dec 18, 2023",frontMatter:{id:"disclosure",title:"Responsible Disclosure",slug:"security/responsible-disclosure"},sidebar:"dapps",previous:{title:"$nice Token (Depcrecated)",permalink:"/giveconomy/niceToken"},next:{title:"Troubleshooting",permalink:"/dapps/troubleshooting"}},s={},u=[{value:"Smart Contract security",id:"smart-contract-security",level:2},{value:"Service vulnerability",id:"service-vulnerability",level:2}],c={toc:u};function p(e){let{components:t,...r}=e;return(0,n.kt)("wrapper",(0,i.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"reporting-a-security-issue-or-vulnerability"},"Reporting a Security Issue or Vulnerability"),(0,n.kt)("h2",{id:"smart-contract-security"},"Smart Contract security"),(0,n.kt)("p",null,"If you believe you\u2019ve identified a smart contract issue or vulnerability, please submit a report via ",(0,n.kt)("a",{parentName:"p",href:"https://app.hats.finance/vulnerability"},"Hats.finance anon-friendly submission portal")," "),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"On that page, under \u2018Select Project\u2019, search for \u2018Giveth\u2019"),(0,n.kt)("li",{parentName:"ol"},"enter the details of the security issue via the form.")),(0,n.kt)("p",null,(0,n.kt)("em",{parentName:"p"},"Using this method will encrypt your communications with Giveth\u2019s security team, and will use the Hat\u2019s bug bounty system which you can learn more about ",(0,n.kt)("a",{parentName:"em",href:"https://docs.hats.finance/"},"in the hats.finance documentation"),".")),(0,n.kt)("h2",{id:"service-vulnerability"},"Service vulnerability"),(0,n.kt)("p",null,"If you believe you have identified a security vulnerability on the backend or in the way our deployments work, you are also welcome to email the security team directly at ",(0,n.kt)("inlineCode",{parentName:"p"},"security@giveth.io"),", with the subject line \u201cResponsible Disclosure\u201d.\nThe email should include:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"a detailed description of the vulnerability and steps to reproduce it. "),(0,n.kt)("li",{parentName:"ul"},"Please also include your Ethereum wallet address for reward distribution. "),(0,n.kt)("li",{parentName:"ul"},"If you wish to encrypt your message to us, our public PGP key is available ",(0,n.kt)("a",{parentName:"li",href:"https://gist.github.com/geleeroyale/bd50ed3bcac66e54c6c53954b4f0841f"},"HERE"),". ")),(0,n.kt)("p",null,"Once the report is received, the Giveth security team will review the vulnerability and respond with a determination of its validity and severity. If the report is valid, the team will work to fix the vulnerability and - in cases where a reward from our side is offered - distribute the reward to the reporter."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3c144caa.b6b09011.js b/assets/js/3c144caa.b6b09011.js new file mode 100644 index 0000000000..561a37f3ff --- /dev/null +++ b/assets/js/3c144caa.b6b09011.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[1167],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var i=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=i.createContext({}),c=function(e){var t=i.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return i.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},d=i.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=c(n),h=o,m=d["".concat(s,".").concat(h)]||d[h]||u[h]||r;return n?i.createElement(m,a(a({ref:t},p),{},{components:n})):i.createElement(m,a({ref:t},p))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,a=new Array(r);a[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,a[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>c,default:()=>m,frontMatter:()=>s,metadata:()=>p,toc:()=>d});var i=n(7462),o=(n(7294),n(3905)),r=n(4996);const a={toc:[]};function l(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,i.Z)({},a,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://etherscan.io/token/0x6b175474e89094c44da98b954eedeac495271d0f"},"DAI")," (Mainnet)"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://etherscan.io/token/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},"USDC")," (Mainnet)"),(0,o.kt)("li",{parentName:"ul"},"xDAI (Gnosis Chain)"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://www.blockscout.com/xdai/mainnet/token/0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d/token-transfers"},"wxDAI")," (Gnosis Chain)")))}l.isMDXComponent=!0;const s={id:"niceToken",title:"$nice Token (Depcrecated)",slug:"/giveconomy/niceToken"},c=void 0,p={unversionedId:"niceToken",id:"niceToken",title:"$nice Token (Depcrecated)",description:"**The $nice token distribution has been discontinued on December 24, 2024. $nice tokens may still be distibuted for promotional and community incentives, however they will no longer be distributed bi-weekly for stablecoin donations to the Giveth Project.**",source:"@site/dapps/niceToken.md",sourceDirName:".",slug:"/giveconomy/niceToken",permalink:"/giveconomy/niceToken",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/niceToken.md",tags:[],version:"current",lastUpdatedBy:"Mitch Oz",lastUpdatedAt:1733944223,formattedLastUpdatedAt:"Dec 11, 2024",frontMatter:{id:"niceToken",title:"$nice Token (Depcrecated)",slug:"/giveconomy/niceToken"},sidebar:"dapps",previous:{title:"The Givers PFP Collection",permalink:"/dapps/giverspfp"},next:{title:"Responsible Disclosure",permalink:"/security/responsible-disclosure"}},u={},d=[{value:"Token Address",id:"token-address",level:4},{value:"Utility",id:"utility",level:2},{value:"Use of Funds",id:"use-of-funds",level:2}],h={toc:d};function m(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,i.Z)({},h,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null," ",(0,o.kt)("em",{parentName:"p"},(0,o.kt)("strong",{parentName:"em"},"The $nice token distribution has been discontinued on December 24, 2024. $nice tokens may still be distibuted for promotional and community incentives, however they will no longer be distributed bi-weekly for stablecoin donations to the ",(0,o.kt)("a",{parentName:"strong",href:"https://giveth.io/project/the-giveth-community-of-makers"},"Giveth Project"),"."))),(0,o.kt)("p",null,(0,o.kt)("em",{parentName:"p"},(0,o.kt)("strong",{parentName:"em"},"This documentation will remain available for historical reference."))),(0,o.kt)("hr",null),(0,o.kt)("p",null,"The $nice token was launched in Q3 2022 in an effort to promote direct donations to the Giveth Organization."),(0,o.kt)("p",null,"When users on the Giveth Dapp make a donation to the ",(0,o.kt)("a",{parentName:"p",href:"https://giveth.io/project/the-giveth-community-of-makers"},"Giveth Project")," in certain eligible tokens they'll receive $nice in return."),(0,o.kt)("a",{href:"https://giveth.io/project/the-giveth-community-of-makers"},(0,o.kt)("img",{alt:"nice token banner",src:(0,r.Z)("img/content/niceBanner.png")})),(0,o.kt)("p",null,"The following tokens have been listed as eligible for $nice when donated to Giveth:"),(0,o.kt)(l,{mdxType:"NiceTokenList"}),(0,o.kt)("p",null,"$nice is matched at a 1:1 ratio of the USD value of the donations at the time the donation was made. For example if you donated 50 DAI to Giveth (assuming it holds its $1 peg) you would receive 50 $nice."),(0,o.kt)("p",null,"Eligible donations are registered on the same bi-weekly rounds that ",(0,o.kt)("a",{parentName:"p",href:"https://docs.giveth.io/giveconomy/givbacks/"},"GIVbacks")," follow. Distribution of $nice, once calculated, is done at the same time that GIVbacks are sent out."),(0,o.kt)("h4",{id:"token-address"},"Token Address"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Giveth $nice token (Gnosis Chain): ",(0,o.kt)("a",{parentName:"li",href:"https://gnosisscan.io/token/0xde378ea32af41b4a2b9c8baee1655761d526c0df"},"0xde378ea32af41b4a2b9c8baee1655761d526c0df"))),(0,o.kt)("h2",{id:"utility"},"Utility"),(0,o.kt)("p",null,"The first of many features of $nice will be the ability to redeem it for swag on the ",(0,o.kt)("a",{parentName:"p",href:"https://swag.giveth.io/"},"Giveth swag shop"),". You can get Giveth branded clothing and more delivered right to your door for supporting Giveth."),(0,o.kt)("p",null,"Some other exciting utilities down the road might include:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Early Access to and Redemption of $nice for ",(0,o.kt)("a",{parentName:"li",href:"https://forum.giveth.io/t/the-givers-pfp-collection-initial-sketches/656/5"},"Giveth PFPs"),"."),(0,o.kt)("li",{parentName:"ul"},"Leaderboards and Social Media promotion of top Giveth donors and $nice holders."),(0,o.kt)("li",{parentName:"ul"},"GIV rewards program for $nice holders.")),(0,o.kt)("p",null,"The sky's the limit for $nice and the Giveth team is actively building and experimenting with features and future utilities of this new token."),(0,o.kt)("h2",{id:"use-of-funds"},"Use of Funds"),(0,o.kt)("p",null,"Giveth will use the acquired funds for a very direct strategy to ensure the stability and growth of Giveth and the GIVeconomy. "),(0,o.kt)("p",null,"50% of the USD value of eligible donations received will be used to buy back GIV. The other 50% will be used to create a liquidy pool pair with the bought back GIV."),(0,o.kt)("p",null,"Let's look at an example:"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"Over a 3 month period Giveth acquires $100,000 of eligible donations in DAI."),(0,o.kt)("p",{parentName:"blockquote"},"We use $50,000 worth of the DAI received to buy back GIV from the circulating supply."),(0,o.kt)("p",{parentName:"blockquote"},"Subsequently we take this $50,000 worth of GIV we just bought back and combine it with the remaining $50,000 of DAI to supply a $100,000 DAI/GIV LP position on Uniswap v2 that is owned by the Giveth multisig.")),(0,o.kt)("p",null,"This effectively allows Giveth to create strong DAO-owned liquidity positions over time. This in turn helps to mitigate the volatility that liquidity farming programs can have on the GIV token economy."),(0,o.kt)("p",null,"Giveth may employ new strategies for received funds at any given point in the future."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3c144caa.ba4e5591.js b/assets/js/3c144caa.ba4e5591.js deleted file mode 100644 index 3856317ac2..0000000000 --- a/assets/js/3c144caa.ba4e5591.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[1167],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var i=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=i.createContext({}),c=function(e){var t=i.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return i.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},d=i.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=c(n),h=o,f=d["".concat(s,".").concat(h)]||d[h]||u[h]||r;return n?i.createElement(f,a(a({ref:t},p),{},{components:n})):i.createElement(f,a({ref:t},p))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,a=new Array(r);a[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,a[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>c,default:()=>f,frontMatter:()=>s,metadata:()=>p,toc:()=>d});var i=n(7462),o=(n(7294),n(3905)),r=n(4996);const a={toc:[]};function l(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,i.Z)({},a,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://etherscan.io/token/0x6b175474e89094c44da98b954eedeac495271d0f"},"DAI")," (Mainnet)"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://etherscan.io/token/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},"USDC")," (Mainnet)"),(0,o.kt)("li",{parentName:"ul"},"xDAI (Gnosis Chain)"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://www.blockscout.com/xdai/mainnet/token/0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d/token-transfers"},"wxDAI")," (Gnosis Chain)")))}l.isMDXComponent=!0;const s={id:"niceToken",title:"$nice Token",slug:"/giveconomy/niceToken"},c=void 0,p={unversionedId:"niceToken",id:"niceToken",title:"$nice Token",description:"The $nice token was launched in Q3 2022 in an effort to promote direct donations to the Giveth Organization.",source:"@site/dapps/niceToken.md",sourceDirName:".",slug:"/giveconomy/niceToken",permalink:"/giveconomy/niceToken",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/niceToken.md",tags:[],version:"current",lastUpdatedBy:"Mitch Oz",lastUpdatedAt:1674485226,formattedLastUpdatedAt:"Jan 23, 2023",frontMatter:{id:"niceToken",title:"$nice Token",slug:"/giveconomy/niceToken"},sidebar:"dapps",previous:{title:"The Givers PFP Collection",permalink:"/dapps/giverspfp"},next:{title:"Responsible Disclosure",permalink:"/security/responsible-disclosure"}},u={},d=[{value:"Token Address",id:"token-address",level:4},{value:"Utility",id:"utility",level:2},{value:"Use of Funds",id:"use-of-funds",level:2}],h={toc:d};function f(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,i.Z)({},h,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"The $nice token was launched in Q3 2022 in an effort to promote direct donations to the Giveth Organization."),(0,o.kt)("p",null,"When users on the Giveth Dapp make a donation to the ",(0,o.kt)("a",{parentName:"p",href:"https://giveth.io/project/the-giveth-community-of-makers"},"Giveth Project")," in certain eligible tokens they'll receive $nice in return."),(0,o.kt)("a",{href:"https://giveth.io/project/the-giveth-community-of-makers"},(0,o.kt)("img",{alt:"nice token banner",src:(0,r.Z)("img/content/niceBanner.png")})),(0,o.kt)("p",null,"The following tokens have been listed as eligible for $nice when donated to Giveth:"),(0,o.kt)(l,{mdxType:"NiceTokenList"}),(0,o.kt)("p",null,"$nice is matched at a 1:1 ratio of the USD value of the donations at the time the donation was made. For example if you donated 50 DAI to Giveth (assuming it holds its $1 peg) you would receive 50 $nice."),(0,o.kt)("p",null,"Eligible donations are registered on the same bi-weekly rounds that ",(0,o.kt)("a",{parentName:"p",href:"https://docs.giveth.io/giveconomy/givbacks/"},"GIVbacks")," follow. Distribution of $nice, once calculated, is done at the same time that GIVbacks are sent out."),(0,o.kt)("h4",{id:"token-address"},"Token Address"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Giveth $nice token (Gnosis Chain): ",(0,o.kt)("a",{parentName:"li",href:"https://gnosisscan.io/token/0xde378ea32af41b4a2b9c8baee1655761d526c0df"},"0xde378ea32af41b4a2b9c8baee1655761d526c0df"))),(0,o.kt)("h2",{id:"utility"},"Utility"),(0,o.kt)("p",null,"The first of many features of $nice will be the ability to redeem it for swag on the ",(0,o.kt)("a",{parentName:"p",href:"https://swag.giveth.io/"},"Giveth swag shop"),". You can get Giveth branded clothing and more delivered right to your door for supporting Giveth."),(0,o.kt)("p",null,"Some other exciting utilities down the road might include:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Early Access to and Redemption of $nice for ",(0,o.kt)("a",{parentName:"li",href:"https://forum.giveth.io/t/the-givers-pfp-collection-initial-sketches/656/5"},"Giveth PFPs"),"."),(0,o.kt)("li",{parentName:"ul"},"Leaderboards and Social Media promotion of top Giveth donors and $nice holders."),(0,o.kt)("li",{parentName:"ul"},"GIV rewards program for $nice holders.")),(0,o.kt)("p",null,"The sky's the limit for $nice and the Giveth team is actively building and experimenting with features and future utilities of this new token."),(0,o.kt)("h2",{id:"use-of-funds"},"Use of Funds"),(0,o.kt)("p",null,"Giveth will use the acquired funds for a very direct strategy to ensure the stability and growth of Giveth and the GIVeconomy. "),(0,o.kt)("p",null,"50% of the USD value of eligible donations received will be used to buy back GIV. The other 50% will be used to create a liquidy pool pair with the bought back GIV."),(0,o.kt)("p",null,"Let's look at an example:"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"Over a 3 month period Giveth acquires $100,000 of eligible donations in DAI."),(0,o.kt)("p",{parentName:"blockquote"},"We use $50,000 worth of the DAI received to buy back GIV from the circulating supply."),(0,o.kt)("p",{parentName:"blockquote"},"Subsequently we take this $50,000 worth of GIV we just bought back and combine it with the remaining $50,000 of DAI to supply a $100,000 DAI/GIV LP position on Uniswap v2 that is owned by the Giveth multisig.")),(0,o.kt)("p",null,"This effectively allows Giveth to create strong DAO-owned liquidity positions over time. This in turn helps to mitigate the volatility that liquidity farming programs can have on the GIV token economy."),(0,o.kt)("p",null,"Giveth may employ new strategies for received funds at any given point in the future."))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/44bb633e.3b1c07ef.js b/assets/js/44bb633e.24a26914.js similarity index 98% rename from assets/js/44bb633e.3b1c07ef.js rename to assets/js/44bb633e.24a26914.js index d03e8183ca..ca5f0f3198 100644 --- a/assets/js/44bb633e.3b1c07ef.js +++ b/assets/js/44bb633e.24a26914.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[6610],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>h});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),m=p(n),h=r,c=m["".concat(s,".").concat(h)]||m[h]||u[h]||o;return n?a.createElement(c,i(i({ref:t},d),{},{components:n})):a.createElement(c,i({ref:t},d))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var p=2;p{n.d(t,{ZP:()=>i});var a=n(7462),r=(n(7294),n(3905));const o={toc:[]};function i(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,a.Z)({},o,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},(0,r.kt)("strong",{parentName:"em"},"Giveth TRACE has officially been deprecated. After 5 years of faithful service, Giveth and its platform, services and products have fully migrated to ",(0,r.kt)("a",{parentName:"strong",href:"https://giveth.io"},"Giveth.io"),". With the deprecation of the Rinkeby network and low user activity, the Giveth DAO decided to sunset its original dApp in Q3 of 2022. The code has and will forever be open-source, and you can find it in ",(0,r.kt)("a",{parentName:"strong",href:"https://github.com/Giveth"},"Giveth's Github repositories"),"."))),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},(0,r.kt)("strong",{parentName:"em"},"This documentation will remain available for historical reference."))),(0,r.kt)("hr",null))}i.isMDXComponent=!0},4776:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(8932);const i={id:"developmentProcess",title:"Development Process",slug:"dapps/developmentProcess"},l=void 0,s={unversionedId:"developmentProcess",id:"developmentProcess",title:"Development Process",description:"This section details the Giveth TRACE development process, deployments, and how merging and testing is handled.",source:"@site/dapps/developmentProcess.md",sourceDirName:".",slug:"/dapps/developmentProcess",permalink:"/dapps/developmentProcess",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/developmentProcess.md",tags:[],version:"current",lastUpdatedBy:"Mitch Oz",lastUpdatedAt:1667254190,formattedLastUpdatedAt:"Oct 31, 2022",frontMatter:{id:"developmentProcess",title:"Development Process",slug:"dapps/developmentProcess"},sidebar:"dapps",previous:{title:"Giveth Bridge Security Implementation",permalink:"/dapps/bridgeSecurity"},next:{title:"Regen Farm Smart Contract Guide",permalink:"/dapps/regenFarmContracts"}},p={},d=[{value:"Development Planning, Sprints and Where to get Involved.",id:"development-planning-sprints-and-where-to-get-involved",level:2},{value:"Deployments and Branch Organisation",id:"deployments-and-branch-organisation",level:2},{value:"Usage of Zenhub Boards",id:"usage-of-zenhub-boards",level:2},{value:"Making a Pull Request",id:"making-a-pull-request",level:3},{value:"Integration & Testing",id:"integration--testing",level:2},{value:"Quality Assurance Testing",id:"quality-assurance-testing",level:2},{value:"Production Deployment",id:"production-deployment",level:2},{value:"Back-end Webservices Documentation",id:"back-end-webservices-documentation",level:2},{value:"FAQ",id:"faq",level:2}],u={toc:d};function m(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)(o.ZP,{mdxType:"TraceDeprecated"}),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"This section details the Giveth TRACE development process, deployments, and how merging and testing is handled.")),(0,r.kt)("h2",{id:"development-planning-sprints-and-where-to-get-involved"},"Development Planning, Sprints and Where to get Involved."),(0,r.kt)("p",null,"We run on a 2 week sprint cycle with weekly developer meetings to plan sprints and assess progress. You can checkout when the next one is on our ",(0,r.kt)("a",{parentName:"p",href:"https://calendar.google.com/calendar/embed?src=givethdotio%40gmail.com"},"Google Calendar")," and you can also reach out on the ",(0,r.kt)("a",{parentName:"p",href:"https://discord.giveth.io"},"Giveth Discord")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"@moenick")," the Giveth TRACE project manager. You can find the current ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Giveth/giveth-dapp"},"Giveth TRACE repository on Github"),"."),(0,r.kt)("h2",{id:"deployments-and-branch-organisation"},"Deployments and Branch Organisation"),(0,r.kt)("p",null,"Giveth TRACE has transitioned from passive to active development for post-beta release coming soon. There are two deployments currently used for the development process."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Blockchain"),(0,r.kt)("th",{parentName:"tr",align:null},"Branch Deployed"),(0,r.kt)("th",{parentName:"tr",align:null},"Auto Deploy"),(0,r.kt)("th",{parentName:"tr",align:null},"Use"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://trace.giveth.io"},"beta")),(0,r.kt)("td",{parentName:"tr",align:null},"Mainnet/Rinkeby"),(0,r.kt)("td",{parentName:"tr",align:null},"master"),(0,r.kt)("td",{parentName:"tr",align:null},"no"),(0,r.kt)("td",{parentName:"tr",align:null},"Bridged deployment; Rinkeby for internal contract interactions, Mainnet for sending and receiving real funds.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://develop.giveth.io"},"develop")),(0,r.kt)("td",{parentName:"tr",align:null},"Ropsten Test Network"),(0,r.kt)("td",{parentName:"tr",align:null},"develop"),(0,r.kt)("td",{parentName:"tr",align:null},"yes"),(0,r.kt)("td",{parentName:"tr",align:null},"Development environment for integrating and testing new features. Feature and pull request branches are deployed to this environment.")))),(0,r.kt)("p",null,"The two branches below are being used in the gitflow."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"master"),(0,r.kt)("td",{parentName:"tr",align:null},"The master branch tracks released code only. Commits are made to master around the middle of each month so as not to interfere with payment processes happening near the end and beginning of these months.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"develop"),(0,r.kt)("td",{parentName:"tr",align:null},"Deployments made to develop are from local builds and include new features and bug fixes.")))),(0,r.kt)("h2",{id:"usage-of-zenhub-boards"},"Usage of Zenhub Boards"),(0,r.kt)("p",null,"Currently we use the Zenhub Boards extension for Github to track progress on features and fixes. You can get the ",(0,r.kt)("a",{parentName:"p",href:"https://www.zenhub.com/extension"},"Zenhub extension here"),"."),(0,r.kt)("p",null,"The Current Github issue flow is as follows:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Usage"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"New Issues"),(0,r.kt)("td",{parentName:"tr",align:null},"Create a new Issue for a new feature request or to report a bug. Tag a developer or ",(0,r.kt)("inlineCode",{parentName:"td"},"@moenick")," to make sure it get's noticed. Use labels to add context to your issue.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Icebox"),(0,r.kt)("td",{parentName:"tr",align:null},"Features and Ideas to consider for future development, to be assesed by the Giveth Team only when developer bandwidth allows.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Product Backlog"),(0,r.kt)("td",{parentName:"tr",align:null},"Issues that need to be dealt with or approved new features for development. These will be queued into the next sprint progressively.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Epics"),(0,r.kt)("td",{parentName:"tr",align:null},"Large tasks which have been broken down into smaller issues.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Needs Clarification"),(0,r.kt)("td",{parentName:"tr",align:null},"Issues which require more clarification from the issue creator in order to move forward.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Sprint Backlog"),(0,r.kt)("td",{parentName:"tr",align:null},"Issues being worked on in the current sprint.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Bugs & Ops"),(0,r.kt)("td",{parentName:"tr",align:null},"Urgent tasks that need to be prioritized. Bandwidth is set aside in the sprint schedule for developers to address any issues here.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"In Progress"),(0,r.kt)("td",{parentName:"tr",align:null},"Issues that have been picked up by a dev for the current sprint.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Code Review"),(0,r.kt)("td",{parentName:"tr",align:null},"Devs should review code referenced in these issues for quality assurance and fixing potential issues before moving to user testing.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"UAT (User Acceptance Testing)"),(0,r.kt)("td",{parentName:"tr",align:null},"Features or Fixes ready to be user tested.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Done"),(0,r.kt)("td",{parentName:"tr",align:null},"Issues ready to be merged to ",(0,r.kt)("inlineCode",{parentName:"td"},"master")," according to the commit cycle.")))),(0,r.kt)("h3",{id:"making-a-pull-request"},"Making a Pull Request"),(0,r.kt)("p",null,"Before making new Pull Request, make sure that your code does not have any linter issues and can be deployed. Only PRs that successfully deploy and don't have any merge conflicts will be merged. You can also easily check the deploy preview on Github Netlify autodeploy integration.\n",(0,r.kt)("img",{parentName:"p",src:"https://d33wubrfki0l68.cloudfront.net/cfa6124f4e0bf556de850f40e97c6b4cc66231f9/d42f0/images/product-development/deploy-preview.png",alt:"Autodeploy Integration"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Deployment preview.")," Each pull request to the DApp repository has a Netlify deploy preview. You can access it at the bottom of the Conversation tab after clicking ",(0,r.kt)("strong",{parentName:"p"},"Show all checks")," button and ",(0,r.kt)("strong",{parentName:"p"},"Details"),"."),(0,r.kt)("h2",{id:"integration--testing"},"Integration & Testing"),(0,r.kt)("p",null,"Integration of new features is done by the ",(0,r.kt)("strong",{parentName:"p"},"development team")," after a DApp dev meeting where PRs are reviewed. After the PRs are reviewed and fixed, they are merged to the develop branch. Testing of the new features is done in the ",(0,r.kt)("a",{parentName:"p",href:"https://develop.giveth.io"},(0,r.kt)("inlineCode",{parentName:"a"},"develop"))," environment to ensure the features do what they say and work well with the rest of the DApp."),(0,r.kt)("h2",{id:"quality-assurance-testing"},"Quality Assurance Testing"),(0,r.kt)("p",null,"After new features are integrated and dev tested in the ",(0,r.kt)("a",{parentName:"p",href:"https://develop.giveth.io"},(0,r.kt)("inlineCode",{parentName:"a"},"develop"))," environment, developers will ping testers with requests or updates in the ",(0,r.kt)("a",{parentName:"p",href:"https://discord.gg/79uUbyVCtE"},"Giveth TRACE Dev Channel")," on Discord. Testing should not be done by developers and is open to anyone who wishes to contribute."),(0,r.kt)("h2",{id:"production-deployment"},"Production Deployment"),(0,r.kt)("p",null,"Only once all the newly introduced bugs are removed in the ",(0,r.kt)("inlineCode",{parentName:"p"},"develop")," branch it can be merged to master and pushed to production. It is done manually by DApp devteam (by ",(0,r.kt)("inlineCode",{parentName:"p"},"@aminlatifi")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"@MohammadPCh"),")."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"To deploy the newest version of feathers-giveth")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ ssh user@feathers.alpha.giveth.io\n\n$ cd /home/deploy/feathers-giveth/\n$ sudo -u deploy bash\n\n$ git pull\n\n$ yarn install --pure-lockfile\n$ yarn serve\n")),(0,r.kt)("p",null,"Next, check the feathers deploy status"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ pm2 logs\n")),(0,r.kt)("p",null,"If the logs are clear, the last step is to deploy the latest master branch commit on ",(0,r.kt)("a",{parentName:"p",href:"http://netlify.com/"},"Netlify")," and locking the deploy."),(0,r.kt)("h2",{id:"back-end-webservices-documentation"},"Back-end Webservices Documentation"),(0,r.kt)("p",null,"If you're a new contributor and would like more in depth technical documentation on all the Webservices leveraged from the back-end (feathers-giveth) to the front-end (giveth-dapp), check out our pages on ",(0,r.kt)("strong",{parentName:"p"},"Swagger")," for both Production and Staging deployments:"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://feathers.beta.giveth.io/docs/?url=/docs#/"},"feathers-giveth Production"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://feathers.develop.giveth.io/docs"},"feathers-giveth Staging")),(0,r.kt)("h2",{id:"faq"},"FAQ"),(0,r.kt)("p",null," ",(0,r.kt)("strong",{parentName:"p"},"What is the definition of a feature?")),(0,r.kt)("p",null,"A Feature is any non-trivial improvement (less than 10 lines of code). Most features have issue in the corresponding Github Repository."),(0,r.kt)("p",null," ",(0,r.kt)("strong",{parentName:"p"},"What about fixes?")),(0,r.kt)("p",null," Big non-critical fixes are treated just like any other feature. If a fix is time critical, it is created as new branch with ",(0,r.kt)("inlineCode",{parentName:"p"},"hotfix/")," prefix as a fork from the ",(0,r.kt)("inlineCode",{parentName:"p"},"master")," branch. Such hotfix is tested at minimum by 2 people from dev team before being merged to ",(0,r.kt)("inlineCode",{parentName:"p"},"master"),"and ",(0,r.kt)("inlineCode",{parentName:"p"},"develop")," branches."),(0,r.kt)("p",null," ",(0,r.kt)("strong",{parentName:"p"},"Where do we communicate what needs testing?")),(0,r.kt)("p",null,"The QA testing is announced in the ",(0,r.kt)("inlineCode",{parentName:"p"},"Giveth-1 Dev")," channel on ",(0,r.kt)("a",{parentName:"p",href:"https://discord.giveth.io"},"Discord"),"."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"How do we prioritize when tests fail / bug fixes?")),(0,r.kt)("p",null,"Bug fixes are done ad-hoc as soon as discovered during the testing process. The bugs can be tackled by the DApp dev team or external contributors can be asked to help. Bug fixing has a priority over new development."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Who does deployments and how are they deployed?")),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"develop")," branch is autodeployed to its environment. The ",(0,r.kt)("inlineCode",{parentName:"p"},"master")," branch is deployed by the dev team (",(0,r.kt)("inlineCode",{parentName:"p"},"@aminlatifi"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"@RamRamez")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"@MohammadPCh"),") once there are no new known bugs in the ",(0,r.kt)("inlineCode",{parentName:"p"},"develop")," branch. The process is manual and there is a deployment procedure."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"What is the release cycle frequency?")),(0,r.kt)("p",null," There is new release every 2 weeks as depicted in the ",(0,r.kt)("a",{parentName:"p",href:"#product-development-testing-fig-release"},"product development cycle gant chart"),"."))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[6610],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>h});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),m=p(n),h=r,c=m["".concat(s,".").concat(h)]||m[h]||u[h]||o;return n?a.createElement(c,i(i({ref:t},d),{},{components:n})):a.createElement(c,i({ref:t},d))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var p=2;p{n.d(t,{ZP:()=>i});var a=n(7462),r=(n(7294),n(3905));const o={toc:[]};function i(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,a.Z)({},o,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},(0,r.kt)("strong",{parentName:"em"},"Giveth TRACE has officially been deprecated. After 5 years of faithful service, Giveth and its platform, services and products have fully migrated to ",(0,r.kt)("a",{parentName:"strong",href:"https://giveth.io"},"Giveth.io"),". With the deprecation of the Rinkeby network and low user activity, the Giveth DAO decided to sunset its original dApp in Q3 of 2022. The code has and will forever be open-source, and you can find it in ",(0,r.kt)("a",{parentName:"strong",href:"https://github.com/Giveth"},"Giveth's Github repositories"),"."))),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},(0,r.kt)("strong",{parentName:"em"},"This documentation will remain available for historical reference."))),(0,r.kt)("hr",null))}i.isMDXComponent=!0},4776:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(8932);const i={id:"developmentProcess",title:"Development Process",slug:"dapps/developmentProcess"},l=void 0,s={unversionedId:"developmentProcess",id:"developmentProcess",title:"Development Process",description:"This section details the Giveth TRACE development process, deployments, and how merging and testing is handled.",source:"@site/dapps/developmentProcess.md",sourceDirName:".",slug:"/dapps/developmentProcess",permalink:"/dapps/developmentProcess",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/developmentProcess.md",tags:[],version:"current",lastUpdatedBy:"Mitch Oz",lastUpdatedAt:1667254190,formattedLastUpdatedAt:"Oct 31, 2022",frontMatter:{id:"developmentProcess",title:"Development Process",slug:"dapps/developmentProcess"}},p={},d=[{value:"Development Planning, Sprints and Where to get Involved.",id:"development-planning-sprints-and-where-to-get-involved",level:2},{value:"Deployments and Branch Organisation",id:"deployments-and-branch-organisation",level:2},{value:"Usage of Zenhub Boards",id:"usage-of-zenhub-boards",level:2},{value:"Making a Pull Request",id:"making-a-pull-request",level:3},{value:"Integration & Testing",id:"integration--testing",level:2},{value:"Quality Assurance Testing",id:"quality-assurance-testing",level:2},{value:"Production Deployment",id:"production-deployment",level:2},{value:"Back-end Webservices Documentation",id:"back-end-webservices-documentation",level:2},{value:"FAQ",id:"faq",level:2}],u={toc:d};function m(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)(o.ZP,{mdxType:"TraceDeprecated"}),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"This section details the Giveth TRACE development process, deployments, and how merging and testing is handled.")),(0,r.kt)("h2",{id:"development-planning-sprints-and-where-to-get-involved"},"Development Planning, Sprints and Where to get Involved."),(0,r.kt)("p",null,"We run on a 2 week sprint cycle with weekly developer meetings to plan sprints and assess progress. You can checkout when the next one is on our ",(0,r.kt)("a",{parentName:"p",href:"https://calendar.google.com/calendar/embed?src=givethdotio%40gmail.com"},"Google Calendar")," and you can also reach out on the ",(0,r.kt)("a",{parentName:"p",href:"https://discord.giveth.io"},"Giveth Discord")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"@moenick")," the Giveth TRACE project manager. You can find the current ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Giveth/giveth-dapp"},"Giveth TRACE repository on Github"),"."),(0,r.kt)("h2",{id:"deployments-and-branch-organisation"},"Deployments and Branch Organisation"),(0,r.kt)("p",null,"Giveth TRACE has transitioned from passive to active development for post-beta release coming soon. There are two deployments currently used for the development process."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Blockchain"),(0,r.kt)("th",{parentName:"tr",align:null},"Branch Deployed"),(0,r.kt)("th",{parentName:"tr",align:null},"Auto Deploy"),(0,r.kt)("th",{parentName:"tr",align:null},"Use"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://trace.giveth.io"},"beta")),(0,r.kt)("td",{parentName:"tr",align:null},"Mainnet/Rinkeby"),(0,r.kt)("td",{parentName:"tr",align:null},"master"),(0,r.kt)("td",{parentName:"tr",align:null},"no"),(0,r.kt)("td",{parentName:"tr",align:null},"Bridged deployment; Rinkeby for internal contract interactions, Mainnet for sending and receiving real funds.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://develop.giveth.io"},"develop")),(0,r.kt)("td",{parentName:"tr",align:null},"Ropsten Test Network"),(0,r.kt)("td",{parentName:"tr",align:null},"develop"),(0,r.kt)("td",{parentName:"tr",align:null},"yes"),(0,r.kt)("td",{parentName:"tr",align:null},"Development environment for integrating and testing new features. Feature and pull request branches are deployed to this environment.")))),(0,r.kt)("p",null,"The two branches below are being used in the gitflow."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"master"),(0,r.kt)("td",{parentName:"tr",align:null},"The master branch tracks released code only. Commits are made to master around the middle of each month so as not to interfere with payment processes happening near the end and beginning of these months.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"develop"),(0,r.kt)("td",{parentName:"tr",align:null},"Deployments made to develop are from local builds and include new features and bug fixes.")))),(0,r.kt)("h2",{id:"usage-of-zenhub-boards"},"Usage of Zenhub Boards"),(0,r.kt)("p",null,"Currently we use the Zenhub Boards extension for Github to track progress on features and fixes. You can get the ",(0,r.kt)("a",{parentName:"p",href:"https://www.zenhub.com/extension"},"Zenhub extension here"),"."),(0,r.kt)("p",null,"The Current Github issue flow is as follows:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Usage"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"New Issues"),(0,r.kt)("td",{parentName:"tr",align:null},"Create a new Issue for a new feature request or to report a bug. Tag a developer or ",(0,r.kt)("inlineCode",{parentName:"td"},"@moenick")," to make sure it get's noticed. Use labels to add context to your issue.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Icebox"),(0,r.kt)("td",{parentName:"tr",align:null},"Features and Ideas to consider for future development, to be assesed by the Giveth Team only when developer bandwidth allows.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Product Backlog"),(0,r.kt)("td",{parentName:"tr",align:null},"Issues that need to be dealt with or approved new features for development. These will be queued into the next sprint progressively.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Epics"),(0,r.kt)("td",{parentName:"tr",align:null},"Large tasks which have been broken down into smaller issues.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Needs Clarification"),(0,r.kt)("td",{parentName:"tr",align:null},"Issues which require more clarification from the issue creator in order to move forward.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Sprint Backlog"),(0,r.kt)("td",{parentName:"tr",align:null},"Issues being worked on in the current sprint.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Bugs & Ops"),(0,r.kt)("td",{parentName:"tr",align:null},"Urgent tasks that need to be prioritized. Bandwidth is set aside in the sprint schedule for developers to address any issues here.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"In Progress"),(0,r.kt)("td",{parentName:"tr",align:null},"Issues that have been picked up by a dev for the current sprint.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Code Review"),(0,r.kt)("td",{parentName:"tr",align:null},"Devs should review code referenced in these issues for quality assurance and fixing potential issues before moving to user testing.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"UAT (User Acceptance Testing)"),(0,r.kt)("td",{parentName:"tr",align:null},"Features or Fixes ready to be user tested.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Done"),(0,r.kt)("td",{parentName:"tr",align:null},"Issues ready to be merged to ",(0,r.kt)("inlineCode",{parentName:"td"},"master")," according to the commit cycle.")))),(0,r.kt)("h3",{id:"making-a-pull-request"},"Making a Pull Request"),(0,r.kt)("p",null,"Before making new Pull Request, make sure that your code does not have any linter issues and can be deployed. Only PRs that successfully deploy and don't have any merge conflicts will be merged. You can also easily check the deploy preview on Github Netlify autodeploy integration.\n",(0,r.kt)("img",{parentName:"p",src:"https://d33wubrfki0l68.cloudfront.net/cfa6124f4e0bf556de850f40e97c6b4cc66231f9/d42f0/images/product-development/deploy-preview.png",alt:"Autodeploy Integration"}),"\n",(0,r.kt)("strong",{parentName:"p"},"Deployment preview.")," Each pull request to the DApp repository has a Netlify deploy preview. You can access it at the bottom of the Conversation tab after clicking ",(0,r.kt)("strong",{parentName:"p"},"Show all checks")," button and ",(0,r.kt)("strong",{parentName:"p"},"Details"),"."),(0,r.kt)("h2",{id:"integration--testing"},"Integration & Testing"),(0,r.kt)("p",null,"Integration of new features is done by the ",(0,r.kt)("strong",{parentName:"p"},"development team")," after a DApp dev meeting where PRs are reviewed. After the PRs are reviewed and fixed, they are merged to the develop branch. Testing of the new features is done in the ",(0,r.kt)("a",{parentName:"p",href:"https://develop.giveth.io"},(0,r.kt)("inlineCode",{parentName:"a"},"develop"))," environment to ensure the features do what they say and work well with the rest of the DApp."),(0,r.kt)("h2",{id:"quality-assurance-testing"},"Quality Assurance Testing"),(0,r.kt)("p",null,"After new features are integrated and dev tested in the ",(0,r.kt)("a",{parentName:"p",href:"https://develop.giveth.io"},(0,r.kt)("inlineCode",{parentName:"a"},"develop"))," environment, developers will ping testers with requests or updates in the ",(0,r.kt)("a",{parentName:"p",href:"https://discord.gg/79uUbyVCtE"},"Giveth TRACE Dev Channel")," on Discord. Testing should not be done by developers and is open to anyone who wishes to contribute."),(0,r.kt)("h2",{id:"production-deployment"},"Production Deployment"),(0,r.kt)("p",null,"Only once all the newly introduced bugs are removed in the ",(0,r.kt)("inlineCode",{parentName:"p"},"develop")," branch it can be merged to master and pushed to production. It is done manually by DApp devteam (by ",(0,r.kt)("inlineCode",{parentName:"p"},"@aminlatifi")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"@MohammadPCh"),")."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"To deploy the newest version of feathers-giveth")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ ssh user@feathers.alpha.giveth.io\n\n$ cd /home/deploy/feathers-giveth/\n$ sudo -u deploy bash\n\n$ git pull\n\n$ yarn install --pure-lockfile\n$ yarn serve\n")),(0,r.kt)("p",null,"Next, check the feathers deploy status"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ pm2 logs\n")),(0,r.kt)("p",null,"If the logs are clear, the last step is to deploy the latest master branch commit on ",(0,r.kt)("a",{parentName:"p",href:"http://netlify.com/"},"Netlify")," and locking the deploy."),(0,r.kt)("h2",{id:"back-end-webservices-documentation"},"Back-end Webservices Documentation"),(0,r.kt)("p",null,"If you're a new contributor and would like more in depth technical documentation on all the Webservices leveraged from the back-end (feathers-giveth) to the front-end (giveth-dapp), check out our pages on ",(0,r.kt)("strong",{parentName:"p"},"Swagger")," for both Production and Staging deployments:"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://feathers.beta.giveth.io/docs/?url=/docs#/"},"feathers-giveth Production"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://feathers.develop.giveth.io/docs"},"feathers-giveth Staging")),(0,r.kt)("h2",{id:"faq"},"FAQ"),(0,r.kt)("p",null," ",(0,r.kt)("strong",{parentName:"p"},"What is the definition of a feature?")),(0,r.kt)("p",null,"A Feature is any non-trivial improvement (less than 10 lines of code). Most features have issue in the corresponding Github Repository."),(0,r.kt)("p",null," ",(0,r.kt)("strong",{parentName:"p"},"What about fixes?")),(0,r.kt)("p",null," Big non-critical fixes are treated just like any other feature. If a fix is time critical, it is created as new branch with ",(0,r.kt)("inlineCode",{parentName:"p"},"hotfix/")," prefix as a fork from the ",(0,r.kt)("inlineCode",{parentName:"p"},"master")," branch. Such hotfix is tested at minimum by 2 people from dev team before being merged to ",(0,r.kt)("inlineCode",{parentName:"p"},"master"),"and ",(0,r.kt)("inlineCode",{parentName:"p"},"develop")," branches."),(0,r.kt)("p",null," ",(0,r.kt)("strong",{parentName:"p"},"Where do we communicate what needs testing?")),(0,r.kt)("p",null,"The QA testing is announced in the ",(0,r.kt)("inlineCode",{parentName:"p"},"Giveth-1 Dev")," channel on ",(0,r.kt)("a",{parentName:"p",href:"https://discord.giveth.io"},"Discord"),"."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"How do we prioritize when tests fail / bug fixes?")),(0,r.kt)("p",null,"Bug fixes are done ad-hoc as soon as discovered during the testing process. The bugs can be tackled by the DApp dev team or external contributors can be asked to help. Bug fixing has a priority over new development."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Who does deployments and how are they deployed?")),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"develop")," branch is autodeployed to its environment. The ",(0,r.kt)("inlineCode",{parentName:"p"},"master")," branch is deployed by the dev team (",(0,r.kt)("inlineCode",{parentName:"p"},"@aminlatifi"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"@RamRamez")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"@MohammadPCh"),") once there are no new known bugs in the ",(0,r.kt)("inlineCode",{parentName:"p"},"develop")," branch. The process is manual and there is a deployment procedure."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"What is the release cycle frequency?")),(0,r.kt)("p",null," There is new release every 2 weeks as depicted in the ",(0,r.kt)("a",{parentName:"p",href:"#product-development-testing-fig-release"},"product development cycle gant chart"),"."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/84960266.43a54d27.js b/assets/js/84960266.43a54d27.js new file mode 100644 index 0000000000..0189aaf04d --- /dev/null +++ b/assets/js/84960266.43a54d27.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[8085],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),u=s(a),h=r,k=u["".concat(p,".").concat(h)]||u[h]||m[h]||l;return a?n.createElement(k,i(i({ref:t},d),{},{components:a})):n.createElement(k,i({ref:t},d))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=u;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o.mdxType="string"==typeof e?e:r,i[1]=o;for(var s=2;s{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>p,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>m});var n=a(7462),r=(a(7294),a(3905)),l=a(4996),i=a(8932);const o={id:"TRACEinstallation",title:"Installing Giveth TRACE for Local Development",slug:"dapps/TRACEinstallation"},p=void 0,s={unversionedId:"TRACEinstallation",id:"TRACEinstallation",title:"Installing Giveth TRACE for Local Development",description:"This is a comprehensive guide that will walk through new contributors on how to run Giveth TRACE locally. We'll be dealing with 2 repos found in the Giveth Github: the giveth-dapp for the front-end and feathers-giveth for smart contract interfacing and the back-end database.",source:"@site/dapps/TRACEinstallation.md",sourceDirName:".",slug:"/dapps/TRACEinstallation",permalink:"/dapps/TRACEinstallation",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/TRACEinstallation.md",tags:[],version:"current",lastUpdatedBy:"Mitch Oz",lastUpdatedAt:1667254190,formattedLastUpdatedAt:"Oct 31, 2022",frontMatter:{id:"TRACEinstallation",title:"Installing Giveth TRACE for Local Development",slug:"dapps/TRACEinstallation"}},d={},m=[{value:"Feathers Installation",id:"feathers-installation",level:2},{value:"Packages and Applications Needed:",id:"packages-and-applications-needed",level:4},{value:"Linux",id:"linux",level:4},{value:"Any OS",id:"any-os",level:4},{value:"Run server",id:"run-server",level:3},{value:"Kill Ganache",id:"kill-ganache",level:3},{value:"IPFS Support",id:"ipfs-support",level:3},{value:"Video Walkthrough",id:"video-walkthrough",level:3},{value:"Scripts",id:"scripts",level:3},{value:"Testing",id:"testing",level:3},{value:"Debugging",id:"debugging",level:3},{value:"Production",id:"production",level:2},{value:"RSK",id:"rsk",level:2},{value:"Audit Log",id:"audit-log",level:2},{value:"Usage",id:"usage",level:3},{value:"Giveth DApp (Giveth TRACE front-end) Installation",id:"giveth-dapp-giveth-trace-front-end-installation",level:2},{value:"Getting Started",id:"getting-started",level:3},{value:"Prerequisites",id:"prerequisites",level:4},{value:"Install",id:"install",level:3},{value:"OSX and Linux",id:"osx-and-linux",level:4},{value:"Windows",id:"windows",level:4},{value:"Run",id:"run",level:3},{value:"Build",id:"build",level:3},{value:"Configuration",id:"configuration",level:3},{value:"Analytics",id:"analytics",level:3},{value:"Query Strings",id:"query-strings",level:3},{value:"Local Development",id:"local-development",level:3},{value:"Development and PR Testing",id:"development-and-pr-testing",level:3},{value:"Deployment Environments",id:"deployment-environments",level:3}],u={toc:m};function h(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)(i.ZP,{mdxType:"TraceDeprecated"}),(0,r.kt)("p",null," This is a comprehensive guide that will walk through new contributors on how to run Giveth TRACE locally. We'll be dealing with 2 repos found in the Giveth Github: the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Giveth/giveth-dapp"},(0,r.kt)("strong",{parentName:"a"},(0,r.kt)("inlineCode",{parentName:"strong"},"giveth-dapp")))," for the front-end and ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Giveth/feathers-giveth"},(0,r.kt)("strong",{parentName:"a"},(0,r.kt)("inlineCode",{parentName:"strong"},"feathers-giveth")))," for smart contract interfacing and the back-end database."),(0,r.kt)("h2",{id:"feathers-installation"},"Feathers Installation"),(0,r.kt)("img",{alt:"Feathers Installation Header",src:(0,l.Z)("img/content/trace/feathers-header.png")}),(0,r.kt)("h4",{id:"packages-and-applications-needed"},"Packages and Applications Needed:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"yarn"),(0,r.kt)("li",{parentName:"ul"},"NodeJS v10.24.0"),(0,r.kt)("li",{parentName:"ul"},"MongoDB"),(0,r.kt)("li",{parentName:"ul"},"Redis"),(0,r.kt)("li",{parentName:"ul"},"MetaMask")),(0,r.kt)("h4",{id:"linux"},"Linux"),(0,r.kt)("p",null," If your operating system is any distrubution of Linux, you can use the all-in-one installation scripts, special thanks to Dapp contributor Jurek Brisbane, available ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Giveth/giveth-dapp/files/3674808/givethBuildStartScripts_2019-09-29.zip"},"here")," along with a Youtube ",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=rzLhxxAz73k&feature=youtu.be"},"video"),"."),(0,r.kt)("h4",{id:"any-os"},"Any OS"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Click ",(0,r.kt)("strong",{parentName:"li"},"Star")," on this repo near the top-right corner of this web page (if you want to)."),(0,r.kt)("li",{parentName:"ol"},"Join our ",(0,r.kt)("a",{parentName:"li",href:"https://discord.giveth.io"},"Contributors Discord")," if you haven't already."),(0,r.kt)("li",{parentName:"ol"},"Fork this repo by clicking ",(0,r.kt)("strong",{parentName:"li"},"Fork")," button in top-right corner of this web page. Continue to follow instruction steps from your own feathers-giveth repo."),(0,r.kt)("li",{parentName:"ol"},'The rest of these steps must be done from your machine\'s command line. Clone your own "feathers-giveth" repo. Copy the link from the "Clone or download" button near the top right of this repo\'s home page.',(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone git@github.com:Giveth/feathers-giveth.git\n"))),(0,r.kt)("li",{parentName:"ol"},"Change directories to feathers-giveth:",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"cd feathers-giveth/\n"))),(0,r.kt)("li",{parentName:"ol"},"Make sure you have ",(0,r.kt)("a",{parentName:"li",href:"https://nodejs.org/"},"NodeJS")," (v10.24.0), ",(0,r.kt)("a",{parentName:"li",href:"https://www.yarnpkg.com/"},"yarn")," (v0.27.5 or higher), and npm (5.4.1 or higher) installed."),(0,r.kt)("li",{parentName:"ol"},"Install dependencies from within feathers-giveth directory:",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn install\n"))),(0,r.kt)("li",{parentName:"ol"},"Install Mongo (we recommend installing via ",(0,r.kt)("a",{parentName:"li",href:"https://treehouse.github.io/installation-guides/mac/mongo-mac.html"},"Brew"),")."),(0,r.kt)("li",{parentName:"ol"},"Run Mongo in a terminal window ",(0,r.kt)("inlineCode",{parentName:"li"},"mongod")," or in the background ",(0,r.kt)("inlineCode",{parentName:"li"},"mongod --fork --syslog"),"."),(0,r.kt)("li",{parentName:"ol"},"Install Redis (we recommend install via Brew ",(0,r.kt)("inlineCode",{parentName:"li"},"brew install redis"),")."),(0,r.kt)("li",{parentName:"ol"},"Run Redis in terminal window ",(0,r.kt)("inlineCode",{parentName:"li"},"redis-server")," or in the background ",(0,r.kt)("inlineCode",{parentName:"li"},"redis-server --daemonize yes"),"."),(0,r.kt)("li",{parentName:"ol"},"(optionally) Install ",(0,r.kt)("a",{parentName:"li",href:"https://ipfs.io/docs/install/"},"IPFS")," (we recommend installing via ",(0,r.kt)("a",{parentName:"li",href:"https://brew.sh/"},"Brew"),").\n*",(0,r.kt)("em",{parentName:"li"},"If you don't install ipfs, image uploading will be affected. You can update the config ",(0,r.kt)("inlineCode",{parentName:"em"},"ipfsGateway")," value to use a public ipfs gateway ex. ",(0,r.kt)("a",{parentName:"em",href:"https://ipfs.io/ipfs/"},"https://ipfs.io/ipfs/"),", however your uploads will be removed at some point."))),(0,r.kt)("h3",{id:"run-server"},"Run server"),(0,r.kt)("p",null,"The Feathers server will need to connect to an Ethereum node via WebSocket. Typically this will be a local TestRPC instance.\nThe configuration param ",(0,r.kt)("inlineCode",{parentName:"p"},"blockchain.nodeUrl")," is used to establish a connection. The default nodeUrl is ",(0,r.kt)("inlineCode",{parentName:"p"},"ws://localhost:8545")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"We need to deploy any contract to that we intend to call. ",(0,r.kt)("em",{parentName:"p"},"NOTE:")," The following cmd will clear the ",(0,r.kt)("inlineCode",{parentName:"p"},"data")," dir, thus starting off in a clean state."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn deploy-local\n")),(0,r.kt)("p",{parentName:"li"},"After deploying local, make sure to copy-paste the MiniMeToken address in default.json.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"We provide an easy way to start the bridge & 2 ganache-cli instances. ",(0,r.kt)("em",{parentName:"p"},"VERY IMPORTANT:")," this command enables Home Ganache and Foreign Ganache networks; if you are using MetaMask you will need to ",(0,r.kt)("strong",{parentName:"p"},"add a Custom RPC")," to your networks config; ",(0,r.kt)("inlineCode",{parentName:"p"},"http://localhost:8546")," will be Foreign Ganache, and Home Ganache is normally added by default which is ",(0,r.kt)("inlineCode",{parentName:"p"},"http://localhost:8545")," if needed."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn start:networks\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Since the bridge & ganache-cli is now running, open a new terminal window, and navigate to the same feathers-giveth directory.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Optionally open a new terminal window and start the ipfs daemon."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"ipfs daemon\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Run db migration files (if this the first time you want to start application, it's not needed to run migrations)."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"}," ./node_modules/.bin/migrate-mongo up\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Start your app."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn start\n")))),(0,r.kt)("h3",{id:"kill-ganache"},"Kill Ganache"),(0,r.kt)("p",null,"If you run into errors like wallet balance not loading, it is very likely that Ganache is stuck.\n",(0,r.kt)("inlineCode",{parentName:"p"},"netstat -vanp tcp | grep 8545"),"\nFind the process that is listening on ",(0,r.kt)("inlineCode",{parentName:"p"},"*.8545")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"127.0.0.1.8545"),", and kill it with ",(0,r.kt)("inlineCode",{parentName:"p"},"kill -9 PID")," (which is in the last colomn)."),(0,r.kt)("h3",{id:"ipfs-support"},"IPFS Support"),(0,r.kt)("p",null,"If the ",(0,r.kt)("inlineCode",{parentName:"p"},"ipfsApi")," is a valid ipfs node that we can connect to, we will pin every ipfs hash that is stored in feathers. We currently do not remove any orphaned (hashes with no references in feathers) ipfs hashs. In the future we will provide a script that you can run as a cronjob to unpin any orphaned hashes."),(0,r.kt)("h3",{id:"video-walkthrough"},"Video Walkthrough"),(0,r.kt)("p",null,"Video tutorial walkthrough here: ",(0,r.kt)("a",{parentName:"p",href:"https://tinyurl.com/y9lx6jrl"},"https://tinyurl.com/y9lx6jrl")),(0,r.kt)("h3",{id:"scripts"},"Scripts"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"feathers-giveth/scripts")," directory contains a few scripts to help development."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"deploy.js")," - deploys a new vault & liquidPledging contract")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"getState.js")," - prints the current state of the deployed vault & liquidPledging contracts")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"confirm.js")," - confirms any payments that are pending in the vault")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"makeUserAdmin.js")," - make a user admin"))),(0,r.kt)("h3",{id:"testing"},"Testing"),(0,r.kt)("p",null,"Simply run ",(0,r.kt)("inlineCode",{parentName:"p"},"yarn test"),", and all your tests in the ",(0,r.kt)("inlineCode",{parentName:"p"},"/src")," directory will be run.\nIt's included some integration tests, so for running tests, you need to run a mongodb in your local system (on port 27017)."),(0,r.kt)("h3",{id:"debugging"},"Debugging"),(0,r.kt)("p",null,"You can control the logging level with the ",(0,r.kt)("inlineCode",{parentName:"p"},"LOG_LEVEL")," env variable. Available levels can be found at: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/winstonjs/winston/tree/2.x#logging-levels"},"https://github.com/winstonjs/winston/tree/2.x#logging-levels")),(0,r.kt)("p",null,"To enable debug logging simply start the server with ",(0,r.kt)("inlineCode",{parentName:"p"},"LOG_LEVEL=debug yarn start"),"."),(0,r.kt)("h2",{id:"production"},"Production"),(0,r.kt)("p",null,"We use docker-compose for orchestration of our docker containers in our production servers."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"make Make sure you have a file named ",(0,r.kt)("inlineCode",{parentName:"li"},"production.json")," in config folder."),(0,r.kt)("li",{parentName:"ul"},"Install docker and docker-compose on your server."),(0,r.kt)("li",{parentName:"ul"},"run this command: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker-compose -f docker-compose-production.yml up -d"),".")),(0,r.kt)("p",null,"PS: It's good to see Github Actions config(",(0,r.kt)("inlineCode",{parentName:"p"},"./.github/workflows/CI-CD.yml"),") to better understand the deployment structure."),(0,r.kt)("h2",{id:"rsk"},"RSK"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"You will need to download the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/rsksmart/rskj/wiki/Install-RskJ-and-join-the-RSK-Orchid-Mainnet-Beta"},"rsk node"),". After installing, you will run the node w/ the ",(0,r.kt)("inlineCode",{parentName:"p"},"regtest")," network for local development."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"java -jar rskj-core-0.5.2-ORCHID-all.jar co.rsk.Start --regtest\n")),(0,r.kt)("p",{parentName:"li"},"or"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"java -Drsk.conf.file=rsk.conf -jar rskj-core-0.5.2-ORCHID-all.jar co.rsk.Start\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"We need to deploy any contracts that we intend to call. ",(0,r.kt)("em",{parentName:"p"},"NOTE:")," You will also need to ensure that your rsk node is in a clean state (reset) for the configured addresses to be correct."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"npm run deploy-local:rsk\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Optionally open a new terminal window and start the ipfs daemon."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"ipfs daemon\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Start your app."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"yarn start:rsk\n")))),(0,r.kt)("h2",{id:"audit-log"},"Audit Log"),(0,r.kt)("p",null,"The Audit log system logs every Create, Update, Patch and\nRemove on ",(0,r.kt)("strong",{parentName:"p"},"Campaigns"),", ",(0,r.kt)("strong",{parentName:"p"},"Traces"),", ",(0,r.kt)("strong",{parentName:"p"},"Events"),", ",(0,r.kt)("strong",{parentName:"p"},"Users"),",\n",(0,r.kt)("strong",{parentName:"p"},"PledgeAdmins"),", ",(0,r.kt)("strong",{parentName:"p"},"Communities"),", ",(0,r.kt)("strong",{parentName:"p"},"Donations"),".\nFor enabling audit log locally you should change ",(0,r.kt)("inlineCode",{parentName:"p"},"enableAuditLog"),"\nin config to ",(0,r.kt)("inlineCode",{parentName:"p"},"true"),", then"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"cd elk"),(0,r.kt)("li",{parentName:"ul"},"docker-compose up")),(0,r.kt)("p",null,"You can see the logs after logging in ",(0,r.kt)("inlineCode",{parentName:"p"},"localhost:5601")," with user:",(0,r.kt)("inlineCode",{parentName:"p"},"elastic"),", password: ",(0,r.kt)("inlineCode",{parentName:"p"},"changeme"),"."),(0,r.kt)("h3",{id:"usage"},"Usage"),(0,r.kt)("p",null,"Each of these services are available via rRest or WebSocket:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"campaigns\ncommunities\ndonations\ndonationsHistory\ntraces\nuploads\nusers\nemails\nhomePaymentsTransactions\nsubscriptions\n")),(0,r.kt)("p",null,"If the server is using default configurations, you can see data for any of these services through your web browser at ",(0,r.kt)("inlineCode",{parentName:"p"},"http://localhost:3030/SERVICE_NAME")),(0,r.kt)("p",null,"PS: For accessing all features like creating ",(0,r.kt)("inlineCode",{parentName:"p"},"communities")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"campaigns")," it's suggested to\nmake ",(0,r.kt)("inlineCode",{parentName:"p"},"isAdmin")," field true, for your user in you local MongoDb."),(0,r.kt)("h2",{id:"giveth-dapp-giveth-trace-front-end-installation"},"Giveth DApp (Giveth TRACE front-end) Installation"),(0,r.kt)("img",{alt:"Giveth-DApp Installation Header",src:(0,l.Z)("img/content/trace/giveth-dapp-header.png")}),(0,r.kt)("h3",{id:"getting-started"},"Getting Started"),(0,r.kt)("p",null,"In the following sections you will learn all you need to know to run the DApp locally and to start contributing. All the steps are also described in this amazing ",(0,r.kt)("a",{parentName:"p",href:"https://tinyurl.com/y9lx6jrl"},"Video Tutorial Walkthrough")," by Oz."),(0,r.kt)("h4",{id:"prerequisites"},"Prerequisites"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"NodeJS v10 LTS."),(0,r.kt)("li",{parentName:"ul"},"yarn (v1.22.10 or higher)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://git-scm.com/book/en/v2/Getting-Started-Installing-Git"},"git"))),(0,r.kt)("h3",{id:"install"},"Install"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Click ",(0,r.kt)("strong",{parentName:"li"},"Star")," on the ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/Giveth/giveth-dapp"},(0,r.kt)("inlineCode",{parentName:"a"},"giveth-dapp"))," repo near the top-right corner of this web page (if you want to)."),(0,r.kt)("li",{parentName:"ol"},"Join us on ",(0,r.kt)("a",{parentName:"li",href:"http://join.giveth.io"},"Element")," or ",(0,r.kt)("a",{parentName:"li",href:"https://discord.gg/Uq2TaXP9bC"},"Discord")," if you haven't already."),(0,r.kt)("li",{parentName:"ol"},"Fork this repo by clicking ",(0,r.kt)("strong",{parentName:"li"},"Fork")," button in top-right corner of this web page. Continue to follow instruction steps from your own giveth-dapp repo."),(0,r.kt)("li",{parentName:"ol"},'Clone your own "giveth-dapp" repo. Copy the link from the "Clone or download" button near the top right of this repo\'s home page.'),(0,r.kt)("li",{parentName:"ol"},"The rest of these steps must be done from your machine's command line. See the ",(0,r.kt)("a",{parentName:"li",href:"#for-osx-and-linux"},"OSX and Linux")," or ",(0,r.kt)("a",{parentName:"li",href:"#for-windows"},"Windows")," section to continue.")),(0,r.kt)("h4",{id:"osx-and-linux"},(0,r.kt)("a",{id:"for-osx-and-linux"},"OSX and Linux")),(0,r.kt)("p",null,"If your operative system is any distribution of Linux you can use the all-in-one installation scripts, special thanks to Dapp contributor Jurek Brisbane, available ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Giveth/giveth-dapp/files/3674808/givethBuildStartScripts_2019-09-29.zip"},"here")," along with a Youtube ",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=rzLhxxAz73k&feature=youtu.be"},"video"),", otherwise try the following:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},'From the desired directory you wish to copy the "giveth-dapp" folder with source files to.',(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone git@github.com:Giveth/giveth-dapp.git\n")),"NOTE: Please use ",(0,r.kt)("inlineCode",{parentName:"li"},"develop")," branch for contributing.",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone -b develop git@github.com:Giveth/giveth-dapp.git\n"))),(0,r.kt)("li",{parentName:"ol"},"Change directories to giveth-dapp:",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"cd giveth-dapp\n"))),(0,r.kt)("li",{parentName:"ol"},"Make sure you have ",(0,r.kt)("a",{parentName:"li",href:"https://nodejs.org/"},"NodeJS")," (v10) and ",(0,r.kt)("a",{parentName:"li",href:"https://yarnpkg.com/"},"yarn")," (v1.22.10 or higher) installed."),(0,r.kt)("li",{parentName:"ol"},"Install dependencies from within giveth-dapp directory:",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn install\n"))),(0,r.kt)("li",{parentName:"ol"},"That is it - you are now ready to run the giveth-dapp! Head to the ",(0,r.kt)("a",{parentName:"li",href:"#run"},"Run DApp")," section for further instructions.")),(0,r.kt)("h4",{id:"windows"},(0,r.kt)("a",{id:"for-windows"},"Windows")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Install the latest version of Python from this ",(0,r.kt)("a",{parentName:"li",href:"https://www.python.org/downloads/"},"Link"),". (Make sure Python is added to $PATH.)"),(0,r.kt)("li",{parentName:"ol"},"Install Microsoft Visual Studio 2017 (double-check the version) from this ",(0,r.kt)("a",{parentName:"li",href:"https://download.visualstudio.microsoft.com/download/pr/3e542575-929e-4297-b6c6-bef34d0ee648/639c868e1219c651793aff537a1d3b77/vs_buildtools.exe"},"link"),". Giveth-Dapp needs the node-gyp module, and node-gyp needs VS C++ 2017 Build Tools to be installed."),(0,r.kt)("li",{parentName:"ol"},"After downloading, install the packages marked from this ",(0,r.kt)("a",{parentName:"li",href:"https://cdn.discordapp.com/attachments/849682448102457374/850480734291623946/unknown.png"},"image"),"."),(0,r.kt)("li",{parentName:"ol"},"Then run command below in command prompt",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"npm config set msvs_version 2017\n"))),(0,r.kt)("li",{parentName:"ol"},"After installing the above, you should install NodeJS version 10 ",(0,r.kt)("a",{parentName:"li",href:"https://nodejs.org/dist/latest-v10.x/"},"LTS")," (it is better to be v10.24.1 LTS)."),(0,r.kt)("li",{parentName:"ol"},'Download and run the node-v10.24.1-x64.msi installer, then continue through the installation as normal. Be sure to have the "Enable in PATH" option enabled before installing.'),(0,r.kt)("li",{parentName:"ol"},'Open the command line in administrator mode by right-clicking on the cmd.exe application and selecting "Run as administrator"'),(0,r.kt)("li",{parentName:"ol"},"In the administrator command prompt, change to the directory where you want to store this repository.",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"cd C:\\some\\directory\\for\\repositories\n"))),(0,r.kt)("li",{parentName:"ol"},"Double-check the node version with CMD command:",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"node -v\n"))),(0,r.kt)("li",{parentName:"ol"},'After that, install the latest version of Yarn. Be careful not to install packages with NPM. If you have already tried "npm install", you should first delete "node modules" folder.',(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn install\n"))),(0,r.kt)("li",{parentName:"ol"},"That is it - you are now ready to run the giveth-dapp!")),(0,r.kt)("h3",{id:"run"},(0,r.kt)("a",{id:"run"},"Run")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"The Giveth dapp will need to connect to a ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Giveth/feathers-giveth"},"feathers-giveth")," server. Follow the feathers-giveth readme instructions to install and run server before proceeding further. Alternatively, you could change the configuration to connect to the ",(0,r.kt)("inlineCode",{parentName:"p"},"develop")," environment, see the ",(0,r.kt)("a",{parentName:"p",href:"#configuration"},"Configuration")," section.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Start the dapp."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn start\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},'Once the dapp is up in your browser, click "Sign In" from the main menu.')),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"For testing locally, choose any of the wallet files found in the ",(0,r.kt)("inlineCode",{parentName:"p"},"giveth-dapp/keystores/")," folder using the wallet password: ",(0,r.kt)("inlineCode",{parentName:"p"},"password"),". ",(0,r.kt)("strong",{parentName:"p"},"DO NOT USE THESE ON ANY MAINNET EVMs."))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Using the test token\nTo use the test token you need to import the keystore.json you use for your account to MetaMask.\nAfter importing, click on 'Add token' > 'Custom token', and enter the MiniMe Token address that can be found when deploying the contracts\n(should be ",(0,r.kt)("inlineCode",{parentName:"p"},"0xe78A0F7E598Cc8b0Bb87894B0F60dD2a88d6a8Ab")," by default but make sure to check).\nThe token balance should show up automatically, and the token symbol is MMT.\nHowever, in the DApp the token symbol is referred to as ANT, b/c the DApp needs to be able to fetch a conversion rate."))),(0,r.kt)("p",null,"NOTE:\nWhen resetting feathers or redeploying the contracts, you need to remove the keystore from Metamask and follow this procedure again."),(0,r.kt)("h3",{id:"build"},"Build"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn run build\n")),(0,r.kt)("p",null,"NOTE: due to some web3 libraries that are not transpiled from es6, we have to use our ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Giveth/create-react-app/tree/master/packages/react-scripts"},"giveth-react-scripts")," fork of react-scripts."),(0,r.kt)("h3",{id:"configuration"},(0,r.kt)("a",{id:"configuration"},"Configuration")),(0,r.kt)("p",null,"The DApp has several node environment variables which can be used to alter the DApp behaviour without changing the code. You can set them through ",(0,r.kt)("inlineCode",{parentName:"p"},".env")," or ",(0,r.kt)("inlineCode",{parentName:"p"},".env.local")," files in the DApp folder."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Variable name"),(0,r.kt)("th",{parentName:"tr",align:null},"Default Value"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"PORT"),(0,r.kt)("td",{parentName:"tr",align:null},"3010"),(0,r.kt)("td",{parentName:"tr",align:null},"Port on which the DApp runs")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_ENVIRONMENT"),(0,r.kt)("td",{parentName:"tr",align:null},"'localhost'"),(0,r.kt)("td",{parentName:"tr",align:null},"To which feathers environment should the DApp connect. By default it connects to localhost feathers. Allowed values are: ",(0,r.kt)("inlineCode",{parentName:"td"},"localhost"),", ",(0,r.kt)("inlineCode",{parentName:"td"},"develop"),", ",(0,r.kt)("inlineCode",{parentName:"td"},"release"),", ",(0,r.kt)("inlineCode",{parentName:"td"},"alpha"),", ",(0,r.kt)("inlineCode",{parentName:"td"},"mainnet"),". See ",(0,r.kt)("a",{parentName:"td",href:"#deploy-environments"},"Deployment Environments"),".")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_DECIMALS"),(0,r.kt)("td",{parentName:"tr",align:null},"8"),(0,r.kt)("td",{parentName:"tr",align:null},"How many decimal should be shown for cryptocurrency values. Note that the calculations are still done with 18 decimals.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_FEATHERJS_CONNECTION_URL"),(0,r.kt)("td",{parentName:"tr",align:null},"Differs per REACT_APP_ENVIRONMENT"),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites the environment injected feathers connection URL.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_NODE_CONNECTION_URL"),(0,r.kt)("td",{parentName:"tr",align:null},"Differs per REACT_APP_ENVIRONMENT"),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites the EVM node connection URL for making EVM transactions.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_LIQUIDPLEDGING_ADDRESS"),(0,r.kt)("td",{parentName:"tr",align:null},"Differs per REACT_APP_ENVIRONMENT"),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites the Liquid Pledging contract address.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_DAC_FACTORY_ADDRESS"),(0,r.kt)("td",{parentName:"tr",align:null},"Differs per REACT_APP_ENVIRONMENT"),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites the Communities contract address.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_CAMPAIGN_FACTORY_ADDRESS"),(0,r.kt)("td",{parentName:"tr",align:null},"Differs per REACT_APP_ENVIRONMENT"),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites the Campaign Factory contract address.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_MILESTONE_FACTORY_ADDRESS"),(0,r.kt)("td",{parentName:"tr",align:null},"Differs per REACT_APP_ENVIRONMENT"),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites the MilestoneFactory contract address.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_TOKEN_ADDRESSES"),(0,r.kt)("td",{parentName:"tr",align:null},"Differs per REACT_APP_ENVIRONMENT"),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites the bridged token addresses. This is a JSON object string w/ token name: token address.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_BLOCKEXPLORER"),(0,r.kt)("td",{parentName:"tr",align:null},"Differs per REACT_APP_ENVIRONMENT"),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites the block explorer base URL. The DApp assumes such blockexplorer api is ",(0,r.kt)("inlineCode",{parentName:"td"},"\\/tx/\\"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_DEFAULT_GASPRICE"),(0,r.kt)("td",{parentName:"tr",align:null},"10"),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites the default gasPrice that is used if ethgasstation service is down. The value is in gwei.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_ANALYTICS_KEY"),(0,r.kt)("td",{parentName:"tr",align:null},'""'),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites ",(0,r.kt)("inlineCode",{parentName:"td"},"Segment")," analytics key.")))),(0,r.kt)("p",null,"Example of ",(0,r.kt)("inlineCode",{parentName:"p"},".env.local")," file that makes the DApp run on port 8080, connects to the ",(0,r.kt)("strong",{parentName:"p"},"develop")," environment and uses custom blockexplorer:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"PORT=8080\nREACT_APP_ENVIRONMENT='develop'\nREACT_APP_BLOCKEXPLORER='www.awesomeopensourceexplorer.io'\n")),(0,r.kt)("p",null,"The rest of the configuration can be found in ",(0,r.kt)("inlineCode",{parentName:"p"},"configuration.js")),(0,r.kt)("h3",{id:"analytics"},"Analytics"),(0,r.kt)("p",null,"Segment Analytics can be enabled by setting REACT_APP_ANALYTICS_KEY."),(0,r.kt)("h3",{id:"query-strings"},"Query Strings"),(0,r.kt)("p",null,"The milestone creation/proposal view now supports query string arguments!\nThe following arguments are available:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Argument"),(0,r.kt)("th",{parentName:"tr",align:null},"Expected Values"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"title"),(0,r.kt)("td",{parentName:"tr",align:null},"The title of the milestone"),(0,r.kt)("td",{parentName:"tr",align:null},"string")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"description"),(0,r.kt)("td",{parentName:"tr",align:null},"The description of the milestone"),(0,r.kt)("td",{parentName:"tr",align:null},"string")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"recipientAddress"),(0,r.kt)("td",{parentName:"tr",align:null},"The address of the recipient"),(0,r.kt)("td",{parentName:"tr",align:null},"string")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"reviewerAddress"),(0,r.kt)("td",{parentName:"tr",align:null},"The address of the reviewer"),(0,r.kt)("td",{parentName:"tr",align:null},"string")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"selectedFiatType"),(0,r.kt)("td",{parentName:"tr",align:null},"A valid fiat type (i.e. USD)"),(0,r.kt)("td",{parentName:"tr",align:null},"string")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"date"),(0,r.kt)("td",{parentName:"tr",align:null},"A valid milestone date string"),(0,r.kt)("td",{parentName:"tr",align:null},"string")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"token"),(0,r.kt)("td",{parentName:"tr",align:null},"A valid token symbol (i.e. DAI)"),(0,r.kt)("td",{parentName:"tr",align:null},"string")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"tokenAddress"),(0,r.kt)("td",{parentName:"tr",align:null},"A valid token address"),(0,r.kt)("td",{parentName:"tr",align:null},"string")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"maxAmount"),(0,r.kt)("td",{parentName:"tr",align:null},"A valid max amount of ETH or token"),(0,r.kt)("td",{parentName:"tr",align:null},"number")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"fiatAmount"),(0,r.kt)("td",{parentName:"tr",align:null},"A valid max amount of fiat (dependant on selectedFiatType)"),(0,r.kt)("td",{parentName:"tr",align:null},"number")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"isCapped"),(0,r.kt)("td",{parentName:"tr",align:null},"Determines whether the milestone should be capped"),(0,r.kt)("td",{parentName:"tr",align:null},"0 or 1 (boolean)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"requireReviewer"),(0,r.kt)("td",{parentName:"tr",align:null},"Determines whether the milestone should require a reviewer"),(0,r.kt)("td",{parentName:"tr",align:null},"0 or 1 (boolean)")))),(0,r.kt)("h3",{id:"local-development"},"Local Development"),(0,r.kt)("p",null,"At first you would like to run the DApp locally. When running ",(0,r.kt)("inlineCode",{parentName:"p"},"testrpc")," locally in ",(0,r.kt)("inlineCode",{parentName:"p"},"deterministic")," mode, you can use any of the keystores in the ",(0,r.kt)("inlineCode",{parentName:"p"},"giveth-dapp/keystores")," as your wallet.\nThis will provide you access to the testrpc accounts for local development. Each keystore uses the same password: ",(0,r.kt)("inlineCode",{parentName:"p"},"password"),". ",(0,r.kt)("strong",{parentName:"p"},"DO NOT USE THESE ON ANY MAINNET EVMs")),(0,r.kt)("p",null,"The keystores are seeded with 10.000 ANT tokens for testing donations. To get started with testing donations,\nmake sure to add your account's keystore to MetaMask and swith MetaMask to Ganache. The donation modal should\nthen show the appropriate balance when donating in ANT tokens."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"NOTE"),': If you get a nonce error in MetaMask or if the DApp fails to load with your MetaMask unlocked, it could be because MetaMask is confused. You should go to "settings" -> "Reset Account" in MetaMask in order to reset the nonce & cached account data.'),(0,r.kt)("h3",{id:"development-and-pr-testing"},"Development and PR Testing"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"The Giveth Dapp is auto deployed from the develop branch and is live on Rinkeby ",(0,r.kt)("a",{parentName:"li",href:"https://develop.giveth.io"},"develop.giveth.io"),". All pull requests are autodeployed, and the PR preview will be generated upon submission. To learn how to access PR previews see ",(0,r.kt)("a",{parentName:"li",href:"https://wiki.giveth.io/documentation/DApp/product-development-testing/"},"Development Process & Quality Assurance")," on our wiki."),(0,r.kt)("li",{parentName:"ol"},'In order to use the DApp you will need to create account. If this is your first time, click "sign up" to create an account. If you already have a valid keychain file, use it to sign in.'),(0,r.kt)("li",{parentName:"ol"},'You will need test ether on the Rinkeby network. Go to the "wallet" page to see your new address (0x..). Copy that address, and use the Faucet to get some: ',(0,r.kt)("a",{parentName:"li",href:"https://faucet.rinkeby.io/"},"https://faucet.rinkeby.io/"),".")),(0,r.kt)("h3",{id:"deployment-environments"},(0,r.kt)("a",{id:"deploy-environments"},"Deployment Environments")),(0,r.kt)("p",null,"At Giveth, we are using the ",(0,r.kt)("a",{parentName:"p",href:"http://nvie.com/posts/a-successful-git-branching-model/"},"gitflow")," branching model to deploy to 4 different environments."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Blockchain"),(0,r.kt)("th",{parentName:"tr",align:null},"Branch Deployed"),(0,r.kt)("th",{parentName:"tr",align:null},"Auto Deploy"),(0,r.kt)("th",{parentName:"tr",align:null},"Use"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://mainnet.giveth.io"},"mainnet")),(0,r.kt)("td",{parentName:"tr",align:null},"Ethereum Main Network"),(0,r.kt)("td",{parentName:"tr",align:null},"master"),(0,r.kt)("td",{parentName:"tr",align:null},"no"),(0,r.kt)("td",{parentName:"tr",align:null},"Main network deployment for now abandoned due to high transaction costs until sustainable solution is found.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://alpha.giveth.io"},"alpha")),(0,r.kt)("td",{parentName:"tr",align:null},"Rinkeby Test Network"),(0,r.kt)("td",{parentName:"tr",align:null},"master"),(0,r.kt)("td",{parentName:"tr",align:null},"no"),(0,r.kt)("td",{parentName:"tr",align:null},"Environment used as a production version until scalability is resolved.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://release.giveth.io"},"release")),(0,r.kt)("td",{parentName:"tr",align:null},"Rinkeby Test Network"),(0,r.kt)("td",{parentName:"tr",align:null},"release"),(0,r.kt)("td",{parentName:"tr",align:null},"yes"),(0,r.kt)("td",{parentName:"tr",align:null},"Environment for release candidate quality control testing by non-devs.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://develop.giveth.io"},"develop")),(0,r.kt)("td",{parentName:"tr",align:null},"Rinkeby Test Network"),(0,r.kt)("td",{parentName:"tr",align:null},"develop"),(0,r.kt)("td",{parentName:"tr",align:null},"yes"),(0,r.kt)("td",{parentName:"tr",align:null},"Development environment for integrating new features. Feature and pull request branches are also automatically deployed to this environment.")))),(0,r.kt)("p",null,"You can change the environment to which the DApp connects through the node environment variables. See the ",(0,r.kt)("a",{parentName:"p",href:"#Configuration"},"Configuration")," section for more details."))}h.isMDXComponent=!0},8932:(e,t,a)=>{a.d(t,{ZP:()=>i});var n=a(7462),r=(a(7294),a(3905));const l={toc:[]};function i(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},l,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},(0,r.kt)("strong",{parentName:"em"},"Giveth TRACE has officially been deprecated. After 5 years of faithful service, Giveth and its platform, services and products have fully migrated to ",(0,r.kt)("a",{parentName:"strong",href:"https://giveth.io"},"Giveth.io"),". With the deprecation of the Rinkeby network and low user activity, the Giveth DAO decided to sunset its original dApp in Q3 of 2022. The code has and will forever be open-source, and you can find it in ",(0,r.kt)("a",{parentName:"strong",href:"https://github.com/Giveth"},"Giveth's Github repositories"),"."))),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},(0,r.kt)("strong",{parentName:"em"},"This documentation will remain available for historical reference."))),(0,r.kt)("hr",null))}i.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/84960266.73576560.js b/assets/js/84960266.73576560.js deleted file mode 100644 index 39bf9915db..0000000000 --- a/assets/js/84960266.73576560.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[8085],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),u=s(a),h=r,k=u["".concat(p,".").concat(h)]||u[h]||m[h]||i;return a?n.createElement(k,l(l({ref:t},d),{},{components:a})):n.createElement(k,l({ref:t},d))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=u;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o.mdxType="string"==typeof e?e:r,l[1]=o;for(var s=2;s{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>p,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>m});var n=a(7462),r=(a(7294),a(3905)),i=a(4996),l=a(8932);const o={id:"TRACEinstallation",title:"Installing Giveth TRACE for Local Development",slug:"dapps/TRACEinstallation"},p=void 0,s={unversionedId:"TRACEinstallation",id:"TRACEinstallation",title:"Installing Giveth TRACE for Local Development",description:"This is a comprehensive guide that will walk through new contributors on how to run Giveth TRACE locally. We'll be dealing with 2 repos found in the Giveth Github: the giveth-dapp for the front-end and feathers-giveth for smart contract interfacing and the back-end database.",source:"@site/dapps/TRACEinstallation.md",sourceDirName:".",slug:"/dapps/TRACEinstallation",permalink:"/dapps/TRACEinstallation",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/TRACEinstallation.md",tags:[],version:"current",lastUpdatedBy:"Mitch Oz",lastUpdatedAt:1667254190,formattedLastUpdatedAt:"Oct 31, 2022",frontMatter:{id:"TRACEinstallation",title:"Installing Giveth TRACE for Local Development",slug:"dapps/TRACEinstallation"},sidebar:"dapps",previous:{title:"Installing Giveth.io for Local Development",permalink:"/dapps/givethioinstallation"},next:{title:"Giveth Bridge Security Implementation",permalink:"/dapps/bridgeSecurity"}},d={},m=[{value:"Feathers Installation",id:"feathers-installation",level:2},{value:"Packages and Applications Needed:",id:"packages-and-applications-needed",level:4},{value:"Linux",id:"linux",level:4},{value:"Any OS",id:"any-os",level:4},{value:"Run server",id:"run-server",level:3},{value:"Kill Ganache",id:"kill-ganache",level:3},{value:"IPFS Support",id:"ipfs-support",level:3},{value:"Video Walkthrough",id:"video-walkthrough",level:3},{value:"Scripts",id:"scripts",level:3},{value:"Testing",id:"testing",level:3},{value:"Debugging",id:"debugging",level:3},{value:"Production",id:"production",level:2},{value:"RSK",id:"rsk",level:2},{value:"Audit Log",id:"audit-log",level:2},{value:"Usage",id:"usage",level:3},{value:"Giveth DApp (Giveth TRACE front-end) Installation",id:"giveth-dapp-giveth-trace-front-end-installation",level:2},{value:"Getting Started",id:"getting-started",level:3},{value:"Prerequisites",id:"prerequisites",level:4},{value:"Install",id:"install",level:3},{value:"OSX and Linux",id:"osx-and-linux",level:4},{value:"Windows",id:"windows",level:4},{value:"Run",id:"run",level:3},{value:"Build",id:"build",level:3},{value:"Configuration",id:"configuration",level:3},{value:"Analytics",id:"analytics",level:3},{value:"Query Strings",id:"query-strings",level:3},{value:"Local Development",id:"local-development",level:3},{value:"Development and PR Testing",id:"development-and-pr-testing",level:3},{value:"Deployment Environments",id:"deployment-environments",level:3}],u={toc:m};function h(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)(l.ZP,{mdxType:"TraceDeprecated"}),(0,r.kt)("p",null," This is a comprehensive guide that will walk through new contributors on how to run Giveth TRACE locally. We'll be dealing with 2 repos found in the Giveth Github: the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Giveth/giveth-dapp"},(0,r.kt)("strong",{parentName:"a"},(0,r.kt)("inlineCode",{parentName:"strong"},"giveth-dapp")))," for the front-end and ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Giveth/feathers-giveth"},(0,r.kt)("strong",{parentName:"a"},(0,r.kt)("inlineCode",{parentName:"strong"},"feathers-giveth")))," for smart contract interfacing and the back-end database."),(0,r.kt)("h2",{id:"feathers-installation"},"Feathers Installation"),(0,r.kt)("img",{alt:"Feathers Installation Header",src:(0,i.Z)("img/content/trace/feathers-header.png")}),(0,r.kt)("h4",{id:"packages-and-applications-needed"},"Packages and Applications Needed:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"yarn"),(0,r.kt)("li",{parentName:"ul"},"NodeJS v10.24.0"),(0,r.kt)("li",{parentName:"ul"},"MongoDB"),(0,r.kt)("li",{parentName:"ul"},"Redis"),(0,r.kt)("li",{parentName:"ul"},"MetaMask")),(0,r.kt)("h4",{id:"linux"},"Linux"),(0,r.kt)("p",null," If your operating system is any distrubution of Linux, you can use the all-in-one installation scripts, special thanks to Dapp contributor Jurek Brisbane, available ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Giveth/giveth-dapp/files/3674808/givethBuildStartScripts_2019-09-29.zip"},"here")," along with a Youtube ",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=rzLhxxAz73k&feature=youtu.be"},"video"),"."),(0,r.kt)("h4",{id:"any-os"},"Any OS"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Click ",(0,r.kt)("strong",{parentName:"li"},"Star")," on this repo near the top-right corner of this web page (if you want to)."),(0,r.kt)("li",{parentName:"ol"},"Join our ",(0,r.kt)("a",{parentName:"li",href:"https://discord.giveth.io"},"Contributors Discord")," if you haven't already."),(0,r.kt)("li",{parentName:"ol"},"Fork this repo by clicking ",(0,r.kt)("strong",{parentName:"li"},"Fork")," button in top-right corner of this web page. Continue to follow instruction steps from your own feathers-giveth repo."),(0,r.kt)("li",{parentName:"ol"},'The rest of these steps must be done from your machine\'s command line. Clone your own "feathers-giveth" repo. Copy the link from the "Clone or download" button near the top right of this repo\'s home page.',(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone git@github.com:Giveth/feathers-giveth.git\n"))),(0,r.kt)("li",{parentName:"ol"},"Change directories to feathers-giveth:",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"cd feathers-giveth/\n"))),(0,r.kt)("li",{parentName:"ol"},"Make sure you have ",(0,r.kt)("a",{parentName:"li",href:"https://nodejs.org/"},"NodeJS")," (v10.24.0), ",(0,r.kt)("a",{parentName:"li",href:"https://www.yarnpkg.com/"},"yarn")," (v0.27.5 or higher), and npm (5.4.1 or higher) installed."),(0,r.kt)("li",{parentName:"ol"},"Install dependencies from within feathers-giveth directory:",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn install\n"))),(0,r.kt)("li",{parentName:"ol"},"Install Mongo (we recommend installing via ",(0,r.kt)("a",{parentName:"li",href:"https://treehouse.github.io/installation-guides/mac/mongo-mac.html"},"Brew"),")."),(0,r.kt)("li",{parentName:"ol"},"Run Mongo in a terminal window ",(0,r.kt)("inlineCode",{parentName:"li"},"mongod")," or in the background ",(0,r.kt)("inlineCode",{parentName:"li"},"mongod --fork --syslog"),"."),(0,r.kt)("li",{parentName:"ol"},"Install Redis (we recommend install via Brew ",(0,r.kt)("inlineCode",{parentName:"li"},"brew install redis"),")."),(0,r.kt)("li",{parentName:"ol"},"Run Redis in terminal window ",(0,r.kt)("inlineCode",{parentName:"li"},"redis-server")," or in the background ",(0,r.kt)("inlineCode",{parentName:"li"},"redis-server --daemonize yes"),"."),(0,r.kt)("li",{parentName:"ol"},"(optionally) Install ",(0,r.kt)("a",{parentName:"li",href:"https://ipfs.io/docs/install/"},"IPFS")," (we recommend installing via ",(0,r.kt)("a",{parentName:"li",href:"https://brew.sh/"},"Brew"),").\n*",(0,r.kt)("em",{parentName:"li"},"If you don't install ipfs, image uploading will be affected. You can update the config ",(0,r.kt)("inlineCode",{parentName:"em"},"ipfsGateway")," value to use a public ipfs gateway ex. ",(0,r.kt)("a",{parentName:"em",href:"https://ipfs.io/ipfs/"},"https://ipfs.io/ipfs/"),", however your uploads will be removed at some point."))),(0,r.kt)("h3",{id:"run-server"},"Run server"),(0,r.kt)("p",null,"The Feathers server will need to connect to an Ethereum node via WebSocket. Typically this will be a local TestRPC instance.\nThe configuration param ",(0,r.kt)("inlineCode",{parentName:"p"},"blockchain.nodeUrl")," is used to establish a connection. The default nodeUrl is ",(0,r.kt)("inlineCode",{parentName:"p"},"ws://localhost:8545")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"We need to deploy any contract to that we intend to call. ",(0,r.kt)("em",{parentName:"p"},"NOTE:")," The following cmd will clear the ",(0,r.kt)("inlineCode",{parentName:"p"},"data")," dir, thus starting off in a clean state."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn deploy-local\n")),(0,r.kt)("p",{parentName:"li"},"After deploying local, make sure to copy-paste the MiniMeToken address in default.json.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"We provide an easy way to start the bridge & 2 ganache-cli instances. ",(0,r.kt)("em",{parentName:"p"},"VERY IMPORTANT:")," this command enables Home Ganache and Foreign Ganache networks; if you are using MetaMask you will need to ",(0,r.kt)("strong",{parentName:"p"},"add a Custom RPC")," to your networks config; ",(0,r.kt)("inlineCode",{parentName:"p"},"http://localhost:8546")," will be Foreign Ganache, and Home Ganache is normally added by default which is ",(0,r.kt)("inlineCode",{parentName:"p"},"http://localhost:8545")," if needed."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn start:networks\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Since the bridge & ganache-cli is now running, open a new terminal window, and navigate to the same feathers-giveth directory.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Optionally open a new terminal window and start the ipfs daemon."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"ipfs daemon\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Run db migration files (if this the first time you want to start application, it's not needed to run migrations)."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"}," ./node_modules/.bin/migrate-mongo up\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Start your app."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn start\n")))),(0,r.kt)("h3",{id:"kill-ganache"},"Kill Ganache"),(0,r.kt)("p",null,"If you run into errors like wallet balance not loading, it is very likely that Ganache is stuck.\n",(0,r.kt)("inlineCode",{parentName:"p"},"netstat -vanp tcp | grep 8545"),"\nFind the process that is listening on ",(0,r.kt)("inlineCode",{parentName:"p"},"*.8545")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"127.0.0.1.8545"),", and kill it with ",(0,r.kt)("inlineCode",{parentName:"p"},"kill -9 PID")," (which is in the last colomn)."),(0,r.kt)("h3",{id:"ipfs-support"},"IPFS Support"),(0,r.kt)("p",null,"If the ",(0,r.kt)("inlineCode",{parentName:"p"},"ipfsApi")," is a valid ipfs node that we can connect to, we will pin every ipfs hash that is stored in feathers. We currently do not remove any orphaned (hashes with no references in feathers) ipfs hashs. In the future we will provide a script that you can run as a cronjob to unpin any orphaned hashes."),(0,r.kt)("h3",{id:"video-walkthrough"},"Video Walkthrough"),(0,r.kt)("p",null,"Video tutorial walkthrough here: ",(0,r.kt)("a",{parentName:"p",href:"https://tinyurl.com/y9lx6jrl"},"https://tinyurl.com/y9lx6jrl")),(0,r.kt)("h3",{id:"scripts"},"Scripts"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"feathers-giveth/scripts")," directory contains a few scripts to help development."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"deploy.js")," - deploys a new vault & liquidPledging contract")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"getState.js")," - prints the current state of the deployed vault & liquidPledging contracts")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"confirm.js")," - confirms any payments that are pending in the vault")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"makeUserAdmin.js")," - make a user admin"))),(0,r.kt)("h3",{id:"testing"},"Testing"),(0,r.kt)("p",null,"Simply run ",(0,r.kt)("inlineCode",{parentName:"p"},"yarn test"),", and all your tests in the ",(0,r.kt)("inlineCode",{parentName:"p"},"/src")," directory will be run.\nIt's included some integration tests, so for running tests, you need to run a mongodb in your local system (on port 27017)."),(0,r.kt)("h3",{id:"debugging"},"Debugging"),(0,r.kt)("p",null,"You can control the logging level with the ",(0,r.kt)("inlineCode",{parentName:"p"},"LOG_LEVEL")," env variable. Available levels can be found at: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/winstonjs/winston/tree/2.x#logging-levels"},"https://github.com/winstonjs/winston/tree/2.x#logging-levels")),(0,r.kt)("p",null,"To enable debug logging simply start the server with ",(0,r.kt)("inlineCode",{parentName:"p"},"LOG_LEVEL=debug yarn start"),"."),(0,r.kt)("h2",{id:"production"},"Production"),(0,r.kt)("p",null,"We use docker-compose for orchestration of our docker containers in our production servers."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"make Make sure you have a file named ",(0,r.kt)("inlineCode",{parentName:"li"},"production.json")," in config folder."),(0,r.kt)("li",{parentName:"ul"},"Install docker and docker-compose on your server."),(0,r.kt)("li",{parentName:"ul"},"run this command: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker-compose -f docker-compose-production.yml up -d"),".")),(0,r.kt)("p",null,"PS: It's good to see Github Actions config(",(0,r.kt)("inlineCode",{parentName:"p"},"./.github/workflows/CI-CD.yml"),") to better understand the deployment structure."),(0,r.kt)("h2",{id:"rsk"},"RSK"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"You will need to download the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/rsksmart/rskj/wiki/Install-RskJ-and-join-the-RSK-Orchid-Mainnet-Beta"},"rsk node"),". After installing, you will run the node w/ the ",(0,r.kt)("inlineCode",{parentName:"p"},"regtest")," network for local development."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"java -jar rskj-core-0.5.2-ORCHID-all.jar co.rsk.Start --regtest\n")),(0,r.kt)("p",{parentName:"li"},"or"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"java -Drsk.conf.file=rsk.conf -jar rskj-core-0.5.2-ORCHID-all.jar co.rsk.Start\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"We need to deploy any contracts that we intend to call. ",(0,r.kt)("em",{parentName:"p"},"NOTE:")," You will also need to ensure that your rsk node is in a clean state (reset) for the configured addresses to be correct."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"npm run deploy-local:rsk\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Optionally open a new terminal window and start the ipfs daemon."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"ipfs daemon\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Start your app."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"yarn start:rsk\n")))),(0,r.kt)("h2",{id:"audit-log"},"Audit Log"),(0,r.kt)("p",null,"The Audit log system logs every Create, Update, Patch and\nRemove on ",(0,r.kt)("strong",{parentName:"p"},"Campaigns"),", ",(0,r.kt)("strong",{parentName:"p"},"Traces"),", ",(0,r.kt)("strong",{parentName:"p"},"Events"),", ",(0,r.kt)("strong",{parentName:"p"},"Users"),",\n",(0,r.kt)("strong",{parentName:"p"},"PledgeAdmins"),", ",(0,r.kt)("strong",{parentName:"p"},"Communities"),", ",(0,r.kt)("strong",{parentName:"p"},"Donations"),".\nFor enabling audit log locally you should change ",(0,r.kt)("inlineCode",{parentName:"p"},"enableAuditLog"),"\nin config to ",(0,r.kt)("inlineCode",{parentName:"p"},"true"),", then"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"cd elk"),(0,r.kt)("li",{parentName:"ul"},"docker-compose up")),(0,r.kt)("p",null,"You can see the logs after logging in ",(0,r.kt)("inlineCode",{parentName:"p"},"localhost:5601")," with user:",(0,r.kt)("inlineCode",{parentName:"p"},"elastic"),", password: ",(0,r.kt)("inlineCode",{parentName:"p"},"changeme"),"."),(0,r.kt)("h3",{id:"usage"},"Usage"),(0,r.kt)("p",null,"Each of these services are available via rRest or WebSocket:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"campaigns\ncommunities\ndonations\ndonationsHistory\ntraces\nuploads\nusers\nemails\nhomePaymentsTransactions\nsubscriptions\n")),(0,r.kt)("p",null,"If the server is using default configurations, you can see data for any of these services through your web browser at ",(0,r.kt)("inlineCode",{parentName:"p"},"http://localhost:3030/SERVICE_NAME")),(0,r.kt)("p",null,"PS: For accessing all features like creating ",(0,r.kt)("inlineCode",{parentName:"p"},"communities")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"campaigns")," it's suggested to\nmake ",(0,r.kt)("inlineCode",{parentName:"p"},"isAdmin")," field true, for your user in you local MongoDb."),(0,r.kt)("h2",{id:"giveth-dapp-giveth-trace-front-end-installation"},"Giveth DApp (Giveth TRACE front-end) Installation"),(0,r.kt)("img",{alt:"Giveth-DApp Installation Header",src:(0,i.Z)("img/content/trace/giveth-dapp-header.png")}),(0,r.kt)("h3",{id:"getting-started"},"Getting Started"),(0,r.kt)("p",null,"In the following sections you will learn all you need to know to run the DApp locally and to start contributing. All the steps are also described in this amazing ",(0,r.kt)("a",{parentName:"p",href:"https://tinyurl.com/y9lx6jrl"},"Video Tutorial Walkthrough")," by Oz."),(0,r.kt)("h4",{id:"prerequisites"},"Prerequisites"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"NodeJS v10 LTS."),(0,r.kt)("li",{parentName:"ul"},"yarn (v1.22.10 or higher)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://git-scm.com/book/en/v2/Getting-Started-Installing-Git"},"git"))),(0,r.kt)("h3",{id:"install"},"Install"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Click ",(0,r.kt)("strong",{parentName:"li"},"Star")," on the ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/Giveth/giveth-dapp"},(0,r.kt)("inlineCode",{parentName:"a"},"giveth-dapp"))," repo near the top-right corner of this web page (if you want to)."),(0,r.kt)("li",{parentName:"ol"},"Join us on ",(0,r.kt)("a",{parentName:"li",href:"http://join.giveth.io"},"Element")," or ",(0,r.kt)("a",{parentName:"li",href:"https://discord.gg/Uq2TaXP9bC"},"Discord")," if you haven't already."),(0,r.kt)("li",{parentName:"ol"},"Fork this repo by clicking ",(0,r.kt)("strong",{parentName:"li"},"Fork")," button in top-right corner of this web page. Continue to follow instruction steps from your own giveth-dapp repo."),(0,r.kt)("li",{parentName:"ol"},'Clone your own "giveth-dapp" repo. Copy the link from the "Clone or download" button near the top right of this repo\'s home page.'),(0,r.kt)("li",{parentName:"ol"},"The rest of these steps must be done from your machine's command line. See the ",(0,r.kt)("a",{parentName:"li",href:"#for-osx-and-linux"},"OSX and Linux")," or ",(0,r.kt)("a",{parentName:"li",href:"#for-windows"},"Windows")," section to continue.")),(0,r.kt)("h4",{id:"osx-and-linux"},(0,r.kt)("a",{id:"for-osx-and-linux"},"OSX and Linux")),(0,r.kt)("p",null,"If your operative system is any distribution of Linux you can use the all-in-one installation scripts, special thanks to Dapp contributor Jurek Brisbane, available ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Giveth/giveth-dapp/files/3674808/givethBuildStartScripts_2019-09-29.zip"},"here")," along with a Youtube ",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=rzLhxxAz73k&feature=youtu.be"},"video"),", otherwise try the following:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},'From the desired directory you wish to copy the "giveth-dapp" folder with source files to.',(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone git@github.com:Giveth/giveth-dapp.git\n")),"NOTE: Please use ",(0,r.kt)("inlineCode",{parentName:"li"},"develop")," branch for contributing.",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone -b develop git@github.com:Giveth/giveth-dapp.git\n"))),(0,r.kt)("li",{parentName:"ol"},"Change directories to giveth-dapp:",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"cd giveth-dapp\n"))),(0,r.kt)("li",{parentName:"ol"},"Make sure you have ",(0,r.kt)("a",{parentName:"li",href:"https://nodejs.org/"},"NodeJS")," (v10) and ",(0,r.kt)("a",{parentName:"li",href:"https://yarnpkg.com/"},"yarn")," (v1.22.10 or higher) installed."),(0,r.kt)("li",{parentName:"ol"},"Install dependencies from within giveth-dapp directory:",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn install\n"))),(0,r.kt)("li",{parentName:"ol"},"That is it - you are now ready to run the giveth-dapp! Head to the ",(0,r.kt)("a",{parentName:"li",href:"#run"},"Run DApp")," section for further instructions.")),(0,r.kt)("h4",{id:"windows"},(0,r.kt)("a",{id:"for-windows"},"Windows")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Install the latest version of Python from this ",(0,r.kt)("a",{parentName:"li",href:"https://www.python.org/downloads/"},"Link"),". (Make sure Python is added to $PATH.)"),(0,r.kt)("li",{parentName:"ol"},"Install Microsoft Visual Studio 2017 (double-check the version) from this ",(0,r.kt)("a",{parentName:"li",href:"https://download.visualstudio.microsoft.com/download/pr/3e542575-929e-4297-b6c6-bef34d0ee648/639c868e1219c651793aff537a1d3b77/vs_buildtools.exe"},"link"),". Giveth-Dapp needs the node-gyp module, and node-gyp needs VS C++ 2017 Build Tools to be installed."),(0,r.kt)("li",{parentName:"ol"},"After downloading, install the packages marked from this ",(0,r.kt)("a",{parentName:"li",href:"https://cdn.discordapp.com/attachments/849682448102457374/850480734291623946/unknown.png"},"image"),"."),(0,r.kt)("li",{parentName:"ol"},"Then run command below in command prompt",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"npm config set msvs_version 2017\n"))),(0,r.kt)("li",{parentName:"ol"},"After installing the above, you should install NodeJS version 10 ",(0,r.kt)("a",{parentName:"li",href:"https://nodejs.org/dist/latest-v10.x/"},"LTS")," (it is better to be v10.24.1 LTS)."),(0,r.kt)("li",{parentName:"ol"},'Download and run the node-v10.24.1-x64.msi installer, then continue through the installation as normal. Be sure to have the "Enable in PATH" option enabled before installing.'),(0,r.kt)("li",{parentName:"ol"},'Open the command line in administrator mode by right-clicking on the cmd.exe application and selecting "Run as administrator"'),(0,r.kt)("li",{parentName:"ol"},"In the administrator command prompt, change to the directory where you want to store this repository.",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"cd C:\\some\\directory\\for\\repositories\n"))),(0,r.kt)("li",{parentName:"ol"},"Double-check the node version with CMD command:",(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"node -v\n"))),(0,r.kt)("li",{parentName:"ol"},'After that, install the latest version of Yarn. Be careful not to install packages with NPM. If you have already tried "npm install", you should first delete "node modules" folder.',(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn install\n"))),(0,r.kt)("li",{parentName:"ol"},"That is it - you are now ready to run the giveth-dapp!")),(0,r.kt)("h3",{id:"run"},(0,r.kt)("a",{id:"run"},"Run")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"The Giveth dapp will need to connect to a ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Giveth/feathers-giveth"},"feathers-giveth")," server. Follow the feathers-giveth readme instructions to install and run server before proceeding further. Alternatively, you could change the configuration to connect to the ",(0,r.kt)("inlineCode",{parentName:"p"},"develop")," environment, see the ",(0,r.kt)("a",{parentName:"p",href:"#configuration"},"Configuration")," section.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Start the dapp."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn start\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},'Once the dapp is up in your browser, click "Sign In" from the main menu.')),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"For testing locally, choose any of the wallet files found in the ",(0,r.kt)("inlineCode",{parentName:"p"},"giveth-dapp/keystores/")," folder using the wallet password: ",(0,r.kt)("inlineCode",{parentName:"p"},"password"),". ",(0,r.kt)("strong",{parentName:"p"},"DO NOT USE THESE ON ANY MAINNET EVMs."))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Using the test token\nTo use the test token you need to import the keystore.json you use for your account to MetaMask.\nAfter importing, click on 'Add token' > 'Custom token', and enter the MiniMe Token address that can be found when deploying the contracts\n(should be ",(0,r.kt)("inlineCode",{parentName:"p"},"0xe78A0F7E598Cc8b0Bb87894B0F60dD2a88d6a8Ab")," by default but make sure to check).\nThe token balance should show up automatically, and the token symbol is MMT.\nHowever, in the DApp the token symbol is referred to as ANT, b/c the DApp needs to be able to fetch a conversion rate."))),(0,r.kt)("p",null,"NOTE:\nWhen resetting feathers or redeploying the contracts, you need to remove the keystore from Metamask and follow this procedure again."),(0,r.kt)("h3",{id:"build"},"Build"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn run build\n")),(0,r.kt)("p",null,"NOTE: due to some web3 libraries that are not transpiled from es6, we have to use our ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Giveth/create-react-app/tree/master/packages/react-scripts"},"giveth-react-scripts")," fork of react-scripts."),(0,r.kt)("h3",{id:"configuration"},(0,r.kt)("a",{id:"configuration"},"Configuration")),(0,r.kt)("p",null,"The DApp has several node environment variables which can be used to alter the DApp behaviour without changing the code. You can set them through ",(0,r.kt)("inlineCode",{parentName:"p"},".env")," or ",(0,r.kt)("inlineCode",{parentName:"p"},".env.local")," files in the DApp folder."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Variable name"),(0,r.kt)("th",{parentName:"tr",align:null},"Default Value"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"PORT"),(0,r.kt)("td",{parentName:"tr",align:null},"3010"),(0,r.kt)("td",{parentName:"tr",align:null},"Port on which the DApp runs")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_ENVIRONMENT"),(0,r.kt)("td",{parentName:"tr",align:null},"'localhost'"),(0,r.kt)("td",{parentName:"tr",align:null},"To which feathers environment should the DApp connect. By default it connects to localhost feathers. Allowed values are: ",(0,r.kt)("inlineCode",{parentName:"td"},"localhost"),", ",(0,r.kt)("inlineCode",{parentName:"td"},"develop"),", ",(0,r.kt)("inlineCode",{parentName:"td"},"release"),", ",(0,r.kt)("inlineCode",{parentName:"td"},"alpha"),", ",(0,r.kt)("inlineCode",{parentName:"td"},"mainnet"),". See ",(0,r.kt)("a",{parentName:"td",href:"#deploy-environments"},"Deployment Environments"),".")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_DECIMALS"),(0,r.kt)("td",{parentName:"tr",align:null},"8"),(0,r.kt)("td",{parentName:"tr",align:null},"How many decimal should be shown for cryptocurrency values. Note that the calculations are still done with 18 decimals.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_FEATHERJS_CONNECTION_URL"),(0,r.kt)("td",{parentName:"tr",align:null},"Differs per REACT_APP_ENVIRONMENT"),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites the environment injected feathers connection URL.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_NODE_CONNECTION_URL"),(0,r.kt)("td",{parentName:"tr",align:null},"Differs per REACT_APP_ENVIRONMENT"),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites the EVM node connection URL for making EVM transactions.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_LIQUIDPLEDGING_ADDRESS"),(0,r.kt)("td",{parentName:"tr",align:null},"Differs per REACT_APP_ENVIRONMENT"),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites the Liquid Pledging contract address.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_DAC_FACTORY_ADDRESS"),(0,r.kt)("td",{parentName:"tr",align:null},"Differs per REACT_APP_ENVIRONMENT"),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites the Communities contract address.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_CAMPAIGN_FACTORY_ADDRESS"),(0,r.kt)("td",{parentName:"tr",align:null},"Differs per REACT_APP_ENVIRONMENT"),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites the Campaign Factory contract address.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_MILESTONE_FACTORY_ADDRESS"),(0,r.kt)("td",{parentName:"tr",align:null},"Differs per REACT_APP_ENVIRONMENT"),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites the MilestoneFactory contract address.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_TOKEN_ADDRESSES"),(0,r.kt)("td",{parentName:"tr",align:null},"Differs per REACT_APP_ENVIRONMENT"),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites the bridged token addresses. This is a JSON object string w/ token name: token address.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_BLOCKEXPLORER"),(0,r.kt)("td",{parentName:"tr",align:null},"Differs per REACT_APP_ENVIRONMENT"),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites the block explorer base URL. The DApp assumes such blockexplorer api is ",(0,r.kt)("inlineCode",{parentName:"td"},"\\/tx/\\"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_DEFAULT_GASPRICE"),(0,r.kt)("td",{parentName:"tr",align:null},"10"),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites the default gasPrice that is used if ethgasstation service is down. The value is in gwei.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"REACT_APP_ANALYTICS_KEY"),(0,r.kt)("td",{parentName:"tr",align:null},'""'),(0,r.kt)("td",{parentName:"tr",align:null},"Overwrites ",(0,r.kt)("inlineCode",{parentName:"td"},"Segment")," analytics key.")))),(0,r.kt)("p",null,"Example of ",(0,r.kt)("inlineCode",{parentName:"p"},".env.local")," file that makes the DApp run on port 8080, connects to the ",(0,r.kt)("strong",{parentName:"p"},"develop")," environment and uses custom blockexplorer:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"PORT=8080\nREACT_APP_ENVIRONMENT='develop'\nREACT_APP_BLOCKEXPLORER='www.awesomeopensourceexplorer.io'\n")),(0,r.kt)("p",null,"The rest of the configuration can be found in ",(0,r.kt)("inlineCode",{parentName:"p"},"configuration.js")),(0,r.kt)("h3",{id:"analytics"},"Analytics"),(0,r.kt)("p",null,"Segment Analytics can be enabled by setting REACT_APP_ANALYTICS_KEY."),(0,r.kt)("h3",{id:"query-strings"},"Query Strings"),(0,r.kt)("p",null,"The milestone creation/proposal view now supports query string arguments!\nThe following arguments are available:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Argument"),(0,r.kt)("th",{parentName:"tr",align:null},"Expected Values"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"title"),(0,r.kt)("td",{parentName:"tr",align:null},"The title of the milestone"),(0,r.kt)("td",{parentName:"tr",align:null},"string")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"description"),(0,r.kt)("td",{parentName:"tr",align:null},"The description of the milestone"),(0,r.kt)("td",{parentName:"tr",align:null},"string")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"recipientAddress"),(0,r.kt)("td",{parentName:"tr",align:null},"The address of the recipient"),(0,r.kt)("td",{parentName:"tr",align:null},"string")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"reviewerAddress"),(0,r.kt)("td",{parentName:"tr",align:null},"The address of the reviewer"),(0,r.kt)("td",{parentName:"tr",align:null},"string")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"selectedFiatType"),(0,r.kt)("td",{parentName:"tr",align:null},"A valid fiat type (i.e. USD)"),(0,r.kt)("td",{parentName:"tr",align:null},"string")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"date"),(0,r.kt)("td",{parentName:"tr",align:null},"A valid milestone date string"),(0,r.kt)("td",{parentName:"tr",align:null},"string")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"token"),(0,r.kt)("td",{parentName:"tr",align:null},"A valid token symbol (i.e. DAI)"),(0,r.kt)("td",{parentName:"tr",align:null},"string")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"tokenAddress"),(0,r.kt)("td",{parentName:"tr",align:null},"A valid token address"),(0,r.kt)("td",{parentName:"tr",align:null},"string")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"maxAmount"),(0,r.kt)("td",{parentName:"tr",align:null},"A valid max amount of ETH or token"),(0,r.kt)("td",{parentName:"tr",align:null},"number")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"fiatAmount"),(0,r.kt)("td",{parentName:"tr",align:null},"A valid max amount of fiat (dependant on selectedFiatType)"),(0,r.kt)("td",{parentName:"tr",align:null},"number")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"isCapped"),(0,r.kt)("td",{parentName:"tr",align:null},"Determines whether the milestone should be capped"),(0,r.kt)("td",{parentName:"tr",align:null},"0 or 1 (boolean)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"requireReviewer"),(0,r.kt)("td",{parentName:"tr",align:null},"Determines whether the milestone should require a reviewer"),(0,r.kt)("td",{parentName:"tr",align:null},"0 or 1 (boolean)")))),(0,r.kt)("h3",{id:"local-development"},"Local Development"),(0,r.kt)("p",null,"At first you would like to run the DApp locally. When running ",(0,r.kt)("inlineCode",{parentName:"p"},"testrpc")," locally in ",(0,r.kt)("inlineCode",{parentName:"p"},"deterministic")," mode, you can use any of the keystores in the ",(0,r.kt)("inlineCode",{parentName:"p"},"giveth-dapp/keystores")," as your wallet.\nThis will provide you access to the testrpc accounts for local development. Each keystore uses the same password: ",(0,r.kt)("inlineCode",{parentName:"p"},"password"),". ",(0,r.kt)("strong",{parentName:"p"},"DO NOT USE THESE ON ANY MAINNET EVMs")),(0,r.kt)("p",null,"The keystores are seeded with 10.000 ANT tokens for testing donations. To get started with testing donations,\nmake sure to add your account's keystore to MetaMask and swith MetaMask to Ganache. The donation modal should\nthen show the appropriate balance when donating in ANT tokens."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"NOTE"),': If you get a nonce error in MetaMask or if the DApp fails to load with your MetaMask unlocked, it could be because MetaMask is confused. You should go to "settings" -> "Reset Account" in MetaMask in order to reset the nonce & cached account data.'),(0,r.kt)("h3",{id:"development-and-pr-testing"},"Development and PR Testing"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"The Giveth Dapp is auto deployed from the develop branch and is live on Rinkeby ",(0,r.kt)("a",{parentName:"li",href:"https://develop.giveth.io"},"develop.giveth.io"),". All pull requests are autodeployed, and the PR preview will be generated upon submission. To learn how to access PR previews see ",(0,r.kt)("a",{parentName:"li",href:"https://wiki.giveth.io/documentation/DApp/product-development-testing/"},"Development Process & Quality Assurance")," on our wiki."),(0,r.kt)("li",{parentName:"ol"},'In order to use the DApp you will need to create account. If this is your first time, click "sign up" to create an account. If you already have a valid keychain file, use it to sign in.'),(0,r.kt)("li",{parentName:"ol"},'You will need test ether on the Rinkeby network. Go to the "wallet" page to see your new address (0x..). Copy that address, and use the Faucet to get some: ',(0,r.kt)("a",{parentName:"li",href:"https://faucet.rinkeby.io/"},"https://faucet.rinkeby.io/"),".")),(0,r.kt)("h3",{id:"deployment-environments"},(0,r.kt)("a",{id:"deploy-environments"},"Deployment Environments")),(0,r.kt)("p",null,"At Giveth, we are using the ",(0,r.kt)("a",{parentName:"p",href:"http://nvie.com/posts/a-successful-git-branching-model/"},"gitflow")," branching model to deploy to 4 different environments."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Blockchain"),(0,r.kt)("th",{parentName:"tr",align:null},"Branch Deployed"),(0,r.kt)("th",{parentName:"tr",align:null},"Auto Deploy"),(0,r.kt)("th",{parentName:"tr",align:null},"Use"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://mainnet.giveth.io"},"mainnet")),(0,r.kt)("td",{parentName:"tr",align:null},"Ethereum Main Network"),(0,r.kt)("td",{parentName:"tr",align:null},"master"),(0,r.kt)("td",{parentName:"tr",align:null},"no"),(0,r.kt)("td",{parentName:"tr",align:null},"Main network deployment for now abandoned due to high transaction costs until sustainable solution is found.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://alpha.giveth.io"},"alpha")),(0,r.kt)("td",{parentName:"tr",align:null},"Rinkeby Test Network"),(0,r.kt)("td",{parentName:"tr",align:null},"master"),(0,r.kt)("td",{parentName:"tr",align:null},"no"),(0,r.kt)("td",{parentName:"tr",align:null},"Environment used as a production version until scalability is resolved.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://release.giveth.io"},"release")),(0,r.kt)("td",{parentName:"tr",align:null},"Rinkeby Test Network"),(0,r.kt)("td",{parentName:"tr",align:null},"release"),(0,r.kt)("td",{parentName:"tr",align:null},"yes"),(0,r.kt)("td",{parentName:"tr",align:null},"Environment for release candidate quality control testing by non-devs.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"https://develop.giveth.io"},"develop")),(0,r.kt)("td",{parentName:"tr",align:null},"Rinkeby Test Network"),(0,r.kt)("td",{parentName:"tr",align:null},"develop"),(0,r.kt)("td",{parentName:"tr",align:null},"yes"),(0,r.kt)("td",{parentName:"tr",align:null},"Development environment for integrating new features. Feature and pull request branches are also automatically deployed to this environment.")))),(0,r.kt)("p",null,"You can change the environment to which the DApp connects through the node environment variables. See the ",(0,r.kt)("a",{parentName:"p",href:"#Configuration"},"Configuration")," section for more details."))}h.isMDXComponent=!0},8932:(e,t,a)=>{a.d(t,{ZP:()=>l});var n=a(7462),r=(a(7294),a(3905));const i={toc:[]};function l(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},i,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},(0,r.kt)("strong",{parentName:"em"},"Giveth TRACE has officially been deprecated. After 5 years of faithful service, Giveth and its platform, services and products have fully migrated to ",(0,r.kt)("a",{parentName:"strong",href:"https://giveth.io"},"Giveth.io"),". With the deprecation of the Rinkeby network and low user activity, the Giveth DAO decided to sunset its original dApp in Q3 of 2022. The code has and will forever be open-source, and you can find it in ",(0,r.kt)("a",{parentName:"strong",href:"https://github.com/Giveth"},"Giveth's Github repositories"),"."))),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},(0,r.kt)("strong",{parentName:"em"},"This documentation will remain available for historical reference."))),(0,r.kt)("hr",null))}l.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8d9fbe5b.478bc2c4.js b/assets/js/8d9fbe5b.478bc2c4.js new file mode 100644 index 0000000000..09d2768d27 --- /dev/null +++ b/assets/js/8d9fbe5b.478bc2c4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[5762],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=s(a),h=r,m=c["".concat(p,".").concat(h)]||c[h]||d[h]||i;return a?n.createElement(m,o(o({ref:t},u),{},{components:a})):n.createElement(m,o({ref:t},u))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l.mdxType="string"==typeof e?e:r,o[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var n=a(7462),r=(a(7294),a(3905));a(4996);const i={id:"givethioinstallation",title:"Installing Giveth.io for Local Development",slug:"dapps/givethioinstallation"},o=void 0,l={unversionedId:"givethioinstallation",id:"givethioinstallation",title:"Installing Giveth.io for Local Development",description:"This guide will document the steps to set up and run Giveth.io locally for the purposes of development. The setup process was documented using Ubuntu 20.04 LTS.",source:"@site/dapps/givethioinstallation.md",sourceDirName:".",slug:"/dapps/givethioinstallation",permalink:"/dapps/givethioinstallation",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/givethioinstallation.md",tags:[],version:"current",lastUpdatedBy:"Mitch Oz",lastUpdatedAt:1693595613,formattedLastUpdatedAt:"Sep 1, 2023",frontMatter:{id:"givethioinstallation",title:"Installing Giveth.io for Local Development",slug:"dapps/givethioinstallation"}},p={},s=[{value:"You'll need a couple prerequisites to get started.",id:"youll-need-a-couple-prerequisites-to-get-started",level:4},{value:"Giveth IO leverages notable packages, applications and architectures including:",id:"giveth-io-leverages-notable-packages-applications-and-architectures-including",level:4},{value:"Install the back-end (impact-graph) from GitHub",id:"install-the-back-end-impact-graph-from-github",level:3},{value:"Create a Database and User in Postgres using psql",id:"create-a-database-and-user-in-postgres-using-psql",level:3},{value:"Clone and Install the Frontend",id:"clone-and-install-the-frontend",level:3},{value:"Get the Environment Variables",id:"get-the-environment-variables",level:3},{value:"Launch the Development Server and Environment",id:"launch-the-development-server-and-environment",level:3},{value:"Run the Migrations to Setup the Database",id:"run-the-migrations-to-setup-the-database",level:3},{value:"Deploy the Front-end",id:"deploy-the-front-end",level:3}],u={toc:s};function d(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"This guide will document the steps to set up and run Giveth.io locally for the purposes of development. The setup process was documented using Ubuntu 20.04 LTS."),(0,r.kt)("h4",{id:"youll-need-a-couple-prerequisites-to-get-started"},(0,r.kt)("strong",{parentName:"h4"},"You'll need a couple prerequisites to get started.")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://redis.io/topics/quickstart"},"Redis")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.postgresql.org/download"},"Postgres")),(0,r.kt)("li",{parentName:"ul"},"Node 14+"),(0,r.kt)("li",{parentName:"ul"},"yarn"),(0,r.kt)("li",{parentName:"ul"},"npm"),(0,r.kt)("li",{parentName:"ul"},"Your favourite Code Editor (VScode for linting presets)")),(0,r.kt)("h4",{id:"giveth-io-leverages-notable-packages-applications-and-architectures-including"},(0,r.kt)("strong",{parentName:"h4"},"Giveth IO leverages notable packages, applications and architectures including:")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Ethereum"),(0,r.kt)("li",{parentName:"ul"},"React"),(0,r.kt)("li",{parentName:"ul"},"NextJS"),(0,r.kt)("li",{parentName:"ul"},"Apollo GraphQL"),(0,r.kt)("li",{parentName:"ul"},"Tor.us"),(0,r.kt)("li",{parentName:"ul"},"theme-ui")),(0,r.kt)("h3",{id:"install-the-back-end-impact-graph-from-github"},"Install the back-end (impact-graph) from GitHub"),(0,r.kt)("p",null,"In order to develop locally you need to clone the back-end server. We are using ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Giveth/impact-graph"},"https://github.com/Giveth/impact-graph")," for this."),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"via SSH on the CLI:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"}," git clone git@github.com:Giveth/impact-graph.git\n cd impact-graph\n npm i\n cp .env.example .env\n")),(0,r.kt)("h3",{id:"create-a-database-and-user-in-postgres-using-psql"},"Create a Database and User in Postgres using psql"),(0,r.kt)("p",null,"Follow this tutorial on PSQL to setup your username and create the database.\n",(0,r.kt)("a",{parentName:"p",href:"https://medium.com/coding-blocks/creating-user-database-and-adding-access-on-postgresql-8bfcd2f4a91e"},"https://medium.com/coding-blocks/creating-user-database-and-adding-access-on-postgresql-8bfcd2f4a91e"),")"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"TL;DR")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo -u postgres psql\npostgres=# create database ;\npostgres=# create user with encrypted password '';\npostgres=# grant all privileges on database to ;\n")),(0,r.kt)("h3",{id:"clone-and-install-the-frontend"},"Clone and Install the Frontend"),(0,r.kt)("p",null," Head on over to ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Giveth/giveth-dapps-v2"},"https://github.com/Giveth/giveth-dapps-v2"),", and clone the repo. "),(0,r.kt)("p",null," ",(0,r.kt)("em",{parentName:"p"},"via SSH on the CLI:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone git@github.com:Giveth/giveth-dapps-v2.git\ncd giveth-dapps-v2\nyarn install\n")),(0,r.kt)("h3",{id:"get-the-environment-variables"},"Get the Environment Variables"),(0,r.kt)("p",null," In order to run the local build for Giveth.io you'll need to ask for the environment variables. Head on over to our ",(0,r.kt)("a",{parentName:"p",href:"https://discord.giveth.io"},"Contributors Discord"),", say Hi and get in touch with our product manager, @MoeNick or one of the developers."),(0,r.kt)("h3",{id:"launch-the-development-server-and-environment"},"Launch the Development Server and Environment"),(0,r.kt)("p",null," Start up the ",(0,r.kt)("inlineCode",{parentName:"p"},"impact-graph")," backend server and redis."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Run redis by using the command ",(0,r.kt)("inlineCode",{parentName:"p"},"redis-server"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"From the impact-graph repo start with ",(0,r.kt)("inlineCode",{parentName:"p"},"npm start"),"."),(0,r.kt)("admonition",{parentName:"li",type:"info"},(0,r.kt)("h3",{parentName:"admonition",id:"using-the-staging-database-for-development"},"Using the Staging Database for Development"),(0,r.kt)("p",{parentName:"admonition"},"If you don't need to setup a local database for your development purposes you can use the staging database instead. Set ",(0,r.kt)("inlineCode",{parentName:"p"},"NEXT_PUBLIC_APOLLO_SERVER")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"https://serve.giveth.io/graphql")," (this uses the same database you see on ",(0,r.kt)("a",{parentName:"p",href:"https://next.giveth.io"},"https://next.giveth.io"),").")))),(0,r.kt)("h3",{id:"run-the-migrations-to-setup-the-database"},"Run the Migrations to Setup the Database"),(0,r.kt)("p",null,"In a separate terminal ",(0,r.kt)("inlineCode",{parentName:"p"},"cd")," into the ",(0,r.kt)("inlineCode",{parentName:"p"},"impact-graph"),"\nrun this command in the terminal:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"npm run typeorm:cli -- migration:run\n")),(0,r.kt)("h3",{id:"deploy-the-front-end"},"Deploy the Front-end"),(0,r.kt)("p",null," To take advantage of linting presets, please use ",(0,r.kt)("strong",{parentName:"p"},"VSCODE"),":"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("em",{parentName:"p"},"File -> Open Workspace"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Navigate into the giveth-dapps-v2 directory.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Install recommended extensions & packages (Prettier and StandardJS plugins).")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Then fire up the front-end locally."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn run dev\n")))),(0,r.kt)("p",null,"You should be ready to go for real-time coding!"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8d9fbe5b.da888a31.js b/assets/js/8d9fbe5b.da888a31.js deleted file mode 100644 index 75656d0557..0000000000 --- a/assets/js/8d9fbe5b.da888a31.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[5762],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=s(a),h=r,m=c["".concat(p,".").concat(h)]||c[h]||d[h]||i;return a?n.createElement(m,o(o({ref:t},u),{},{components:a})):n.createElement(m,o({ref:t},u))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l.mdxType="string"==typeof e?e:r,o[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var n=a(7462),r=(a(7294),a(3905));a(4996);const i={id:"givethioinstallation",title:"Installing Giveth.io for Local Development",slug:"dapps/givethioinstallation"},o=void 0,l={unversionedId:"givethioinstallation",id:"givethioinstallation",title:"Installing Giveth.io for Local Development",description:"This guide will document the steps to set up and run Giveth.io locally for the purposes of development. The setup process was documented using Ubuntu 20.04 LTS.",source:"@site/dapps/givethioinstallation.md",sourceDirName:".",slug:"/dapps/givethioinstallation",permalink:"/dapps/givethioinstallation",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/givethioinstallation.md",tags:[],version:"current",lastUpdatedBy:"Mitch Oz",lastUpdatedAt:1693595613,formattedLastUpdatedAt:"Sep 1, 2023",frontMatter:{id:"givethioinstallation",title:"Installing Giveth.io for Local Development",slug:"dapps/givethioinstallation"},sidebar:"dapps",previous:{title:"Contributing to Giveth Development",permalink:"/dapps/contributors"},next:{title:"Installing Giveth TRACE for Local Development",permalink:"/dapps/TRACEinstallation"}},p={},s=[{value:"You'll need a couple prerequisites to get started.",id:"youll-need-a-couple-prerequisites-to-get-started",level:4},{value:"Giveth IO leverages notable packages, applications and architectures including:",id:"giveth-io-leverages-notable-packages-applications-and-architectures-including",level:4},{value:"Install the back-end (impact-graph) from GitHub",id:"install-the-back-end-impact-graph-from-github",level:3},{value:"Create a Database and User in Postgres using psql",id:"create-a-database-and-user-in-postgres-using-psql",level:3},{value:"Clone and Install the Frontend",id:"clone-and-install-the-frontend",level:3},{value:"Get the Environment Variables",id:"get-the-environment-variables",level:3},{value:"Launch the Development Server and Environment",id:"launch-the-development-server-and-environment",level:3},{value:"Run the Migrations to Setup the Database",id:"run-the-migrations-to-setup-the-database",level:3},{value:"Deploy the Front-end",id:"deploy-the-front-end",level:3}],u={toc:s};function d(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"This guide will document the steps to set up and run Giveth.io locally for the purposes of development. The setup process was documented using Ubuntu 20.04 LTS."),(0,r.kt)("h4",{id:"youll-need-a-couple-prerequisites-to-get-started"},(0,r.kt)("strong",{parentName:"h4"},"You'll need a couple prerequisites to get started.")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://redis.io/topics/quickstart"},"Redis")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.postgresql.org/download"},"Postgres")),(0,r.kt)("li",{parentName:"ul"},"Node 14+"),(0,r.kt)("li",{parentName:"ul"},"yarn"),(0,r.kt)("li",{parentName:"ul"},"npm"),(0,r.kt)("li",{parentName:"ul"},"Your favourite Code Editor (VScode for linting presets)")),(0,r.kt)("h4",{id:"giveth-io-leverages-notable-packages-applications-and-architectures-including"},(0,r.kt)("strong",{parentName:"h4"},"Giveth IO leverages notable packages, applications and architectures including:")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Ethereum"),(0,r.kt)("li",{parentName:"ul"},"React"),(0,r.kt)("li",{parentName:"ul"},"NextJS"),(0,r.kt)("li",{parentName:"ul"},"Apollo GraphQL"),(0,r.kt)("li",{parentName:"ul"},"Tor.us"),(0,r.kt)("li",{parentName:"ul"},"theme-ui")),(0,r.kt)("h3",{id:"install-the-back-end-impact-graph-from-github"},"Install the back-end (impact-graph) from GitHub"),(0,r.kt)("p",null,"In order to develop locally you need to clone the back-end server. We are using ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Giveth/impact-graph"},"https://github.com/Giveth/impact-graph")," for this."),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"via SSH on the CLI:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"}," git clone git@github.com:Giveth/impact-graph.git\n cd impact-graph\n npm i\n cp .env.example .env\n")),(0,r.kt)("h3",{id:"create-a-database-and-user-in-postgres-using-psql"},"Create a Database and User in Postgres using psql"),(0,r.kt)("p",null,"Follow this tutorial on PSQL to setup your username and create the database.\n",(0,r.kt)("a",{parentName:"p",href:"https://medium.com/coding-blocks/creating-user-database-and-adding-access-on-postgresql-8bfcd2f4a91e"},"https://medium.com/coding-blocks/creating-user-database-and-adding-access-on-postgresql-8bfcd2f4a91e"),")"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"TL;DR")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo -u postgres psql\npostgres=# create database ;\npostgres=# create user with encrypted password '';\npostgres=# grant all privileges on database to ;\n")),(0,r.kt)("h3",{id:"clone-and-install-the-frontend"},"Clone and Install the Frontend"),(0,r.kt)("p",null," Head on over to ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Giveth/giveth-dapps-v2"},"https://github.com/Giveth/giveth-dapps-v2"),", and clone the repo. "),(0,r.kt)("p",null," ",(0,r.kt)("em",{parentName:"p"},"via SSH on the CLI:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone git@github.com:Giveth/giveth-dapps-v2.git\ncd giveth-dapps-v2\nyarn install\n")),(0,r.kt)("h3",{id:"get-the-environment-variables"},"Get the Environment Variables"),(0,r.kt)("p",null," In order to run the local build for Giveth.io you'll need to ask for the environment variables. Head on over to our ",(0,r.kt)("a",{parentName:"p",href:"https://discord.giveth.io"},"Contributors Discord"),", say Hi and get in touch with our product manager, @MoeNick or one of the developers."),(0,r.kt)("h3",{id:"launch-the-development-server-and-environment"},"Launch the Development Server and Environment"),(0,r.kt)("p",null," Start up the ",(0,r.kt)("inlineCode",{parentName:"p"},"impact-graph")," backend server and redis."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Run redis by using the command ",(0,r.kt)("inlineCode",{parentName:"p"},"redis-server"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"From the impact-graph repo start with ",(0,r.kt)("inlineCode",{parentName:"p"},"npm start"),"."),(0,r.kt)("admonition",{parentName:"li",type:"info"},(0,r.kt)("h3",{parentName:"admonition",id:"using-the-staging-database-for-development"},"Using the Staging Database for Development"),(0,r.kt)("p",{parentName:"admonition"},"If you don't need to setup a local database for your development purposes you can use the staging database instead. Set ",(0,r.kt)("inlineCode",{parentName:"p"},"NEXT_PUBLIC_APOLLO_SERVER")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"https://serve.giveth.io/graphql")," (this uses the same database you see on ",(0,r.kt)("a",{parentName:"p",href:"https://next.giveth.io"},"https://next.giveth.io"),").")))),(0,r.kt)("h3",{id:"run-the-migrations-to-setup-the-database"},"Run the Migrations to Setup the Database"),(0,r.kt)("p",null,"In a separate terminal ",(0,r.kt)("inlineCode",{parentName:"p"},"cd")," into the ",(0,r.kt)("inlineCode",{parentName:"p"},"impact-graph"),"\nrun this command in the terminal:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"npm run typeorm:cli -- migration:run\n")),(0,r.kt)("h3",{id:"deploy-the-front-end"},"Deploy the Front-end"),(0,r.kt)("p",null," To take advantage of linting presets, please use ",(0,r.kt)("strong",{parentName:"p"},"VSCODE"),":"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("em",{parentName:"p"},"File -> Open Workspace"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Navigate into the giveth-dapps-v2 directory.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Install recommended extensions & packages (Prettier and StandardJS plugins).")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Then fire up the front-end locally."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"yarn run dev\n")))),(0,r.kt)("p",null,"You should be ready to go for real-time coding!"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8f560ee4.ca1ae910.js b/assets/js/8f560ee4.ca1ae910.js deleted file mode 100644 index 20d518c473..0000000000 --- a/assets/js/8f560ee4.ca1ae910.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[8251],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>h});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},c=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(r),h=o,m=d["".concat(l,".").concat(h)]||d[h]||u[h]||i;return r?n.createElement(m,a(a({ref:t},c),{},{components:r})):n.createElement(m,a({ref:t},c))}));function h(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:o,a[1]=s;for(var p=2;p{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>s,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=r(7462),o=(r(7294),r(3905)),i=r(4996);const a={id:"giverspfp",title:"The Givers PFP Collection",slug:"dapps/giverspfp"},s=void 0,l={unversionedId:"giverspfp",id:"giverspfp",title:"The Givers PFP Collection",description:"\u201cThe Givers\u201d NFT\u2019s are not just NFT\u2019s but integrated Giveth PFPs! Giveth's first PFP collection was a community proposed initiative begun in March 2022. The intention of the PFP collection is to raise funds for the Giveth DAO and continue our mission of building the Future of Giving. The Givers was launched for public minting on March 24, 2023 at 11am CST.",source:"@site/dapps/PFPcollection.md",sourceDirName:".",slug:"/dapps/giverspfp",permalink:"/dapps/giverspfp",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/PFPcollection.md",tags:[],version:"current",lastUpdatedBy:"Mitch Oz",lastUpdatedAt:1682563677,formattedLastUpdatedAt:"Apr 27, 2023",frontMatter:{id:"giverspfp",title:"The Givers PFP Collection",slug:"dapps/giverspfp"},sidebar:"dapps",previous:{title:"Quadratic Funding",permalink:"/quadraticfunding"},next:{title:"$nice Token",permalink:"/giveconomy/niceToken"}},p={},c=[{value:"Supply & Minting",id:"supply--minting",level:2},{value:"Art parameters",id:"art-parameters",level:2},{value:"Secondary Market",id:"secondary-market",level:2},{value:"Benefits",id:"benefits",level:2},{value:"Setting your Givers PFP",id:"setting-your-givers-pfp",level:2},{value:"Contract Address",id:"contract-address",level:2}],u={toc:c};function d(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"\u201cThe Givers\u201d NFT\u2019s are not just NFT\u2019s but integrated Giveth PFPs! Giveth's first PFP collection was a ",(0,o.kt)("a",{parentName:"p",href:"https://forum.giveth.io/t/the-givers-the-giveth-ecosystem-pfp-collection/478"},"community proposed initiative")," begun in March 2022. The intention of the PFP collection is to raise funds for the Giveth DAO and continue our mission of building the Future of Giving. The Givers was launched for public minting on March 24, 2023 at 11am CST. "),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"To mint a Giver head on over to ",(0,o.kt)("a",{parentName:"strong",href:"https://giveth.io/nft"},"the minting page")),"! "),(0,o.kt)("img",{alt:"Givers base image",src:(0,i.Z)("img/content/GiversHidden.png")}),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("h3",{parentName:"admonition",id:"about-the-giveth-dao"},"About the Giveth DAO"),(0,o.kt)("p",{parentName:"admonition"},"Since 2016, Giveth has focused on supporting public goods through a community-driven ecosystem of collective support and value creation. This has resulted in streamlined donation tools and mechanisms powered by blockchain technology, which have onboarded over 1,700 projects and has facilitated hundreds of thousands of donations."),(0,o.kt)("p",{parentName:"admonition"},"We\u2019re launching the Givers PFP collection as a fundraiser to allow us to continue improving our donation platform and build tools that empower non-profits and impact projects.")),(0,o.kt)("h2",{id:"supply--minting"},"Supply & Minting"),(0,o.kt)("p",null,"There will be a total of 1,250 NFTs in the collection, and no more than 100 of them will be used for promotional purposes by the DAO. Minting can be done on Ethereum Mainnet for 100 DAI each. To ensure an even distribution, no single address can hold more than 5 Givers PFPs."),(0,o.kt)("h2",{id:"art-parameters"},"Art parameters"),(0,o.kt)("p",null,"Every art NFT is created out of several individual layers of artwork. In some cases some of the layered artwork may be unseen as they get covered by others above it, as for instance the art tattoos. You will however be able to see all of your unique art's traits and rarity on Rarible or in the token's metadata."),(0,o.kt)("h2",{id:"secondary-market"},"Secondary Market"),(0,o.kt)("p",null,'You can trade your Giver but keep in mind that for any trades on the secondary market, a 10% royalty fee will be imposed. All Givers (unless stated otherwise) are licensed under Creative Commons CC0 or "No Rights Reserved". The easiest way to trade is using the ',(0,o.kt)("a",{parentName:"p",href:"https://rarible.com/the-givers-pfp/items"},"Rarible Collection Page"),"."),(0,o.kt)("h2",{id:"benefits"},"Benefits"),(0,o.kt)("p",null,"Givers PFP owners are able to have their NFTs integrated on their Giveth.io profile when logged in! Show your flair and support for Giveth almost anywhere on the DApp. Below is a preview of how Givers show up on the Giveth.io platform."),(0,o.kt)("a",{href:"/img/content/PFPbenefits.png",target:"_blank",rel:"noopener noreferrer"},(0,o.kt)("img",{alt:"pfp holder benefits on the dapp",src:(0,i.Z)("img/content/PFPbenefits.png")})),(0,o.kt)("p",null,"When you set your Giver as your profile picture on Giveth.io it will be show up as a badge next to your name on any projects that you have created as well as when you make donations or boost projects with GIVpower. Users can also get an up close look at your Giver by navigating to your user profile."),(0,o.kt)("p",null,"Giveth is also partnering with Punk Domains to provide Givers NFT holders a ",(0,o.kt)("strong",{parentName:"p"},"50% discount on the Giveth domain names.")," Anyone is able claim their unique \u201cyourname.giveth\u201d domain name, which will also be linked to your account. You can check out ",(0,o.kt)("a",{parentName:"p",href:"https://giveth.punk.domains/#/"},"Giveth domain names here"),"."),(0,o.kt)("p",null,"We're still working on providing more benefits to Givers PFP holders, so stay tuned for more updates!"),(0,o.kt)("h2",{id:"setting-your-givers-pfp"},"Setting your Givers PFP"),(0,o.kt)("p",null,"Setting your Givers PFP as your profile picture on giveth.io is very simple. First login with your web wallet that hold your Givers PFP NFT. Then head over to ",(0,o.kt)("inlineCode",{parentName:"p"},"My Account")," from the dropdown menu in the top right and click on the link next to your profile picture that says ",(0,o.kt)("inlineCode",{parentName:"p"},"Set your Givers PFP"),". From there you'll be taken to a menu where you can select your Givers PFP from your wallet and set it as your profile picture. Click ",(0,o.kt)("inlineCode",{parentName:"p"},"Save")," and you're done! "),(0,o.kt)("h2",{id:"contract-address"},"Contract Address"),(0,o.kt)("p",null,"GiversPFP Contract (Mainnet): ",(0,o.kt)("a",{parentName:"p",href:"https://etherscan.io/token/0x78fde77737d5b9ab32fc718c9535c7f1b8ce84db"},"0x78fde77737d5b9ab32fc718c9535c7f1b8ce84db")),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Mint a Givers PFP here: ",(0,o.kt)("a",{parentName:"p",href:"https://giveth.io/nft"},"https://giveth.io/nft"),(0,o.kt)("br",{parentName:"p"}),"\n","View the Givers collection on Rarible here: ",(0,o.kt)("a",{parentName:"p",href:"https://rarible.com/the-givers-pfp/items"},"Giveth Givers PFP")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8f560ee4.e8492b7d.js b/assets/js/8f560ee4.e8492b7d.js new file mode 100644 index 0000000000..6b4bd1098c --- /dev/null +++ b/assets/js/8f560ee4.e8492b7d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[8251],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>h});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},c=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(r),h=o,m=d["".concat(l,".").concat(h)]||d[h]||u[h]||i;return r?n.createElement(m,a(a({ref:t},c),{},{components:r})):n.createElement(m,a({ref:t},c))}));function h(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:o,a[1]=s;for(var p=2;p{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>s,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=r(7462),o=(r(7294),r(3905)),i=r(4996);const a={id:"giverspfp",title:"The Givers PFP Collection",slug:"dapps/giverspfp"},s=void 0,l={unversionedId:"giverspfp",id:"giverspfp",title:"The Givers PFP Collection",description:"\u201cThe Givers\u201d NFT\u2019s are not just NFT\u2019s but integrated Giveth PFPs! Giveth's first PFP collection was a community proposed initiative begun in March 2022. The intention of the PFP collection is to raise funds for the Giveth DAO and continue our mission of building the Future of Giving. The Givers was launched for public minting on March 24, 2023 at 11am CST.",source:"@site/dapps/PFPcollection.md",sourceDirName:".",slug:"/dapps/giverspfp",permalink:"/dapps/giverspfp",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/PFPcollection.md",tags:[],version:"current",lastUpdatedBy:"Mitch Oz",lastUpdatedAt:1682563677,formattedLastUpdatedAt:"Apr 27, 2023",frontMatter:{id:"giverspfp",title:"The Givers PFP Collection",slug:"dapps/giverspfp"},sidebar:"dapps",previous:{title:"Quadratic Funding",permalink:"/quadraticfunding"},next:{title:"$nice Token (Depcrecated)",permalink:"/giveconomy/niceToken"}},p={},c=[{value:"Supply & Minting",id:"supply--minting",level:2},{value:"Art parameters",id:"art-parameters",level:2},{value:"Secondary Market",id:"secondary-market",level:2},{value:"Benefits",id:"benefits",level:2},{value:"Setting your Givers PFP",id:"setting-your-givers-pfp",level:2},{value:"Contract Address",id:"contract-address",level:2}],u={toc:c};function d(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"\u201cThe Givers\u201d NFT\u2019s are not just NFT\u2019s but integrated Giveth PFPs! Giveth's first PFP collection was a ",(0,o.kt)("a",{parentName:"p",href:"https://forum.giveth.io/t/the-givers-the-giveth-ecosystem-pfp-collection/478"},"community proposed initiative")," begun in March 2022. The intention of the PFP collection is to raise funds for the Giveth DAO and continue our mission of building the Future of Giving. The Givers was launched for public minting on March 24, 2023 at 11am CST. "),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"To mint a Giver head on over to ",(0,o.kt)("a",{parentName:"strong",href:"https://giveth.io/nft"},"the minting page")),"! "),(0,o.kt)("img",{alt:"Givers base image",src:(0,i.Z)("img/content/GiversHidden.png")}),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("h3",{parentName:"admonition",id:"about-the-giveth-dao"},"About the Giveth DAO"),(0,o.kt)("p",{parentName:"admonition"},"Since 2016, Giveth has focused on supporting public goods through a community-driven ecosystem of collective support and value creation. This has resulted in streamlined donation tools and mechanisms powered by blockchain technology, which have onboarded over 1,700 projects and has facilitated hundreds of thousands of donations."),(0,o.kt)("p",{parentName:"admonition"},"We\u2019re launching the Givers PFP collection as a fundraiser to allow us to continue improving our donation platform and build tools that empower non-profits and impact projects.")),(0,o.kt)("h2",{id:"supply--minting"},"Supply & Minting"),(0,o.kt)("p",null,"There will be a total of 1,250 NFTs in the collection, and no more than 100 of them will be used for promotional purposes by the DAO. Minting can be done on Ethereum Mainnet for 100 DAI each. To ensure an even distribution, no single address can hold more than 5 Givers PFPs."),(0,o.kt)("h2",{id:"art-parameters"},"Art parameters"),(0,o.kt)("p",null,"Every art NFT is created out of several individual layers of artwork. In some cases some of the layered artwork may be unseen as they get covered by others above it, as for instance the art tattoos. You will however be able to see all of your unique art's traits and rarity on Rarible or in the token's metadata."),(0,o.kt)("h2",{id:"secondary-market"},"Secondary Market"),(0,o.kt)("p",null,'You can trade your Giver but keep in mind that for any trades on the secondary market, a 10% royalty fee will be imposed. All Givers (unless stated otherwise) are licensed under Creative Commons CC0 or "No Rights Reserved". The easiest way to trade is using the ',(0,o.kt)("a",{parentName:"p",href:"https://rarible.com/the-givers-pfp/items"},"Rarible Collection Page"),"."),(0,o.kt)("h2",{id:"benefits"},"Benefits"),(0,o.kt)("p",null,"Givers PFP owners are able to have their NFTs integrated on their Giveth.io profile when logged in! Show your flair and support for Giveth almost anywhere on the DApp. Below is a preview of how Givers show up on the Giveth.io platform."),(0,o.kt)("a",{href:"/img/content/PFPbenefits.png",target:"_blank",rel:"noopener noreferrer"},(0,o.kt)("img",{alt:"pfp holder benefits on the dapp",src:(0,i.Z)("img/content/PFPbenefits.png")})),(0,o.kt)("p",null,"When you set your Giver as your profile picture on Giveth.io it will be show up as a badge next to your name on any projects that you have created as well as when you make donations or boost projects with GIVpower. Users can also get an up close look at your Giver by navigating to your user profile."),(0,o.kt)("p",null,"Giveth is also partnering with Punk Domains to provide Givers NFT holders a ",(0,o.kt)("strong",{parentName:"p"},"50% discount on the Giveth domain names.")," Anyone is able claim their unique \u201cyourname.giveth\u201d domain name, which will also be linked to your account. You can check out ",(0,o.kt)("a",{parentName:"p",href:"https://giveth.punk.domains/#/"},"Giveth domain names here"),"."),(0,o.kt)("p",null,"We're still working on providing more benefits to Givers PFP holders, so stay tuned for more updates!"),(0,o.kt)("h2",{id:"setting-your-givers-pfp"},"Setting your Givers PFP"),(0,o.kt)("p",null,"Setting your Givers PFP as your profile picture on giveth.io is very simple. First login with your web wallet that hold your Givers PFP NFT. Then head over to ",(0,o.kt)("inlineCode",{parentName:"p"},"My Account")," from the dropdown menu in the top right and click on the link next to your profile picture that says ",(0,o.kt)("inlineCode",{parentName:"p"},"Set your Givers PFP"),". From there you'll be taken to a menu where you can select your Givers PFP from your wallet and set it as your profile picture. Click ",(0,o.kt)("inlineCode",{parentName:"p"},"Save")," and you're done! "),(0,o.kt)("h2",{id:"contract-address"},"Contract Address"),(0,o.kt)("p",null,"GiversPFP Contract (Mainnet): ",(0,o.kt)("a",{parentName:"p",href:"https://etherscan.io/token/0x78fde77737d5b9ab32fc718c9535c7f1b8ce84db"},"0x78fde77737d5b9ab32fc718c9535c7f1b8ce84db")),(0,o.kt)("hr",null),(0,o.kt)("p",null,"Mint a Givers PFP here: ",(0,o.kt)("a",{parentName:"p",href:"https://giveth.io/nft"},"https://giveth.io/nft"),(0,o.kt)("br",{parentName:"p"}),"\n","View the Givers collection on Rarible here: ",(0,o.kt)("a",{parentName:"p",href:"https://rarible.com/the-givers-pfp/items"},"Giveth Givers PFP")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9e70dc58.3955c826.js b/assets/js/9e70dc58.3955c826.js new file mode 100644 index 0000000000..d9f56ee6ad --- /dev/null +++ b/assets/js/9e70dc58.3955c826.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[2481],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>u});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),m=p(n),u=a,h=m["".concat(l,".").concat(u)]||m[u]||c[u]||o;return n?r.createElement(h,i(i({ref:t},d),{},{components:n})):r.createElement(h,i({ref:t},d))}));function u(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:a,i[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const o={id:"regenFarmContracts",title:"Regen Farm Smart Contract Guide",slug:"dapps/regenFarmContracts"},i=void 0,s={unversionedId:"regenFarmContracts",id:"regenFarmContracts",title:"Regen Farm Smart Contract Guide",description:"GIVeconomy is a collection of audited smart contracts which work together to provide capabilities, including: token streaming, airdropping, and various types of farming. Contracts and scripts can be found at the Giveth giv-token-contracts repository.",source:"@site/dapps/regenFarmContracts.md",sourceDirName:".",slug:"/dapps/regenFarmContracts",permalink:"/dapps/regenFarmContracts",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/regenFarmContracts.md",tags:[],version:"current",lastUpdatedBy:"Amin Latifi",lastUpdatedAt:1652119118,formattedLastUpdatedAt:"May 9, 2022",frontMatter:{id:"regenFarmContracts",title:"Regen Farm Smart Contract Guide",slug:"dapps/regenFarmContracts"}},l={},p=[{value:"Contracts",id:"contracts",level:2},{value:"Streaming",id:"streaming",level:3},{value:"Air Drop",id:"air-drop",level:3},{value:"Farming",id:"farming",level:3},{value:"Deployment",id:"deployment",level:2}],d={toc:p};function c(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"GIVeconomy is a collection of audited smart contracts which work together to provide capabilities, including: token streaming, airdropping, and various types of farming. Contracts and scripts can be found at the ",(0,a.kt)("strong",{parentName:"p"},"Giveth")," ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/Giveth/giv-token-contracts"},"giv-token-contracts")," repository."),(0,a.kt)("h2",{id:"contracts"},"Contracts"),(0,a.kt)("h3",{id:"streaming"},"Streaming"),(0,a.kt)("p",null,"The streaming allows any rewards (e.g. airdrop, liquidity mining reward, ...) to be released gradually across a given time span instead of the whole sum moving immediately to the end user's wallet. To achieve that, every reward payment to users will be an ",(0,a.kt)("inlineCode",{parentName:"p"},"allocate")," on stream instead of a traditional ",(0,a.kt)("inlineCode",{parentName:"p"},"transfer/safeTransfer"),"."),(0,a.kt)("p",null,"Each instance of a ",(0,a.kt)("strong",{parentName:"p"},"Stream")," is deployed with these configuration parameters:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Total Tokens:")," Total amount of tokens that will be distributed over the stream period"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Start Time:")," The time stamp that the stream begins"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Duration:")," Total duration of the stream. At the end of stream 100% of tokens are released and can be claimed by recipients."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Cliff Period:")," The length of an initial period after the start of the stream. During this period, only the intitial percentage of the stream can be claimed and not more."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Initial Percentage:")," The percentage of immediately claimable rewards during the ",(0,a.kt)("em",{parentName:"li"},"Cliff Period")," ")),(0,a.kt)("p",null,"The ",(0,a.kt)("strong",{parentName:"p"},"TokenDistro")," is the smart contract which has implemented the streaming feature. Any eligible smart contract or eligible user can call ",(0,a.kt)("inlineCode",{parentName:"p"},"allocate")," method on the ",(0,a.kt)("strong",{parentName:"p"},"TokenDistro")," to add to the recipient's balance of their stream. Eligible contracts or users who can call ",(0,a.kt)("inlineCode",{parentName:"p"},"allocate")," should have the ",(0,a.kt)("strong",{parentName:"p"},"DISTRIBUTOR")," role for the ",(0,a.kt)("strong",{parentName:"p"},"TokenDistro")," smart contract. They are called ",(0,a.kt)("strong",{parentName:"p"},"Distributors"),". Each Distributor has a balance that they can distribute. Therefore, on each allocation the allocated amount sent is decreased from the distributor's balance and is added to recipient's balance."),(0,a.kt)("p",null,"A percentage of the allocated amount is claimable immediately, and the remaining percent goes into increasing recipient's stream flowrate. The flowrate is an expression of how many tokens become claimable from their stream over a weekly period. Over time, a greater percentage of the recipient's balance will be claimable immediately following the continued expansion of the stream."),(0,a.kt)("h3",{id:"air-drop"},"Air Drop"),(0,a.kt)("p",null,"The initial token distribution can be done by the ",(0,a.kt)("strong",{parentName:"p"},"MerkleDistro")," smart contract. It utilizes ",(0,a.kt)("em",{parentName:"p"},"Merkle Tree")," theory and each eligible recipient should provide its own unique proof data to claim their air drop. The air drop value actually will be allocated by calling ",(0,a.kt)("inlineCode",{parentName:"p"},"allocate")," on ",(0,a.kt)("strong",{parentName:"p"},"TokenDistro")," and will be added to user's stream balance."),(0,a.kt)("p",null,"Each instance of ",(0,a.kt)("strong",{parentName:"p"},"MerkleDistro")," is deployed with these configuration parameters:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Merkle Tree Root:")," The key of the merkle tree root (read blow)."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Token Distro Address:")," The address of the deployed TokenDistro instance.")),(0,a.kt)("p",null,"In order to deploy the ",(0,a.kt)("strong",{parentName:"p"},"MerkleDistro")," smart contract, the deployer must generate a merkle tree. The value of root will be used on the smart contract at deployment time, and the whole tree data is needed to obtain each user unique path to root. In ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/Giveth/giv-token-contracts"},"giv-token-contracts")," repo, there is a script to generate merkle tree data."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"ts-node scripts/generate-merkle-root.ts --input --output \n")),(0,a.kt)("p",null,"A JSON format of the airdrop data is not easy to generate for everyone, an ",(0,a.kt)("inlineCode",{parentName:"p"},"airdrop json file")," can be generated by a separate script from a CSV file, which is a more convenient format."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"ts-node scripts/csv2json.ts \n")),(0,a.kt)("h3",{id:"farming"},"Farming"),(0,a.kt)("p",null,"Giveth uses the ",(0,a.kt)("strong",{parentName:"p"},"UnipoolTokenDistro"),", a derivative of the ",(0,a.kt)("em",{parentName:"p"},"Unipool")," smart contract, for farming purposes. The difference is that ",(0,a.kt)("strong",{parentName:"p"},"UnipoolTokenDistro")," pays stakers' rewards by calling ",(0,a.kt)("inlineCode",{parentName:"p"},"allocate")," method on the ",(0,a.kt)("em",{parentName:"p"},"TokenDistro(stream)")," instead of transferring real tokens to the recipient's address."),(0,a.kt)("p",null,"Generally, the Unipool contract rewards stakers based on the liquidity they have staked. The liquidity token is named ",(0,a.kt)("inlineCode",{parentName:"p"},"uni")," deposited by stakers, and can be any token such as native token (e.g. GIV, FOX, ...) or a LP token obtained by staking in a pool (e.g. UniswapV2, SushiSwap, HoneySwap, ...)."),(0,a.kt)("p",null,"The Unipool reward amount is set by calling the ",(0,a.kt)("inlineCode",{parentName:"p"},"notifyRewardAmount(uint256 reward)")," method by the ",(0,a.kt)("strong",{parentName:"p"},"rewardDistribution"),". ",(0,a.kt)("strong",{parentName:"p"},"rewardDistribution")," can be set by the ",(0,a.kt)("strong",{parentName:"p"},"owner")," role and in the deployment script, deployer set its own address as ",(0,a.kt)("strong",{parentName:"p"},"rewardDistribution")," by default. Each time this method is called, the Unipool will set to disperse rewards in the ",(0,a.kt)("inlineCode",{parentName:"p"},"duration")," length period to stakers. Therefore, the reward distributor need to regularly call ",(0,a.kt)("inlineCode",{parentName:"p"},"notifyRewardAmount")," to keep a positive reward rate, and adjust the reward rate as it can be different on each round.\nEach instance of the ",(0,a.kt)("strong",{parentName:"p"},"UnipoolTokenDistro")," is deployed with these configuration parameters:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"TokenDistro Address:")," The address of deployed TokenDistro instance."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Uni Token Address:")," The liquidity token address"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Duration:")," Each rewarding program round length")),(0,a.kt)("h2",{id:"deployment"},"Deployment"),(0,a.kt)("p",null,"Deployment of a stream with farms and an airdrop is complicated and would be error prone to be done manually. Therefore, ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/Giveth/giv-token-contracts"},"giv-token-contracts")," has scripts to make it easier. Most of these scripts are tailored for GIVeconomy use cases."),(0,a.kt)("p",null,"However, a script is ready for DAOs to deploy their own stream (tokenDistro) and farming programs (Unipools). The script can be found in the path ",(0,a.kt)("inlineCode",{parentName:"p"},"deployments/regenFarms/1_regenFarm.ts"),". The script reads the deployment configuration from ",(0,a.kt)("inlineCode",{parentName:"p"},"deployments/regenFarms/config.ts")," file. The configuration format in ",(0,a.kt)("inlineCode",{parentName:"p"},"config.ts")," is as below:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},'const config: IRegenConfig = {\n alreadyDeployedTokenDistroAddress: "",\n newTokenDistroParams: {\n startTime: \n cliffPeriod: \n duration: \n initialPercentage: , // two decimals of precision, 20_00 means 20%\n tokenAddress: \n totalTokens: , // In ether format\n cancelable: , // whether admins can cancel an allocation\n },\n unipools: {\n : {\n uniTokenAddress: ,\n lmDuration: \n rewardAmount: , // Number of tokens it can allocate\n },\n ...\n },\n};\n')),(0,a.kt)("p",null,"To deploy via script these environmental variables should be set:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"INFURA_PROJECT_ID:")," When the network is not xDai (Gnosis-Chain)"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"PRIVATE_KEY:")," The private key of deployer account, used when network is not xDAI (Gnosis-Chain)"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"PRIVATE_KEY_XDAI:")," The private key of deployer account, used when network is xDAI (Gnosis-Chain)")),(0,a.kt)("p",null,"The script can be run by this command"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"HARDHAT_NETWORK= ts-node deployments/regenFarms/1_regenFarm.ts\n")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9e70dc58.8429d393.js b/assets/js/9e70dc58.8429d393.js deleted file mode 100644 index 1a4cecad5d..0000000000 --- a/assets/js/9e70dc58.8429d393.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[2481],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>u});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},d=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),m=p(r),u=a,h=m["".concat(l,".").concat(u)]||m[u]||c[u]||o;return r?n.createElement(h,i(i({ref:t},d),{},{components:r})):n.createElement(h,i({ref:t},d))}));function u(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:a,i[1]=s;for(var p=2;p{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var n=r(7462),a=(r(7294),r(3905));const o={id:"regenFarmContracts",title:"Regen Farm Smart Contract Guide",slug:"dapps/regenFarmContracts"},i=void 0,s={unversionedId:"regenFarmContracts",id:"regenFarmContracts",title:"Regen Farm Smart Contract Guide",description:"GIVeconomy is a collection of audited smart contracts which work together to provide capabilities, including: token streaming, airdropping, and various types of farming. Contracts and scripts can be found at the Giveth giv-token-contracts repository.",source:"@site/dapps/regenFarmContracts.md",sourceDirName:".",slug:"/dapps/regenFarmContracts",permalink:"/dapps/regenFarmContracts",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/regenFarmContracts.md",tags:[],version:"current",lastUpdatedBy:"Amin Latifi",lastUpdatedAt:1652119118,formattedLastUpdatedAt:"May 9, 2022",frontMatter:{id:"regenFarmContracts",title:"Regen Farm Smart Contract Guide",slug:"dapps/regenFarmContracts"},sidebar:"dapps",previous:{title:"Development Process",permalink:"/dapps/developmentProcess"},next:{title:"Intro to Giveth TRACE",permalink:"/dapps/introTrace"}},l={},p=[{value:"Contracts",id:"contracts",level:2},{value:"Streaming",id:"streaming",level:3},{value:"Air Drop",id:"air-drop",level:3},{value:"Farming",id:"farming",level:3},{value:"Deployment",id:"deployment",level:2}],d={toc:p};function c(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"GIVeconomy is a collection of audited smart contracts which work together to provide capabilities, including: token streaming, airdropping, and various types of farming. Contracts and scripts can be found at the ",(0,a.kt)("strong",{parentName:"p"},"Giveth")," ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/Giveth/giv-token-contracts"},"giv-token-contracts")," repository."),(0,a.kt)("h2",{id:"contracts"},"Contracts"),(0,a.kt)("h3",{id:"streaming"},"Streaming"),(0,a.kt)("p",null,"The streaming allows any rewards (e.g. airdrop, liquidity mining reward, ...) to be released gradually across a given time span instead of the whole sum moving immediately to the end user's wallet. To achieve that, every reward payment to users will be an ",(0,a.kt)("inlineCode",{parentName:"p"},"allocate")," on stream instead of a traditional ",(0,a.kt)("inlineCode",{parentName:"p"},"transfer/safeTransfer"),"."),(0,a.kt)("p",null,"Each instance of a ",(0,a.kt)("strong",{parentName:"p"},"Stream")," is deployed with these configuration parameters:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Total Tokens:")," Total amount of tokens that will be distributed over the stream period"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Start Time:")," The time stamp that the stream begins"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Duration:")," Total duration of the stream. At the end of stream 100% of tokens are released and can be claimed by recipients."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Cliff Period:")," The length of an initial period after the start of the stream. During this period, only the intitial percentage of the stream can be claimed and not more."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Initial Percentage:")," The percentage of immediately claimable rewards during the ",(0,a.kt)("em",{parentName:"li"},"Cliff Period")," ")),(0,a.kt)("p",null,"The ",(0,a.kt)("strong",{parentName:"p"},"TokenDistro")," is the smart contract which has implemented the streaming feature. Any eligible smart contract or eligible user can call ",(0,a.kt)("inlineCode",{parentName:"p"},"allocate")," method on the ",(0,a.kt)("strong",{parentName:"p"},"TokenDistro")," to add to the recipient's balance of their stream. Eligible contracts or users who can call ",(0,a.kt)("inlineCode",{parentName:"p"},"allocate")," should have the ",(0,a.kt)("strong",{parentName:"p"},"DISTRIBUTOR")," role for the ",(0,a.kt)("strong",{parentName:"p"},"TokenDistro")," smart contract. They are called ",(0,a.kt)("strong",{parentName:"p"},"Distributors"),". Each Distributor has a balance that they can distribute. Therefore, on each allocation the allocated amount sent is decreased from the distributor's balance and is added to recipient's balance."),(0,a.kt)("p",null,"A percentage of the allocated amount is claimable immediately, and the remaining percent goes into increasing recipient's stream flowrate. The flowrate is an expression of how many tokens become claimable from their stream over a weekly period. Over time, a greater percentage of the recipient's balance will be claimable immediately following the continued expansion of the stream."),(0,a.kt)("h3",{id:"air-drop"},"Air Drop"),(0,a.kt)("p",null,"The initial token distribution can be done by the ",(0,a.kt)("strong",{parentName:"p"},"MerkleDistro")," smart contract. It utilizes ",(0,a.kt)("em",{parentName:"p"},"Merkle Tree")," theory and each eligible recipient should provide its own unique proof data to claim their air drop. The air drop value actually will be allocated by calling ",(0,a.kt)("inlineCode",{parentName:"p"},"allocate")," on ",(0,a.kt)("strong",{parentName:"p"},"TokenDistro")," and will be added to user's stream balance."),(0,a.kt)("p",null,"Each instance of ",(0,a.kt)("strong",{parentName:"p"},"MerkleDistro")," is deployed with these configuration parameters:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Merkle Tree Root:")," The key of the merkle tree root (read blow)."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Token Distro Address:")," The address of the deployed TokenDistro instance.")),(0,a.kt)("p",null,"In order to deploy the ",(0,a.kt)("strong",{parentName:"p"},"MerkleDistro")," smart contract, the deployer must generate a merkle tree. The value of root will be used on the smart contract at deployment time, and the whole tree data is needed to obtain each user unique path to root. In ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/Giveth/giv-token-contracts"},"giv-token-contracts")," repo, there is a script to generate merkle tree data."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"ts-node scripts/generate-merkle-root.ts --input --output \n")),(0,a.kt)("p",null,"A JSON format of the airdrop data is not easy to generate for everyone, an ",(0,a.kt)("inlineCode",{parentName:"p"},"airdrop json file")," can be generated by a separate script from a CSV file, which is a more convenient format."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"ts-node scripts/csv2json.ts \n")),(0,a.kt)("h3",{id:"farming"},"Farming"),(0,a.kt)("p",null,"Giveth uses the ",(0,a.kt)("strong",{parentName:"p"},"UnipoolTokenDistro"),", a derivative of the ",(0,a.kt)("em",{parentName:"p"},"Unipool")," smart contract, for farming purposes. The difference is that ",(0,a.kt)("strong",{parentName:"p"},"UnipoolTokenDistro")," pays stakers' rewards by calling ",(0,a.kt)("inlineCode",{parentName:"p"},"allocate")," method on the ",(0,a.kt)("em",{parentName:"p"},"TokenDistro(stream)")," instead of transferring real tokens to the recipient's address."),(0,a.kt)("p",null,"Generally, the Unipool contract rewards stakers based on the liquidity they have staked. The liquidity token is named ",(0,a.kt)("inlineCode",{parentName:"p"},"uni")," deposited by stakers, and can be any token such as native token (e.g. GIV, FOX, ...) or a LP token obtained by staking in a pool (e.g. UniswapV2, SushiSwap, HoneySwap, ...)."),(0,a.kt)("p",null,"The Unipool reward amount is set by calling the ",(0,a.kt)("inlineCode",{parentName:"p"},"notifyRewardAmount(uint256 reward)")," method by the ",(0,a.kt)("strong",{parentName:"p"},"rewardDistribution"),". ",(0,a.kt)("strong",{parentName:"p"},"rewardDistribution")," can be set by the ",(0,a.kt)("strong",{parentName:"p"},"owner")," role and in the deployment script, deployer set its own address as ",(0,a.kt)("strong",{parentName:"p"},"rewardDistribution")," by default. Each time this method is called, the Unipool will set to disperse rewards in the ",(0,a.kt)("inlineCode",{parentName:"p"},"duration")," length period to stakers. Therefore, the reward distributor need to regularly call ",(0,a.kt)("inlineCode",{parentName:"p"},"notifyRewardAmount")," to keep a positive reward rate, and adjust the reward rate as it can be different on each round.\nEach instance of the ",(0,a.kt)("strong",{parentName:"p"},"UnipoolTokenDistro")," is deployed with these configuration parameters:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"TokenDistro Address:")," The address of deployed TokenDistro instance."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Uni Token Address:")," The liquidity token address"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Duration:")," Each rewarding program round length")),(0,a.kt)("h2",{id:"deployment"},"Deployment"),(0,a.kt)("p",null,"Deployment of a stream with farms and an airdrop is complicated and would be error prone to be done manually. Therefore, ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/Giveth/giv-token-contracts"},"giv-token-contracts")," has scripts to make it easier. Most of these scripts are tailored for GIVeconomy use cases."),(0,a.kt)("p",null,"However, a script is ready for DAOs to deploy their own stream (tokenDistro) and farming programs (Unipools). The script can be found in the path ",(0,a.kt)("inlineCode",{parentName:"p"},"deployments/regenFarms/1_regenFarm.ts"),". The script reads the deployment configuration from ",(0,a.kt)("inlineCode",{parentName:"p"},"deployments/regenFarms/config.ts")," file. The configuration format in ",(0,a.kt)("inlineCode",{parentName:"p"},"config.ts")," is as below:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},'const config: IRegenConfig = {\n alreadyDeployedTokenDistroAddress: "",\n newTokenDistroParams: {\n startTime: \n cliffPeriod: \n duration: \n initialPercentage: , // two decimals of precision, 20_00 means 20%\n tokenAddress: \n totalTokens: , // In ether format\n cancelable: , // whether admins can cancel an allocation\n },\n unipools: {\n : {\n uniTokenAddress: ,\n lmDuration: \n rewardAmount: , // Number of tokens it can allocate\n },\n ...\n },\n};\n')),(0,a.kt)("p",null,"To deploy via script these environmental variables should be set:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"INFURA_PROJECT_ID:")," When the network is not xDai (Gnosis-Chain)"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"PRIVATE_KEY:")," The private key of deployer account, used when network is not xDAI (Gnosis-Chain)"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"PRIVATE_KEY_XDAI:")," The private key of deployer account, used when network is xDAI (Gnosis-Chain)")),(0,a.kt)("p",null,"The script can be run by this command"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"HARDHAT_NETWORK= ts-node deployments/regenFarms/1_regenFarm.ts\n")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b57950f4.baa60072.js b/assets/js/b57950f4.baa60072.js new file mode 100644 index 0000000000..1d56d75974 --- /dev/null +++ b/assets/js/b57950f4.baa60072.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[4617],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>g});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var d=n.createContext({}),s=function(e){var t=n.useContext(d),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=s(e.components);return n.createElement(d.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,d=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),c=s(a),g=r,m=c["".concat(d,".").concat(g)]||c[g]||p[g]||l;return a?n.createElement(m,i(i({ref:t},u),{},{components:a})):n.createElement(m,i({ref:t},u))}));function g(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=c;var o={};for(var d in t)hasOwnProperty.call(t,d)&&(o[d]=t[d]);o.originalType=e,o.mdxType="string"==typeof e?e:r,i[1]=o;for(var s=2;s{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>d,toc:()=>u});var n=a(7462),r=(a(7294),a(3905)),l=a(4996);const i={id:"angelVault",title:"The Angel Vault (Deprecated)"},o=void 0,d={unversionedId:"angelVault",id:"angelVault",title:"The Angel Vault (Deprecated)",description:"Then Angel Vault has been deprecated. This documentation will remain purely for historical reference.",source:"@site/dapps/angelVault.md",sourceDirName:".",slug:"/angelVault",permalink:"/angelVault",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/angelVault.md",tags:[],version:"current",lastUpdatedBy:"Mitch Oz",lastUpdatedAt:1705082232,formattedLastUpdatedAt:"Jan 12, 2024",frontMatter:{id:"angelVault",title:"The Angel Vault (Deprecated)"},sidebar:"dapps",previous:{title:"$nice Token (Depcrecated)",permalink:"/giveconomy/niceToken"}},s={},u=[{value:"Then Angel Vault has been deprecated. This documentation will remain purely for historical reference.",id:"then-angel-vault-has-been-deprecated-this-documentation-will-remain-purely-for-historical-reference",level:3},{value:"Contracts",id:"contracts",level:2},{value:"oneGIV",id:"onegiv",level:2},{value:"Providing & Removing Liquidity",id:"providing--removing-liquidity",level:2},{value:"Earning Rewards",id:"earning-rewards",level:2},{value:"Distribution of GIV rewards to Angel Vault LP Stakers",id:"distribution-of-giv-rewards-to-angel-vault-lp-stakers",level:2},{value:"Incentives Plan\u200a\u2014\u200aThe Jagged Staircase",id:"incentives-planthe-jagged-staircase",level:3}],p={toc:u};function c(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"then-angel-vault-has-been-deprecated-this-documentation-will-remain-purely-for-historical-reference"},(0,r.kt)("em",{parentName:"h3"},"Then Angel Vault has been deprecated. This documentation will remain purely for historical reference.")),(0,r.kt)("p",null,"The Angel Vault is a strategically managed Univ3 position structured to protect GIV from downward volatility. It is managed by our Angel Vault multisig, a ",(0,r.kt)("a",{parentName:"p",href:"https://gnosis-safe.io/app/eth:0x2B0ee142dCFE7C2dD150cDbd7B6832F6e9977f51/home"},"4/7 multisig of Giveth core team members and two members for ICHI"),". To learn more about Angel Vaults and how they work, please refer to ",(0,r.kt)("a",{parentName:"p",href:"https://docs.ichi.org/ichi-docs-v3/ichi-vaults/angel-vaults"},"ICHI\u2019s documentation"),"."),(0,r.kt)("h2",{id:"contracts"},"Contracts"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Angel Vault (ICHI) LM (Unipool): ",(0,r.kt)("inlineCode",{parentName:"li"},"0xA4b727DF6fD608d1835e3440288c73fB28c4eF16")),(0,r.kt)("li",{parentName:"ul"},"Angel Vault (ICHI) LP: ",(0,r.kt)("inlineCode",{parentName:"li"},"0xc3151A58d519B94E915f66B044De3E55F77c2dd9"))),(0,r.kt)("h2",{id:"onegiv"},"oneGIV"),(0,r.kt)("p",null,"oneGIV is a Giveth Branded Dollar (by ICHI) that can be minted using DAI at a 1:1 ratio. This can be done via ",(0,r.kt)("a",{parentName:"p",href:"https://app.ichi.org/vault?poolId=20009&back=vault"},"ICHI\u2019s website"),". To learn more about ICHI\u2019s branded dollar, ",(0,r.kt)("a",{parentName:"p",href:"https://docs.ichi.org/ichi-docs-v3/branded-dollars/overview"},"please refer to their documentation"),"."),(0,r.kt)("p",null,"oneGIV is minted using 100% DAI, and is also over-collateralized by GIV. The contract holds GIV as additional collateral in case there is some issue with the DAI. All mints & burns of oneGIV happen via a contract managed by our Angel Vault multisig."),(0,r.kt)("p",null,"Over time, the Giveth DAO may vote to change the minting ratio from 100% DAI to a combination of DAI and GIV (e.g. 80% DAI, 20% GIV). However, to keep the peg to the dollar, burning oneGIV to redeem DAI will always result in 100% DAI."),(0,r.kt)("h2",{id:"providing--removing-liquidity"},"Providing & Removing Liquidity"),(0,r.kt)("p",null,"Liquidity providers can add liquidity to the Angel Vault using oneGIV via ",(0,r.kt)("a",{parentName:"p",href:"https://app.ichi.org/vault?poolId=20009&back=vault"},"ICHI\u2019s website"),", and then stake their LP tokens in the ",(0,r.kt)("a",{parentName:"p",href:"https://giveth.io/givfarm"},"GIVfarm"),". Because this oneGIV is added to a oneGIV / GIV Univ3 position, when you remove liquidity you will get oneGIV & GIV proportional to the holdings in the Angel Vault."),(0,r.kt)("h2",{id:"earning-rewards"},"Earning Rewards"),(0,r.kt)("p",null,"Rewards are given to liquidity providers in proportion to the liquidity provided. When you stake your LP tokens, you earn rewards in two parts:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"The 1% Uniswap fee which automatically increase your Angel Vault position (",(0,r.kt)("a",{parentName:"li",href:"https://docs.ichi.org/ichi-docs-v3/resources/faqs#what-does-the-irr-metric-on-the-angel-vault-page-represent"},"IRR"),")."),(0,r.kt)("li",{parentName:"ol"},"GIV incentives from within the GIVfarm, which as always, are distributed according to the GIVstream. Check out the ",(0,r.kt)("a",{parentName:"li",href:"https://giveth.io/givstream"},(0,r.kt)("strong",{parentName:"a"},"GIViverse Expansion"))," to understand how much your claimable rewards will be.")),(0,r.kt)("p",null,"The APR shown in the GIVfarm oneGIV/GIV staking pool is the sum of these two reward rates."),(0,r.kt)("img",{alt:"angel vault staking farm staking card",src:(0,l.Z)("/img/content/giveconomy/angelVaultCard.png")}),(0,r.kt)("h2",{id:"distribution-of-giv-rewards-to-angel-vault-lp-stakers"},"Distribution of GIV rewards to Angel Vault LP Stakers"),(0,r.kt)("p",null,"A total of 6 Million GIV has been allocated to run a rewards program for Angel Vault LP stakers for 26 weeks from the start date August 4, 2022. The amount of rewards being sent out throughout each two week period is as follows:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Week"),(0,r.kt)("th",{parentName:"tr",align:null},"GIV Rewarded (within the 2 week period)"),(0,r.kt)("th",{parentName:"tr",align:null},"% of rewards"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 1"),(0,r.kt)("td",{parentName:"tr",align:null},"485,143"),(0,r.kt)("td",{parentName:"tr",align:null},"8.09%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 3"),(0,r.kt)("td",{parentName:"tr",align:null},"569,143"),(0,r.kt)("td",{parentName:"tr",align:null},"9.49%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 5"),(0,r.kt)("td",{parentName:"tr",align:null},"140,000"),(0,r.kt)("td",{parentName:"tr",align:null},"2.33%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 7"),(0,r.kt)("td",{parentName:"tr",align:null},"653,143"),(0,r.kt)("td",{parentName:"tr",align:null},"10.89%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 9"),(0,r.kt)("td",{parentName:"tr",align:null},"140,000"),(0,r.kt)("td",{parentName:"tr",align:null},"2.33%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 11"),(0,r.kt)("td",{parentName:"tr",align:null},"737,143"),(0,r.kt)("td",{parentName:"tr",align:null},"12.29%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 13"),(0,r.kt)("td",{parentName:"tr",align:null},"140,000"),(0,r.kt)("td",{parentName:"tr",align:null},"2.33%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 15"),(0,r.kt)("td",{parentName:"tr",align:null},"821,143"),(0,r.kt)("td",{parentName:"tr",align:null},"13.69%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 17"),(0,r.kt)("td",{parentName:"tr",align:null},"140,000"),(0,r.kt)("td",{parentName:"tr",align:null},"2.33%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 19"),(0,r.kt)("td",{parentName:"tr",align:null},"905,143"),(0,r.kt)("td",{parentName:"tr",align:null},"15.09%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 21"),(0,r.kt)("td",{parentName:"tr",align:null},"140,000"),(0,r.kt)("td",{parentName:"tr",align:null},"2.33%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 23"),(0,r.kt)("td",{parentName:"tr",align:null},"989,143"),(0,r.kt)("td",{parentName:"tr",align:null},"16.49%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 25"),(0,r.kt)("td",{parentName:"tr",align:null},"140,000"),(0,r.kt)("td",{parentName:"tr",align:null},"2.32%")))),(0,r.kt)("h3",{id:"incentives-planthe-jagged-staircase"},"Incentives Plan\u200a\u2014\u200aThe Jagged Staircase"),(0,r.kt)("p",null,"When the Angel Vault is initialized, the entirety of its liquidity will be in oneGIV. This is beneficial as the Angel Vault works best when there is a high percentage of oneGIV in the vault, but this percentage does not stay stable over time.\nThe ratio of GIV goes up when there is sell pressure in the market on the GIV token.\nThe ratio of oneGIV goes up when new Angel Vault LP positions are created.\nThe ratio of GIV/oneGIV stays the same when Angel Vault LP positions are removed.\nWe therefore want to encourage liquidity providers to periodically withdraw liquidity\u200a\u2014\u200a removing some % of GIV from the pool\u200a\u2014\u200aand then re-add liquidity in oneGIV, increasing the total concentration of stables in the Angel Vault. This will help to support the strength of the Angel Vault buy-wall."),(0,r.kt)("img",{alt:"rewards distribution schedule for jagged staircase",src:(0,l.Z)("/img/content/giveconomy/jaggedStaircase.png")}))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b57950f4.fc9ae2eb.js b/assets/js/b57950f4.fc9ae2eb.js deleted file mode 100644 index 53faac4dac..0000000000 --- a/assets/js/b57950f4.fc9ae2eb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[4617],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>m});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var d=n.createContext({}),s=function(e){var t=n.useContext(d),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=s(e.components);return n.createElement(d.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,d=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),g=s(a),m=r,c=g["".concat(d,".").concat(m)]||g[m]||p[m]||l;return a?n.createElement(c,i(i({ref:t},u),{},{components:a})):n.createElement(c,i({ref:t},u))}));function m(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=g;var o={};for(var d in t)hasOwnProperty.call(t,d)&&(o[d]=t[d]);o.originalType=e,o.mdxType="string"==typeof e?e:r,i[1]=o;for(var s=2;s{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>g,frontMatter:()=>i,metadata:()=>d,toc:()=>u});var n=a(7462),r=(a(7294),a(3905)),l=a(4996);const i={id:"angelVault",title:"The Angel Vault (Deprecated)"},o=void 0,d={unversionedId:"angelVault",id:"angelVault",title:"The Angel Vault (Deprecated)",description:"Then Angel Vault has been deprecated. This documentation will remain purely for historical reference.",source:"@site/dapps/angelVault.md",sourceDirName:".",slug:"/angelVault",permalink:"/angelVault",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/angelVault.md",tags:[],version:"current",lastUpdatedBy:"Mitch Oz",lastUpdatedAt:1705082232,formattedLastUpdatedAt:"Jan 12, 2024",frontMatter:{id:"angelVault",title:"The Angel Vault (Deprecated)"},sidebar:"dapps",previous:{title:"Regen Farms",permalink:"/regenFarms"},next:{title:"GIVdrop (Finished)",permalink:"/giveconomy/givdrop"}},s={},u=[{value:"Then Angel Vault has been deprecated. This documentation will remain purely for historical reference.",id:"then-angel-vault-has-been-deprecated-this-documentation-will-remain-purely-for-historical-reference",level:3},{value:"Contracts",id:"contracts",level:2},{value:"oneGIV",id:"onegiv",level:2},{value:"Providing & Removing Liquidity",id:"providing--removing-liquidity",level:2},{value:"Earning Rewards",id:"earning-rewards",level:2},{value:"Distribution of GIV rewards to Angel Vault LP Stakers",id:"distribution-of-giv-rewards-to-angel-vault-lp-stakers",level:2},{value:"Incentives Plan\u200a\u2014\u200aThe Jagged Staircase",id:"incentives-planthe-jagged-staircase",level:3}],p={toc:u};function g(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h3",{id:"then-angel-vault-has-been-deprecated-this-documentation-will-remain-purely-for-historical-reference"},(0,r.kt)("em",{parentName:"h3"},"Then Angel Vault has been deprecated. This documentation will remain purely for historical reference.")),(0,r.kt)("p",null,"The Angel Vault is a strategically managed Univ3 position structured to protect GIV from downward volatility. It is managed by our Angel Vault multisig, a ",(0,r.kt)("a",{parentName:"p",href:"https://gnosis-safe.io/app/eth:0x2B0ee142dCFE7C2dD150cDbd7B6832F6e9977f51/home"},"4/7 multisig of Giveth core team members and two members for ICHI"),". To learn more about Angel Vaults and how they work, please refer to ",(0,r.kt)("a",{parentName:"p",href:"https://docs.ichi.org/ichi-docs-v3/ichi-vaults/angel-vaults"},"ICHI\u2019s documentation"),"."),(0,r.kt)("h2",{id:"contracts"},"Contracts"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Angel Vault (ICHI) LM (Unipool): ",(0,r.kt)("inlineCode",{parentName:"li"},"0xA4b727DF6fD608d1835e3440288c73fB28c4eF16")),(0,r.kt)("li",{parentName:"ul"},"Angel Vault (ICHI) LP: ",(0,r.kt)("inlineCode",{parentName:"li"},"0xc3151A58d519B94E915f66B044De3E55F77c2dd9"))),(0,r.kt)("h2",{id:"onegiv"},"oneGIV"),(0,r.kt)("p",null,"oneGIV is a Giveth Branded Dollar (by ICHI) that can be minted using DAI at a 1:1 ratio. This can be done via ",(0,r.kt)("a",{parentName:"p",href:"https://app.ichi.org/vault?poolId=20009&back=vault"},"ICHI\u2019s website"),". To learn more about ICHI\u2019s branded dollar, ",(0,r.kt)("a",{parentName:"p",href:"https://docs.ichi.org/ichi-docs-v3/branded-dollars/overview"},"please refer to their documentation"),"."),(0,r.kt)("p",null,"oneGIV is minted using 100% DAI, and is also over-collateralized by GIV. The contract holds GIV as additional collateral in case there is some issue with the DAI. All mints & burns of oneGIV happen via a contract managed by our Angel Vault multisig."),(0,r.kt)("p",null,"Over time, the Giveth DAO may vote to change the minting ratio from 100% DAI to a combination of DAI and GIV (e.g. 80% DAI, 20% GIV). However, to keep the peg to the dollar, burning oneGIV to redeem DAI will always result in 100% DAI."),(0,r.kt)("h2",{id:"providing--removing-liquidity"},"Providing & Removing Liquidity"),(0,r.kt)("p",null,"Liquidity providers can add liquidity to the Angel Vault using oneGIV via ",(0,r.kt)("a",{parentName:"p",href:"https://app.ichi.org/vault?poolId=20009&back=vault"},"ICHI\u2019s website"),", and then stake their LP tokens in the ",(0,r.kt)("a",{parentName:"p",href:"https://giveth.io/givfarm"},"GIVfarm"),". Because this oneGIV is added to a oneGIV / GIV Univ3 position, when you remove liquidity you will get oneGIV & GIV proportional to the holdings in the Angel Vault."),(0,r.kt)("h2",{id:"earning-rewards"},"Earning Rewards"),(0,r.kt)("p",null,"Rewards are given to liquidity providers in proportion to the liquidity provided. When you stake your LP tokens, you earn rewards in two parts:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"The 1% Uniswap fee which automatically increase your Angel Vault position (",(0,r.kt)("a",{parentName:"li",href:"https://docs.ichi.org/ichi-docs-v3/resources/faqs#what-does-the-irr-metric-on-the-angel-vault-page-represent"},"IRR"),")."),(0,r.kt)("li",{parentName:"ol"},"GIV incentives from within the GIVfarm, which as always, are distributed according to the GIVstream. Check out the ",(0,r.kt)("a",{parentName:"li",href:"https://giveth.io/givstream"},(0,r.kt)("strong",{parentName:"a"},"GIViverse Expansion"))," to understand how much your claimable rewards will be.")),(0,r.kt)("p",null,"The APR shown in the GIVfarm oneGIV/GIV staking pool is the sum of these two reward rates."),(0,r.kt)("img",{alt:"angel vault staking farm staking card",src:(0,l.Z)("/img/content/giveconomy/angelVaultCard.png")}),(0,r.kt)("h2",{id:"distribution-of-giv-rewards-to-angel-vault-lp-stakers"},"Distribution of GIV rewards to Angel Vault LP Stakers"),(0,r.kt)("p",null,"A total of 6 Million GIV has been allocated to run a rewards program for Angel Vault LP stakers for 26 weeks from the start date August 4, 2022. The amount of rewards being sent out throughout each two week period is as follows:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Week"),(0,r.kt)("th",{parentName:"tr",align:null},"GIV Rewarded (within the 2 week period)"),(0,r.kt)("th",{parentName:"tr",align:null},"% of rewards"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 1"),(0,r.kt)("td",{parentName:"tr",align:null},"485,143"),(0,r.kt)("td",{parentName:"tr",align:null},"8.09%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 3"),(0,r.kt)("td",{parentName:"tr",align:null},"569,143"),(0,r.kt)("td",{parentName:"tr",align:null},"9.49%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 5"),(0,r.kt)("td",{parentName:"tr",align:null},"140,000"),(0,r.kt)("td",{parentName:"tr",align:null},"2.33%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 7"),(0,r.kt)("td",{parentName:"tr",align:null},"653,143"),(0,r.kt)("td",{parentName:"tr",align:null},"10.89%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 9"),(0,r.kt)("td",{parentName:"tr",align:null},"140,000"),(0,r.kt)("td",{parentName:"tr",align:null},"2.33%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 11"),(0,r.kt)("td",{parentName:"tr",align:null},"737,143"),(0,r.kt)("td",{parentName:"tr",align:null},"12.29%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 13"),(0,r.kt)("td",{parentName:"tr",align:null},"140,000"),(0,r.kt)("td",{parentName:"tr",align:null},"2.33%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 15"),(0,r.kt)("td",{parentName:"tr",align:null},"821,143"),(0,r.kt)("td",{parentName:"tr",align:null},"13.69%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 17"),(0,r.kt)("td",{parentName:"tr",align:null},"140,000"),(0,r.kt)("td",{parentName:"tr",align:null},"2.33%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 19"),(0,r.kt)("td",{parentName:"tr",align:null},"905,143"),(0,r.kt)("td",{parentName:"tr",align:null},"15.09%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 21"),(0,r.kt)("td",{parentName:"tr",align:null},"140,000"),(0,r.kt)("td",{parentName:"tr",align:null},"2.33%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 23"),(0,r.kt)("td",{parentName:"tr",align:null},"989,143"),(0,r.kt)("td",{parentName:"tr",align:null},"16.49%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Week 25"),(0,r.kt)("td",{parentName:"tr",align:null},"140,000"),(0,r.kt)("td",{parentName:"tr",align:null},"2.32%")))),(0,r.kt)("h3",{id:"incentives-planthe-jagged-staircase"},"Incentives Plan\u200a\u2014\u200aThe Jagged Staircase"),(0,r.kt)("p",null,"When the Angel Vault is initialized, the entirety of its liquidity will be in oneGIV. This is beneficial as the Angel Vault works best when there is a high percentage of oneGIV in the vault, but this percentage does not stay stable over time.\nThe ratio of GIV goes up when there is sell pressure in the market on the GIV token.\nThe ratio of oneGIV goes up when new Angel Vault LP positions are created.\nThe ratio of GIV/oneGIV stays the same when Angel Vault LP positions are removed.\nWe therefore want to encourage liquidity providers to periodically withdraw liquidity\u200a\u2014\u200a removing some % of GIV from the pool\u200a\u2014\u200aand then re-add liquidity in oneGIV, increasing the total concentration of stables in the Angel Vault. This will help to support the strength of the Angel Vault buy-wall."),(0,r.kt)("img",{alt:"rewards distribution schedule for jagged staircase",src:(0,l.Z)("/img/content/giveconomy/jaggedStaircase.png")}))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/beea71df.86026c31.js b/assets/js/beea71df.86026c31.js new file mode 100644 index 0000000000..ad4b06ceb6 --- /dev/null +++ b/assets/js/beea71df.86026c31.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[33],{3905:(e,t,n)=>{n.d(t,{Zo:()=>l,kt:()=>d});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),p=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},l=function(e){var t=p(e.components);return r.createElement(c.Provider,{value:t},e.children)},h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),u=p(n),d=o,m=u["".concat(c,".").concat(d)]||u[d]||h[d]||a;return n?r.createElement(m,i(i({ref:t},l),{},{components:n})):r.createElement(m,i({ref:t},l))}));function d(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=u;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:o,i[1]=s;for(var p=2;p{n.d(t,{ZP:()=>i});var r=n(7462),o=(n(7294),n(3905));const a={toc:[]};function i(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,r.Z)({},a,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,(0,o.kt)("em",{parentName:"p"},(0,o.kt)("strong",{parentName:"em"},"Giveth TRACE has officially been deprecated. After 5 years of faithful service, Giveth and its platform, services and products have fully migrated to ",(0,o.kt)("a",{parentName:"strong",href:"https://giveth.io"},"Giveth.io"),". With the deprecation of the Rinkeby network and low user activity, the Giveth DAO decided to sunset its original dApp in Q3 of 2022. The code has and will forever be open-source, and you can find it in ",(0,o.kt)("a",{parentName:"strong",href:"https://github.com/Giveth"},"Giveth's Github repositories"),"."))),(0,o.kt)("p",null,(0,o.kt)("em",{parentName:"p"},(0,o.kt)("strong",{parentName:"em"},"This documentation will remain available for historical reference."))),(0,o.kt)("hr",null))}i.isMDXComponent=!0},1138:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>d,frontMatter:()=>s,metadata:()=>p,toc:()=>h});var r=n(7462),o=(n(7294),n(3905)),a=n(4996),i=n(8932);const s={id:"introTrace",title:"Intro to Giveth TRACE",slug:"dapps/introTrace"},c=void 0,p={unversionedId:"introTrace",id:"introTrace",title:"Intro to Giveth TRACE",description:"Giveth is re-engineering charitable giving, by creating entirely free, open-source platforms, built on the Ethereum Blockchain. Giveth TRACE cuts out bureaucracy and enables makers to create a high level of transparency and accountability for Givers. The basic donation hierarchy of Communities, Campaigns and Traces allows for users to specify the scope of their donation. There are multiple reviewer roles and security check points that allow Givers and Makers to use our DApp with confidence. You can read more about the basic components and the logic behind our DApp (Donation Application) in this post.",source:"@site/dapps/introTrace.md",sourceDirName:".",slug:"/dapps/introTrace",permalink:"/dapps/introTrace",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/introTrace.md",tags:[],version:"current",lastUpdatedBy:"Mitch Oz",lastUpdatedAt:1667254190,formattedLastUpdatedAt:"Oct 31, 2022",frontMatter:{id:"introTrace",title:"Intro to Giveth TRACE",slug:"dapps/introTrace"},sidebar:"dapps",previous:{title:"Troubleshooting",permalink:"/dapps/troubleshooting"},next:{title:"Giveth Entities and Roles",permalink:"/dapps/entitiesAndRoles"}},l={},h=[{value:"Current Status",id:"current-status",level:2},{value:"A Tale of Two Networks",id:"a-tale-of-two-networks",level:3},{value:"Development",id:"development",level:3}],u={toc:h};function d(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)(i.ZP,{mdxType:"TraceDeprecated"}),(0,o.kt)("p",null,"Giveth is re-engineering charitable giving, by creating entirely free, open-source platforms, built on the Ethereum Blockchain. Giveth TRACE cuts out bureaucracy and enables makers to create a high level of transparency and accountability for Givers. The basic donation hierarchy of Communities, Campaigns and Traces allows for users to specify the scope of their donation. There are multiple reviewer roles and security check points that allow Givers and Makers to use our DApp with confidence. You can read more about the basic components and the ",(0,o.kt)("strong",{parentName:"p"},"logic behind our DApp (Donation Application) in this ",(0,o.kt)("a",{parentName:"strong",href:"https://medium.com/giveth/what-is-the-future-of-giving-d50446b0a0e4"},"post."))),(0,o.kt)("img",{alt:"Giveth TRACE home page",src:(0,a.Z)("img/content/trace/tracefrontpage.png")}),(0,o.kt)("h2",{id:"current-status"},"Current Status"),(0,o.kt)("p",null,"The ",(0,o.kt)("a",{parentName:"p",href:"https://trace.giveth.io"},"Giveth TRACE DApp")," is on the Ethereum mainnet, bridged to Rinkeby testnet. We are in active development on the DApp and aiming for a post-beta release in the coming months. The best way to reach out to our team is via ",(0,o.kt)("a",{parentName:"p",href:"https://discord.gg/GMQFKmdSGy"},"Discord"),", feel free to drop in and say hello!"),(0,o.kt)("p",null,"New Projects are currently being added onto Giveth TRACE by a case-by-case vetting process. If you have a simple project looking for funding try out ",(0,o.kt)("a",{parentName:"p",href:"https://giveth.io"},"Giveth.io"),". If you have a community, cause or project that is more complex, and perhaps requiring greater transparency and traceability, then get in touch with us on ",(0,o.kt)("a",{parentName:"p",href:"https://discord.gg/qf7XZ48gCU"},"Discord"),"."),(0,o.kt)("p",null,"Check out the amazing projects onboarded onto our ",(0,o.kt)("a",{parentName:"p",href:"https://beta.giveth.io"},"DApp"),", and register as a user by completing a profile. You can support the development of our Dapp by giving to a Community or Campaign, or funding specific Traces directly and see exactly how your donation creates positive change in the world."),(0,o.kt)("h3",{id:"a-tale-of-two-networks"},"A Tale of Two Networks"),(0,o.kt)("p",null,"It's been a quest getting to mainnet efficiency, challenged by ",(0,o.kt)("strong",{parentName:"p"},"scalability issues")," that were too prohibitive for real use. In 2017, we found a smooth solution with a bridge between Ethereum mainnet and Rinkeby testnet."),(0,o.kt)("img",{alt:"Selecting the Rinkeby Network",src:(0,a.Z)("img/content/trace/rinkebyselect.png"),class:"leftfloat"}),(0,o.kt)("p",null,"In order to interface with the Giveth application you'll have to ",(0,o.kt)("a",{parentName:"p",href:"https://metamask.zendesk.com/hc/en-us/articles/360015489531-Getting-Started-With-MetaMask"},"download and install MetaMask")," on your favourite web browser. The Ethereum address used for your MetaMask sign-in will be how we identify your personal profile on the DApp."),(0,o.kt)("p",null,"This ground-breaking innovation (of its time) allows Giveth and the user to perform smart contract interactions for free, spending only gas on Rinkeby testnet, while still tracking everything on a blockchain. For most tasks on Giveth TRACE you'll want to make sure you're connected to the ",(0,o.kt)("strong",{parentName:"p"},"Rinkeby")," test network."),(0,o.kt)("p",null,"When you're sending real funds to any entity on Giveth TRACE, you do it with the Ethereum mainnet. Conversely, when you claim funds that have been delegated to a completed Trace you are the recipient of, ",(0,o.kt)("strong",{parentName:"p"},"Giveth pays the gas")," to bridge your transaction to the mainnet and send the funds to you."),(0,o.kt)("p",null,"To learn more about the Giveth bridge, head over to the documentation ",(0,o.kt)("a",{parentName:"p",href:"https://docs.giveth.io/dapps/bridgeSecurity"},"here"),". There is also a ",(0,o.kt)("a",{parentName:"p",href:"https://medium.com/giveth/tackling-ethereum-scalability-issues-29bd700b5060"},"wonderful Medium article")," from 2017, that identifies the major scalability issues of that era in crypto and how we found a solution."),(0,o.kt)("h3",{id:"development"},"Development"),(0,o.kt)("p",null,"You can follow the development on ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/Giveth/giveth-dapp"},"Github"),", read more in this documentation (add internal link) or join our contributors channel in ",(0,o.kt)("a",{parentName:"p",href:"https://discord.gg/qf7XZ48gCU"},"Discord"),". Our meetings are on the ",(0,o.kt)("a",{parentName:"p",href:"https://calendar.google.com/calendar/embed?src=givethdotio@gmail.com&pli=1"},"Giveth calendar"),", and you are welcome to join!"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/beea71df.c4dfabd0.js b/assets/js/beea71df.c4dfabd0.js deleted file mode 100644 index 1f7c0f0159..0000000000 --- a/assets/js/beea71df.c4dfabd0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[33],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>d});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),p=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},l=function(e){var t=p(e.components);return n.createElement(c.Provider,{value:t},e.children)},h={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),u=p(r),d=a,m=u["".concat(c,".").concat(d)]||u[d]||h[d]||o;return r?n.createElement(m,i(i({ref:t},l),{},{components:r})):n.createElement(m,i({ref:t},l))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=u;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:a,i[1]=s;for(var p=2;p{r.d(t,{ZP:()=>i});var n=r(7462),a=(r(7294),r(3905));const o={toc:[]};function i(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},o,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,(0,a.kt)("em",{parentName:"p"},(0,a.kt)("strong",{parentName:"em"},"Giveth TRACE has officially been deprecated. After 5 years of faithful service, Giveth and its platform, services and products have fully migrated to ",(0,a.kt)("a",{parentName:"strong",href:"https://giveth.io"},"Giveth.io"),". With the deprecation of the Rinkeby network and low user activity, the Giveth DAO decided to sunset its original dApp in Q3 of 2022. The code has and will forever be open-source, and you can find it in ",(0,a.kt)("a",{parentName:"strong",href:"https://github.com/Giveth"},"Giveth's Github repositories"),"."))),(0,a.kt)("p",null,(0,a.kt)("em",{parentName:"p"},(0,a.kt)("strong",{parentName:"em"},"This documentation will remain available for historical reference."))),(0,a.kt)("hr",null))}i.isMDXComponent=!0},1138:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>d,frontMatter:()=>s,metadata:()=>p,toc:()=>h});var n=r(7462),a=(r(7294),r(3905)),o=r(4996),i=r(8932);const s={id:"introTrace",title:"Intro to Giveth TRACE",slug:"dapps/introTrace"},c=void 0,p={unversionedId:"introTrace",id:"introTrace",title:"Intro to Giveth TRACE",description:"Giveth is re-engineering charitable giving, by creating entirely free, open-source platforms, built on the Ethereum Blockchain. Giveth TRACE cuts out bureaucracy and enables makers to create a high level of transparency and accountability for Givers. The basic donation hierarchy of Communities, Campaigns and Traces allows for users to specify the scope of their donation. There are multiple reviewer roles and security check points that allow Givers and Makers to use our DApp with confidence. You can read more about the basic components and the logic behind our DApp (Donation Application) in this post.",source:"@site/dapps/introTrace.md",sourceDirName:".",slug:"/dapps/introTrace",permalink:"/dapps/introTrace",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/introTrace.md",tags:[],version:"current",lastUpdatedBy:"Mitch Oz",lastUpdatedAt:1667254190,formattedLastUpdatedAt:"Oct 31, 2022",frontMatter:{id:"introTrace",title:"Intro to Giveth TRACE",slug:"dapps/introTrace"},sidebar:"dapps",previous:{title:"Regen Farm Smart Contract Guide",permalink:"/dapps/regenFarmContracts"},next:{title:"Giveth Entities and Roles",permalink:"/dapps/entitiesAndRoles"}},l={},h=[{value:"Current Status",id:"current-status",level:2},{value:"A Tale of Two Networks",id:"a-tale-of-two-networks",level:3},{value:"Development",id:"development",level:3}],u={toc:h};function d(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)(i.ZP,{mdxType:"TraceDeprecated"}),(0,a.kt)("p",null,"Giveth is re-engineering charitable giving, by creating entirely free, open-source platforms, built on the Ethereum Blockchain. Giveth TRACE cuts out bureaucracy and enables makers to create a high level of transparency and accountability for Givers. The basic donation hierarchy of Communities, Campaigns and Traces allows for users to specify the scope of their donation. There are multiple reviewer roles and security check points that allow Givers and Makers to use our DApp with confidence. You can read more about the basic components and the ",(0,a.kt)("strong",{parentName:"p"},"logic behind our DApp (Donation Application) in this ",(0,a.kt)("a",{parentName:"strong",href:"https://medium.com/giveth/what-is-the-future-of-giving-d50446b0a0e4"},"post."))),(0,a.kt)("img",{alt:"Giveth TRACE home page",src:(0,o.Z)("img/content/trace/tracefrontpage.png")}),(0,a.kt)("h2",{id:"current-status"},"Current Status"),(0,a.kt)("p",null,"The ",(0,a.kt)("a",{parentName:"p",href:"https://trace.giveth.io"},"Giveth TRACE DApp")," is on the Ethereum mainnet, bridged to Rinkeby testnet. We are in active development on the DApp and aiming for a post-beta release in the coming months. The best way to reach out to our team is via ",(0,a.kt)("a",{parentName:"p",href:"https://discord.gg/GMQFKmdSGy"},"Discord"),", feel free to drop in and say hello!"),(0,a.kt)("p",null,"New Projects are currently being added onto Giveth TRACE by a case-by-case vetting process. If you have a simple project looking for funding try out ",(0,a.kt)("a",{parentName:"p",href:"https://giveth.io"},"Giveth.io"),". If you have a community, cause or project that is more complex, and perhaps requiring greater transparency and traceability, then get in touch with us on ",(0,a.kt)("a",{parentName:"p",href:"https://discord.gg/qf7XZ48gCU"},"Discord"),"."),(0,a.kt)("p",null,"Check out the amazing projects onboarded onto our ",(0,a.kt)("a",{parentName:"p",href:"https://beta.giveth.io"},"DApp"),", and register as a user by completing a profile. You can support the development of our Dapp by giving to a Community or Campaign, or funding specific Traces directly and see exactly how your donation creates positive change in the world."),(0,a.kt)("h3",{id:"a-tale-of-two-networks"},"A Tale of Two Networks"),(0,a.kt)("p",null,"It's been a quest getting to mainnet efficiency, challenged by ",(0,a.kt)("strong",{parentName:"p"},"scalability issues")," that were too prohibitive for real use. In 2017, we found a smooth solution with a bridge between Ethereum mainnet and Rinkeby testnet."),(0,a.kt)("img",{alt:"Selecting the Rinkeby Network",src:(0,o.Z)("img/content/trace/rinkebyselect.png"),class:"leftfloat"}),(0,a.kt)("p",null,"In order to interface with the Giveth application you'll have to ",(0,a.kt)("a",{parentName:"p",href:"https://metamask.zendesk.com/hc/en-us/articles/360015489531-Getting-Started-With-MetaMask"},"download and install MetaMask")," on your favourite web browser. The Ethereum address used for your MetaMask sign-in will be how we identify your personal profile on the DApp."),(0,a.kt)("p",null,"This ground-breaking innovation (of its time) allows Giveth and the user to perform smart contract interactions for free, spending only gas on Rinkeby testnet, while still tracking everything on a blockchain. For most tasks on Giveth TRACE you'll want to make sure you're connected to the ",(0,a.kt)("strong",{parentName:"p"},"Rinkeby")," test network."),(0,a.kt)("p",null,"When you're sending real funds to any entity on Giveth TRACE, you do it with the Ethereum mainnet. Conversely, when you claim funds that have been delegated to a completed Trace you are the recipient of, ",(0,a.kt)("strong",{parentName:"p"},"Giveth pays the gas")," to bridge your transaction to the mainnet and send the funds to you."),(0,a.kt)("p",null,"To learn more about the Giveth bridge, head over to the documentation ",(0,a.kt)("a",{parentName:"p",href:"https://docs.giveth.io/dapps/bridgeSecurity"},"here"),". There is also a ",(0,a.kt)("a",{parentName:"p",href:"https://medium.com/giveth/tackling-ethereum-scalability-issues-29bd700b5060"},"wonderful Medium article")," from 2017, that identifies the major scalability issues of that era in crypto and how we found a solution."),(0,a.kt)("h3",{id:"development"},"Development"),(0,a.kt)("p",null,"You can follow the development on ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/Giveth/giveth-dapp"},"Github"),", read more in this documentation (add internal link) or join our contributors channel in ",(0,a.kt)("a",{parentName:"p",href:"https://discord.gg/qf7XZ48gCU"},"Discord"),". Our meetings are on the ",(0,a.kt)("a",{parentName:"p",href:"https://calendar.google.com/calendar/embed?src=givethdotio@gmail.com&pli=1"},"Giveth calendar"),", and you are welcome to join!"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d38a5531.6e04b6dc.js b/assets/js/d38a5531.0dd995a8.js similarity index 50% rename from assets/js/d38a5531.6e04b6dc.js rename to assets/js/d38a5531.0dd995a8.js index 469490a42a..77a7570892 100644 --- a/assets/js/d38a5531.6e04b6dc.js +++ b/assets/js/d38a5531.0dd995a8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[3127],{3905:(e,t,o)=>{o.d(t,{Zo:()=>u,kt:()=>d});var r=o(7294);function n(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function i(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,r)}return o}function a(e){for(var t=1;t=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}var l=r.createContext({}),c=function(e){var t=r.useContext(l),o=t;return e&&(o="function"==typeof e?e(t):a(a({},t),e)),o},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var o=e.components,n=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),h=c(o),d=n,g=h["".concat(l,".").concat(d)]||h[d]||p[d]||i;return o?r.createElement(g,a(a({ref:t},u),{},{components:o})):r.createElement(g,a({ref:t},u))}));function d(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=o.length,a=new Array(i);a[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:n,a[1]=s;for(var c=2;c{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>u});var r=o(7462),n=(o(7294),o(3905)),i=o(4996);const a={id:"troubleshooting",title:"Troubleshooting",slug:"dapps/troubleshooting"},s=void 0,l={unversionedId:"troubleshooting",id:"troubleshooting",title:"Troubleshooting",description:"",source:"@site/dapps/guide3-troubleshooting.md",sourceDirName:".",slug:"/dapps/troubleshooting",permalink:"/dapps/troubleshooting",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/guide3-troubleshooting.md",tags:[],version:"current",lastUpdatedBy:"Suga",lastUpdatedAt:1643964517,formattedLastUpdatedAt:"Feb 4, 2022",frontMatter:{id:"troubleshooting",title:"Troubleshooting",slug:"dapps/troubleshooting"},sidebar:"dapps",previous:{title:"Responsible Disclosure",permalink:"/security/responsible-disclosure"},next:{title:"Contributing to Giveth Development",permalink:"/dapps/contributors"}},c={},u=[{value:"Brave Browser",id:"brave-browser",level:2},{value:"Giveth.io shows a blank screen! Help!",id:"givethio-shows-a-blank-screen-help",level:3}],p={toc:u};function h(e){let{components:t,...o}=e;return(0,n.kt)("wrapper",(0,r.Z)({},p,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"If you are having technical problems with the Giveth DApp, you may find a solution on this page."),(0,n.kt)("h2",{id:"brave-browser"},"Brave Browser"),(0,n.kt)("p",null,"If you try to sign into the Giveth DApp with Brave browser, Torus (the wallet provider) notifies you that it needs cookies to operate. (Torus needs these permissions for their OAuth services, so our users can be provided easily with their own Ethereum wallet that is tied i.e. their Google account.)"),(0,n.kt)("p",null,"To quickly solve this problem you can:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"click on the site settings (Brave icon)"),(0,n.kt)("li",{parentName:"ul"},'change the cookie setting just for Giveth.io to "all cookies allowed"')),(0,n.kt)("img",{alt:"Enable Cookies in Brave",src:(0,i.Z)("img/content/screenshot-brave-cookies.png")}),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://support.brave.com/hc/en-us/articles/360050634931-How-Do-I-Manage-Cookies-In-Brave-"},"Read more about handling cookies in Brave.")),(0,n.kt)("h3",{id:"givethio-shows-a-blank-screen-help"},"Giveth.io shows a blank screen! Help!"),(0,n.kt)("p",null,"Sometimes updates get pushed to the Giveth.io website, and your cached files and cookies don't always get along well with the new updates on the site, so you'll need to clear your cache, delete your cookies, then refresh the browser."),(0,n.kt)("p",null,"To clear your cache and cookies on Brave, navigate to: ",(0,n.kt)("inlineCode",{parentName:"p"},"Settings -> Additional Settings -> Privacy and Securiy -> Clear Browsing Data ")," Once you're arrived there, check off ",(0,n.kt)("inlineCode",{parentName:"p"},"Cookies")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"Cached images and files"),", and make sure at the top of the pop-up window you check off the appropriate Time Range. You can select ",(0,n.kt)("inlineCode",{parentName:"p"},"All Time")," just to be sure you got 'em all."),(0,n.kt)("p",null,"Clearing your cookies will log you out of most sites. If you don't want to go through the hassle of logging back in to all the websites you frequent, then head to: ",(0,n.kt)("inlineCode",{parentName:"p"},"Privacy and Security -> Cookies and othersite data -> See all site cookies and other data")," Then from this menu look up the Giveth domain like so:"),(0,n.kt)("img",{alt:"Deleting Cookies in Brave",src:(0,i.Z)("img/content/givethcookies.png")}),(0,n.kt)("p",null,"Then click the trash icon to delete the cookie for Giveth. If that's finished, pull up a fresh Brave browser window, head back to Giveth, and get back to giving!"))}h.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[3127],{3905:(e,t,o)=>{o.d(t,{Zo:()=>u,kt:()=>d});var r=o(7294);function n(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function i(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,r)}return o}function a(e){for(var t=1;t=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}var l=r.createContext({}),c=function(e){var t=r.useContext(l),o=t;return e&&(o="function"==typeof e?e(t):a(a({},t),e)),o},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var o=e.components,n=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),h=c(o),d=n,g=h["".concat(l,".").concat(d)]||h[d]||p[d]||i;return o?r.createElement(g,a(a({ref:t},u),{},{components:o})):r.createElement(g,a({ref:t},u))}));function d(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=o.length,a=new Array(i);a[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:n,a[1]=s;for(var c=2;c{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>u});var r=o(7462),n=(o(7294),o(3905)),i=o(4996);const a={id:"troubleshooting",title:"Troubleshooting",slug:"dapps/troubleshooting"},s=void 0,l={unversionedId:"troubleshooting",id:"troubleshooting",title:"Troubleshooting",description:"",source:"@site/dapps/guide3-troubleshooting.md",sourceDirName:".",slug:"/dapps/troubleshooting",permalink:"/dapps/troubleshooting",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/guide3-troubleshooting.md",tags:[],version:"current",lastUpdatedBy:"Suga",lastUpdatedAt:1643964517,formattedLastUpdatedAt:"Feb 4, 2022",frontMatter:{id:"troubleshooting",title:"Troubleshooting",slug:"dapps/troubleshooting"},sidebar:"dapps",previous:{title:"Responsible Disclosure",permalink:"/security/responsible-disclosure"},next:{title:"Intro to Giveth TRACE",permalink:"/dapps/introTrace"}},c={},u=[{value:"Brave Browser",id:"brave-browser",level:2},{value:"Giveth.io shows a blank screen! Help!",id:"givethio-shows-a-blank-screen-help",level:3}],p={toc:u};function h(e){let{components:t,...o}=e;return(0,n.kt)("wrapper",(0,r.Z)({},p,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"If you are having technical problems with the Giveth DApp, you may find a solution on this page."),(0,n.kt)("h2",{id:"brave-browser"},"Brave Browser"),(0,n.kt)("p",null,"If you try to sign into the Giveth DApp with Brave browser, Torus (the wallet provider) notifies you that it needs cookies to operate. (Torus needs these permissions for their OAuth services, so our users can be provided easily with their own Ethereum wallet that is tied i.e. their Google account.)"),(0,n.kt)("p",null,"To quickly solve this problem you can:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"click on the site settings (Brave icon)"),(0,n.kt)("li",{parentName:"ul"},'change the cookie setting just for Giveth.io to "all cookies allowed"')),(0,n.kt)("img",{alt:"Enable Cookies in Brave",src:(0,i.Z)("img/content/screenshot-brave-cookies.png")}),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://support.brave.com/hc/en-us/articles/360050634931-How-Do-I-Manage-Cookies-In-Brave-"},"Read more about handling cookies in Brave.")),(0,n.kt)("h3",{id:"givethio-shows-a-blank-screen-help"},"Giveth.io shows a blank screen! Help!"),(0,n.kt)("p",null,"Sometimes updates get pushed to the Giveth.io website, and your cached files and cookies don't always get along well with the new updates on the site, so you'll need to clear your cache, delete your cookies, then refresh the browser."),(0,n.kt)("p",null,"To clear your cache and cookies on Brave, navigate to: ",(0,n.kt)("inlineCode",{parentName:"p"},"Settings -> Additional Settings -> Privacy and Securiy -> Clear Browsing Data ")," Once you're arrived there, check off ",(0,n.kt)("inlineCode",{parentName:"p"},"Cookies")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"Cached images and files"),", and make sure at the top of the pop-up window you check off the appropriate Time Range. You can select ",(0,n.kt)("inlineCode",{parentName:"p"},"All Time")," just to be sure you got 'em all."),(0,n.kt)("p",null,"Clearing your cookies will log you out of most sites. If you don't want to go through the hassle of logging back in to all the websites you frequent, then head to: ",(0,n.kt)("inlineCode",{parentName:"p"},"Privacy and Security -> Cookies and othersite data -> See all site cookies and other data")," Then from this menu look up the Giveth domain like so:"),(0,n.kt)("img",{alt:"Deleting Cookies in Brave",src:(0,i.Z)("img/content/givethcookies.png")}),(0,n.kt)("p",null,"Then click the trash icon to delete the cookie for Giveth. If that's finished, pull up a fresh Brave browser window, head back to Giveth, and get back to giving!"))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d62b591d.70df63e9.js b/assets/js/d62b591d.70df63e9.js new file mode 100644 index 0000000000..f8eb5ad325 --- /dev/null +++ b/assets/js/d62b591d.70df63e9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[6702],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var a=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=p(n),m=i,c=h["".concat(s,".").concat(m)]||h[m]||d[m]||o;return n?a.createElement(c,r(r({ref:t},u),{},{components:n})):a.createElement(c,r({ref:t},u))}));function m(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,r=new Array(o);r[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:i,r[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>u});var a=n(7462),i=(n(7294),n(3905)),o=n(4996);const r={id:"contributors",title:"Contributing to Giveth Development",slug:"dapps/contributors"},l=void 0,s={unversionedId:"contributors",id:"contributors",title:"Contributing to Giveth Development",description:"Giveth currently maintains three products that focus on funding management, peer to peer donations, and DeFi for-good token economics. These are Giveth TRACE, Giveth.io and the GIVeconomy respectively",source:"@site/dapps/doc1a-contributors.md",sourceDirName:".",slug:"/dapps/contributors",permalink:"/dapps/contributors",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/doc1a-contributors.md",tags:[],version:"current",lastUpdatedBy:"mitch",lastUpdatedAt:1649688459,formattedLastUpdatedAt:"Apr 11, 2022",frontMatter:{id:"contributors",title:"Contributing to Giveth Development",slug:"dapps/contributors"}},p={},u=[{value:"Github Management",id:"github-management",level:2},{value:"Repositories",id:"repositories",level:3},{value:"Pipelines on the All-Devs Workspace",id:"pipelines-on-the-all-devs-workspace",level:3},{value:"Creating Issues",id:"creating-issues",level:3},{value:"Ceremonies",id:"ceremonies",level:2},{value:"Sprint Management",id:"sprint-management",level:2},{value:"What is Scrum?",id:"what-is-scrum",level:3},{value:"Key Contacts",id:"key-contacts",level:2},{value:"Installation Guides for Local Development",id:"installation-guides-for-local-development",level:2},{value:"Testing Guidelines",id:"testing-guidelines",level:2},{value:"Tools we Use",id:"tools-we-use",level:2}],d={toc:u};function h(e){let{components:t,...n}=e;return(0,i.kt)("wrapper",(0,a.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Giveth currently maintains three products that focus on funding management, peer to peer donations, and DeFi for-good token economics. These are ",(0,i.kt)("a",{parentName:"p",href:"https://trace.giveth.io"},"Giveth TRACE"),", ",(0,i.kt)("a",{parentName:"p",href:"https://giveth.io"},"Giveth.io")," and the ",(0,i.kt)("a",{parentName:"p",href:"https://giveth.io"},"GIVeconomy")," respectively"),(0,i.kt)("p",null,"All our products share some common development standards that are paramount to learn before engaging in any development for Giveth. In this document we'll show you how to interact with our open-source repositories, getting in touch with the right people and how to begin creating and picking up issues."),(0,i.kt)("h2",{id:"github-management"},"Github Management"),(0,i.kt)("p",null,"First things first, you'll need to install the ",(0,i.kt)("a",{parentName:"p",href:"https://chrome.google.com/webstore/detail/zenhub-for-github/ogcgkffhplmphkaahpmffcafajaocjbd"},"zenhub extension for github")," for your web browser that will allow you to see the workspaces and pipelines we use in Github to manage issues."),(0,i.kt)("img",{alt:"All-Devs Zenhub Board",width:"85%",height:"auto",src:(0,o.Z)("img/content/allDevsZenhub.png")}),(0,i.kt)("p",null,"We have transitioned to manage all three DApps(products) under one workspace, ",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("inlineCode",{parentName:"strong"},"All-Devs")),"."),(0,i.kt)("h3",{id:"repositories"},"Repositories"),(0,i.kt)("p",null,"The ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/Giveth"},"Giveth Github organization")," has many, many repositories. Here\u2019s a general overview of relevant repositories that relate to our active products:"),(0,i.kt)("table",null,(0,i.kt)("tr",null,(0,i.kt)("td",null,(0,i.kt)("h3",null,"Product")),(0,i.kt)("td",null,(0,i.kt)("h3",null,"Repository")),(0,i.kt)("td",null,(0,i.kt)("h3",null,"Description"))),(0,i.kt)("tr",null,(0,i.kt)("td",null,"Giveth.io"),(0,i.kt)("td",null,"impact-graph"),(0,i.kt)("td",null,"Backend of Giveth.io")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"Giveth.io"),(0,i.kt)("td",null,"giveth-next"),(0,i.kt)("td",null,"Giveth.io current version")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"Giveth.io"),(0,i.kt)("td",null,"giveth-io-typescript"),(0,i.kt)("td",null,"Givethio typescript version with new design.")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"GIVEeconomy"),(0,i.kt)("td",null,"GIVeconomy"),(0,i.kt)("td",null,"Usually used for planning and issue tracking")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"GIVeconomy"),(0,i.kt)("td",null,"giv-token-contracts"),(0,i.kt)("td",null,"Smart contract implementations")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"GIVeconomy"),(0,i.kt)("td",null,"liquidity-mining-dapp"),(0,i.kt)("td",null,"GIVeconomy Frontend UI")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"GIVeconomy"),(0,i.kt)("td",null,"giv-token-subgraph"),(0,i.kt)("td",null,"Calculating $GIV data for GIVeconomy Frontend")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"GIVeconomy"),(0,i.kt)("td",null,"givback-calculation"),(0,i.kt)("td",null,"Calculating GIVbacks")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"TRACE"),(0,i.kt)("td",null,"giveth-dapp"),(0,i.kt)("td",null,"Frontend and planning of giveth TRACE")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"TRACE"),(0,i.kt)("td",null,"feathers-giveth"),(0,i.kt)("td",null,"Backend of Giveth TRACE")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"TRACE"),(0,i.kt)("td",null,"dapp-mailer"),(0,i.kt)("td",null,"Email notification system for TRACE")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"TRACE"),(0,i.kt)("td",null,"giveth-bridge"),(0,i.kt)("td",null,"Giveth Rinkeby - Mainnet Bridge system")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"General Services"),(0,i.kt)("td",null,"ui-design-system"),(0,i.kt)("td",null,"npm package for Giveth design assets"))),(0,i.kt)("h3",{id:"pipelines-on-the-all-devs-workspace"},"Pipelines on the ",(0,i.kt)("inlineCode",{parentName:"h3"},"All-Devs")," Workspace"),(0,i.kt)("p",null,"When you enter a workspace on the Zenhub tab you'll see a line of adjacent columns that are used to identify and manage the statuses of issues currently in the repositories. You can find a short description of each below:"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"New Issues")," - New bugs and features go here first."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Epics")," - Pipeline for Epic Issues. Larger tasks comprised of several smaller issues."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Icebox")," - Features or Suggestions that have been archived. Issues here are non-priority and might be added into sprints only if Devs have the bandwidth."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Backlog")," - Lower Priority Issues waiting to get pulled into Sprint Planning."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Sprint Backlog")," - These issues have been vetted and are ready to be worked on. They will be added into the next sprint according to priority and Developer bandwidth."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"In Progress")," - Picked up and being worked on by the Developers, usually on local builds."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Code Reviews")," - Open Pull Requests waiting for review and eventual merge into the staging server."),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"It\u2019s mandatory to have the code reviewed by one of the core team members, usually your mentor or the one which introduces the project to you can review it, pls ask for review before pushing it to any environment.")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"UAT Testing/QA")," - The feature or bug fix is deployed on the staging server for user testing and Quality Assurance."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Done")," - Bug fix or feature has been completed, and is ready to be deployed on the live server."),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"All issues should meet DoD (Definition of Done) criteria to be approved as Done and being in this column:\nSuccess Criteria passed (if it\u2019s get mentioned in User Story / Task or related issue)\nDeployed in Staging\nUAT Tested by a tester or PM\nDocumented")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Closed")," - The bug fix or feature has been copied live. It\u2019s recommended that all closed issues get related to a release number in the zenhub and get closed right after the version goes live."),(0,i.kt)("h3",{id:"creating-issues"},"Creating Issues"),(0,i.kt)("p",null,"Creating Github issues is essential to ensure bug fixes or features are tracked properly and relevant information can be organized, and consolidated. The new issue template is a guide only, feel free to delete any heading that you don't use."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Labels")," will help add context to your issue, please use them so other developers can get a better understanding of issues at a glance and pick them up. Some commonly used labels in ",(0,i.kt)("inlineCode",{parentName:"p"},"All-Devs")," are:"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("inlineCode",{parentName:"strong"},"fast follow"))," - Priority features or improvements following a product launch or version release."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("inlineCode",{parentName:"strong"},"documentation"))," - Requesting creation or updates of technical documentation."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("inlineCode",{parentName:"strong"},"bugs"))," - Functionality or feature of a product that is broken or not working as intended"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("inlineCode",{parentName:"strong"},"feature request"))," - Requesting for a new feature or functionality to be added to a product"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("inlineCode",{parentName:"strong"},"design needed"))," - Requesting support from the design team to create assets relevant to this issue"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("inlineCode",{parentName:"strong"},"question"))," - There is a pending question inside this issue that needs a response in order to move forward"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("inlineCode",{parentName:"strong"},"security"))," - Security issue or improvement"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("inlineCode",{parentName:"strong"},"UI"))," - This issue relates to the User Interface of a given product"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("inlineCode",{parentName:"strong"},"UX"))," - This issue relates to the User Experience of a given product"),(0,i.kt)("h2",{id:"ceremonies"},"Ceremonies"),(0,i.kt)("p",null,"We host in the ",(0,i.kt)("a",{parentName:"p",href:"https://discord.giveth.io"},"Giveth Discord")," many Developer meetings throughout the week including:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Daily Dev Standups from Tuesday to Thursday at 6:30am GMT-6 "),(0,i.kt)("li",{parentName:"ul"},"All-Devs Sync weekly on Mondays at 10:00am GMT-6"),(0,i.kt)("li",{parentName:"ul"},"GIVeconomy Sync weekly on Wednesdays at 8:00am GMT-6")),(0,i.kt)("p",null,"These meetings are important places to stay up to date with DApp development and to integrate with the Giveth Team as a Development Contributor."),(0,i.kt)("h2",{id:"sprint-management"},"Sprint Management"),(0,i.kt)("p",null,"Framework: We\u2019re practicing mostly Scrum, in biweekly iterations (called sprints), sometimes based on project situations we move to KanBan."),(0,i.kt)("h3",{id:"what-is-scrum"},"What is Scrum?"),(0,i.kt)("p",null,"In scrum, the sprint is a set period of time where all the work is done. However, before you can leap into action you have to set up the sprint. You need to decide on how long the time box is going to be, the sprint goal, and where you're going to start. The sprint planning session kicks off the sprint by setting the agenda and focus."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"The What")," \u2013 The product owner describes the objective(or goal) of the sprint and what backlog items contribute to that goal. The scrum team decides what can be done in the coming sprint and what they will do during the sprint to make that happen.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"The How")," \u2013 The development team plans the work necessary to deliver the sprint goal. Ultimately, the resulting sprint plan is a negotiation between the development team and product owner based on value and effort.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"The Who")," \u2013 You cannot do sprint planning without the product owner or the development team. The product owner defines the goal based on the value that they seek. The development team needs to understand how they can or cannot deliver that goal. If either is missing from this event it makes planning the sprint almost impossible.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"The Inputs")," \u2013 A great starting point for the sprint plan is the product backlog as it provides a list of \u2018stuff\u2019 that could potentially be part of the current sprint. The team should also look at the existing work done in the increment and have a view to capacity.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"The Outputs")," \u2013 The most important outcome for the sprint planning meeting is that the team can describe the goal of the sprint and how it will start working toward that goal. This is made visible in the sprint backlog."))),(0,i.kt)("img",{alt:"sprint planning",width:"75%",src:(0,o.Z)("img/content/sprintInfo.png")}),(0,i.kt)("p",null,"Before the iteration starts, you may need to have your expected total contribution hours in ",(0,i.kt)("a",{parentName:"p",href:"https://docs.google.com/spreadsheets/d/1fJcFTLJof6o0rViKIy4C46sXuisySTud40HFsMGE1e0/edit#gid=311929329"},"Giveth Resource Planning Spreadsheet"),", the link usually gets shared in the Discord dev channel before the sprint meeting. You can find the sprint sheet and update the following cells:"),(0,i.kt)("img",{alt:"resource planning spreadsheet",src:(0,o.Z)("img/content/resourcePlanningAllDevs.png")}),(0,i.kt)("p",null,"It helps the Product Managers (PMs) to plan for the resources better and know if they are able to meet the milestone in each sprint or not. If you couldn\u2019t find time to fill out the spreadsheet, you may be asked to do so during the meeting or whenever you can have an estimate, just DM it to PMs or put it in the dev channel."),(0,i.kt)("p",null,"The usual sprint planning goes like this:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"PMs bring the issues (Preferably User Stories to the planning meeting, describe it and make sure it\u2019s clear for the team to start implementing."),(0,i.kt)("li",{parentName:"ol"},"PM facilitates talks between devs to make it as clear as it can be."),(0,i.kt)("li",{parentName:"ol"},"PM asks for estimations in Story Points (Story Points are the unit of minimum effort spent on a product which can be delivered asap, like a simple bug fix, for example, could take half of a working day. )"),(0,i.kt)("li",{parentName:"ol"},"PM starts building \u201cSprint Backlog\u201d with prioritizing the issues and makes sure the total amount of Story Points are proportionate with the total capacity of the teams and contributors."),(0,i.kt)("li",{parentName:"ol"},"Everyone agrees on the sprint plan and commits to the expected goal.")),(0,i.kt)("h2",{id:"key-contacts"},"Key Contacts"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Development Working Group Steward - Amin",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Discord Handle: ",(0,i.kt)("inlineCode",{parentName:"li"},"Amin#2164")))),(0,i.kt)("li",{parentName:"ul"},"GIVeconomy Product Manager - Lauren",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Discord Handle: ",(0,i.kt)("inlineCode",{parentName:"li"},"karmaticacid#1218")))),(0,i.kt)("li",{parentName:"ul"},"Giveth TRACE, Giveth.io Product Manager - MoeNick",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Discord Handle: ",(0,i.kt)("inlineCode",{parentName:"li"},"MoeNick#1374")))),(0,i.kt)("li",{parentName:"ul"},"Giveth.io Lead Developer - Mateo",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Discord Handle: ",(0,i.kt)("inlineCode",{parentName:"li"},"mateodaza#3156")))),(0,i.kt)("li",{parentName:"ul"},"DevOps & Security - Kay",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Discord Handle: ",(0,i.kt)("inlineCode",{parentName:"li"},"geleeroyale#3228")))),(0,i.kt)("li",{parentName:"ul"},"Lead Designer - Marko",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Discord Handle: ",(0,i.kt)("inlineCode",{parentName:"li"},"markop#2007"))))),(0,i.kt)("h2",{id:"installation-guides-for-local-development"},"Installation Guides for Local Development"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./givethioinstallation"},"Giveth.io")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./TRACEinstallation"},"Giveth TRACE")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./installGIVeconomy"},"GIVeconomy"))),(0,i.kt)("h2",{id:"testing-guidelines"},"Testing Guidelines"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./testing-guidelines"},"Giveth.io")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./testingGIVeconomy"},"GIVeconomy"))),(0,i.kt)("h2",{id:"tools-we-use"},"Tools we Use"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://segment.com/"},"Segment")," (Giveth TRACE, Giveth.io)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://sentry.io/welcome/"},"Sentry")," (Giveth TRACE, Giveth.io)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://infura.io/"},"Infura")," (Giveth TRACE, Giveth.io)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://journeys.autopilotapp.com/features/email-marketing-software"},"Autopilot")," (Giveth.io)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.amplitude.com/"},"Amplitude")," (Giveth TRACE, Giveth.io)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://docusaurus.io/"},"Docusaurus")," (Documentation)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://thegraph.com/en/"},"The Graph")," (GIVeconomy)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.netlify.com/"},"Netlify")," (Giveth TRACE)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://vercel.com/dashboard"},"Vercel")," (Giveth.io, GIVeconomy)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.cryptocompare.com/"},"Cryptocompare")," (Giveth TRACE)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.coingecko.com/en/api"},"Coingecko")," (All Products)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/features/actions"},"Github Actions")," (All Products)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.mongodb.com/"},"MongoDB")," (Giveth TRACE)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.postgresql.org/"},"PostgreSQL")," (Giveth.io)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://redis.io/"},"Redis")," (Giveth TRACE, Giveth.io)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.elastic.co/elasticsearch/"},"Elastic Search")," (Giveth TRACE)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.elastic.co/kibana/"},"Kibana")," (Giveth TRACE)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.pinata.cloud/"},"Pinata")," (Giveth.io, GIVeconomy)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://transak.com/"},"Transak")," (Giveth.io)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://v2.adminbro.com/index.html"},"AdminBro")," (Giveth.io)")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d62b591d.78303c0f.js b/assets/js/d62b591d.78303c0f.js deleted file mode 100644 index 7c871b6d80..0000000000 --- a/assets/js/d62b591d.78303c0f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[6702],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var a=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),h=p(n),m=i,c=h["".concat(s,".").concat(m)]||h[m]||d[m]||o;return n?a.createElement(c,r(r({ref:t},u),{},{components:n})):a.createElement(c,r({ref:t},u))}));function m(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,r=new Array(o);r[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:i,r[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>u});var a=n(7462),i=(n(7294),n(3905)),o=n(4996);const r={id:"contributors",title:"Contributing to Giveth Development",slug:"dapps/contributors"},l=void 0,s={unversionedId:"contributors",id:"contributors",title:"Contributing to Giveth Development",description:"Giveth currently maintains three products that focus on funding management, peer to peer donations, and DeFi for-good token economics. These are Giveth TRACE, Giveth.io and the GIVeconomy respectively",source:"@site/dapps/doc1a-contributors.md",sourceDirName:".",slug:"/dapps/contributors",permalink:"/dapps/contributors",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/doc1a-contributors.md",tags:[],version:"current",lastUpdatedBy:"mitch",lastUpdatedAt:1649688459,formattedLastUpdatedAt:"Apr 11, 2022",frontMatter:{id:"contributors",title:"Contributing to Giveth Development",slug:"dapps/contributors"},sidebar:"dapps",previous:{title:"Troubleshooting",permalink:"/dapps/troubleshooting"},next:{title:"Installing Giveth.io for Local Development",permalink:"/dapps/givethioinstallation"}},p={},u=[{value:"Github Management",id:"github-management",level:2},{value:"Repositories",id:"repositories",level:3},{value:"Pipelines on the All-Devs Workspace",id:"pipelines-on-the-all-devs-workspace",level:3},{value:"Creating Issues",id:"creating-issues",level:3},{value:"Ceremonies",id:"ceremonies",level:2},{value:"Sprint Management",id:"sprint-management",level:2},{value:"What is Scrum?",id:"what-is-scrum",level:3},{value:"Key Contacts",id:"key-contacts",level:2},{value:"Installation Guides for Local Development",id:"installation-guides-for-local-development",level:2},{value:"Testing Guidelines",id:"testing-guidelines",level:2},{value:"Tools we Use",id:"tools-we-use",level:2}],d={toc:u};function h(e){let{components:t,...n}=e;return(0,i.kt)("wrapper",(0,a.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Giveth currently maintains three products that focus on funding management, peer to peer donations, and DeFi for-good token economics. These are ",(0,i.kt)("a",{parentName:"p",href:"https://trace.giveth.io"},"Giveth TRACE"),", ",(0,i.kt)("a",{parentName:"p",href:"https://giveth.io"},"Giveth.io")," and the ",(0,i.kt)("a",{parentName:"p",href:"https://giveth.io"},"GIVeconomy")," respectively"),(0,i.kt)("p",null,"All our products share some common development standards that are paramount to learn before engaging in any development for Giveth. In this document we'll show you how to interact with our open-source repositories, getting in touch with the right people and how to begin creating and picking up issues."),(0,i.kt)("h2",{id:"github-management"},"Github Management"),(0,i.kt)("p",null,"First things first, you'll need to install the ",(0,i.kt)("a",{parentName:"p",href:"https://chrome.google.com/webstore/detail/zenhub-for-github/ogcgkffhplmphkaahpmffcafajaocjbd"},"zenhub extension for github")," for your web browser that will allow you to see the workspaces and pipelines we use in Github to manage issues."),(0,i.kt)("img",{alt:"All-Devs Zenhub Board",width:"85%",height:"auto",src:(0,o.Z)("img/content/allDevsZenhub.png")}),(0,i.kt)("p",null,"We have transitioned to manage all three DApps(products) under one workspace, ",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("inlineCode",{parentName:"strong"},"All-Devs")),"."),(0,i.kt)("h3",{id:"repositories"},"Repositories"),(0,i.kt)("p",null,"The ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/Giveth"},"Giveth Github organization")," has many, many repositories. Here\u2019s a general overview of relevant repositories that relate to our active products:"),(0,i.kt)("table",null,(0,i.kt)("tr",null,(0,i.kt)("td",null,(0,i.kt)("h3",null,"Product")),(0,i.kt)("td",null,(0,i.kt)("h3",null,"Repository")),(0,i.kt)("td",null,(0,i.kt)("h3",null,"Description"))),(0,i.kt)("tr",null,(0,i.kt)("td",null,"Giveth.io"),(0,i.kt)("td",null,"impact-graph"),(0,i.kt)("td",null,"Backend of Giveth.io")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"Giveth.io"),(0,i.kt)("td",null,"giveth-next"),(0,i.kt)("td",null,"Giveth.io current version")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"Giveth.io"),(0,i.kt)("td",null,"giveth-io-typescript"),(0,i.kt)("td",null,"Givethio typescript version with new design.")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"GIVEeconomy"),(0,i.kt)("td",null,"GIVeconomy"),(0,i.kt)("td",null,"Usually used for planning and issue tracking")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"GIVeconomy"),(0,i.kt)("td",null,"giv-token-contracts"),(0,i.kt)("td",null,"Smart contract implementations")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"GIVeconomy"),(0,i.kt)("td",null,"liquidity-mining-dapp"),(0,i.kt)("td",null,"GIVeconomy Frontend UI")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"GIVeconomy"),(0,i.kt)("td",null,"giv-token-subgraph"),(0,i.kt)("td",null,"Calculating $GIV data for GIVeconomy Frontend")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"GIVeconomy"),(0,i.kt)("td",null,"givback-calculation"),(0,i.kt)("td",null,"Calculating GIVbacks")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"TRACE"),(0,i.kt)("td",null,"giveth-dapp"),(0,i.kt)("td",null,"Frontend and planning of giveth TRACE")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"TRACE"),(0,i.kt)("td",null,"feathers-giveth"),(0,i.kt)("td",null,"Backend of Giveth TRACE")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"TRACE"),(0,i.kt)("td",null,"dapp-mailer"),(0,i.kt)("td",null,"Email notification system for TRACE")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"TRACE"),(0,i.kt)("td",null,"giveth-bridge"),(0,i.kt)("td",null,"Giveth Rinkeby - Mainnet Bridge system")),(0,i.kt)("tr",null,(0,i.kt)("td",null,"General Services"),(0,i.kt)("td",null,"ui-design-system"),(0,i.kt)("td",null,"npm package for Giveth design assets"))),(0,i.kt)("h3",{id:"pipelines-on-the-all-devs-workspace"},"Pipelines on the ",(0,i.kt)("inlineCode",{parentName:"h3"},"All-Devs")," Workspace"),(0,i.kt)("p",null,"When you enter a workspace on the Zenhub tab you'll see a line of adjacent columns that are used to identify and manage the statuses of issues currently in the repositories. You can find a short description of each below:"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"New Issues")," - New bugs and features go here first."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Epics")," - Pipeline for Epic Issues. Larger tasks comprised of several smaller issues."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Icebox")," - Features or Suggestions that have been archived. Issues here are non-priority and might be added into sprints only if Devs have the bandwidth."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Backlog")," - Lower Priority Issues waiting to get pulled into Sprint Planning."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Sprint Backlog")," - These issues have been vetted and are ready to be worked on. They will be added into the next sprint according to priority and Developer bandwidth."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"In Progress")," - Picked up and being worked on by the Developers, usually on local builds."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Code Reviews")," - Open Pull Requests waiting for review and eventual merge into the staging server."),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"It\u2019s mandatory to have the code reviewed by one of the core team members, usually your mentor or the one which introduces the project to you can review it, pls ask for review before pushing it to any environment.")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"UAT Testing/QA")," - The feature or bug fix is deployed on the staging server for user testing and Quality Assurance."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Done")," - Bug fix or feature has been completed, and is ready to be deployed on the live server."),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"All issues should meet DoD (Definition of Done) criteria to be approved as Done and being in this column:\nSuccess Criteria passed (if it\u2019s get mentioned in User Story / Task or related issue)\nDeployed in Staging\nUAT Tested by a tester or PM\nDocumented")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Closed")," - The bug fix or feature has been copied live. It\u2019s recommended that all closed issues get related to a release number in the zenhub and get closed right after the version goes live."),(0,i.kt)("h3",{id:"creating-issues"},"Creating Issues"),(0,i.kt)("p",null,"Creating Github issues is essential to ensure bug fixes or features are tracked properly and relevant information can be organized, and consolidated. The new issue template is a guide only, feel free to delete any heading that you don't use."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Labels")," will help add context to your issue, please use them so other developers can get a better understanding of issues at a glance and pick them up. Some commonly used labels in ",(0,i.kt)("inlineCode",{parentName:"p"},"All-Devs")," are:"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("inlineCode",{parentName:"strong"},"fast follow"))," - Priority features or improvements following a product launch or version release."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("inlineCode",{parentName:"strong"},"documentation"))," - Requesting creation or updates of technical documentation."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("inlineCode",{parentName:"strong"},"bugs"))," - Functionality or feature of a product that is broken or not working as intended"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("inlineCode",{parentName:"strong"},"feature request"))," - Requesting for a new feature or functionality to be added to a product"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("inlineCode",{parentName:"strong"},"design needed"))," - Requesting support from the design team to create assets relevant to this issue"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("inlineCode",{parentName:"strong"},"question"))," - There is a pending question inside this issue that needs a response in order to move forward"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("inlineCode",{parentName:"strong"},"security"))," - Security issue or improvement"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("inlineCode",{parentName:"strong"},"UI"))," - This issue relates to the User Interface of a given product"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("inlineCode",{parentName:"strong"},"UX"))," - This issue relates to the User Experience of a given product"),(0,i.kt)("h2",{id:"ceremonies"},"Ceremonies"),(0,i.kt)("p",null,"We host in the ",(0,i.kt)("a",{parentName:"p",href:"https://discord.giveth.io"},"Giveth Discord")," many Developer meetings throughout the week including:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Daily Dev Standups from Tuesday to Thursday at 6:30am GMT-6 "),(0,i.kt)("li",{parentName:"ul"},"All-Devs Sync weekly on Mondays at 10:00am GMT-6"),(0,i.kt)("li",{parentName:"ul"},"GIVeconomy Sync weekly on Wednesdays at 8:00am GMT-6")),(0,i.kt)("p",null,"These meetings are important places to stay up to date with DApp development and to integrate with the Giveth Team as a Development Contributor."),(0,i.kt)("h2",{id:"sprint-management"},"Sprint Management"),(0,i.kt)("p",null,"Framework: We\u2019re practicing mostly Scrum, in biweekly iterations (called sprints), sometimes based on project situations we move to KanBan."),(0,i.kt)("h3",{id:"what-is-scrum"},"What is Scrum?"),(0,i.kt)("p",null,"In scrum, the sprint is a set period of time where all the work is done. However, before you can leap into action you have to set up the sprint. You need to decide on how long the time box is going to be, the sprint goal, and where you're going to start. The sprint planning session kicks off the sprint by setting the agenda and focus."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"The What")," \u2013 The product owner describes the objective(or goal) of the sprint and what backlog items contribute to that goal. The scrum team decides what can be done in the coming sprint and what they will do during the sprint to make that happen.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"The How")," \u2013 The development team plans the work necessary to deliver the sprint goal. Ultimately, the resulting sprint plan is a negotiation between the development team and product owner based on value and effort.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"The Who")," \u2013 You cannot do sprint planning without the product owner or the development team. The product owner defines the goal based on the value that they seek. The development team needs to understand how they can or cannot deliver that goal. If either is missing from this event it makes planning the sprint almost impossible.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"The Inputs")," \u2013 A great starting point for the sprint plan is the product backlog as it provides a list of \u2018stuff\u2019 that could potentially be part of the current sprint. The team should also look at the existing work done in the increment and have a view to capacity.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"The Outputs")," \u2013 The most important outcome for the sprint planning meeting is that the team can describe the goal of the sprint and how it will start working toward that goal. This is made visible in the sprint backlog."))),(0,i.kt)("img",{alt:"sprint planning",width:"75%",src:(0,o.Z)("img/content/sprintInfo.png")}),(0,i.kt)("p",null,"Before the iteration starts, you may need to have your expected total contribution hours in ",(0,i.kt)("a",{parentName:"p",href:"https://docs.google.com/spreadsheets/d/1fJcFTLJof6o0rViKIy4C46sXuisySTud40HFsMGE1e0/edit#gid=311929329"},"Giveth Resource Planning Spreadsheet"),", the link usually gets shared in the Discord dev channel before the sprint meeting. You can find the sprint sheet and update the following cells:"),(0,i.kt)("img",{alt:"resource planning spreadsheet",src:(0,o.Z)("img/content/resourcePlanningAllDevs.png")}),(0,i.kt)("p",null,"It helps the Product Managers (PMs) to plan for the resources better and know if they are able to meet the milestone in each sprint or not. If you couldn\u2019t find time to fill out the spreadsheet, you may be asked to do so during the meeting or whenever you can have an estimate, just DM it to PMs or put it in the dev channel."),(0,i.kt)("p",null,"The usual sprint planning goes like this:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"PMs bring the issues (Preferably User Stories to the planning meeting, describe it and make sure it\u2019s clear for the team to start implementing."),(0,i.kt)("li",{parentName:"ol"},"PM facilitates talks between devs to make it as clear as it can be."),(0,i.kt)("li",{parentName:"ol"},"PM asks for estimations in Story Points (Story Points are the unit of minimum effort spent on a product which can be delivered asap, like a simple bug fix, for example, could take half of a working day. )"),(0,i.kt)("li",{parentName:"ol"},"PM starts building \u201cSprint Backlog\u201d with prioritizing the issues and makes sure the total amount of Story Points are proportionate with the total capacity of the teams and contributors."),(0,i.kt)("li",{parentName:"ol"},"Everyone agrees on the sprint plan and commits to the expected goal.")),(0,i.kt)("h2",{id:"key-contacts"},"Key Contacts"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Development Working Group Steward - Amin",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Discord Handle: ",(0,i.kt)("inlineCode",{parentName:"li"},"Amin#2164")))),(0,i.kt)("li",{parentName:"ul"},"GIVeconomy Product Manager - Lauren",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Discord Handle: ",(0,i.kt)("inlineCode",{parentName:"li"},"karmaticacid#1218")))),(0,i.kt)("li",{parentName:"ul"},"Giveth TRACE, Giveth.io Product Manager - MoeNick",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Discord Handle: ",(0,i.kt)("inlineCode",{parentName:"li"},"MoeNick#1374")))),(0,i.kt)("li",{parentName:"ul"},"Giveth.io Lead Developer - Mateo",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Discord Handle: ",(0,i.kt)("inlineCode",{parentName:"li"},"mateodaza#3156")))),(0,i.kt)("li",{parentName:"ul"},"DevOps & Security - Kay",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Discord Handle: ",(0,i.kt)("inlineCode",{parentName:"li"},"geleeroyale#3228")))),(0,i.kt)("li",{parentName:"ul"},"Lead Designer - Marko",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Discord Handle: ",(0,i.kt)("inlineCode",{parentName:"li"},"markop#2007"))))),(0,i.kt)("h2",{id:"installation-guides-for-local-development"},"Installation Guides for Local Development"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./givethioinstallation"},"Giveth.io")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./TRACEinstallation"},"Giveth TRACE")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./installGIVeconomy"},"GIVeconomy"))),(0,i.kt)("h2",{id:"testing-guidelines"},"Testing Guidelines"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./testing-guidelines"},"Giveth.io")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./testingGIVeconomy"},"GIVeconomy"))),(0,i.kt)("h2",{id:"tools-we-use"},"Tools we Use"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://segment.com/"},"Segment")," (Giveth TRACE, Giveth.io)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://sentry.io/welcome/"},"Sentry")," (Giveth TRACE, Giveth.io)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://infura.io/"},"Infura")," (Giveth TRACE, Giveth.io)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://journeys.autopilotapp.com/features/email-marketing-software"},"Autopilot")," (Giveth.io)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.amplitude.com/"},"Amplitude")," (Giveth TRACE, Giveth.io)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://docusaurus.io/"},"Docusaurus")," (Documentation)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://thegraph.com/en/"},"The Graph")," (GIVeconomy)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.netlify.com/"},"Netlify")," (Giveth TRACE)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://vercel.com/dashboard"},"Vercel")," (Giveth.io, GIVeconomy)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.cryptocompare.com/"},"Cryptocompare")," (Giveth TRACE)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.coingecko.com/en/api"},"Coingecko")," (All Products)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/features/actions"},"Github Actions")," (All Products)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.mongodb.com/"},"MongoDB")," (Giveth TRACE)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.postgresql.org/"},"PostgreSQL")," (Giveth.io)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://redis.io/"},"Redis")," (Giveth TRACE, Giveth.io)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.elastic.co/elasticsearch/"},"Elastic Search")," (Giveth TRACE)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.elastic.co/kibana/"},"Kibana")," (Giveth TRACE)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.pinata.cloud/"},"Pinata")," (Giveth.io, GIVeconomy)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://transak.com/"},"Transak")," (Giveth.io)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://v2.adminbro.com/index.html"},"AdminBro")," (Giveth.io)")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/db205422.71876779.js b/assets/js/db205422.71876779.js new file mode 100644 index 0000000000..a722f0fc2e --- /dev/null +++ b/assets/js/db205422.71876779.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[5538],{3905:(e,t,o)=>{o.d(t,{Zo:()=>p,kt:()=>h});var r=o(7294);function a(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function i(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,r)}return o}function n(e){for(var t=1;t=0||(a[o]=e[o]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(a[o]=e[o])}return a}var s=r.createContext({}),d=function(e){var t=r.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):n(n({},t),e)),o},p=function(e){var t=d(e.components);return r.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var o=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),c=d(o),h=a,m=c["".concat(s,".").concat(h)]||c[h]||u[h]||i;return o?r.createElement(m,n(n({ref:t},p),{},{components:o})):r.createElement(m,n({ref:t},p))}));function h(e,t){var o=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=o.length,n=new Array(i);n[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,n[1]=l;for(var d=2;d{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>c,frontMatter:()=>n,metadata:()=>s,toc:()=>p});var r=o(7462),a=(o(7294),o(3905)),i=o(4996);const n={id:"givdrop",title:"GIVdrop (Finished)",slug:"giveconomy/givdrop"},l=void 0,s={unversionedId:"givdrop",id:"givdrop",title:"GIVdrop (Finished)",description:"The GIVdrop has finished. Any airdropped tokens are no longer eligible to be claimed since January, 2023. This documentation will remain purely for historical reference.",source:"@site/dapps/GIVdrop.md",sourceDirName:".",slug:"/giveconomy/givdrop",permalink:"/giveconomy/givdrop",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/GIVdrop.md",tags:[],version:"current",lastUpdatedBy:"Mitch Oz",lastUpdatedAt:1705082232,formattedLastUpdatedAt:"Jan 12, 2024",frontMatter:{id:"givdrop",title:"GIVdrop (Finished)",slug:"giveconomy/givdrop"},sidebar:"dapps",previous:{title:"Regen Farms",permalink:"/regenFarms"},next:{title:"Recurring Donations",permalink:"/dapps/recurringDonation"}},d={},p=[{value:"The GIVdrop has finished. Any airdropped tokens are no longer eligible to be claimed since January, 2023. This documentation will remain purely for historical reference.",id:"the-givdrop-has-finished-any-airdropped-tokens-are-no-longer-eligible-to-be-claimed-since-january-2023-this-documentation-will-remain-purely-for-historical-reference",level:3},{value:"GIVdrop Eligibility",id:"givdrop-eligibility",level:2},{value:"Claiming your GIVdrop",id:"claiming-your-givdrop",level:2},{value:"1. GIVdrop to Claim",id:"1-givdrop-to-claim",level:3},{value:"2. The address provided has already claimed its GIVdrop",id:"2-the-address-provided-has-already-claimed-its-givdrop",level:3},{value:"3. You missed the GIVdrop (sad face)",id:"3-you-missed-the-givdrop-sad-face",level:3},{value:"If you get stuck in the GIVdrop claim:",id:"if-you-get-stuck-in-the-givdrop-claim",level:3}],u={toc:p};function c(e){let{components:t,...o}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"the-givdrop-has-finished-any-airdropped-tokens-are-no-longer-eligible-to-be-claimed-since-january-2023-this-documentation-will-remain-purely-for-historical-reference"},(0,a.kt)("em",{parentName:"h3"},"The GIVdrop has finished. Any airdropped tokens are no longer eligible to be claimed since January, 2023. This documentation will remain purely for historical reference.")),(0,a.kt)("p",null,"The GIVdrop is designed to kickstart the GIVeconomy by distributing GIV tokens to the Giveth trusted seed - crypto philanthropists, Giveth users & builders, Blockchain4Good DAO members, and other ecosystem partners. To check your GIVdrop eligibility or to claim ",(0,a.kt)("a",{parentName:"p",href:"https://giveth.io/claim"},"click here"),". To learn how to claim your GIVdrop, refer to our tutorial below."),(0,a.kt)("p",null,"All addresses have ",(0,a.kt)("a",{parentName:"p",href:"https://forum.giveth.io/t/ending-the-givdrop/880"},"until Decemember 24, 2022")," to claim their GIVdrop. After that, any unclaimed tokens will be returned to the Giveth DAO."),(0,a.kt)("h2",{id:"givdrop-eligibility"},"GIVdrop Eligibility"),(0,a.kt)("p",null,"17.05% of the total initial supply (1 billion GIV) has been distributed to our trusted seed. The trusted seed is a group of individuals - previous supporters 10% of these tokens are instantly claimable on Gnosis Chain (formerly xDai Network) as the GIVdrop. The rest initializes and sustains ",(0,a.kt)("a",{parentName:"p",href:"https://docs.giveth.io/giveconomy/givstream"},"the GIVstream")," - a flow of GIV that becomes claimable gradually and continuously until December 23, 2026."),(0,a.kt)("p",null,"Eligible recipients of the GIVdrop and the associated GIVstream include:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Giveth Contributors 5.05%"),(0,a.kt)("li",{parentName:"ul"},"Past donors to Giveth directly 4%"),(0,a.kt)("li",{parentName:"ul"},"Blockchain4Good heroes 4%"),(0,a.kt)("li",{parentName:"ul"},"Past donors to projects on Giveth 2%"),(0,a.kt)("li",{parentName:"ul"},"Past users of beta Giveth TRACE 1%"),(0,a.kt)("li",{parentName:"ul"},"Past donors to Gitcoin Grants in Rounds 1-7 1%")),(0,a.kt)("p",null,"The Blockchain4Good DAO heroes group includes a list of over 2500 unique addresses, with over 60 different groupings. The majority of addresses belong to people who have been identified as crypto donors, with the rest belonging to value-aligned DAO members that are working, directly or indirectly, to further ",(0,a.kt)("a",{parentName:"p",href:"https://docs.giveth.io/whatisgiveth/"},"Giveth's mission"),". You may have a GIVdrop if you are part of any of these groups (and many others!):"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"1Hive"),(0,a.kt)("li",{parentName:"ul"},"ChievMint"),(0,a.kt)("li",{parentName:"ul"},"clr.fund"),(0,a.kt)("li",{parentName:"ul"},"Commons Stack Trusted Seed"),(0,a.kt)("li",{parentName:"ul"},"Crypto Commons Gathering"),(0,a.kt)("li",{parentName:"ul"},"Ethereum Foundation"),(0,a.kt)("li",{parentName:"ul"},"General Magic"),(0,a.kt)("li",{parentName:"ul"},"MetaCartel DAO"),(0,a.kt)("li",{parentName:"ul"},"MetaGame"),(0,a.kt)("li",{parentName:"ul"},"MetaGammaDelta"),(0,a.kt)("li",{parentName:"ul"},"MolochDAO"),(0,a.kt)("li",{parentName:"ul"},"STAKEhausDAO"),(0,a.kt)("li",{parentName:"ul"},"TEC Hatchers"),(0,a.kt)("li",{parentName:"ul"},"TrojanDAO"),(0,a.kt)("li",{parentName:"ul"},"Vocdoni"),(0,a.kt)("li",{parentName:"ul"},"WeTrust"),(0,a.kt)("li",{parentName:"ul"},"WhalerDAO")),(0,a.kt)("span",{class:"importantText"},"The snapshot for past donors and Giveth users was taken in March 2021.")," The snapshot for contributors (builders) and Blockchain4Good DAO heroes was taken in September 2021. ",(0,a.kt)("span",{class:"importantText"},"For donors to Gitcoin Grants, GIVdrop eligibility was for those who donated in ",(0,a.kt)("i",null,(0,a.kt)("u",null,"at least two rounds"))," from rounds 1-8.")," Our snapshot was taken at those times because the token development was all public, and we didn't want to give all of the GIV to the airdrop hunters that have proliferated throughout the past year.",(0,a.kt)("admonition",{type:"info"},(0,a.kt)("p",{parentName:"admonition"},"We have made every effort to include all valid addresses in this GIVdrop made at our discretion. Not every person who has ever interacted with Giveth is eligible. If you did not receive GIV, that is because you were not eligible or the wallet that stores the address that was eligible can not be accessed. We will not review past transactions or consider other addresses for inclusion. We appreciate your understanding."),(0,a.kt)("p",{parentName:"admonition"},"If you did not receive the GIVdrop, check out our ",(0,a.kt)("a",{parentName:"p",href:"https://giveth.io/givbacks"},"GIVbacks program")," to find out how to get GIV!")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"NOTE:")," If you received the GIVdrop but no longer have access to the eligible address, it is possible for us to redirect the allocation to another ETH address. However, you need to prove who you are and that you do have tokens allocated to you. If this is you, reach out to our team for support. FYI - if no one in the Giveth team knows you, it probably won't work out."),(0,a.kt)("h2",{id:"claiming-your-givdrop"},"Claiming your GIVdrop"),(0,a.kt)("p",null,"The GIVdrop was released on December 24, 2021. In this guide we'll walk you through how to claim your GIV on the GIVdrop claim page."),(0,a.kt)("p",null,"First thing is to head over to ",(0,a.kt)("a",{parentName:"p",href:"https://giveth.io/claim"},"the GIVdrop claim page"),"; you should arrive at this screen:"),(0,a.kt)("img",{alt:"check GIVdrop eligibility",src:(0,i.Z)("/img/content/giveconomy/claimConnect1.png")}),(0,a.kt)("p",null,"From here you will need to connect your web3 wallet to the DApp to check your eligibility."),(0,a.kt)("p",null,"After connecting, one of three situations will happen:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("a",{href:"#1-givdrop-to-claim"},"You have a GIVdrop to claim, NICE!")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("a",{href:"#2-the-address-provided-has-already-claimed-its-givdrop"},"The address provided has already claimed its GIVdrop, GREAT!")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("a",{href:"#3-you-missed-the-givdrop-sad-face"}," You missed the GIVdrop. :( "))),(0,a.kt)("p",null,"Click on any of the above situations to learn how to proceed. To learn more about GIVdrop eligibility, click ",(0,a.kt)("a",{parentName:"p",href:"./givdrop"},"here"),"."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"1-givdrop-to-claim"},"1. GIVdrop to Claim"),(0,a.kt)("p",null,"If you have a GIVdrop ready to claim that's great news! Click the arrow to dive into the GIVdrop claim process."),(0,a.kt)("img",{alt:"you have giv to claim",src:(0,i.Z)("/img/content/giveconomy/claimReady1.png")}),(0,a.kt)("p",null,"Go through the flow to learn all the amazing ways to participate in the GIVeconomy. You can see your GIVdrop and GIVstream and visualize the impacts your GIV could make in the GIViverse."),(0,a.kt)("img",{alt:"how to use your GIV",src:(0,i.Z)("/img/content/giveconomy/claimReady2.png")}),(0,a.kt)("p",null,"On the final page you can claim your GIVdrop as well as add the GIV token to your MetaMask wallet. When you click ",(0,a.kt)("inlineCode",{parentName:"p"},"CLAIM")," you'll see a summary of all the GIV you're getting."),(0,a.kt)("img",{alt:"claim your giv now screen",src:(0,i.Z)("/img/content/giveconomy/claimReady3.png")}),(0,a.kt)("p",null,"In addition to the GIVdrop, you'll also receive a GIVstream which will continuously stream you GIV for a period of up 5 years - learn more about the ",(0,a.kt)("a",{parentName:"p",href:"./givstream"},"GIVstream here"),"."),(0,a.kt)("img",{alt:"harvesting your GIVdrop",src:(0,i.Z)("/img/content/giveconomy/claimHarvest1.png")}),(0,a.kt)("p",null,"Click ",(0,a.kt)("inlineCode",{parentName:"p"},"HARVEST")," to generate the transaction to claim your GIVdrop to your connected wallet."),(0,a.kt)("p",null,"You're now equipped and ready to jump into the GIVeconomy - Discover all the great ways you can contribute to a ",(0,a.kt)("a",{parentName:"p",href:"https://giveth.io/"},"thriving economy of Giving"),"."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"2-the-address-provided-has-already-claimed-its-givdrop"},"2. The address provided has already claimed its GIVdrop"),(0,a.kt)("p",null,"You already claimed the GIVdrop for the address you provided. However, you have no shortage of options now at your disposal. Give us a shout out on Twitter, and join our Discord to see the action happening in our Community."),(0,a.kt)("img",{alt:"you already claimed",src:(0,i.Z)("/img/content/giveconomy/claimClaimed1.png")}),(0,a.kt)("p",null,"We also have dropped you some gLove tokens on Rinkeby that you can exchange for some awesome Giveth Swag! Check out our ",(0,a.kt)("a",{parentName:"p",href:"https://swag.giveth.io/"},"Swag Store")," to see all our custom designed apparel and mugs!"),(0,a.kt)("p",null,"Lastly, and most importantly, click ",(0,a.kt)("inlineCode",{parentName:"p"},"Explore the GIVeconomy")," to jump into GIVeconomy and explore all of the wonderful GIVing opportunities available."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"3-you-missed-the-givdrop-sad-face"},"3. You missed the GIVdrop (sad face)"),(0,a.kt)("p",null,"Unfortunately the address provided didn't receive a GIVdrop. Check the wallet address you provided or that you've connected with the correct wallet address."),(0,a.kt)("img",{alt:"you missed the GIVdrop",src:(0,i.Z)("/img/content/giveconomy/claimMissed1.png")}),(0,a.kt)("p",null,"If you missed out, don't fret; there are still other ways to get GIV! You can follow the link on the ",(0,a.kt)("a",{parentName:"p",href:"https://giveth.io/givfarm"},"GIVfarm")," page to take you to your local friendly Decentralized Exchange (on Mainnet or Gnosis Chain ","[formerly xDai Network]",") to swap your crypto for some of that sweet, sweet GIV."),(0,a.kt)("img",{alt:"buy tokens link from GIVfarm",src:(0,i.Z)("/img/content/giveconomy/claimMissed2.png")}),(0,a.kt)("p",null,"Or if you want to be a real GIVhero, participate in the GIVbacks program. You can qualify to earn GIV from donating to verified projects on ",(0,a.kt)("a",{parentName:"p",href:"https://giveth.io/projects/"},"giveth.io"),". Learn more about the ",(0,a.kt)("a",{parentName:"p",href:"./givbacks"},"GIVbacks program here"),"."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"if-you-get-stuck-in-the-givdrop-claim"},"If you get stuck in the GIVdrop claim:"),(0,a.kt)("p",null,"You could find yourself stuck in the GIVdrop Connect page for a variety of reasons including:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Declining to connect your wallet in MetaMask"),(0,a.kt)("li",{parentName:"ul"},"Not connected to Gnosis Chain (formerly xDai Network)")),(0,a.kt)("p",null,"To remedy this, open up your MetaMask extension, and verify your connection:"),(0,a.kt)("img",{alt:"troubleshooting getting stuck",src:(0,i.Z)("/img/content/giveconomy/claimStuck1.png")}),(0,a.kt)("p",null,"Ensure you're on Gnosis Chain (formerly xDai Network), and connect the wallet you'd like to claim for to the DApp. If the page doesn't update automatically just give it a quick refresh (F5), and you should be good to go!"))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/db205422.fff5af1b.js b/assets/js/db205422.fff5af1b.js deleted file mode 100644 index b354280aaa..0000000000 --- a/assets/js/db205422.fff5af1b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[5538],{3905:(e,t,o)=>{o.d(t,{Zo:()=>p,kt:()=>h});var r=o(7294);function a(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function i(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,r)}return o}function n(e){for(var t=1;t=0||(a[o]=e[o]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(a[o]=e[o])}return a}var s=r.createContext({}),d=function(e){var t=r.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):n(n({},t),e)),o},p=function(e){var t=d(e.components);return r.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var o=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),c=d(o),h=a,m=c["".concat(s,".").concat(h)]||c[h]||u[h]||i;return o?r.createElement(m,n(n({ref:t},p),{},{components:o})):r.createElement(m,n({ref:t},p))}));function h(e,t){var o=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=o.length,n=new Array(i);n[0]=c;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,n[1]=l;for(var d=2;d{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>c,frontMatter:()=>n,metadata:()=>s,toc:()=>p});var r=o(7462),a=(o(7294),o(3905)),i=o(4996);const n={id:"givdrop",title:"GIVdrop (Finished)",slug:"giveconomy/givdrop"},l=void 0,s={unversionedId:"givdrop",id:"givdrop",title:"GIVdrop (Finished)",description:"The GIVdrop has finished. Any airdropped tokens are no longer eligible to be claimed since January, 2023. This documentation will remain purely for historical reference.",source:"@site/dapps/GIVdrop.md",sourceDirName:".",slug:"/giveconomy/givdrop",permalink:"/giveconomy/givdrop",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/GIVdrop.md",tags:[],version:"current",lastUpdatedBy:"Mitch Oz",lastUpdatedAt:1705082232,formattedLastUpdatedAt:"Jan 12, 2024",frontMatter:{id:"givdrop",title:"GIVdrop (Finished)",slug:"giveconomy/givdrop"},sidebar:"dapps",previous:{title:"The Angel Vault (Deprecated)",permalink:"/angelVault"},next:{title:"Recurring Donations",permalink:"/dapps/recurringDonation"}},d={},p=[{value:"The GIVdrop has finished. Any airdropped tokens are no longer eligible to be claimed since January, 2023. This documentation will remain purely for historical reference.",id:"the-givdrop-has-finished-any-airdropped-tokens-are-no-longer-eligible-to-be-claimed-since-january-2023-this-documentation-will-remain-purely-for-historical-reference",level:3},{value:"GIVdrop Eligibility",id:"givdrop-eligibility",level:2},{value:"Claiming your GIVdrop",id:"claiming-your-givdrop",level:2},{value:"1. GIVdrop to Claim",id:"1-givdrop-to-claim",level:3},{value:"2. The address provided has already claimed its GIVdrop",id:"2-the-address-provided-has-already-claimed-its-givdrop",level:3},{value:"3. You missed the GIVdrop (sad face)",id:"3-you-missed-the-givdrop-sad-face",level:3},{value:"If you get stuck in the GIVdrop claim:",id:"if-you-get-stuck-in-the-givdrop-claim",level:3}],u={toc:p};function c(e){let{components:t,...o}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"the-givdrop-has-finished-any-airdropped-tokens-are-no-longer-eligible-to-be-claimed-since-january-2023-this-documentation-will-remain-purely-for-historical-reference"},(0,a.kt)("em",{parentName:"h3"},"The GIVdrop has finished. Any airdropped tokens are no longer eligible to be claimed since January, 2023. This documentation will remain purely for historical reference.")),(0,a.kt)("p",null,"The GIVdrop is designed to kickstart the GIVeconomy by distributing GIV tokens to the Giveth trusted seed - crypto philanthropists, Giveth users & builders, Blockchain4Good DAO members, and other ecosystem partners. To check your GIVdrop eligibility or to claim ",(0,a.kt)("a",{parentName:"p",href:"https://giveth.io/claim"},"click here"),". To learn how to claim your GIVdrop, refer to our tutorial below."),(0,a.kt)("p",null,"All addresses have ",(0,a.kt)("a",{parentName:"p",href:"https://forum.giveth.io/t/ending-the-givdrop/880"},"until Decemember 24, 2022")," to claim their GIVdrop. After that, any unclaimed tokens will be returned to the Giveth DAO."),(0,a.kt)("h2",{id:"givdrop-eligibility"},"GIVdrop Eligibility"),(0,a.kt)("p",null,"17.05% of the total initial supply (1 billion GIV) has been distributed to our trusted seed. The trusted seed is a group of individuals - previous supporters 10% of these tokens are instantly claimable on Gnosis Chain (formerly xDai Network) as the GIVdrop. The rest initializes and sustains ",(0,a.kt)("a",{parentName:"p",href:"https://docs.giveth.io/giveconomy/givstream"},"the GIVstream")," - a flow of GIV that becomes claimable gradually and continuously until December 23, 2026."),(0,a.kt)("p",null,"Eligible recipients of the GIVdrop and the associated GIVstream include:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Giveth Contributors 5.05%"),(0,a.kt)("li",{parentName:"ul"},"Past donors to Giveth directly 4%"),(0,a.kt)("li",{parentName:"ul"},"Blockchain4Good heroes 4%"),(0,a.kt)("li",{parentName:"ul"},"Past donors to projects on Giveth 2%"),(0,a.kt)("li",{parentName:"ul"},"Past users of beta Giveth TRACE 1%"),(0,a.kt)("li",{parentName:"ul"},"Past donors to Gitcoin Grants in Rounds 1-7 1%")),(0,a.kt)("p",null,"The Blockchain4Good DAO heroes group includes a list of over 2500 unique addresses, with over 60 different groupings. The majority of addresses belong to people who have been identified as crypto donors, with the rest belonging to value-aligned DAO members that are working, directly or indirectly, to further ",(0,a.kt)("a",{parentName:"p",href:"https://docs.giveth.io/whatisgiveth/"},"Giveth's mission"),". You may have a GIVdrop if you are part of any of these groups (and many others!):"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"1Hive"),(0,a.kt)("li",{parentName:"ul"},"ChievMint"),(0,a.kt)("li",{parentName:"ul"},"clr.fund"),(0,a.kt)("li",{parentName:"ul"},"Commons Stack Trusted Seed"),(0,a.kt)("li",{parentName:"ul"},"Crypto Commons Gathering"),(0,a.kt)("li",{parentName:"ul"},"Ethereum Foundation"),(0,a.kt)("li",{parentName:"ul"},"General Magic"),(0,a.kt)("li",{parentName:"ul"},"MetaCartel DAO"),(0,a.kt)("li",{parentName:"ul"},"MetaGame"),(0,a.kt)("li",{parentName:"ul"},"MetaGammaDelta"),(0,a.kt)("li",{parentName:"ul"},"MolochDAO"),(0,a.kt)("li",{parentName:"ul"},"STAKEhausDAO"),(0,a.kt)("li",{parentName:"ul"},"TEC Hatchers"),(0,a.kt)("li",{parentName:"ul"},"TrojanDAO"),(0,a.kt)("li",{parentName:"ul"},"Vocdoni"),(0,a.kt)("li",{parentName:"ul"},"WeTrust"),(0,a.kt)("li",{parentName:"ul"},"WhalerDAO")),(0,a.kt)("span",{class:"importantText"},"The snapshot for past donors and Giveth users was taken in March 2021.")," The snapshot for contributors (builders) and Blockchain4Good DAO heroes was taken in September 2021. ",(0,a.kt)("span",{class:"importantText"},"For donors to Gitcoin Grants, GIVdrop eligibility was for those who donated in ",(0,a.kt)("i",null,(0,a.kt)("u",null,"at least two rounds"))," from rounds 1-8.")," Our snapshot was taken at those times because the token development was all public, and we didn't want to give all of the GIV to the airdrop hunters that have proliferated throughout the past year.",(0,a.kt)("admonition",{type:"info"},(0,a.kt)("p",{parentName:"admonition"},"We have made every effort to include all valid addresses in this GIVdrop made at our discretion. Not every person who has ever interacted with Giveth is eligible. If you did not receive GIV, that is because you were not eligible or the wallet that stores the address that was eligible can not be accessed. We will not review past transactions or consider other addresses for inclusion. We appreciate your understanding."),(0,a.kt)("p",{parentName:"admonition"},"If you did not receive the GIVdrop, check out our ",(0,a.kt)("a",{parentName:"p",href:"https://giveth.io/givbacks"},"GIVbacks program")," to find out how to get GIV!")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"NOTE:")," If you received the GIVdrop but no longer have access to the eligible address, it is possible for us to redirect the allocation to another ETH address. However, you need to prove who you are and that you do have tokens allocated to you. If this is you, reach out to our team for support. FYI - if no one in the Giveth team knows you, it probably won't work out."),(0,a.kt)("h2",{id:"claiming-your-givdrop"},"Claiming your GIVdrop"),(0,a.kt)("p",null,"The GIVdrop was released on December 24, 2021. In this guide we'll walk you through how to claim your GIV on the GIVdrop claim page."),(0,a.kt)("p",null,"First thing is to head over to ",(0,a.kt)("a",{parentName:"p",href:"https://giveth.io/claim"},"the GIVdrop claim page"),"; you should arrive at this screen:"),(0,a.kt)("img",{alt:"check GIVdrop eligibility",src:(0,i.Z)("/img/content/giveconomy/claimConnect1.png")}),(0,a.kt)("p",null,"From here you will need to connect your web3 wallet to the DApp to check your eligibility."),(0,a.kt)("p",null,"After connecting, one of three situations will happen:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("a",{href:"#1-givdrop-to-claim"},"You have a GIVdrop to claim, NICE!")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("a",{href:"#2-the-address-provided-has-already-claimed-its-givdrop"},"The address provided has already claimed its GIVdrop, GREAT!")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("a",{href:"#3-you-missed-the-givdrop-sad-face"}," You missed the GIVdrop. :( "))),(0,a.kt)("p",null,"Click on any of the above situations to learn how to proceed. To learn more about GIVdrop eligibility, click ",(0,a.kt)("a",{parentName:"p",href:"./givdrop"},"here"),"."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"1-givdrop-to-claim"},"1. GIVdrop to Claim"),(0,a.kt)("p",null,"If you have a GIVdrop ready to claim that's great news! Click the arrow to dive into the GIVdrop claim process."),(0,a.kt)("img",{alt:"you have giv to claim",src:(0,i.Z)("/img/content/giveconomy/claimReady1.png")}),(0,a.kt)("p",null,"Go through the flow to learn all the amazing ways to participate in the GIVeconomy. You can see your GIVdrop and GIVstream and visualize the impacts your GIV could make in the GIViverse."),(0,a.kt)("img",{alt:"how to use your GIV",src:(0,i.Z)("/img/content/giveconomy/claimReady2.png")}),(0,a.kt)("p",null,"On the final page you can claim your GIVdrop as well as add the GIV token to your MetaMask wallet. When you click ",(0,a.kt)("inlineCode",{parentName:"p"},"CLAIM")," you'll see a summary of all the GIV you're getting."),(0,a.kt)("img",{alt:"claim your giv now screen",src:(0,i.Z)("/img/content/giveconomy/claimReady3.png")}),(0,a.kt)("p",null,"In addition to the GIVdrop, you'll also receive a GIVstream which will continuously stream you GIV for a period of up 5 years - learn more about the ",(0,a.kt)("a",{parentName:"p",href:"./givstream"},"GIVstream here"),"."),(0,a.kt)("img",{alt:"harvesting your GIVdrop",src:(0,i.Z)("/img/content/giveconomy/claimHarvest1.png")}),(0,a.kt)("p",null,"Click ",(0,a.kt)("inlineCode",{parentName:"p"},"HARVEST")," to generate the transaction to claim your GIVdrop to your connected wallet."),(0,a.kt)("p",null,"You're now equipped and ready to jump into the GIVeconomy - Discover all the great ways you can contribute to a ",(0,a.kt)("a",{parentName:"p",href:"https://giveth.io/"},"thriving economy of Giving"),"."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"2-the-address-provided-has-already-claimed-its-givdrop"},"2. The address provided has already claimed its GIVdrop"),(0,a.kt)("p",null,"You already claimed the GIVdrop for the address you provided. However, you have no shortage of options now at your disposal. Give us a shout out on Twitter, and join our Discord to see the action happening in our Community."),(0,a.kt)("img",{alt:"you already claimed",src:(0,i.Z)("/img/content/giveconomy/claimClaimed1.png")}),(0,a.kt)("p",null,"We also have dropped you some gLove tokens on Rinkeby that you can exchange for some awesome Giveth Swag! Check out our ",(0,a.kt)("a",{parentName:"p",href:"https://swag.giveth.io/"},"Swag Store")," to see all our custom designed apparel and mugs!"),(0,a.kt)("p",null,"Lastly, and most importantly, click ",(0,a.kt)("inlineCode",{parentName:"p"},"Explore the GIVeconomy")," to jump into GIVeconomy and explore all of the wonderful GIVing opportunities available."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"3-you-missed-the-givdrop-sad-face"},"3. You missed the GIVdrop (sad face)"),(0,a.kt)("p",null,"Unfortunately the address provided didn't receive a GIVdrop. Check the wallet address you provided or that you've connected with the correct wallet address."),(0,a.kt)("img",{alt:"you missed the GIVdrop",src:(0,i.Z)("/img/content/giveconomy/claimMissed1.png")}),(0,a.kt)("p",null,"If you missed out, don't fret; there are still other ways to get GIV! You can follow the link on the ",(0,a.kt)("a",{parentName:"p",href:"https://giveth.io/givfarm"},"GIVfarm")," page to take you to your local friendly Decentralized Exchange (on Mainnet or Gnosis Chain ","[formerly xDai Network]",") to swap your crypto for some of that sweet, sweet GIV."),(0,a.kt)("img",{alt:"buy tokens link from GIVfarm",src:(0,i.Z)("/img/content/giveconomy/claimMissed2.png")}),(0,a.kt)("p",null,"Or if you want to be a real GIVhero, participate in the GIVbacks program. You can qualify to earn GIV from donating to verified projects on ",(0,a.kt)("a",{parentName:"p",href:"https://giveth.io/projects/"},"giveth.io"),". Learn more about the ",(0,a.kt)("a",{parentName:"p",href:"./givbacks"},"GIVbacks program here"),"."),(0,a.kt)("hr",null),(0,a.kt)("h3",{id:"if-you-get-stuck-in-the-givdrop-claim"},"If you get stuck in the GIVdrop claim:"),(0,a.kt)("p",null,"You could find yourself stuck in the GIVdrop Connect page for a variety of reasons including:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Declining to connect your wallet in MetaMask"),(0,a.kt)("li",{parentName:"ul"},"Not connected to Gnosis Chain (formerly xDai Network)")),(0,a.kt)("p",null,"To remedy this, open up your MetaMask extension, and verify your connection:"),(0,a.kt)("img",{alt:"troubleshooting getting stuck",src:(0,i.Z)("/img/content/giveconomy/claimStuck1.png")}),(0,a.kt)("p",null,"Ensure you're on Gnosis Chain (formerly xDai Network), and connect the wallet you'd like to claim for to the DApp. If the page doesn't update automatically just give it a quick refresh (F5), and you should be good to go!"))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e0473e90.1af6fbb4.js b/assets/js/e0473e90.1af6fbb4.js new file mode 100644 index 0000000000..053fbc734c --- /dev/null +++ b/assets/js/e0473e90.1af6fbb4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[8020],{7545:e=>{e.exports=JSON.parse('{"pluginId":"dapps","version":"current","label":"Next","banner":null,"badge":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"dapps":[{"type":"category","label":"Giveth.io Guides","items":[{"type":"link","label":"Intro to Giveth.io","href":"/dapps/givethIO","docId":"givethIO"},{"type":"link","label":"Getting started","href":"/dapps/gettingStarted","docId":"gettingStarted"},{"type":"category","label":"For Donors","collapsed":true,"items":[{"type":"link","label":"Making a Donation","href":"/dapps/projectdonating","docId":"projectdonating"},{"type":"link","label":"Donating with Metamask","href":"/dapps/donatingmetamask","docId":"donatingmetamask"},{"type":"link","label":"MultiSig Wallets on Giveth","href":"/dapps/multisigs","docId":"multisigs"},{"type":"link","label":"Import Torus Private Key into Metamask","href":"/dapps/importTorusMM","docId":"importTorusMM"}],"collapsible":true,"href":"/dapps/projectdonating"},{"type":"category","label":"For Project Owners","collapsed":true,"items":[{"type":"link","label":"Create a project","href":"/dapps/createproject","docId":"createproject"},{"type":"link","label":"Project Quality Assurance Guide","href":"/dapps/listedUnlisted","docId":"listedUnlisted"},{"type":"link","label":"Project Verification Processes and Guidelines","href":"/dapps/projectVerification","docId":"projectVerification"},{"type":"link","label":"Adding Updates to Your Project","href":"/dapps/projectUpdates","docId":"projectUpdates"}],"collapsible":true,"href":"/dapps/createproject"},{"type":"category","label":"GIVeconomy","items":[{"type":"link","label":"GIVbacks","href":"/giveconomy/givbacks","docId":"givbacks"},{"type":"link","label":"GIVstream","href":"/giveconomy/givstream","docId":"givstream"},{"type":"link","label":"GIVpower","href":"/giveconomy/givpower","docId":"givpower"},{"type":"category","label":"GIVgarden","items":[{"type":"link","label":"Terms & Conditions for Submitting or Challenging a Proposal","href":"/giveconomy/termsForProposals","docId":"termsForProposals"}],"collapsed":true,"collapsible":true,"href":"/giveconomy/givgarden"},{"type":"category","label":"GIVfarm","items":[{"type":"link","label":"Regen Farms","href":"/regenFarms","docId":"regenFarms"}],"collapsed":true,"collapsible":true,"href":"/giveconomy/givfarm"},{"type":"link","label":"GIVdrop (Finished)","href":"/giveconomy/givdrop","docId":"givdrop"}],"collapsed":true,"collapsible":true,"href":"/giveconomy/"},{"type":"link","label":"Recurring Donations","href":"/dapps/recurringDonation","docId":"recurringDonation"},{"type":"link","label":"Quadratic Funding","href":"/quadraticfunding","docId":"quadraticfunding"},{"type":"link","label":"The Givers PFP Collection","href":"/dapps/giverspfp","docId":"giverspfp"},{"type":"link","label":"$nice Token (Depcrecated)","href":"/giveconomy/niceToken","docId":"niceToken"},{"type":"link","label":"Responsible Disclosure","href":"/security/responsible-disclosure","docId":"disclosure"},{"type":"link","label":"Troubleshooting","href":"/dapps/troubleshooting","docId":"troubleshooting"},{"type":"category","label":"Archives","items":[{"type":"category","label":"Giveth TRACE (Deprecated)","items":[{"type":"link","label":"Giveth Entities and Roles","href":"/dapps/entitiesAndRoles","docId":"entitiesAndRoles"},{"type":"link","label":"Getting your project on TRACE","href":"/dapps/makeTraceableProject","docId":"makeTraceableProject"},{"type":"link","label":"Leaving Traces (formerly Creating Milestones)","href":"/dapps/leavingTraces","docId":"leavingTraces"},{"type":"link","label":"Technical White Paper","href":"/technicalWhitePaper","docId":"technicalWhitePaper"},{"type":"link","label":"Exchange Rates","href":"/dapps/exchangeRates","docId":"exchangeRates"},{"type":"link","label":"Contracts, Bridges and Multisigs Technical Information","href":"/dapps/traceContracts","docId":"traceContracts"}],"collapsed":true,"collapsible":true,"href":"/dapps/introTrace"},{"type":"link","label":"$nice Token (Depcrecated)","href":"/giveconomy/niceToken","docId":"niceToken"},{"type":"link","label":"The Angel Vault (Deprecated)","href":"/angelVault","docId":"angelVault"}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true,"href":"/dapps/"}]},"docs":{"angelVault":{"id":"angelVault","title":"The Angel Vault (Deprecated)","description":"Then Angel Vault has been deprecated. This documentation will remain purely for historical reference.","sidebar":"dapps"},"bridgeSecurity":{"id":"bridgeSecurity","title":"Giveth Bridge Security Implementation","description":"A technical overview of the features, roles and theory behind the security of the Giveth Bridge."},"contributors":{"id":"contributors","title":"Contributing to Giveth Development","description":"Giveth currently maintains three products that focus on funding management, peer to peer donations, and DeFi for-good token economics. These are Giveth TRACE, Giveth.io and the GIVeconomy respectively"},"createproject":{"id":"createproject","title":"Create a project","description":"","sidebar":"dapps"},"crypto":{"id":"crypto","title":"Cryptocurrency donations","description":"What is and why Cryptocurrency?"},"developmentProcess":{"id":"developmentProcess","title":"Development Process","description":"This section details the Giveth TRACE development process, deployments, and how merging and testing is handled."},"disclosure":{"id":"disclosure","title":"Responsible Disclosure","description":"Smart Contract security","sidebar":"dapps"},"donatingmetamask":{"id":"donatingmetamask","title":"Donating with Metamask","description":"","sidebar":"dapps"},"entitiesAndRoles":{"id":"entitiesAndRoles","title":"Giveth Entities and Roles","description":"Content and ideas have been modified from this excellent article \u201cAn Overview of the Giveth Donation Application\u201d authored by Kris Decoodt in 2017. Many things have been revised and modified since 2017. Here we breakdown the DApp as it is in 2022.","sidebar":"dapps"},"exchangeRates":{"id":"exchangeRates","title":"Exchange Rates","description":"When you leave a Trace within Giveth TRACE, you can enter an amount in ether or in fiat. Our system then automatically calculates the conversion rate based on the date of the Trace.","sidebar":"dapps"},"faq":{"id":"faq","title":"Frequently Asked Questions","description":"General"},"gettingStarted":{"id":"gettingStarted","title":"Getting started","description":"","sidebar":"dapps"},"givbacks":{"id":"givbacks","title":"GIVbacks","description":"GIVbacks Reloaded!","sidebar":"dapps"},"givdrop":{"id":"givdrop","title":"GIVdrop (Finished)","description":"The GIVdrop has finished. Any airdropped tokens are no longer eligible to be claimed since January, 2023. This documentation will remain purely for historical reference.","sidebar":"dapps"},"giveconomy":{"id":"giveconomy","title":"GIVeconomy","description":"Giveth is building a culture of giving that empowers and rewards those who give -- to projects, to society, and to the world. We aim to inspire our community to participate in an ecosystem of collective support, abundance and value-creation.","sidebar":"dapps"},"giverspfp":{"id":"giverspfp","title":"The Givers PFP Collection","description":"\u201cThe Givers\u201d NFT\u2019s are not just NFT\u2019s but integrated Giveth PFPs! Giveth\'s first PFP collection was a community proposed initiative begun in March 2022. The intention of the PFP collection is to raise funds for the Giveth DAO and continue our mission of building the Future of Giving. The Givers was launched for public minting on March 24, 2023 at 11am CST.","sidebar":"dapps"},"givethIO":{"id":"givethIO","title":"Intro to Giveth.io","description":"Giveth.io, launched in March 2021, offers a simple and streamlined way for the world to donate to for-good projects via the Ethereum Blockchain.","sidebar":"dapps"},"givethioinstallation":{"id":"givethioinstallation","title":"Installing Giveth.io for Local Development","description":"This guide will document the steps to set up and run Giveth.io locally for the purposes of development. The setup process was documented using Ubuntu 20.04 LTS."},"givethMatchingPool":{"id":"givethMatchingPool","title":"Giveth Matching Pool","description":"The Giveth Matching Pool is raising funds for future donation matching to\xa0verified projects\xa0on Giveth! It is a one-stop-shop for donors who want to ensure their donation has a broad impact."},"givfarm":{"id":"givfarm","title":"GIVfarm","description":"On October 29, 2022, the GIVfarm was exploited on ETH Mainnet, all funds in the Mainnet farming contracts were drained and stolen. The Giveth Community voted subsequently to not restart any of the affected farms. Currently most GIV liqudity farming programs have ended since, with the exception of GIVpower Staking, there are no plans to launch any new GIVfarm programs in the future. However there are still opportunities to earn liquidity rewards through the RegenFarm program.","sidebar":"dapps"},"givgarden":{"id":"givgarden","title":"GIVgarden (Deprecated)","description":"**The GIVgarden was deprecated as of March 7th 2024. Find the most current info for Giveth Governance in our related documentation.**","sidebar":"dapps"},"givpower":{"id":"givpower","title":"GIVpower","description":"GIVpower was created to build a win-win relationship between projects & donors. GIV holders get GIVpower and earn a yield when they stake and - if they choose - lock GIV in the GIVfarm. They will eventually be able to use their GIVpower to \u201cboost\u201d projects on Giveth and help improve their ranking. Top ranked projects will get benefits on the platform. Initially their donors will get more GIVbacks, and eventually, they will get matching funds and other benefits.","sidebar":"dapps"},"givstream":{"id":"givstream","title":"GIVstream","description":"Welcome to the expanding GIViverse! The GIVstream aligns community members with the long term success of Giveth and the GIVeconomy. With the GIVstream, anyone who adds value to the GIVeconomy receives GIV continuously for up to 5 years from the GIVeconomy launch date. The GIVeconomy begins humbly, but as time passes, the GIViverse expands: More GIV becomes liquid is streamed to our community of GIVernauts.","sidebar":"dapps"},"importTorusMM":{"id":"importTorusMM","title":"Import Torus Private Key into Metamask","description":"The purpose of this guide is to explain how to import Torus private key into a MetaMask wallet, thereby enabling broader functionality and easier access to decentralized applications (dApps).","sidebar":"dapps"},"installGIVeconomy":{"id":"installGIVeconomy","title":"Installing the GIVeconomy Front-End","description":"You can find the Github repository containing the GIVeconomy front-end at https://github.com/Giveth/liquidity-mining-dapp."},"introTrace":{"id":"introTrace","title":"Intro to Giveth TRACE","description":"Giveth is re-engineering charitable giving, by creating entirely free, open-source platforms, built on the Ethereum Blockchain. Giveth TRACE cuts out bureaucracy and enables makers to create a high level of transparency and accountability for Givers. The basic donation hierarchy of Communities, Campaigns and Traces allows for users to specify the scope of their donation. There are multiple reviewer roles and security check points that allow Givers and Makers to use our DApp with confidence. You can read more about the basic components and the logic behind our DApp (Donation Application) in this post.","sidebar":"dapps"},"leavingTraces":{"id":"leavingTraces","title":"Leaving Traces (formerly Creating Milestones)","description":"Welcome! If you are super new to Giveth, join the #\ud83d\udd28contribute channel on Discord. You can introduce yourself and ask questions there! This is a living document and will change as bugs are fixed and features added to the DApp.","sidebar":"dapps"},"listedUnlisted":{"id":"listedUnlisted","title":"Project Quality Assurance Guide","description":"In order to ensure the quality of projects on our DApp, we have implemented a processus for pre-screening projects before they are featured on the Giveth homepage. All new projects are initially unlisted until they are reviewed and approved by a Giveth Unicorn. Unlisted projects can still receive donations and can be accessed via the project\'s URL. However, only listed projects will appear on the Giveth homepage & projects page, and using our sort, filter and search functionalities.","sidebar":"dapps"},"makeTraceableProject":{"id":"makeTraceableProject","title":"Getting your project on TRACE","description":"This guide will show you how to make your project traceable. We will go over the steps for first getting your project verified then upgrading it into a Campaign on Giveth TRACE.","sidebar":"dapps"},"multisigs":{"id":"multisigs","title":"MultiSig Wallets on Giveth","description":"It is possible to use Giveth with your Safe Multisig Wallet. However there are a few steps to get setup and a few things to keep in mind. If you don\'t know what a multisig wallet is or how to make one, check out the Safe documentation for Getting Started with Multisig Wallets.","sidebar":"dapps"},"niceToken":{"id":"niceToken","title":"$nice Token (Depcrecated)","description":"**The $nice token distribution has been discontinued on December 24, 2024. $nice tokens may still be distibuted for promotional and community incentives, however they will no longer be distributed bi-weekly for stablecoin donations to the Giveth Project.**","sidebar":"dapps"},"projectdonating":{"id":"projectdonating","title":"Making a Donation","description":"","sidebar":"dapps"},"projectUpdates":{"id":"projectUpdates","title":"Adding Updates to Your Project","description":"Are you the proud owner of a verified project on Giveth? If so, it\'s important to keep your donors in the loop and maintain your active status by posting updates every 3 months.","sidebar":"dapps"},"projectVerification":{"id":"projectVerification","title":"Project Verification Processes and Guidelines","description":"Giveth is progressively decentralizing its system of reviewing projects for legitimacy and determining if they are providing a public good. This system determines which projects provide rewards to their donors to those projects via the GIVbacks program as well as which projects are eligible to be boosted with GIVpower.","sidebar":"dapps"},"quadraticfunding":{"id":"quadraticfunding","title":"Quadratic Funding","description":"What is Quadratic Funding?","sidebar":"dapps"},"recurringDonation":{"id":"recurringDonation","title":"Recurring Donations","description":"On Giveth you can use the power of Superfluid to create recurring donations to projects. This allows you to provide continuous support over a long-period to your favourite projects. In this article we will explain the key concepts of recurring donations and how to interact with them on the Giveth Dapp.","sidebar":"dapps"},"referral":{"id":"referral","title":"Giveth Referral Program","description":"The Giveth referral program is a way for users to earn rewards by inviting their friends and network to donate to impact projects. Since the launch of the GIVeconomy in 2020, donors can earn GIV tokens when they donate to verified projects thanks to our GIVbacks program. With our referral program, users can earn even more rewards!"},"regenFarmContracts":{"id":"regenFarmContracts","title":"Regen Farm Smart Contract Guide","description":"GIVeconomy is a collection of audited smart contracts which work together to provide capabilities, including: token streaming, airdropping, and various types of farming. Contracts and scripts can be found at the Giveth giv-token-contracts repository."},"regenFarms":{"id":"regenFarms","title":"Regen Farms","description":"RegenFarms is the next generation of ReFi liquidity mining opportunities for DAOs and regens alike. Using our contracts for the GIVfarm and the GIVstream, we are empowering other for-good DAOs to launch liquidity mining incentive programs, \u201cRegenFarms\u201d, with streams of their own.","sidebar":"dapps"},"styleguide":{"id":"styleguide","title":"Style Guide","description":"Giveth Design by @markoprljic."},"technicalWhitePaper":{"id":"technicalWhitePaper","title":"Technical White Paper","description":"The purpose of our technology is to give cryptocurrency users the ability to donate effortlessly to Campaigns focused on making the world a better place. They can use the Giveth platform to find those Campaigns and donate directly, or they can pledge their crypto to a cause and have a Delegate choose an appropriate Campaign or Trace for them. As an alternative to traditional donation systems, our Liquid Pledging contract allows Givers to take back their pledge if they disagree with how their donations were allocated. This can only occur before it has been locked into a Campaign for a specific purpose.","sidebar":"dapps"},"termsForProposals":{"id":"termsForProposals","title":"Terms & Conditions for Submitting or Challenging a Proposal","description":"1. ACCEPTANCE OF TERMS","sidebar":"dapps"},"testing-guidelines":{"id":"testing-guidelines","title":"Giveth.io Testing Guidelines","description":"This guide provides a framework for testing the Giveth.io DApp."},"testingGIVeconomy":{"id":"testingGIVeconomy","title":"GIVeconomy Testing Guidelines","description":"This is a guide for thorough user testing scenarios for the GIVeconomy DApp. Testing should be done on the staging server which can be found at https://staging.giveth.io/."},"torusonramp":{"id":"torusonramp","title":"Donating with Fiat via the Torus on-ramp","description":""},"torusUserGuide":{"id":"torusUserGuide","title":"Using the Torus Wallet","description":"The Torus wallet is a great option for newcomers to crypto. Using web3 technology it allows you to create an Ethereum wallet that\'s linked to your identity via your chosen social media platform. With the Torus wallet, you can send and receive cryptocurrencies and buy crypto with fiat currency using the Torus \\"wallet top-up\\" option."},"traceContracts":{"id":"traceContracts","title":"Contracts, Bridges and Multisigs Technical Information","description":"Contracts:","sidebar":"dapps"},"TRACEinstallation":{"id":"TRACEinstallation","title":"Installing Giveth TRACE for Local Development","description":"This is a comprehensive guide that will walk through new contributors on how to run Giveth TRACE locally. We\'ll be dealing with 2 repos found in the Giveth Github: the giveth-dapp for the front-end and feathers-giveth for smart contract interfacing and the back-end database."},"troubleshooting":{"id":"troubleshooting","title":"Troubleshooting","description":"","sidebar":"dapps"}}}')}}]); \ No newline at end of file diff --git a/assets/js/e0473e90.ff6d18a8.js b/assets/js/e0473e90.ff6d18a8.js deleted file mode 100644 index 7aa38666c6..0000000000 --- a/assets/js/e0473e90.ff6d18a8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[8020],{7545:e=>{e.exports=JSON.parse('{"pluginId":"dapps","version":"current","label":"Next","banner":null,"badge":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"dapps":[{"type":"category","label":"Giveth.io Guides","items":[{"type":"link","label":"Intro to Giveth.io","href":"/dapps/givethIO","docId":"givethIO"},{"type":"link","label":"Getting started","href":"/dapps/gettingStarted","docId":"gettingStarted"},{"type":"category","label":"For Donors","collapsed":true,"items":[{"type":"link","label":"Making a Donation","href":"/dapps/projectdonating","docId":"projectdonating"},{"type":"link","label":"Donating with Metamask","href":"/dapps/donatingmetamask","docId":"donatingmetamask"},{"type":"link","label":"MultiSig Wallets on Giveth","href":"/dapps/multisigs","docId":"multisigs"},{"type":"link","label":"Import Torus Private Key into Metamask","href":"/dapps/importTorusMM","docId":"importTorusMM"}],"collapsible":true,"href":"/dapps/projectdonating"},{"type":"category","label":"For Project Owners","collapsed":true,"items":[{"type":"link","label":"Create a project","href":"/dapps/createproject","docId":"createproject"},{"type":"link","label":"Project Quality Assurance Guide","href":"/dapps/listedUnlisted","docId":"listedUnlisted"},{"type":"link","label":"Project Verification Processes and Guidelines","href":"/dapps/projectVerification","docId":"projectVerification"},{"type":"link","label":"Adding Updates to Your Project","href":"/dapps/projectUpdates","docId":"projectUpdates"}],"collapsible":true,"href":"/dapps/createproject"},{"type":"category","label":"GIVeconomy","items":[{"type":"link","label":"GIVbacks","href":"/giveconomy/givbacks","docId":"givbacks"},{"type":"link","label":"GIVstream","href":"/giveconomy/givstream","docId":"givstream"},{"type":"link","label":"GIVpower","href":"/giveconomy/givpower","docId":"givpower"},{"type":"category","label":"GIVgarden","items":[{"type":"link","label":"Terms & Conditions for Submitting or Challenging a Proposal","href":"/giveconomy/termsForProposals","docId":"termsForProposals"}],"collapsed":true,"collapsible":true,"href":"/giveconomy/givgarden"},{"type":"category","label":"GIVfarm","items":[{"type":"link","label":"Regen Farms","href":"/regenFarms","docId":"regenFarms"},{"type":"link","label":"The Angel Vault (Deprecated)","href":"/angelVault","docId":"angelVault"}],"collapsed":true,"collapsible":true,"href":"/giveconomy/givfarm"},{"type":"link","label":"GIVdrop (Finished)","href":"/giveconomy/givdrop","docId":"givdrop"}],"collapsed":true,"collapsible":true,"href":"/giveconomy/"},{"type":"link","label":"Recurring Donations","href":"/dapps/recurringDonation","docId":"recurringDonation"},{"type":"link","label":"Quadratic Funding","href":"/quadraticfunding","docId":"quadraticfunding"},{"type":"link","label":"The Givers PFP Collection","href":"/dapps/giverspfp","docId":"giverspfp"},{"type":"link","label":"$nice Token","href":"/giveconomy/niceToken","docId":"niceToken"},{"type":"link","label":"Responsible Disclosure","href":"/security/responsible-disclosure","docId":"disclosure"},{"type":"link","label":"Troubleshooting","href":"/dapps/troubleshooting","docId":"troubleshooting"},{"type":"category","label":"Developer Guides","items":[{"type":"link","label":"Contributing to Giveth Development","href":"/dapps/contributors","docId":"contributors"},{"type":"link","label":"Installing Giveth.io for Local Development","href":"/dapps/givethioinstallation","docId":"givethioinstallation"},{"type":"category","label":"Giveth TRACE (Deprecated)","items":[{"type":"link","label":"Installing Giveth TRACE for Local Development","href":"/dapps/TRACEinstallation","docId":"TRACEinstallation"},{"type":"link","label":"Giveth Bridge Security Implementation","href":"/dapps/bridgeSecurity","docId":"bridgeSecurity"},{"type":"link","label":"Development Process","href":"/dapps/developmentProcess","docId":"developmentProcess"}],"collapsed":true,"collapsible":true},{"type":"link","label":"Regen Farm Smart Contract Guide","href":"/dapps/regenFarmContracts","docId":"regenFarmContracts"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Giveth TRACE (Deprecated)","items":[{"type":"link","label":"Giveth Entities and Roles","href":"/dapps/entitiesAndRoles","docId":"entitiesAndRoles"},{"type":"link","label":"Getting your project on TRACE","href":"/dapps/makeTraceableProject","docId":"makeTraceableProject"},{"type":"link","label":"Leaving Traces (formerly Creating Milestones)","href":"/dapps/leavingTraces","docId":"leavingTraces"},{"type":"link","label":"Technical White Paper","href":"/technicalWhitePaper","docId":"technicalWhitePaper"},{"type":"link","label":"Exchange Rates","href":"/dapps/exchangeRates","docId":"exchangeRates"},{"type":"link","label":"Contracts, Bridges and Multisigs Technical Information","href":"/dapps/traceContracts","docId":"traceContracts"}],"collapsed":true,"collapsible":true,"href":"/dapps/introTrace"}],"collapsed":true,"collapsible":true,"href":"/dapps/"}]},"docs":{"angelVault":{"id":"angelVault","title":"The Angel Vault (Deprecated)","description":"Then Angel Vault has been deprecated. This documentation will remain purely for historical reference.","sidebar":"dapps"},"bridgeSecurity":{"id":"bridgeSecurity","title":"Giveth Bridge Security Implementation","description":"A technical overview of the features, roles and theory behind the security of the Giveth Bridge.","sidebar":"dapps"},"contributors":{"id":"contributors","title":"Contributing to Giveth Development","description":"Giveth currently maintains three products that focus on funding management, peer to peer donations, and DeFi for-good token economics. These are Giveth TRACE, Giveth.io and the GIVeconomy respectively","sidebar":"dapps"},"createproject":{"id":"createproject","title":"Create a project","description":"","sidebar":"dapps"},"crypto":{"id":"crypto","title":"Cryptocurrency donations","description":"What is and why Cryptocurrency?"},"developmentProcess":{"id":"developmentProcess","title":"Development Process","description":"This section details the Giveth TRACE development process, deployments, and how merging and testing is handled.","sidebar":"dapps"},"disclosure":{"id":"disclosure","title":"Responsible Disclosure","description":"Smart Contract security","sidebar":"dapps"},"donatingmetamask":{"id":"donatingmetamask","title":"Donating with Metamask","description":"","sidebar":"dapps"},"entitiesAndRoles":{"id":"entitiesAndRoles","title":"Giveth Entities and Roles","description":"Content and ideas have been modified from this excellent article \u201cAn Overview of the Giveth Donation Application\u201d authored by Kris Decoodt in 2017. Many things have been revised and modified since 2017. Here we breakdown the DApp as it is in 2022.","sidebar":"dapps"},"exchangeRates":{"id":"exchangeRates","title":"Exchange Rates","description":"When you leave a Trace within Giveth TRACE, you can enter an amount in ether or in fiat. Our system then automatically calculates the conversion rate based on the date of the Trace.","sidebar":"dapps"},"faq":{"id":"faq","title":"Frequently Asked Questions","description":"General"},"gettingStarted":{"id":"gettingStarted","title":"Getting started","description":"","sidebar":"dapps"},"givbacks":{"id":"givbacks","title":"GIVbacks","description":"GIVbacks Reloaded!","sidebar":"dapps"},"givdrop":{"id":"givdrop","title":"GIVdrop (Finished)","description":"The GIVdrop has finished. Any airdropped tokens are no longer eligible to be claimed since January, 2023. This documentation will remain purely for historical reference.","sidebar":"dapps"},"giveconomy":{"id":"giveconomy","title":"GIVeconomy","description":"Giveth is building a culture of giving that empowers and rewards those who give -- to projects, to society, and to the world. We aim to inspire our community to participate in an ecosystem of collective support, abundance and value-creation.","sidebar":"dapps"},"giverspfp":{"id":"giverspfp","title":"The Givers PFP Collection","description":"\u201cThe Givers\u201d NFT\u2019s are not just NFT\u2019s but integrated Giveth PFPs! Giveth\'s first PFP collection was a community proposed initiative begun in March 2022. The intention of the PFP collection is to raise funds for the Giveth DAO and continue our mission of building the Future of Giving. The Givers was launched for public minting on March 24, 2023 at 11am CST.","sidebar":"dapps"},"givethIO":{"id":"givethIO","title":"Intro to Giveth.io","description":"Giveth.io, launched in March 2021, offers a simple and streamlined way for the world to donate to for-good projects via the Ethereum Blockchain.","sidebar":"dapps"},"givethioinstallation":{"id":"givethioinstallation","title":"Installing Giveth.io for Local Development","description":"This guide will document the steps to set up and run Giveth.io locally for the purposes of development. The setup process was documented using Ubuntu 20.04 LTS.","sidebar":"dapps"},"givethMatchingPool":{"id":"givethMatchingPool","title":"Giveth Matching Pool","description":"The Giveth Matching Pool is raising funds for future donation matching to\xa0verified projects\xa0on Giveth! It is a one-stop-shop for donors who want to ensure their donation has a broad impact."},"givfarm":{"id":"givfarm","title":"GIVfarm","description":"On October 29, 2022, the GIVfarm was exploited on ETH Mainnet, all funds in the Mainnet farming contracts were drained and stolen. The Giveth Community voted subsequently to not restart any of the affected farms. Currently most GIV liqudity farming programs have ended since, with the exception of GIVpower Staking, there are no plans to launch any new GIVfarm programs in the future. However there are still opportunities to earn liquidity rewards through the RegenFarm program.","sidebar":"dapps"},"givgarden":{"id":"givgarden","title":"GIVgarden (Deprecated)","description":"**The GIVgarden was deprecated as of March 7th 2024. Find the most current info for Giveth Governance in our related documentation.**","sidebar":"dapps"},"givpower":{"id":"givpower","title":"GIVpower","description":"GIVpower was created to build a win-win relationship between projects & donors. GIV holders get GIVpower and earn a yield when they stake and - if they choose - lock GIV in the GIVfarm. They will eventually be able to use their GIVpower to \u201cboost\u201d projects on Giveth and help improve their ranking. Top ranked projects will get benefits on the platform. Initially their donors will get more GIVbacks, and eventually, they will get matching funds and other benefits.","sidebar":"dapps"},"givstream":{"id":"givstream","title":"GIVstream","description":"Welcome to the expanding GIViverse! The GIVstream aligns community members with the long term success of Giveth and the GIVeconomy. With the GIVstream, anyone who adds value to the GIVeconomy receives GIV continuously for up to 5 years from the GIVeconomy launch date. The GIVeconomy begins humbly, but as time passes, the GIViverse expands: More GIV becomes liquid is streamed to our community of GIVernauts.","sidebar":"dapps"},"importTorusMM":{"id":"importTorusMM","title":"Import Torus Private Key into Metamask","description":"The purpose of this guide is to explain how to import Torus private key into a MetaMask wallet, thereby enabling broader functionality and easier access to decentralized applications (dApps).","sidebar":"dapps"},"installGIVeconomy":{"id":"installGIVeconomy","title":"Installing the GIVeconomy Front-End","description":"You can find the Github repository containing the GIVeconomy front-end at https://github.com/Giveth/liquidity-mining-dapp."},"introTrace":{"id":"introTrace","title":"Intro to Giveth TRACE","description":"Giveth is re-engineering charitable giving, by creating entirely free, open-source platforms, built on the Ethereum Blockchain. Giveth TRACE cuts out bureaucracy and enables makers to create a high level of transparency and accountability for Givers. The basic donation hierarchy of Communities, Campaigns and Traces allows for users to specify the scope of their donation. There are multiple reviewer roles and security check points that allow Givers and Makers to use our DApp with confidence. You can read more about the basic components and the logic behind our DApp (Donation Application) in this post.","sidebar":"dapps"},"leavingTraces":{"id":"leavingTraces","title":"Leaving Traces (formerly Creating Milestones)","description":"Welcome! If you are super new to Giveth, join the #\ud83d\udd28contribute channel on Discord. You can introduce yourself and ask questions there! This is a living document and will change as bugs are fixed and features added to the DApp.","sidebar":"dapps"},"listedUnlisted":{"id":"listedUnlisted","title":"Project Quality Assurance Guide","description":"In order to ensure the quality of projects on our DApp, we have implemented a processus for pre-screening projects before they are featured on the Giveth homepage. All new projects are initially unlisted until they are reviewed and approved by a Giveth Unicorn. Unlisted projects can still receive donations and can be accessed via the project\'s URL. However, only listed projects will appear on the Giveth homepage & projects page, and using our sort, filter and search functionalities.","sidebar":"dapps"},"makeTraceableProject":{"id":"makeTraceableProject","title":"Getting your project on TRACE","description":"This guide will show you how to make your project traceable. We will go over the steps for first getting your project verified then upgrading it into a Campaign on Giveth TRACE.","sidebar":"dapps"},"multisigs":{"id":"multisigs","title":"MultiSig Wallets on Giveth","description":"It is possible to use Giveth with your Safe Multisig Wallet. However there are a few steps to get setup and a few things to keep in mind. If you don\'t know what a multisig wallet is or how to make one, check out the Safe documentation for Getting Started with Multisig Wallets.","sidebar":"dapps"},"niceToken":{"id":"niceToken","title":"$nice Token","description":"The $nice token was launched in Q3 2022 in an effort to promote direct donations to the Giveth Organization.","sidebar":"dapps"},"projectdonating":{"id":"projectdonating","title":"Making a Donation","description":"","sidebar":"dapps"},"projectUpdates":{"id":"projectUpdates","title":"Adding Updates to Your Project","description":"Are you the proud owner of a verified project on Giveth? If so, it\'s important to keep your donors in the loop and maintain your active status by posting updates every 3 months.","sidebar":"dapps"},"projectVerification":{"id":"projectVerification","title":"Project Verification Processes and Guidelines","description":"Giveth is progressively decentralizing its system of reviewing projects for legitimacy and determining if they are providing a public good. This system determines which projects provide rewards to their donors to those projects via the GIVbacks program as well as which projects are eligible to be boosted with GIVpower.","sidebar":"dapps"},"quadraticfunding":{"id":"quadraticfunding","title":"Quadratic Funding","description":"What is Quadratic Funding?","sidebar":"dapps"},"recurringDonation":{"id":"recurringDonation","title":"Recurring Donations","description":"On Giveth you can use the power of Superfluid to create recurring donations to projects. This allows you to provide continuous support over a long-period to your favourite projects. In this article we will explain the key concepts of recurring donations and how to interact with them on the Giveth Dapp.","sidebar":"dapps"},"referral":{"id":"referral","title":"Giveth Referral Program","description":"The Giveth referral program is a way for users to earn rewards by inviting their friends and network to donate to impact projects. Since the launch of the GIVeconomy in 2020, donors can earn GIV tokens when they donate to verified projects thanks to our GIVbacks program. With our referral program, users can earn even more rewards!"},"regenFarmContracts":{"id":"regenFarmContracts","title":"Regen Farm Smart Contract Guide","description":"GIVeconomy is a collection of audited smart contracts which work together to provide capabilities, including: token streaming, airdropping, and various types of farming. Contracts and scripts can be found at the Giveth giv-token-contracts repository.","sidebar":"dapps"},"regenFarms":{"id":"regenFarms","title":"Regen Farms","description":"RegenFarms is the next generation of ReFi liquidity mining opportunities for DAOs and regens alike. Using our contracts for the GIVfarm and the GIVstream, we are empowering other for-good DAOs to launch liquidity mining incentive programs, \u201cRegenFarms\u201d, with streams of their own.","sidebar":"dapps"},"styleguide":{"id":"styleguide","title":"Style Guide","description":"Giveth Design by @markoprljic."},"technicalWhitePaper":{"id":"technicalWhitePaper","title":"Technical White Paper","description":"The purpose of our technology is to give cryptocurrency users the ability to donate effortlessly to Campaigns focused on making the world a better place. They can use the Giveth platform to find those Campaigns and donate directly, or they can pledge their crypto to a cause and have a Delegate choose an appropriate Campaign or Trace for them. As an alternative to traditional donation systems, our Liquid Pledging contract allows Givers to take back their pledge if they disagree with how their donations were allocated. This can only occur before it has been locked into a Campaign for a specific purpose.","sidebar":"dapps"},"termsForProposals":{"id":"termsForProposals","title":"Terms & Conditions for Submitting or Challenging a Proposal","description":"1. ACCEPTANCE OF TERMS","sidebar":"dapps"},"testing-guidelines":{"id":"testing-guidelines","title":"Giveth.io Testing Guidelines","description":"This guide provides a framework for testing the Giveth.io DApp."},"testingGIVeconomy":{"id":"testingGIVeconomy","title":"GIVeconomy Testing Guidelines","description":"This is a guide for thorough user testing scenarios for the GIVeconomy DApp. Testing should be done on the staging server which can be found at https://staging.giveth.io/."},"torusonramp":{"id":"torusonramp","title":"Donating with Fiat via the Torus on-ramp","description":""},"torusUserGuide":{"id":"torusUserGuide","title":"Using the Torus Wallet","description":"The Torus wallet is a great option for newcomers to crypto. Using web3 technology it allows you to create an Ethereum wallet that\'s linked to your identity via your chosen social media platform. With the Torus wallet, you can send and receive cryptocurrencies and buy crypto with fiat currency using the Torus \\"wallet top-up\\" option."},"traceContracts":{"id":"traceContracts","title":"Contracts, Bridges and Multisigs Technical Information","description":"Contracts:","sidebar":"dapps"},"TRACEinstallation":{"id":"TRACEinstallation","title":"Installing Giveth TRACE for Local Development","description":"This is a comprehensive guide that will walk through new contributors on how to run Giveth TRACE locally. We\'ll be dealing with 2 repos found in the Giveth Github: the giveth-dapp for the front-end and feathers-giveth for smart contract interfacing and the back-end database.","sidebar":"dapps"},"troubleshooting":{"id":"troubleshooting","title":"Troubleshooting","description":"","sidebar":"dapps"}}}')}}]); \ No newline at end of file diff --git a/assets/js/f45b2fb8.bd0d7560.js b/assets/js/f45b2fb8.bd0d7560.js deleted file mode 100644 index 61254912e5..0000000000 --- a/assets/js/f45b2fb8.bd0d7560.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[7684],{3905:(e,t,n)=>{n.d(t,{Zo:()=>h,kt:()=>p});var i=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=i.createContext({}),d=function(e){var t=i.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},h=function(e){var t=d(e.components);return i.createElement(l.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},u=i.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,l=e.parentName,h=s(e,["components","mdxType","originalType","parentName"]),u=d(n),p=a,m=u["".concat(l,".").concat(p)]||u[p]||c[p]||r;return n?i.createElement(m,o(o({ref:t},h),{},{components:n})):i.createElement(m,o({ref:t},h))}));function p(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,o=new Array(r);o[0]=u;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:a,o[1]=s;for(var d=2;d{n.d(t,{ZP:()=>o});var i=n(7462),a=(n(7294),n(3905));const r={toc:[]};function o(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,i.Z)({},r,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,(0,a.kt)("em",{parentName:"p"},(0,a.kt)("strong",{parentName:"em"},"Giveth TRACE has officially been deprecated. After 5 years of faithful service, Giveth and its platform, services and products have fully migrated to ",(0,a.kt)("a",{parentName:"strong",href:"https://giveth.io"},"Giveth.io"),". With the deprecation of the Rinkeby network and low user activity, the Giveth DAO decided to sunset its original dApp in Q3 of 2022. The code has and will forever be open-source, and you can find it in ",(0,a.kt)("a",{parentName:"strong",href:"https://github.com/Giveth"},"Giveth's Github repositories"),"."))),(0,a.kt)("p",null,(0,a.kt)("em",{parentName:"p"},(0,a.kt)("strong",{parentName:"em"},"This documentation will remain available for historical reference."))),(0,a.kt)("hr",null))}o.isMDXComponent=!0},7860:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>l,default:()=>p,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var i=n(7462),a=(n(7294),n(3905)),r=n(4996),o=n(8932);const s={id:"bridgeSecurity",title:"Giveth Bridge Security Implementation",slug:"dapps/bridgeSecurity"},l=void 0,d={unversionedId:"bridgeSecurity",id:"bridgeSecurity",title:"Giveth Bridge Security Implementation",description:"A technical overview of the features, roles and theory behind the security of the Giveth Bridge.",source:"@site/dapps/bridgeSecurity.md",sourceDirName:".",slug:"/dapps/bridgeSecurity",permalink:"/dapps/bridgeSecurity",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/bridgeSecurity.md",tags:[],version:"current",lastUpdatedBy:"Mitch Oz",lastUpdatedAt:1667254190,formattedLastUpdatedAt:"Oct 31, 2022",frontMatter:{id:"bridgeSecurity",title:"Giveth Bridge Security Implementation",slug:"dapps/bridgeSecurity"},sidebar:"dapps",previous:{title:"Installing Giveth TRACE for Local Development",permalink:"/dapps/TRACEinstallation"},next:{title:"Development Process",permalink:"/dapps/developmentProcess"}},h={},c=[{value:"A technical overview of the features, roles and theory behind the security of the Giveth Bridge.",id:"a-technical-overview-of-the-features-roles-and-theory-behind-the-security-of-the-giveth-bridge",level:4},{value:"What is the Giveth Bridge, exactly?",id:"what-is-the-giveth-bridge-exactly",level:3},{value:"How does it work?",id:"how-does-it-work",level:3},{value:"Security Roles",id:"security-roles",level:2},{value:"Mainnet Owner",id:"mainnet-owner",level:3},{value:"Mainnet Funding and EscapeHatch Destination",id:"mainnet-funding-and-escapehatch-destination",level:3},{value:"Security Guard",id:"security-guard",level:3},{value:"Mainnet EscapeHatchCaller",id:"mainnet-escapehatchcaller",level:3},{value:"Allowed Spenders",id:"allowed-spenders",level:3},{value:"ForeignGivethBridge Owner",id:"foreigngivethbridge-owner",level:3},{value:"Rinkeby DappGod Multisig",id:"rinkeby-dappgod-multisig",level:3},{value:"Rinkeby EscapeHatchCaller",id:"rinkeby-escapehatchcaller",level:3},{value:"Possible Security Issue Scenarios",id:"possible-security-issue-scenarios",level:2}],u={toc:c};function p(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,i.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)(o.ZP,{mdxType:"TraceDeprecated"}),(0,a.kt)("h4",{id:"a-technical-overview-of-the-features-roles-and-theory-behind-the-security-of-the-giveth-bridge"},"A technical overview of the features, roles and theory behind the security of the Giveth Bridge."),(0,a.kt)("p",null,(0,a.kt)("em",{parentName:"p"},"This document assumes that the reader has basic knowledge of smart contracts, multisig contracts and Ethereum testnet chains.")),(0,a.kt)("h3",{id:"what-is-the-giveth-bridge-exactly"},"What is the Giveth Bridge, exactly?"),(0,a.kt)("p",null,"The bridge has 3 parts: A contract on the Ethereum Mainnet, a contract on the Rinkeby Testnet, and an off-chain service that connects these two contracts. The off-chain service listens for events from these contracts and relays commands from one contract to the other."),(0,a.kt)("img",{id:"contentimg",alt:"Giveth TRACE Bridge Flow",src:(0,r.Z)("img/content/trace/givethbridge.png")}),(0,a.kt)("h3",{id:"how-does-it-work"},"How does it work?"),(0,a.kt)("p",null,"The Giveth Bridge contract on mainnet is simply a vault contract with 1 extra security measure and a few modifications to make it function as a bridge. Payments are only paid out under certain conditions. Every bridge payment has a standard 48-hour time lockout before payment can occur."),(0,a.kt)("p",null,"During this time, the Security Guard has the ability to delay a payment further than the standard 48 hours - up to 30 days. This allows time to determine whether or not a payment needs to be cancelled. No payments can be issued without a check-in from the Security Guard happening XX minutes after the payment was requested. This check-in will happen daily so as not to delay authorized payments."),(0,a.kt)("p",null,"There is also an ",(0,a.kt)("inlineCode",{parentName:"p"},"escapeHatch")," that can be called by an ",(0,a.kt)("inlineCode",{parentName:"p"},"escapeHatchCaller")," to send the funds in the bridge to the funding multisig during the 48 hour delay, or any additional delay generated by the Security Guard."),(0,a.kt)("p",null,"This funding multisig will for some time also hold funds to diversify risk between the Bridge contract and the Consensus Multisig contract, when the bridge is holding too much value the funding multisig will ",(0,a.kt)("inlineCode",{parentName:"p"},"escapeFunds()")," out of the bridge and when the bridge is getting low, the funding multisig will manually top it off."),(0,a.kt)("p",null,"Donations and withdrawals will happen directly out of the bridge. When a donation is made to the bridge, a token is created by the TokenFactory (at 1:1 ETH) and sent to LiquidPledging, where the decisions are made about spending. When a payment is called for, tokens are sent from Liquid Pledging and burned by the ForeignGivethBridge, at which point the command is issued back across the Ghetto Bridge using the Bridge Key to the Giveth Bridge to issue a payment."),(0,a.kt)("p",null,"In case for some reason the bridge goes down, the listener service will issue alarms to notify of a service interruption. The listener service will also create an alarm if tokens are created without a corresponding donation, or if tokens are not created at the time of a donation."),(0,a.kt)("h2",{id:"security-roles"},"Security Roles"),(0,a.kt)("h3",{id:"mainnet-owner"},"Mainnet Owner"),(0,a.kt)("p",null,"This is the Giveth multisig that can issue control commands to the bridge. They can cancel any payment and can boot the Security Guard or remove the approved spender (bridge key)."),(0,a.kt)("h3",{id:"mainnet-funding-and-escapehatch-destination"},"Mainnet Funding and EscapeHatch Destination"),(0,a.kt)("p",null,"This multisig is used to both send funds to the Mainnet Bridge (Vault) and act as the destination for the EscapeHatch Call."),(0,a.kt)("h3",{id:"security-guard"},"Security Guard"),(0,a.kt)("p",null,"Keeps watch over all requested payments, checks in each day, and delays suspicious payments."),(0,a.kt)("h3",{id:"mainnet-escapehatchcaller"},"Mainnet EscapeHatchCaller"),(0,a.kt)("p",null,"This is a 1 of x multisig that can trigger the vault to dump its funds to a predetermined wallet. We have people that are scattered across the world, multiple points of contacts that can do this."),(0,a.kt)("h3",{id:"allowed-spenders"},"Allowed Spenders"),(0,a.kt)("p",null,"These addresses are a whitelist who can issue a payment request to the bridge contract. In the application the bridge key is the only Allowed Spender."),(0,a.kt)("h3",{id:"foreigngivethbridge-owner"},"ForeignGivethBridge Owner"),(0,a.kt)("p",null,"The bridge key."),(0,a.kt)("h3",{id:"rinkeby-dappgod-multisig"},"Rinkeby DappGod Multisig"),(0,a.kt)("p",null,"This multisig controls updates and has total access to control the ForeignGivethBridge. It also acts as the ",(0,a.kt)("inlineCode",{parentName:"p"},"escapeHatchDestination")," for the ForeignGivethBridge and Liquid Pledging."),(0,a.kt)("h3",{id:"rinkeby-escapehatchcaller"},"Rinkeby EscapeHatchCaller"),(0,a.kt)("p",null,"This is a 1 of x multisig that can trigger the ForeignGivethBridge and Liquid Pledging contracts to dump their tokens to a predetermined wallet."),(0,a.kt)("h2",{id:"possible-security-issue-scenarios"},"Possible Security Issue Scenarios"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Bridge Key is compromised:"),"\nA hacker could use bridge key to create transactions sending ETH to their own address to force transactions through. The Security Guard can delay these payments long enough for the owner multisig to cancel the payment and remove the compromised key on Mainnet."),(0,a.kt)("p",null,"They could also create GivETH tokens as the token controller on the rinkeby side. The listener service would catch this though and sound the alarm any time GivETH tokens are generated without a corresponding Ether donation. (also sounds an alarm if the bridge key service decided to take a nap and doesn\u2019t create GivETH tokens when a donation is received.)"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Owner multisig has a bug and is able to be taken over (like the parity hack) or 6 keys out of 11 of the keys are compromised:"),"\nThis is highly unlikely but if this happens there will be no loss of funds. This multisig doesn't hold any funds, it only controls the bridge. Tt could reduce the 48 hour delay to 25 hours, the Security Guard can still delay any payments but the Security Guard can be replaced by the owner. Funds could be escaped within the 25 hours in this scenario."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"EscapeHatchCaller keys get compromised:"),"\nIn this case the worst thing that can happen is that the flow of the DApp on Rinkeby can be disrupted. This can be repaired however, by removing the compromised key on the EscapeHatch 1 of x multisig, and DAppGod. Once that is done then simply sending the giveth tokens back to the address from which they came, a similar scenario is possible on Mainnet. The EscapeHatch Caller can only move money to an escape destination, and nowhere else. If a key is compromised the worst thing they can do is to remove all owners and themselves from the EscapeHatch multisig, but the owner 6 of 11 multisig on main net can still call the EscapeHatch and can replace the EscapeHatch caller and the 3 of 5 multisig on rinkeby can as well."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Funding multisig has a bug and is able to be taken over (like the parity hack) or 4 keys out of 7 of the keys are compromised:"),"\nThis is extremely unlikely but if this happens there will be a loss of funds. The loss however, would not be catastrophic as funds are split between the bridge and the multisig."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Bridge on mainnet has a bug that lets someone else take over as owner:"),"\nThe 48 hour delay can be only be reduced to 25 hours Security Guard can still delay any payments but the Security Guard can be replaced by the owner. Funds could be escaped within 25 hours in this scenario."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"DAppGod Multisig on the testnet decides to take over:"),"\nIf this were to occur, the EscapeHatch from the bridge would prevent any loss of funds, and the testnet set up could be manually redeployed."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"What if the Security Guard\u2019s key and Bridge Key Controller both get compromised (or their holders collude to steal funds)"),":\nThe Owner multisig can cancel payments and extend the time delay to longer than 48 hours. In this scenario though they probably wouldn't have to because the bridge funds can be escaped to the funding multisig. This is the only scenario that could be a serious risk to the funds in the bridge vault. This could be averted within 48 hours of the event starting because of the default delay and that funds can be escaped during that period."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Finally, what if the Event Listener falls off-line just previous to any of the aforementioned attacks that trigger alarms on compromise?"),"\nThe Security Guard should see any suspicious transactions and be able to delay payments until they are dealt with."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f45b2fb8.cd5c3a57.js b/assets/js/f45b2fb8.cd5c3a57.js new file mode 100644 index 0000000000..e360aab9a7 --- /dev/null +++ b/assets/js/f45b2fb8.cd5c3a57.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[7684],{3905:(e,t,n)=>{n.d(t,{Zo:()=>h,kt:()=>p});var i=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=i.createContext({}),d=function(e){var t=i.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},h=function(e){var t=d(e.components);return i.createElement(l.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},u=i.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,l=e.parentName,h=s(e,["components","mdxType","originalType","parentName"]),u=d(n),p=a,g=u["".concat(l,".").concat(p)]||u[p]||c[p]||r;return n?i.createElement(g,o(o({ref:t},h),{},{components:n})):i.createElement(g,o({ref:t},h))}));function p(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,o=new Array(r);o[0]=u;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:a,o[1]=s;for(var d=2;d{n.d(t,{ZP:()=>o});var i=n(7462),a=(n(7294),n(3905));const r={toc:[]};function o(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,i.Z)({},r,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,(0,a.kt)("em",{parentName:"p"},(0,a.kt)("strong",{parentName:"em"},"Giveth TRACE has officially been deprecated. After 5 years of faithful service, Giveth and its platform, services and products have fully migrated to ",(0,a.kt)("a",{parentName:"strong",href:"https://giveth.io"},"Giveth.io"),". With the deprecation of the Rinkeby network and low user activity, the Giveth DAO decided to sunset its original dApp in Q3 of 2022. The code has and will forever be open-source, and you can find it in ",(0,a.kt)("a",{parentName:"strong",href:"https://github.com/Giveth"},"Giveth's Github repositories"),"."))),(0,a.kt)("p",null,(0,a.kt)("em",{parentName:"p"},(0,a.kt)("strong",{parentName:"em"},"This documentation will remain available for historical reference."))),(0,a.kt)("hr",null))}o.isMDXComponent=!0},7860:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>l,default:()=>p,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var i=n(7462),a=(n(7294),n(3905)),r=n(4996),o=n(8932);const s={id:"bridgeSecurity",title:"Giveth Bridge Security Implementation",slug:"dapps/bridgeSecurity"},l=void 0,d={unversionedId:"bridgeSecurity",id:"bridgeSecurity",title:"Giveth Bridge Security Implementation",description:"A technical overview of the features, roles and theory behind the security of the Giveth Bridge.",source:"@site/dapps/bridgeSecurity.md",sourceDirName:".",slug:"/dapps/bridgeSecurity",permalink:"/dapps/bridgeSecurity",draft:!1,editUrl:"https://github.com/giveth/giveth-docs/edit/master/dapps/bridgeSecurity.md",tags:[],version:"current",lastUpdatedBy:"Mitch Oz",lastUpdatedAt:1667254190,formattedLastUpdatedAt:"Oct 31, 2022",frontMatter:{id:"bridgeSecurity",title:"Giveth Bridge Security Implementation",slug:"dapps/bridgeSecurity"}},h={},c=[{value:"A technical overview of the features, roles and theory behind the security of the Giveth Bridge.",id:"a-technical-overview-of-the-features-roles-and-theory-behind-the-security-of-the-giveth-bridge",level:4},{value:"What is the Giveth Bridge, exactly?",id:"what-is-the-giveth-bridge-exactly",level:3},{value:"How does it work?",id:"how-does-it-work",level:3},{value:"Security Roles",id:"security-roles",level:2},{value:"Mainnet Owner",id:"mainnet-owner",level:3},{value:"Mainnet Funding and EscapeHatch Destination",id:"mainnet-funding-and-escapehatch-destination",level:3},{value:"Security Guard",id:"security-guard",level:3},{value:"Mainnet EscapeHatchCaller",id:"mainnet-escapehatchcaller",level:3},{value:"Allowed Spenders",id:"allowed-spenders",level:3},{value:"ForeignGivethBridge Owner",id:"foreigngivethbridge-owner",level:3},{value:"Rinkeby DappGod Multisig",id:"rinkeby-dappgod-multisig",level:3},{value:"Rinkeby EscapeHatchCaller",id:"rinkeby-escapehatchcaller",level:3},{value:"Possible Security Issue Scenarios",id:"possible-security-issue-scenarios",level:2}],u={toc:c};function p(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,i.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)(o.ZP,{mdxType:"TraceDeprecated"}),(0,a.kt)("h4",{id:"a-technical-overview-of-the-features-roles-and-theory-behind-the-security-of-the-giveth-bridge"},"A technical overview of the features, roles and theory behind the security of the Giveth Bridge."),(0,a.kt)("p",null,(0,a.kt)("em",{parentName:"p"},"This document assumes that the reader has basic knowledge of smart contracts, multisig contracts and Ethereum testnet chains.")),(0,a.kt)("h3",{id:"what-is-the-giveth-bridge-exactly"},"What is the Giveth Bridge, exactly?"),(0,a.kt)("p",null,"The bridge has 3 parts: A contract on the Ethereum Mainnet, a contract on the Rinkeby Testnet, and an off-chain service that connects these two contracts. The off-chain service listens for events from these contracts and relays commands from one contract to the other."),(0,a.kt)("img",{id:"contentimg",alt:"Giveth TRACE Bridge Flow",src:(0,r.Z)("img/content/trace/givethbridge.png")}),(0,a.kt)("h3",{id:"how-does-it-work"},"How does it work?"),(0,a.kt)("p",null,"The Giveth Bridge contract on mainnet is simply a vault contract with 1 extra security measure and a few modifications to make it function as a bridge. Payments are only paid out under certain conditions. Every bridge payment has a standard 48-hour time lockout before payment can occur."),(0,a.kt)("p",null,"During this time, the Security Guard has the ability to delay a payment further than the standard 48 hours - up to 30 days. This allows time to determine whether or not a payment needs to be cancelled. No payments can be issued without a check-in from the Security Guard happening XX minutes after the payment was requested. This check-in will happen daily so as not to delay authorized payments."),(0,a.kt)("p",null,"There is also an ",(0,a.kt)("inlineCode",{parentName:"p"},"escapeHatch")," that can be called by an ",(0,a.kt)("inlineCode",{parentName:"p"},"escapeHatchCaller")," to send the funds in the bridge to the funding multisig during the 48 hour delay, or any additional delay generated by the Security Guard."),(0,a.kt)("p",null,"This funding multisig will for some time also hold funds to diversify risk between the Bridge contract and the Consensus Multisig contract, when the bridge is holding too much value the funding multisig will ",(0,a.kt)("inlineCode",{parentName:"p"},"escapeFunds()")," out of the bridge and when the bridge is getting low, the funding multisig will manually top it off."),(0,a.kt)("p",null,"Donations and withdrawals will happen directly out of the bridge. When a donation is made to the bridge, a token is created by the TokenFactory (at 1:1 ETH) and sent to LiquidPledging, where the decisions are made about spending. When a payment is called for, tokens are sent from Liquid Pledging and burned by the ForeignGivethBridge, at which point the command is issued back across the Ghetto Bridge using the Bridge Key to the Giveth Bridge to issue a payment."),(0,a.kt)("p",null,"In case for some reason the bridge goes down, the listener service will issue alarms to notify of a service interruption. The listener service will also create an alarm if tokens are created without a corresponding donation, or if tokens are not created at the time of a donation."),(0,a.kt)("h2",{id:"security-roles"},"Security Roles"),(0,a.kt)("h3",{id:"mainnet-owner"},"Mainnet Owner"),(0,a.kt)("p",null,"This is the Giveth multisig that can issue control commands to the bridge. They can cancel any payment and can boot the Security Guard or remove the approved spender (bridge key)."),(0,a.kt)("h3",{id:"mainnet-funding-and-escapehatch-destination"},"Mainnet Funding and EscapeHatch Destination"),(0,a.kt)("p",null,"This multisig is used to both send funds to the Mainnet Bridge (Vault) and act as the destination for the EscapeHatch Call."),(0,a.kt)("h3",{id:"security-guard"},"Security Guard"),(0,a.kt)("p",null,"Keeps watch over all requested payments, checks in each day, and delays suspicious payments."),(0,a.kt)("h3",{id:"mainnet-escapehatchcaller"},"Mainnet EscapeHatchCaller"),(0,a.kt)("p",null,"This is a 1 of x multisig that can trigger the vault to dump its funds to a predetermined wallet. We have people that are scattered across the world, multiple points of contacts that can do this."),(0,a.kt)("h3",{id:"allowed-spenders"},"Allowed Spenders"),(0,a.kt)("p",null,"These addresses are a whitelist who can issue a payment request to the bridge contract. In the application the bridge key is the only Allowed Spender."),(0,a.kt)("h3",{id:"foreigngivethbridge-owner"},"ForeignGivethBridge Owner"),(0,a.kt)("p",null,"The bridge key."),(0,a.kt)("h3",{id:"rinkeby-dappgod-multisig"},"Rinkeby DappGod Multisig"),(0,a.kt)("p",null,"This multisig controls updates and has total access to control the ForeignGivethBridge. It also acts as the ",(0,a.kt)("inlineCode",{parentName:"p"},"escapeHatchDestination")," for the ForeignGivethBridge and Liquid Pledging."),(0,a.kt)("h3",{id:"rinkeby-escapehatchcaller"},"Rinkeby EscapeHatchCaller"),(0,a.kt)("p",null,"This is a 1 of x multisig that can trigger the ForeignGivethBridge and Liquid Pledging contracts to dump their tokens to a predetermined wallet."),(0,a.kt)("h2",{id:"possible-security-issue-scenarios"},"Possible Security Issue Scenarios"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Bridge Key is compromised:"),"\nA hacker could use bridge key to create transactions sending ETH to their own address to force transactions through. The Security Guard can delay these payments long enough for the owner multisig to cancel the payment and remove the compromised key on Mainnet."),(0,a.kt)("p",null,"They could also create GivETH tokens as the token controller on the rinkeby side. The listener service would catch this though and sound the alarm any time GivETH tokens are generated without a corresponding Ether donation. (also sounds an alarm if the bridge key service decided to take a nap and doesn\u2019t create GivETH tokens when a donation is received.)"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Owner multisig has a bug and is able to be taken over (like the parity hack) or 6 keys out of 11 of the keys are compromised:"),"\nThis is highly unlikely but if this happens there will be no loss of funds. This multisig doesn't hold any funds, it only controls the bridge. Tt could reduce the 48 hour delay to 25 hours, the Security Guard can still delay any payments but the Security Guard can be replaced by the owner. Funds could be escaped within the 25 hours in this scenario."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"EscapeHatchCaller keys get compromised:"),"\nIn this case the worst thing that can happen is that the flow of the DApp on Rinkeby can be disrupted. This can be repaired however, by removing the compromised key on the EscapeHatch 1 of x multisig, and DAppGod. Once that is done then simply sending the giveth tokens back to the address from which they came, a similar scenario is possible on Mainnet. The EscapeHatch Caller can only move money to an escape destination, and nowhere else. If a key is compromised the worst thing they can do is to remove all owners and themselves from the EscapeHatch multisig, but the owner 6 of 11 multisig on main net can still call the EscapeHatch and can replace the EscapeHatch caller and the 3 of 5 multisig on rinkeby can as well."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Funding multisig has a bug and is able to be taken over (like the parity hack) or 4 keys out of 7 of the keys are compromised:"),"\nThis is extremely unlikely but if this happens there will be a loss of funds. The loss however, would not be catastrophic as funds are split between the bridge and the multisig."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Bridge on mainnet has a bug that lets someone else take over as owner:"),"\nThe 48 hour delay can be only be reduced to 25 hours Security Guard can still delay any payments but the Security Guard can be replaced by the owner. Funds could be escaped within 25 hours in this scenario."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"DAppGod Multisig on the testnet decides to take over:"),"\nIf this were to occur, the EscapeHatch from the bridge would prevent any loss of funds, and the testnet set up could be manually redeployed."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"What if the Security Guard\u2019s key and Bridge Key Controller both get compromised (or their holders collude to steal funds)"),":\nThe Owner multisig can cancel payments and extend the time delay to longer than 48 hours. In this scenario though they probably wouldn't have to because the bridge funds can be escaped to the funding multisig. This is the only scenario that could be a serious risk to the funds in the bridge vault. This could be averted within 48 hours of the event starting because of the default delay and that funds can be escaped during that period."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Finally, what if the Event Listener falls off-line just previous to any of the aforementioned attacks that trigger alarms on compromise?"),"\nThe Security Guard should see any suspicious transactions and be able to delay payments until they are dealt with."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.0c26f776.js b/assets/js/main.0c26f776.js deleted file mode 100644 index 9417f22cb2..0000000000 --- a/assets/js/main.0c26f776.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.0c26f776.js.LICENSE.txt */ -(self.webpackChunkgiveth_docs=self.webpackChunkgiveth_docs||[]).push([[179],{830:(e,t,n)=>{"use strict";n.d(t,{W:()=>a});var r=n(7294);function a(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),a=n(7462),o=n(8356),i=n.n(o),l=n(6887);const s={"015f68aa":[()=>n.e(7645).then(n.bind(n,3525)),"@site/whatisgiveth/daoStructure.md",3525],"01a85c17":[()=>Promise.all([n.e(3312),n.e(4013)]).then(n.bind(n,1223)),"@theme/BlogTagsListPage",1223],"01b09a56":[()=>n.e(739).then(n.bind(n,3914)),"@site/dapps/traceContracts.md",3914],"038834ad":[()=>n.e(4153).then(n.t.bind(n,978,19)),"~docs/dapps/category-dapps-category-givethio-guides-698.json",978],"03896916":[()=>n.e(116).then(n.bind(n,3290)),"@site/whatisgiveth/communityCommsGuide.md",3290],"05e29cf0":[()=>n.e(818).then(n.bind(n,5243)),"@site/blog/2021-05-04-changeMakersRoundup1.md",5243],"063116f2":[()=>n.e(7246).then(n.bind(n,5109)),"@site/blog/2018-03-22-decentralizedGiving.md?truncated=true",5109],"0829e72e":[()=>n.e(6349).then(n.bind(n,1513)),"@site/whatisgiveth/adviceProcess.md",1513],"0a7142d8":[()=>n.e(3350).then(n.bind(n,4566)),"@site/blog/2018-05-15-masterpieceManifesto.md",4566],"0fc6ec13":[()=>n.e(8952).then(n.bind(n,2334)),"@site/whatisgiveth/introGIVernance.md",2334],"12d03d7f":[()=>n.e(4004).then(n.bind(n,4699)),"@site/blog/2021-05-04-changeMakersRoundup1.md?truncated=true",4699],"14eb3368":[()=>Promise.all([n.e(3312),n.e(9817)]).then(n.bind(n,4228)),"@theme/DocCategoryGeneratedIndexPage",4228],"14ef460a":[()=>n.e(6710).then(n.bind(n,9585)),"@site/dapps/torusUserGuide.md",9585],17896441:[()=>Promise.all([n.e(3312),n.e(210),n.e(7918)]).then(n.bind(n,5154)),"@theme/DocItem",5154],"186c9ebb":[()=>n.e(6950).then(n.bind(n,8066)),"@site/blog/2021-08-12-communtiySpotlight1.md?truncated=true",8066],"1a4e3797":[()=>Promise.all([n.e(3312),n.e(7920)]).then(n.bind(n,9172)),"@theme/SearchPage",9172],"1a8e8982":[()=>n.e(3560).then(n.bind(n,8815)),"@site/dapps/torusonramp.md",8815],"1be78505":[()=>Promise.all([n.e(3312),n.e(9514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1c82be9a":[()=>Promise.all([n.e(1068),n.e(8392)]).then(n.bind(n,9052)),"@site/dapps/projectVerification.md",9052],"1e245ad0":[()=>n.e(1243).then(n.bind(n,1403)),"@site/blog/2021-04-19-whatDappened2.md?truncated=true",1403],"1eaafa75":[()=>n.e(7714).then(n.bind(n,1197)),"@site/blog/2021-04-15-change-makers.md?truncated=true",1197],"1f00284e":[()=>n.e(3686).then(n.bind(n,872)),"@site/dapps/quadraticfunding.md",872],"1f391b9e":[()=>Promise.all([n.e(3312),n.e(210),n.e(3085)]).then(n.bind(n,4247)),"@theme/MDXPage",4247],"220170c5":[()=>n.e(2249).then(n.bind(n,5300)),"@site/whatisgiveth/introDiscord.md",5300],"2443c520":[()=>n.e(7827).then(n.bind(n,6312)),"@site/blog/2021-04-19-whatDappened2.md",6312],"247cc856":[()=>n.e(7731).then(n.bind(n,7993)),"@site/dapps/leavingTraces.md",7993],"252f725d":[()=>n.e(7138).then(n.bind(n,9999)),"@site/blog/2018-11-30-unicornDACexperiment.md",9999],"2aff3c16":[()=>n.e(8136).then(n.bind(n,2015)),"@site/blog/2021-12-24-welcomeGIVeconomy.md?truncated=true",2015],"2b639896":[()=>n.e(377).then(n.bind(n,1578)),"@site/whatisgiveth/history.md",1578],"2bc7e8f3":[()=>n.e(8450).then(n.bind(n,6759)),"@site/whatisgiveth/conflictResolution.md",6759],"2f9f396f":[()=>n.e(4138).then(n.bind(n,1254)),"@site/dapps/regenfarms.md",1254],30988674:[()=>n.e(709).then(n.bind(n,989)),"@site/dapps/guide2-crypto.md",989],"31ab04b2":[()=>n.e(1600).then(n.bind(n,4568)),"@site/dapps/mandatoryupdates.md",4568],"32ce0e8a":[()=>n.e(8221).then(n.bind(n,1747)),"@site/dapps/submit-vulnerability.md",1747],"3483a5e6":[()=>n.e(8455).then(n.bind(n,4537)),"@site/blog/2021-03-01-howToDocs.md",4537],"35ac7830":[()=>n.e(6156).then(n.bind(n,4660)),"@site/whatisgiveth/zero-fees.md",4660],"36ff8b28":[()=>n.e(7467).then(n.bind(n,8842)),"@site/whatisgiveth/whatisgiveth.md",8842],"38f00f86":[()=>n.e(9667).then(n.t.bind(n,6372,19)),"~blog/default/blog-tags-documentation-944.json",6372],"393b5e9d":[()=>n.e(7485).then(n.bind(n,4667)),"@site/blog/2018-11-30-unicornDACexperiment.md?truncated=true",4667],"3a7763a7":[()=>Promise.all([n.e(1068),n.e(4232)]).then(n.bind(n,9704)),"@site/dapps/GIVpower.md",9704],"3c144caa":[()=>n.e(1167).then(n.bind(n,1091)),"@site/dapps/niceToken.md",1091],"3d1f4451":[()=>n.e(1618).then(n.t.bind(n,363,19)),"/home/runner/work/giveth-docs/giveth-docs/.docusaurus/docusaurus-plugin-content-docs/whatisgiveth/plugin-route-context-module-100.json",363],"3fed36ed":[()=>n.e(1158).then(n.bind(n,173)),"@site/devouch/api.md",173],"4115fbac":[()=>n.e(1008).then(n.bind(n,817)),"@site/whatisgiveth/covenant.md",817],"44bb633e":[()=>n.e(6610).then(n.bind(n,4776)),"@site/dapps/developmentProcess.md",4776],"4a0c699c":[()=>n.e(407).then(n.bind(n,1597)),"@site/blog/2021-03-24-futureofGiving.md?truncated=true",1597],"4cbd8b0f":[()=>n.e(844).then(n.bind(n,8866)),"@site/blog/2018-01-12-liquidDemocracy.md?truncated=true",8866],"5040394d":[()=>n.e(7384).then(n.bind(n,4086)),"@site/dapps/exchangeRates.md",4086],"5067090e":[()=>n.e(9201).then(n.bind(n,1516)),"@site/blog/2021-03-30-flavorsOfGiveth.md",1516],"54c8f7ca":[()=>Promise.all([n.e(3312),n.e(6579)]).then(n.bind(n,2719)),"@site/dapps/testingGIVeconomy.md",2719],"56776d7b":[()=>n.e(2846).then(n.t.bind(n,6464,19)),"~blog/default/blog-tags-how-to-7f0.json",6464],"581a9015":[()=>n.e(644).then(n.t.bind(n,3769,19)),"/home/runner/work/giveth-docs/giveth-docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"58ffe44f":[()=>n.e(7622).then(n.bind(n,9824)),"@site/dapps/doc1b-testing-guidelines.md",9824],"59fb4d76":[()=>n.e(3231).then(n.t.bind(n,5406,19)),"~docs/devouch/version-current-metadata-prop-751.json",5406],"5a29a95d":[()=>n.e(8944).then(n.bind(n,5013)),"@site/blog/2021-03-01-howToDocs.md?truncated=true",5013],"5df4dc66":[()=>n.e(5734).then(n.bind(n,3434)),"@site/dapps/introGivethIO.md",3434],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"61e3be1c":[()=>n.e(4807).then(n.t.bind(n,4409,19)),"~blog/default/blog-tags-how-to-7f0-list.json",4409],"661e27a1":[()=>n.e(1944).then(n.bind(n,1918)),"@site/blog/2019-03-27-realigningIncentives.md",1918],"6875c492":[()=>Promise.all([n.e(3312),n.e(210),n.e(2529),n.e(8610)]).then(n.bind(n,1714)),"@theme/BlogTagsPostsPage",1714],"6c3cd777":[()=>n.e(3346).then(n.bind(n,4581)),"@site/blog/2021-05-10-whatDappened3.md",4581],"6c9e5118":[()=>n.e(6685).then(n.bind(n,7315)),"@site/whatisgiveth/externalContributors.md",7315],"71501b55":[()=>n.e(8120).then(n.bind(n,3954)),"@site/blog/2019-03-27-realigningIncentives.md?truncated=true",3954],"7375d1b5":[()=>n.e(610).then(n.bind(n,9584)),"@site/blog/2021-05-10-whatDappened3.md?truncated=true",9584],"76eb8bb0":[()=>n.e(7617).then(n.bind(n,5384)),"@site/whatisgiveth/codeofconduct.md",5384],"7842f3be":[()=>n.e(9913).then(n.bind(n,4091)),"@site/blog/2021-10-19-communitySpotlight3.md?truncated=true",4091],"78cb0bd9":[()=>n.e(1735).then(n.bind(n,2511)),"@site/dapps/giveconomy.md",2511],"7bb52a6e":[()=>n.e(8616).then(n.bind(n,7861)),"@site/blog/2021-05-14-changeMakersRoundup2.md",7861],"7bf6813d":[()=>n.e(2497).then(n.bind(n,6861)),"@site/dapps/GIVfarm.md",6861],"7e526a1a":[()=>n.e(532).then(n.bind(n,9417)),"@site/whatisgiveth/toolsDecentralizedCommunities.md",9417],"7fa12866":[()=>n.e(7931).then(n.bind(n,8837)),"@site/dapps/doc1-styleguide.md",8837],"80c63d7d":[()=>n.e(7461).then(n.bind(n,9078)),"@site/blog/2021-11-18-communitySpotlight4.md?truncated=true",9078],"814f3328":[()=>n.e(2535).then(n.t.bind(n,5641,19)),"~blog/default/blog-post-list-prop-default.json",5641],"833b487c":[()=>n.e(1180).then(n.bind(n,5508)),"@site/blog/2021-04-05-whatDappened1.md?truncated=true",5508],"839bb152":[()=>n.e(5195).then(n.t.bind(n,7085,19)),"/home/runner/work/giveth-docs/giveth-docs/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",7085],"83a2710c":[()=>n.e(9442).then(n.bind(n,2656)),"@site/whatisgiveth/fundraisingGuide.md",2656],84960266:[()=>n.e(8085).then(n.bind(n,4743)),"@site/dapps/TRACEinstallation.md",4743],"894ed9e1":[()=>n.e(7976).then(n.bind(n,2279)),"@site/blog/2021-07-13-traceLaunch.md?truncated=true",2279],"89e7af7e":[()=>n.e(9035).then(n.bind(n,3442)),"@site/dapps/entitiesAndRoles.md",3442],"8ccd19fa":[()=>n.e(7833).then(n.bind(n,2027)),"@site/blog/2022-01-19-evolvingPhilanthropy.md?truncated=true",2027],"8d9fbe5b":[()=>n.e(5762).then(n.bind(n,3391)),"@site/dapps/givethioinstallation.md",3391],"8e47e7c8":[()=>n.e(9440).then(n.bind(n,1717)),"@site/dapps/ImportTorusMM.md",1717],"8eb4e46b":[()=>n.e(1).then(n.t.bind(n,2638,19)),"~blog/default/blog-page-2-677.json",2638],"8f560ee4":[()=>n.e(8251).then(n.bind(n,5857)),"@site/dapps/PFPcollection.md",5857],"8fc4f0be":[()=>n.e(138).then(n.bind(n,6916)),"@site/blog/2021-08-12-communtiySpotlight1.md",6916],"900d7d3c":[()=>n.e(1457).then(n.bind(n,4127)),"@site/blog/2021-05-14-changeMakersRoundup2.md?truncated=true",4127],"917de644":[()=>n.e(7274).then(n.bind(n,7020)),"@site/blog/2021-12-06-givethDAO.md?truncated=true",7020],"92999a1c":[()=>n.e(8442).then(n.t.bind(n,5310,19)),"~blog/default/blog-page-3-fd4.json",5310],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"9364e17c":[()=>n.e(9163).then(n.bind(n,9742)),"@site/blog/2018-01-12-liquidDemocracy.md",9742],"9547bbd3":[()=>n.e(4461).then(n.bind(n,3349)),"@site/blog/2021-12-06-givethDAO.md",3349],"9559fdc3":[()=>n.e(3317).then(n.bind(n,1678)),"@site/blog/2021-10-19-communitySpotlight3.md",1678],"959a8abf":[()=>n.e(7199).then(n.t.bind(n,5745,19)),"/home/runner/work/giveth-docs/giveth-docs/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],"966822ae":[()=>n.e(5373).then(n.t.bind(n,4469,19)),"/home/runner/work/giveth-docs/giveth-docs/.docusaurus/docusaurus-plugin-content-blog/default/plugin-route-context-module-100.json",4469],"988044f1":[()=>n.e(6419).then(n.bind(n,3005)),"@site/dapps/technicalWhitePaper.md",3005],"992a3bb7":[()=>n.e(1415).then(n.t.bind(n,8229,19)),"~blog/default/blog-tags-documentation-944-list.json",8229],"9b2234a5":[()=>n.e(1590).then(n.bind(n,8573)),"@site/blog/2021-03-24-futureofGiving.md",8573],"9c427d51":[()=>n.e(927).then(n.bind(n,2448)),"@site/blog/2021-04-05-whatDappened1.md",2448],"9e4087bc":[()=>n.e(3608).then(n.bind(n,3169)),"@theme/BlogArchivePage",3169],"9e70dc58":[()=>n.e(2481).then(n.bind(n,7889)),"@site/dapps/regenFarmContracts.md",7889],a0a187ad:[()=>n.e(6657).then(n.bind(n,7584)),"@site/blog/2018-03-22-decentralizedGiving.md",7584],a187ce25:[()=>n.e(7122).then(n.bind(n,995)),"@site/blog/2018-11-20-futureOfWork.md?truncated=true",995],a1b34ced:[()=>n.e(4901).then(n.bind(n,3843)),"@site/devouch/whatisdevouch.md",3843],a2b37acb:[()=>n.e(7740).then(n.bind(n,3419)),"@site/whatisgiveth/introCommunity.md",3419],a601245a:[()=>n.e(9404).then(n.bind(n,1850)),"@site/dapps/termsForProposals.md",1850],a61f40d2:[()=>n.e(4341).then(n.bind(n,9847)),"@site/docs/givethioinstallation.md",9847],a64c8910:[()=>n.e(6211).then(n.bind(n,2865)),"@site/blog/2022-01-19-evolvingPhilanthropy.md",2865],a6aa9e1f:[()=>Promise.all([n.e(3312),n.e(210),n.e(2529),n.e(3089)]).then(n.bind(n,46)),"@theme/BlogListPage",46],a6ba6d7b:[()=>n.e(4998).then(n.bind(n,4744)),"@site/dapps/multisigs.md",4744],a7023ddc:[()=>n.e(1713).then(n.t.bind(n,3457,19)),"~blog/default/blog-tags-tags-4c2.json",3457],abe66227:[()=>n.e(8864).then(n.t.bind(n,2907,19)),"~docs/whatisgiveth/version-current-metadata-prop-751.json",2907],acfccad9:[()=>n.e(2738).then(n.bind(n,1059)),"@site/blog/2021-07-13-traceLaunch.md",1059],ad257875:[()=>n.e(9139).then(n.bind(n,7283)),"@site/dapps/installGIVeconomy.md",7283],b2b675dd:[()=>n.e(533).then(n.t.bind(n,8017,19)),"~blog/default/blog-c06.json",8017],b2f554cd:[()=>n.e(1477).then(n.t.bind(n,10,19)),"~blog/default/blog-archive-80c.json",10],b3e75be8:[()=>n.e(279).then(n.bind(n,9177)),"@site/dapps/projectdonating.md",9177],b44b327e:[()=>n.e(5073).then(n.bind(n,8622)),"@site/whatisgiveth/commsContributorGuide.md",8622],b57950f4:[()=>n.e(4617).then(n.bind(n,4536)),"@site/dapps/angelVault.md",4536],b69cabda:[()=>Promise.all([n.e(1068),n.e(7068)]).then(n.bind(n,8788)),"@site/dapps/givstream.md",8788],b8ff8b97:[()=>n.e(8166).then(n.bind(n,3206)),"@site/blog/2021-04-15-change-makers.md",3206],b9a00ec6:[()=>n.e(1244).then(n.bind(n,9447)),"@site/blog/2021-03-30-flavorsOfGiveth.md?truncated=true",9447],be3c56c1:[()=>n.e(4989).then(n.t.bind(n,4153,19)),"/home/runner/work/giveth-docs/giveth-docs/.docusaurus/docusaurus-plugin-content-docs/devouch/plugin-route-context-module-100.json",4153],beea71df:[()=>n.e(33).then(n.bind(n,1138)),"@site/dapps/introTrace.md",1138],bf2bda70:[()=>n.e(7007).then(n.bind(n,2036)),"@site/blog/2018-05-15-masterpieceManifesto.md?truncated=true",2036],bfaf5a60:[()=>n.e(6521).then(n.bind(n,8332)),"@site/dapps/GIVgarden.md",8332],bfbadba4:[()=>n.e(4444).then(n.bind(n,1666)),"@site/blog/2017-10-26-futureofGiving2017.md?truncated=true",1666],c30598cf:[()=>n.e(2684).then(n.bind(n,5916)),"@site/src/pages/jobs.md",5916],c46a0d96:[()=>n.e(8929).then(n.bind(n,2195)),"@site/dapps/guide5-FAQ.md",2195],c4f5d8e4:[()=>Promise.all([n.e(3312),n.e(4195)]).then(n.bind(n,5239)),"@site/src/pages/index.js",5239],c59f89a8:[()=>n.e(6987).then(n.bind(n,3274)),"@site/blog/2018-11-20-futureOfWork.md",3274],c6789411:[()=>n.e(4266).then(n.t.bind(n,3416,19)),"/home/runner/work/giveth-docs/giveth-docs/.docusaurus/docusaurus-plugin-content-docs/dapps/plugin-route-context-module-100.json",3416],cc26c5ab:[()=>n.e(3981).then(n.bind(n,4416)),"@site/blog/2021-09-10-communtiySpotlight2.md?truncated=true",4416],ccc49370:[()=>Promise.all([n.e(3312),n.e(210),n.e(2529),n.e(6103)]).then(n.bind(n,5203)),"@theme/BlogPostPage",5203],cf2932c3:[()=>n.e(4114).then(n.bind(n,1172)),"@site/dapps/givethmatchingpool.md",1172],d05c918d:[()=>n.e(524).then(n.bind(n,1220)),"@site/blog/2021-09-10-communtiySpotlight2.md",1220],d2c5b2d2:[()=>n.e(2992).then(n.bind(n,6541)),"@site/dapps/guide0-gettingstarted.md",6541],d38a5531:[()=>n.e(3127).then(n.bind(n,5237)),"@site/dapps/guide3-troubleshooting.md",5237],d62b591d:[()=>n.e(6702).then(n.bind(n,2752)),"@site/dapps/doc1a-contributors.md",2752],d6aa8d9d:[()=>n.e(9240).then(n.bind(n,5735)),"@site/dapps/guide1-createproject.md",5735],d7db1260:[()=>n.e(6222).then(n.bind(n,7751)),"@site/blog/2021-11-18-communitySpotlight4.md",7751],da6f53d1:[()=>n.e(2794).then(n.bind(n,7)),"@site/blog/2021-12-24-welcomeGIVeconomy.md",7],db205422:[()=>n.e(5538).then(n.bind(n,5663)),"@site/dapps/GIVdrop.md",5663],dbd823d4:[()=>Promise.all([n.e(1068),n.e(5850)]).then(n.bind(n,7384)),"@site/dapps/recurringDonation.md",7384],dd260736:[()=>n.e(3538).then(n.bind(n,7599)),"@site/dapps/donatingmetamask.md",7599],dd63234b:[()=>n.e(2916).then(n.bind(n,1177)),"@site/whatisgiveth/brandBook.md",1177],df9533c9:[()=>n.e(9561).then(n.bind(n,3659)),"@site/blog/2021-07-05-changeMakersFinal.md?truncated=true",3659],e0473e90:[()=>n.e(8020).then(n.t.bind(n,7545,19)),"~docs/dapps/version-current-metadata-prop-751.json",7545],e14248d1:[()=>n.e(9335).then(n.bind(n,3842)),"@site/dapps/givbacks.md",3842],e5a7c2f7:[()=>n.e(219).then(n.bind(n,251)),"@site/dapps/listedUnlisted.md",251],e5b491f5:[()=>n.e(6820).then(n.bind(n,6587)),"@site/whatisgiveth/meetingsGuide.md",6587],e6867e78:[()=>n.e(430).then(n.bind(n,4859)),"@site/whatisgiveth/introPlatform.md",4859],f1e5a686:[()=>n.e(2143).then(n.bind(n,407)),"@site/dapps/referralprogram.md",407],f327d2ee:[()=>n.e(232).then(n.bind(n,276)),"@site/blog/2017-10-26-futureofGiving2017.md",276],f45b2fb8:[()=>n.e(7684).then(n.bind(n,7860)),"@site/dapps/bridgeSecurity.md",7860],f529d87a:[()=>n.e(6056).then(n.bind(n,7249)),"@site/whatisgiveth/finance.md",7249],f5dd0f23:[()=>n.e(7612).then(n.bind(n,4572)),"@site/dapps/traceableProject.md",4572],f69c22ca:[()=>n.e(6055).then(n.bind(n,8198)),"@site/blog/2021-07-05-changeMakersFinal.md",8198],fa6f707e:[()=>n.e(7543).then(n.bind(n,848)),"@site/whatisgiveth/governanceProcess.md",848]};function c(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var u=n(9670),d=n(226);function p(e,t){if("*"===e)return i()({loading:c,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=l[e+"-"+t],p={},f=[],m=[],h=(0,u.Z)(o);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=s[n];r&&(p[t]=r[0],f.push(r[1]),m.push(r[2]))})),i().Map({loading:c,loader:p,modules:f,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error("The page component at "+e+" doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.");"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=a}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.z,{value:s},r.createElement(l,(0,a.Z)({},i,n)))}})}const f=[{path:"/blog",component:p("/blog","0d7"),exact:!0},{path:"/blog/archive",component:p("/blog/archive","6c9"),exact:!0},{path:"/blog/changeMakers",component:p("/blog/changeMakers","ffd"),exact:!0},{path:"/blog/changeMakersFinal",component:p("/blog/changeMakersFinal","ac3"),exact:!0},{path:"/blog/changeMakersRoundup1",component:p("/blog/changeMakersRoundup1","207"),exact:!0},{path:"/blog/changeMakersRoundup2",component:p("/blog/changeMakersRoundup2","6ca"),exact:!0},{path:"/blog/communitySpotlight1",component:p("/blog/communitySpotlight1","12a"),exact:!0},{path:"/blog/communitySpotlight2",component:p("/blog/communitySpotlight2","dd6"),exact:!0},{path:"/blog/communitySpotlight3",component:p("/blog/communitySpotlight3","38e"),exact:!0},{path:"/blog/communitySpotlight4",component:p("/blog/communitySpotlight4","07d"),exact:!0},{path:"/blog/decentralizedGiving",component:p("/blog/decentralizedGiving","858"),exact:!0},{path:"/blog/evolvingPhilanthropy",component:p("/blog/evolvingPhilanthropy","105"),exact:!0},{path:"/blog/flavorsOfGiveth",component:p("/blog/flavorsOfGiveth","33d"),exact:!0},{path:"/blog/futureofGiving",component:p("/blog/futureofGiving","347"),exact:!0},{path:"/blog/futureOfGiving2017",component:p("/blog/futureOfGiving2017","3a9"),exact:!0},{path:"/blog/futureOfWork",component:p("/blog/futureOfWork","f81"),exact:!0},{path:"/blog/givethDAO",component:p("/blog/givethDAO","bb0"),exact:!0},{path:"/blog/howToDocs",component:p("/blog/howToDocs","b5e"),exact:!0},{path:"/blog/liquidDemocracy",component:p("/blog/liquidDemocracy","30b"),exact:!0},{path:"/blog/masterpieceManifesto",component:p("/blog/masterpieceManifesto","011"),exact:!0},{path:"/blog/page/2",component:p("/blog/page/2","6e9"),exact:!0},{path:"/blog/page/3",component:p("/blog/page/3","a96"),exact:!0},{path:"/blog/realigningIncentives",component:p("/blog/realigningIncentives","753"),exact:!0},{path:"/blog/tags",component:p("/blog/tags","d5a"),exact:!0},{path:"/blog/tags/documentation",component:p("/blog/tags/documentation","985"),exact:!0},{path:"/blog/tags/how-to",component:p("/blog/tags/how-to","d94"),exact:!0},{path:"/blog/traceLaunch",component:p("/blog/traceLaunch","a51"),exact:!0},{path:"/blog/unicornDACexperiment",component:p("/blog/unicornDACexperiment","245"),exact:!0},{path:"/blog/welcomeGIVeconomy",component:p("/blog/welcomeGIVeconomy","8c4"),exact:!0},{path:"/blog/whatDappened1",component:p("/blog/whatDappened1","cb1"),exact:!0},{path:"/blog/whatDappened2",component:p("/blog/whatDappened2","55c"),exact:!0},{path:"/blog/whatDappened3",component:p("/blog/whatDappened3","bbb"),exact:!0},{path:"/jobs",component:p("/jobs","f27"),exact:!0},{path:"/search",component:p("/search","5dd"),exact:!0},{path:"/devouch",component:p("/devouch","fe7"),routes:[{path:"/devouch/",component:p("/devouch/","d24"),exact:!0,sidebar:"whatisdevouch"},{path:"/devouch/integrating-devouch",component:p("/devouch/integrating-devouch","04d"),exact:!0,sidebar:"whatisdevouch"}]},{path:"/docs",component:p("/docs","a9e"),routes:[{path:"/docs/givethioinstallation",component:p("/docs/givethioinstallation","f70"),exact:!0,sidebar:"defaultSidebar"}]},{path:"/whatisgiveth",component:p("/whatisgiveth","f45"),routes:[{path:"/whatisgiveth/",component:p("/whatisgiveth/","529"),exact:!0,sidebar:"whatisgiveth"},{path:"/whatisgiveth/adviceProcess",component:p("/whatisgiveth/adviceProcess","a5c"),exact:!0,sidebar:"whatisgiveth"},{path:"/whatisgiveth/brandBook",component:p("/whatisgiveth/brandBook","e28"),exact:!0,sidebar:"whatisgiveth"},{path:"/whatisgiveth/codeofconduct",component:p("/whatisgiveth/codeofconduct","65a"),exact:!0,sidebar:"whatisgiveth"},{path:"/whatisgiveth/commsContributorGuide",component:p("/whatisgiveth/commsContributorGuide","cff"),exact:!0,sidebar:"whatisgiveth"},{path:"/whatisgiveth/communityCommsGuide",component:p("/whatisgiveth/communityCommsGuide","005"),exact:!0,sidebar:"whatisgiveth"},{path:"/whatisgiveth/conflictResolution",component:p("/whatisgiveth/conflictResolution","897"),exact:!0,sidebar:"whatisgiveth"},{path:"/whatisgiveth/covenant",component:p("/whatisgiveth/covenant","5a1"),exact:!0,sidebar:"whatisgiveth"},{path:"/whatisgiveth/daoStructure",component:p("/whatisgiveth/daoStructure","9a5"),exact:!0,sidebar:"whatisgiveth"},{path:"/whatisgiveth/externalContributors",component:p("/whatisgiveth/externalContributors","f4c"),exact:!0,sidebar:"whatisgiveth"},{path:"/whatisgiveth/finances",component:p("/whatisgiveth/finances","3a5"),exact:!0},{path:"/whatisgiveth/fundraisingGuide",component:p("/whatisgiveth/fundraisingGuide","ae8"),exact:!0,sidebar:"whatisgiveth"},{path:"/whatisgiveth/governanceProcess",component:p("/whatisgiveth/governanceProcess","e55"),exact:!0,sidebar:"whatisgiveth"},{path:"/whatisgiveth/history",component:p("/whatisgiveth/history","43a"),exact:!0,sidebar:"whatisgiveth"},{path:"/whatisgiveth/introCommunity",component:p("/whatisgiveth/introCommunity","718"),exact:!0},{path:"/whatisgiveth/introDiscord",component:p("/whatisgiveth/introDiscord","6b8"),exact:!0,sidebar:"whatisgiveth"},{path:"/whatisgiveth/introGIVernance",component:p("/whatisgiveth/introGIVernance","4fd"),exact:!0},{path:"/whatisgiveth/introPlatform",component:p("/whatisgiveth/introPlatform","918"),exact:!0},{path:"/whatisgiveth/meetingsGuide",component:p("/whatisgiveth/meetingsGuide","570"),exact:!0,sidebar:"whatisgiveth"},{path:"/whatisgiveth/toolsDecentralizedCommunities",component:p("/whatisgiveth/toolsDecentralizedCommunities","9a6"),exact:!0,sidebar:"whatisgiveth"},{path:"/whatisgiveth/zero-fees",component:p("/whatisgiveth/zero-fees","9fe"),exact:!0,sidebar:"whatisgiveth"}]},{path:"/",component:p("/","e12"),exact:!0},{path:"/",component:p("/","cbf"),routes:[{path:"/angelVault",component:p("/angelVault","88f"),exact:!0,sidebar:"dapps"},{path:"/dapps/",component:p("/dapps/","469"),exact:!0,sidebar:"dapps"},{path:"/dapps/bridgeSecurity",component:p("/dapps/bridgeSecurity","ad4"),exact:!0,sidebar:"dapps"},{path:"/dapps/contributors",component:p("/dapps/contributors","630"),exact:!0,sidebar:"dapps"},{path:"/dapps/createproject",component:p("/dapps/createproject","d9d"),exact:!0,sidebar:"dapps"},{path:"/dapps/crypto",component:p("/dapps/crypto","ab4"),exact:!0},{path:"/dapps/developmentProcess",component:p("/dapps/developmentProcess","73a"),exact:!0,sidebar:"dapps"},{path:"/dapps/donatingmetamask",component:p("/dapps/donatingmetamask","c4a"),exact:!0,sidebar:"dapps"},{path:"/dapps/entitiesAndRoles",component:p("/dapps/entitiesAndRoles","f73"),exact:!0,sidebar:"dapps"},{path:"/dapps/exchangeRates",component:p("/dapps/exchangeRates","363"),exact:!0,sidebar:"dapps"},{path:"/dapps/faq",component:p("/dapps/faq","8b3"),exact:!0},{path:"/dapps/gettingStarted",component:p("/dapps/gettingStarted","ade"),exact:!0,sidebar:"dapps"},{path:"/dapps/giverspfp",component:p("/dapps/giverspfp","070"),exact:!0,sidebar:"dapps"},{path:"/dapps/givethIO",component:p("/dapps/givethIO","496"),exact:!0,sidebar:"dapps"},{path:"/dapps/givethioinstallation",component:p("/dapps/givethioinstallation","d60"),exact:!0,sidebar:"dapps"},{path:"/dapps/importTorusMM",component:p("/dapps/importTorusMM","fde"),exact:!0,sidebar:"dapps"},{path:"/dapps/installGIVeconomy",component:p("/dapps/installGIVeconomy","59a"),exact:!0},{path:"/dapps/introTrace",component:p("/dapps/introTrace","39b"),exact:!0,sidebar:"dapps"},{path:"/dapps/leavingTraces",component:p("/dapps/leavingTraces","f87"),exact:!0,sidebar:"dapps"},{path:"/dapps/listedUnlisted",component:p("/dapps/listedUnlisted","183"),exact:!0,sidebar:"dapps"},{path:"/dapps/makeTraceableProject",component:p("/dapps/makeTraceableProject","ed8"),exact:!0,sidebar:"dapps"},{path:"/dapps/multisigs",component:p("/dapps/multisigs","e19"),exact:!0,sidebar:"dapps"},{path:"/dapps/projectdonating",component:p("/dapps/projectdonating","0d1"),exact:!0,sidebar:"dapps"},{path:"/dapps/projectUpdates",component:p("/dapps/projectUpdates","f79"),exact:!0,sidebar:"dapps"},{path:"/dapps/projectVerification",component:p("/dapps/projectVerification","ef7"),exact:!0,sidebar:"dapps"},{path:"/dapps/recurringDonation",component:p("/dapps/recurringDonation","089"),exact:!0,sidebar:"dapps"},{path:"/dapps/regenFarmContracts",component:p("/dapps/regenFarmContracts","f35"),exact:!0,sidebar:"dapps"},{path:"/dapps/testing-guidelines",component:p("/dapps/testing-guidelines","c41"),exact:!0},{path:"/dapps/testingGIVeconomy",component:p("/dapps/testingGIVeconomy","e3d"),exact:!0},{path:"/dapps/torusonramp",component:p("/dapps/torusonramp","914"),exact:!0},{path:"/dapps/torusUserGuide",component:p("/dapps/torusUserGuide","868"),exact:!0},{path:"/dapps/traceContracts",component:p("/dapps/traceContracts","d61"),exact:!0,sidebar:"dapps"},{path:"/dapps/TRACEinstallation",component:p("/dapps/TRACEinstallation","ceb"),exact:!0,sidebar:"dapps"},{path:"/dapps/troubleshooting",component:p("/dapps/troubleshooting","2d4"),exact:!0,sidebar:"dapps"},{path:"/giveconomy/",component:p("/giveconomy/","f85"),exact:!0,sidebar:"dapps"},{path:"/giveconomy/givbacks",component:p("/giveconomy/givbacks","3ad"),exact:!0,sidebar:"dapps"},{path:"/giveconomy/givdrop",component:p("/giveconomy/givdrop","1d8"),exact:!0,sidebar:"dapps"},{path:"/giveconomy/givfarm",component:p("/giveconomy/givfarm","bf9"),exact:!0,sidebar:"dapps"},{path:"/giveconomy/givgarden",component:p("/giveconomy/givgarden","7fb"),exact:!0,sidebar:"dapps"},{path:"/giveconomy/givpower",component:p("/giveconomy/givpower","ff9"),exact:!0,sidebar:"dapps"},{path:"/giveconomy/givstream",component:p("/giveconomy/givstream","45e"),exact:!0,sidebar:"dapps"},{path:"/giveconomy/niceToken",component:p("/giveconomy/niceToken","d31"),exact:!0,sidebar:"dapps"},{path:"/giveconomy/referral",component:p("/giveconomy/referral","816"),exact:!0},{path:"/giveconomy/termsForProposals",component:p("/giveconomy/termsForProposals","c85"),exact:!0,sidebar:"dapps"},{path:"/givethMatchingPool",component:p("/givethMatchingPool","68e"),exact:!0},{path:"/quadraticfunding",component:p("/quadraticfunding","5b9"),exact:!0,sidebar:"dapps"},{path:"/regenFarms",component:p("/regenFarms","e36"),exact:!0,sidebar:"dapps"},{path:"/security/responsible-disclosure",component:p("/security/responsible-disclosure","9c8"),exact:!0,sidebar:"dapps"},{path:"/styleguide",component:p("/styleguide","57d"),exact:!0},{path:"/technicalWhitePaper",component:p("/technicalWhitePaper","7f7"),exact:!0,sidebar:"dapps"}]},{path:"*",component:p("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(7294);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},9383:(e,t,n)=>{"use strict";var r=n(7294),a=n(3935),o=n(3727),i=n(405),l=n(412);const s=[n(2497),n(3310),n(8320),n(2295)];var c=n(723),u=n(6775),d=n(8790);function p(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var f=n(7462),m=n(5742),h=n(2263),g=n(4996),b=n(6668),v=n(833),y=n(4711),w=n(9727),k=n(3320),E=n(197);function S(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,h.Z)(),n=(0,y.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function x(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),a=function(){const{siteConfig:{url:e}}=(0,h.Z)(),{pathname:t}=(0,u.TH)();return e+(0,g.Z)(t)}(),o=t?""+n+t:a;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function T(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(v.d,{image:n}),r.createElement(x,null),r.createElement(S,null),r.createElement(E.Z,{tag:k.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,f.Z)({key:t},e))))))}const _=new Map;function C(e){if(_.has(e.pathname))return{...e,pathname:_.get(e.pathname)};if((0,d.f)(c.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return _.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return _.set(e.pathname,t),{...e,pathname:t}}var P=n(8934),A=n(8940);function R(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{var r,a;const o=null!=(r=null==(a=t.default)?void 0:a[e])?r:t[e];return null==o?void 0:o(...n)}));return()=>a.forEach((e=>null==e?void 0:e()))}const L=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(a&&function(e){const{hash:t}=e;if(t){const e=decodeURIComponent(t.substring(1)),n=document.getElementById(e);null==n||n.scrollIntoView()}else window.scrollTo(0,0)}(n),R("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function O(e){const t=(0,d.f)(c.Z,e);return Promise.all(t.map((e=>null==e.route.component.preload?void 0:e.route.component.preload())))}class I extends r.Component{constructor(e){super(e),this.previousLocation=void 0,this.routeUpdateCleanupCb=void 0,this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?R("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=R("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),O(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(L,{previousLocation:this.previousLocation,location:t},r.createElement(u.AW,{location:t,render:()=>e}))}}const N=I,D="docusaurus-base-url-issue-banner-container",M="docusaurus-base-url-issue-banner-suggestion-container",F="__DOCUSAURUS_INSERT_BASEURL_BANNER";function j(e){return"\nwindow['"+F+"'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['"+F+"'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('"+D+"');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = "+JSON.stringify(function(e){return'\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = '+e+" "+("/"===e?" (default value)":"")+'

\n

We suggest trying baseUrl =

\n
\n'}(e)).replace(/{window[F]=!1}),[]),r.createElement(r.Fragment,null,!l.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,j(e))),r.createElement("div",{id:D}))}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,h.Z)(),{pathname:n}=(0,u.TH)();return t&&n===e?r.createElement(B,null):null}function z(){const{siteConfig:{favicon:e,title:t},i18n:{currentLocale:n,localeConfigs:a}}=(0,h.Z)(),o=(0,g.Z)(e),{htmlLang:i,direction:l}=a[n];return r.createElement(m.Z,null,r.createElement("html",{lang:i,dir:l}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),e&&r.createElement("link",{rel:"icon",href:o}))}var G=n(4763);function q(){const e=(0,d.H)(c.Z),t=(0,u.TH)();return r.createElement(G.Z,null,r.createElement(A.M,null,r.createElement(P.t,null,r.createElement(p,null,r.createElement(z,null),r.createElement(T,null),r.createElement(U,null),r.createElement(N,{location:C(t)},e)))))}var $=n(6887);const H=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{var r,a;if("undefined"==typeof document)return void n();const o=document.createElement("link");o.setAttribute("rel","prefetch"),o.setAttribute("href",e),o.onload=()=>t(),o.onerror=()=>n();const i=null!=(r=document.getElementsByTagName("head")[0])?r:null==(a=document.getElementsByName("script")[0])?void 0:a.parentNode;null==i||i.appendChild(o)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var Z=n(9670);const V=new Set,W=new Set,K=()=>{var e,t;return(null==(e=navigator.connection)?void 0:e.effectiveType.includes("2g"))||(null==(t=navigator.connection)?void 0:t.saveData)},Q={prefetch(e){if(!(e=>!K()&&!W.has(e)&&!V.has(e))(e))return!1;V.add(e);const t=(0,d.f)(c.Z,e).flatMap((e=>{return t=e.route.path,Object.entries($).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Z.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?H(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!K()&&!W.has(e))(e)&&(W.add(e),O(e))},Y=Object.freeze(Q);if(l.Z.canUseDOM){window.docusaurus=Y;const e=a.hydrate;O(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(q,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>u,M:()=>d});var r=n(7294),a=n(6809);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"dapps":{"path":"/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/","mainDocId":"givethIO","docs":[{"id":"angelVault","path":"/angelVault","sidebar":"dapps"},{"id":"bridgeSecurity","path":"/dapps/bridgeSecurity","sidebar":"dapps"},{"id":"contributors","path":"/dapps/contributors","sidebar":"dapps"},{"id":"createproject","path":"/dapps/createproject","sidebar":"dapps"},{"id":"crypto","path":"/dapps/crypto"},{"id":"developmentProcess","path":"/dapps/developmentProcess","sidebar":"dapps"},{"id":"disclosure","path":"/security/responsible-disclosure","sidebar":"dapps"},{"id":"donatingmetamask","path":"/dapps/donatingmetamask","sidebar":"dapps"},{"id":"entitiesAndRoles","path":"/dapps/entitiesAndRoles","sidebar":"dapps"},{"id":"exchangeRates","path":"/dapps/exchangeRates","sidebar":"dapps"},{"id":"faq","path":"/dapps/faq"},{"id":"gettingStarted","path":"/dapps/gettingStarted","sidebar":"dapps"},{"id":"givbacks","path":"/giveconomy/givbacks","sidebar":"dapps"},{"id":"givdrop","path":"/giveconomy/givdrop","sidebar":"dapps"},{"id":"giveconomy","path":"/giveconomy/","sidebar":"dapps"},{"id":"giverspfp","path":"/dapps/giverspfp","sidebar":"dapps"},{"id":"givethIO","path":"/dapps/givethIO","sidebar":"dapps"},{"id":"givethioinstallation","path":"/dapps/givethioinstallation","sidebar":"dapps"},{"id":"givethMatchingPool","path":"/givethMatchingPool"},{"id":"givfarm","path":"/giveconomy/givfarm","sidebar":"dapps"},{"id":"givgarden","path":"/giveconomy/givgarden","sidebar":"dapps"},{"id":"givpower","path":"/giveconomy/givpower","sidebar":"dapps"},{"id":"givstream","path":"/giveconomy/givstream","sidebar":"dapps"},{"id":"importTorusMM","path":"/dapps/importTorusMM","sidebar":"dapps"},{"id":"installGIVeconomy","path":"/dapps/installGIVeconomy"},{"id":"introTrace","path":"/dapps/introTrace","sidebar":"dapps"},{"id":"leavingTraces","path":"/dapps/leavingTraces","sidebar":"dapps"},{"id":"listedUnlisted","path":"/dapps/listedUnlisted","sidebar":"dapps"},{"id":"makeTraceableProject","path":"/dapps/makeTraceableProject","sidebar":"dapps"},{"id":"multisigs","path":"/dapps/multisigs","sidebar":"dapps"},{"id":"niceToken","path":"/giveconomy/niceToken","sidebar":"dapps"},{"id":"projectdonating","path":"/dapps/projectdonating","sidebar":"dapps"},{"id":"projectUpdates","path":"/dapps/projectUpdates","sidebar":"dapps"},{"id":"projectVerification","path":"/dapps/projectVerification","sidebar":"dapps"},{"id":"quadraticfunding","path":"/quadraticfunding","sidebar":"dapps"},{"id":"recurringDonation","path":"/dapps/recurringDonation","sidebar":"dapps"},{"id":"referral","path":"/giveconomy/referral"},{"id":"regenFarmContracts","path":"/dapps/regenFarmContracts","sidebar":"dapps"},{"id":"regenFarms","path":"/regenFarms","sidebar":"dapps"},{"id":"styleguide","path":"/styleguide"},{"id":"technicalWhitePaper","path":"/technicalWhitePaper","sidebar":"dapps"},{"id":"termsForProposals","path":"/giveconomy/termsForProposals","sidebar":"dapps"},{"id":"testing-guidelines","path":"/dapps/testing-guidelines"},{"id":"testingGIVeconomy","path":"/dapps/testingGIVeconomy"},{"id":"torusonramp","path":"/dapps/torusonramp"},{"id":"torusUserGuide","path":"/dapps/torusUserGuide"},{"id":"traceContracts","path":"/dapps/traceContracts","sidebar":"dapps"},{"id":"TRACEinstallation","path":"/dapps/TRACEinstallation","sidebar":"dapps"},{"id":"troubleshooting","path":"/dapps/troubleshooting","sidebar":"dapps"},{"id":"dapps/","path":"/dapps/","sidebar":"dapps"}],"draftIds":[],"sidebars":{"dapps":{"link":{"path":"/dapps/","label":"Giveth.io Guides"}}}}],"breadcrumbs":true},"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"givethioinstallation","docs":[{"id":"givethioinstallation","path":"/docs/givethioinstallation","sidebar":"defaultSidebar"}],"draftIds":[],"sidebars":{"defaultSidebar":{"link":{"path":"/docs/givethioinstallation","label":"givethioinstallation"}}}}],"breadcrumbs":true},"devouch":{"path":"/devouch","versions":[{"name":"current","label":"Next","isLast":true,"path":"/devouch","mainDocId":"whatisdevouch","docs":[{"id":"devouch-api","path":"/devouch/integrating-devouch","sidebar":"whatisdevouch"},{"id":"whatisdevouch","path":"/devouch/","sidebar":"whatisdevouch"}],"draftIds":[],"sidebars":{"whatisdevouch":{"link":{"path":"/devouch/","label":"whatisdevouch"}}}}],"breadcrumbs":true},"whatisgiveth":{"path":"/whatisgiveth","versions":[{"name":"current","label":"Next","isLast":true,"path":"/whatisgiveth","mainDocId":"whatisgiveth","docs":[{"id":"adviceProcess","path":"/whatisgiveth/adviceProcess","sidebar":"whatisgiveth"},{"id":"brandBook","path":"/whatisgiveth/brandBook","sidebar":"whatisgiveth"},{"id":"codeofconduct","path":"/whatisgiveth/codeofconduct","sidebar":"whatisgiveth"},{"id":"commsContributorGuide","path":"/whatisgiveth/commsContributorGuide","sidebar":"whatisgiveth"},{"id":"communityCommsGuide","path":"/whatisgiveth/communityCommsGuide","sidebar":"whatisgiveth"},{"id":"conflictResolution","path":"/whatisgiveth/conflictResolution","sidebar":"whatisgiveth"},{"id":"covenant","path":"/whatisgiveth/covenant","sidebar":"whatisgiveth"},{"id":"daoStructure","path":"/whatisgiveth/daoStructure","sidebar":"whatisgiveth"},{"id":"externalContributors","path":"/whatisgiveth/externalContributors","sidebar":"whatisgiveth"},{"id":"finances","path":"/whatisgiveth/finances"},{"id":"fundraisingGuide","path":"/whatisgiveth/fundraisingGuide","sidebar":"whatisgiveth"},{"id":"governanceProcess","path":"/whatisgiveth/governanceProcess","sidebar":"whatisgiveth"},{"id":"history","path":"/whatisgiveth/history","sidebar":"whatisgiveth"},{"id":"introCommunity","path":"/whatisgiveth/introCommunity"},{"id":"introDiscord","path":"/whatisgiveth/introDiscord","sidebar":"whatisgiveth"},{"id":"introGIVernance","path":"/whatisgiveth/introGIVernance"},{"id":"introPlatform","path":"/whatisgiveth/introPlatform"},{"id":"meetingsGuide","path":"/whatisgiveth/meetingsGuide","sidebar":"whatisgiveth"},{"id":"toolsDecentralizedCommunities","path":"/whatisgiveth/toolsDecentralizedCommunities","sidebar":"whatisgiveth"},{"id":"whatisgiveth","path":"/whatisgiveth/","sidebar":"whatisgiveth"},{"id":"zero-fees","path":"/whatisgiveth/zero-fees","sidebar":"whatisgiveth"}],"draftIds":[],"sidebars":{"whatisgiveth":{"link":{"path":"/whatisgiveth/","label":"whatisgiveth"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en","es","pt","tr"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en-US","calendar":"gregory","path":"en"},"es":{"label":"Espa\xf1ol","direction":"ltr","htmlLang":"es-MX","calendar":"gregory","path":"es"},"pt":{"label":"Portugu\xe9s","direction":"ltr","htmlLang":"pt-BR","calendar":"gregory","path":"pt"},"tr":{"label":"T\xfcrk\xe7e","direction":"ltr","htmlLang":"tr-TR","calendar":"gregory","path":"tr"}}}');var l=n(7529);const s=JSON.parse('{"docusaurusVersion":"2.0.0-rc.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.0.0-rc.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.0.0-rc.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.0.0-rc.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.0.0-rc.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.0.0-rc.1"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"2.0.0-rc.1"}}}'),c={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},u=r.createContext(c);function d(e){let{children:t}=e;return r.createElement(u.Provider,{value:c},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7294),a=n(412),o=n(5742),i=n(584);function l(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",height:"50vh",width:"100%",fontSize:"20px"}},r.createElement("h1",null,"This page crashed."),r.createElement("p",null,t.message),r.createElement("button",{type:"button",onClick:n},"Try again"))}function s(e){let{error:t,tryAgain:n}=e;return r.createElement(u,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(i.Z,null,r.createElement(l,{error:t,tryAgain:n})))}const c=e=>r.createElement(s,e);class u extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){var n;const e={error:t,tryAgain:()=>this.setState({error:null})};return(null!=(n=this.props.fallback)?n:c)(e)}return null!=e?e:null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(405);function o(e){return r.createElement(a.ql,e)}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7462),a=n(7294),o=n(3727),i=n(8780),l=n(2263),s=n(3919),c=n(412);const u=a.createContext({collectLink:()=>{}});var d=n(4996);function p(e,t){var n,p;let{isNavLink:f,to:m,href:h,activeClassName:g,isActive:b,"data-noBrokenLinkCheck":v,autoAddBaseUrl:y=!0,...w}=e;const{siteConfig:{trailingSlash:k,baseUrl:E}}=(0,l.Z)(),{withBaseUrl:S}=(0,d.C)(),x=(0,a.useContext)(u),T=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>T.current));const _=m||h;const C=(0,s.Z)(_),P=null==_?void 0:_.replace("pathname://","");let A=void 0!==P?(R=P,y&&(e=>e.startsWith("/"))(R)?S(R):R):void 0;var R;A&&C&&(A=(0,i.applyTrailingSlash)(A,{trailingSlash:k,baseUrl:E}));const L=(0,a.useRef)(!1),O=f?o.OL:o.rU,I=c.Z.canUseIntersectionObserver,N=(0,a.useRef)();(0,a.useEffect)((()=>(!I&&C&&null!=A&&window.docusaurus.prefetch(A),()=>{I&&N.current&&N.current.disconnect()})),[N,A,I,C]);const D=null!=(n=null==(p=A)?void 0:p.startsWith("#"))&&n,M=!A||!C||D;return M||v||x.collectLink(A),M?a.createElement("a",(0,r.Z)({ref:T,href:A},_&&!C&&{target:"_blank",rel:"noopener noreferrer"},w)):a.createElement(O,(0,r.Z)({},w,{onMouseEnter:()=>{L.current||null==A||(window.docusaurus.preload(A),L.current=!0)},innerRef:e=>{T.current=e,I&&e&&C&&(N.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(N.current.unobserve(e),N.current.disconnect(),null!=A&&window.docusaurus.prefetch(A))}))})),N.current.observe(e))},to:A},f&&{isActive:b,activeClassName:g}))}const f=a.forwardRef(p)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var r=n(7294);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=null==t?void 0:t[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(7529);function i(e){var t,n;let{id:r,message:a}=e;if(void 0===r&&void 0===a)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return null!=(t=null!=(n=o[null!=r?r:a])?n:a)?t:r}function l(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>o,Z:()=>i});var r=n(2263),a=n(3919);function o(){const{siteConfig:{baseUrl:e,url:t}}=(0,r.Z)();return{withBaseUrl:(n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:o=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,a.b)(n))return n;if(o)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)}}function i(e,t){void 0===t&&(t={});const{withBaseUrl:n}=o();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8934);function o(){return(0,r.useContext)(a._)}},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});function r(e){const t={};return function e(n,r){Object.entries(n).forEach((n=>{let[a,o]=n;const i=r?r+"."+a:a;var l;"object"==typeof(l=o)&&l&&Object.keys(l).length>0?e(o,i):t[i]=o}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(7294);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...null==n?void 0:n.data};return{plugin:t.plugin,data:r}}({parent:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>b,gA:()=>f,WS:()=>m,_r:()=>d,Jo:()=>v,zh:()=>p,yW:()=>g,gB:()=>h});var r=n(6775),a=n(2263),o=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error('Docusaurus plugin global data not found for "'+e+'" plugin.');return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=s(e,t),a=null==n?void 0:n.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},d=()=>{var e;return null!=(e=i("docusaurus-plugin-content-docs"))?e:u},p=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=null==r?void 0:r[t];if(!a&&n.failfast)throw new Error('Docusaurus plugin global data not found for "'+e+'" plugin with id "'+t+'".');return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function f(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error("Can't find active docs plugin for \""+t+'" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: '+Object.values(e).map((e=>e.path)).join(", "));return o}(t,n,e)}function m(e){void 0===e&&(e={});const t=f(e),{pathname:n}=(0,r.TH)();if(!t)return;return{activePlugin:t,activeVersion:s(t.pluginData,n)}}function h(e){return p(e).versions}function g(e){const t=p(e);return l(t)}function b(e){const t=p(e),{pathname:n}=(0,r.TH)();return c(t,n)}function v(e){const t=p(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(4865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(7410),a=n(6809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(6726)("./prism-"+e)})),delete globalThis.Prism}(r.Z)},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const a="iconExternalLink_nPIU";function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},584:(e,t,n)=>{"use strict";n.d(t,{Z:()=>yt});var r=n(7294),a=n(6010),o=n(4763),i=n(833),l=n(5281),s=n(9727),c=n(5999),u=n(6775),d=n(5936);function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}const f="skipToContent_fXgn";function m(){const{containerRef:e,handleSkip:t}=function(){const e=(0,r.useRef)(null),{action:t}=(0,u.k6)(),n=(0,r.useCallback)((e=>{var t;e.preventDefault();const n=null!=(t=document.querySelector("main:first-of-type"))?t:document.querySelector("."+l.k.wrapper.main);n&&p(n)}),[]);return(0,d.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,handleSkip:n}}();return r.createElement("div",{ref:e,role:"region"},r.createElement("a",{href:"#",className:f,onClick:t},r.createElement(c.Z,{id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation"},"Skip to main content")))}var h=n(6668),g=n(9689),b=n(7462);function v(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...l}=e;return r.createElement("svg",(0,b.Z)({viewBox:"0 0 15 15",width:t,height:n},l),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const y="announcementBar_mb4j",w="announcementBarPlaceholder_vyr4",k="announcementBarClose_gvF7",E="announcementBarContent_xLdY";function S(){const{isActive:e,close:t}=(0,g.nT)(),{announcementBar:n}=(0,h.L)();if(!e)return null;const{content:o,backgroundColor:i,textColor:l,isCloseable:s}=n;return r.createElement("div",{className:y,style:{backgroundColor:i,color:l},role:"banner"},s&&r.createElement("div",{className:w}),r.createElement("div",{className:E,dangerouslySetInnerHTML:{__html:o}}),s?r.createElement("button",{type:"button",className:(0,a.Z)("clean-btn close",k),onClick:t,"aria-label":(0,c.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},r.createElement(v,{width:14,height:14,strokeWidth:3.1})):null)}var x=n(2961),T=n(2466);var _=n(902),C=n(3102);const P=r.createContext(null);function A(e){let{children:t}=e;const n=function(){const e=(0,x.e)(),t=(0,C.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,_.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return r.createElement(P.Provider,{value:n},t)}function R(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function L(){const e=(0,r.useContext)(P);if(!e)throw new _.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,C.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:R(o)})),[a,o,t])}function O(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=L();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var I=n(2949),N=n(2389);function D(e){return r.createElement("svg",(0,b.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function M(e){return r.createElement("svg",(0,b.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const F={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function j(e){let{className:t,value:n,onChange:o}=e;const i=(0,N.Z)(),l=(0,c.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===n?(0,c.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,c.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)(F.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",F.toggleButton,!i&&F.toggleButtonDisabled),type:"button",onClick:()=>o("dark"===n?"light":"dark"),disabled:!i,title:l,"aria-label":l},r.createElement(D,{className:(0,a.Z)(F.toggleIcon,F.lightToggleIcon)}),r.createElement(M,{className:(0,a.Z)(F.toggleIcon,F.darkToggleIcon)})))}const B=r.memo(j);function U(e){let{className:t}=e;const n=(0,h.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,I.I)();return n?null:r.createElement(B,{className:t,value:a,onChange:o})}var z=n(1327);function G(){return r.createElement(z.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function q(){const e=(0,x.e)();return r.createElement("button",{type:"button",className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(v,{color:"var(--ifm-color-emphasis-600)"}))}function $(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(G,null),r.createElement(U,{className:"margin-right--md"}),r.createElement(q,null))}var H=n(9960),Z=n(4996),V=n(3919),W=n(8022),K=n(9471);function Q(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:l,isDropdownLink:s,prependBaseUrlToHref:c,...u}=e;const d=(0,Z.Z)(a),p=(0,Z.Z)(t),f=(0,Z.Z)(o,{forcePrependBaseUrl:!0}),m=i&&o&&!(0,V.Z)(o),h=l?{dangerouslySetInnerHTML:{__html:l}}:{children:r.createElement(r.Fragment,null,i,m&&r.createElement(K.Z,s&&{width:12,height:12}))};return o?r.createElement(H.Z,(0,b.Z)({href:c?f:o},u,h)):r.createElement(H.Z,(0,b.Z)({to:d,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?(0,W.F)(n,t.pathname):t.pathname.startsWith(p)},u,h))}function Y(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(Q,(0,b.Z)({className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function X(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(Q,(0,b.Z)({className:(0,a.Z)("menu__link",t)},o)))}function J(e){var t;let{mobile:n=!1,position:a,...o}=e;const i=n?X:Y;return r.createElement(i,(0,b.Z)({},o,{activeClassName:null!=(t=o.activeClassName)?t:n?"menu__link--active":"navbar__link--active"}))}var ee=n(6043),te=n(8596),ne=n(2263);function re(e,t){return e.some((e=>function(e,t){return!!(0,te.Mg)(e.to,t)||!!(0,W.F)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ae(e){var t;let{items:n,position:o,className:i,onClick:l,...s}=e;const c=(0,r.useRef)(null),[u,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{c.current&&!c.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}}),[c]),r.createElement("div",{ref:c,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===o,"dropdown--show":u})},r.createElement(Q,(0,b.Z)({"aria-haspopup":"true","aria-expanded":u,role:"button",href:s.to?void 0:"#",className:(0,a.Z)("navbar__link",i)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))}}),null!=(t=s.children)?t:s.label),r.createElement("ul",{className:"dropdown__menu"},n.map(((e,t)=>r.createElement(Me,(0,b.Z)({isDropdownItem:!0,onKeyDown:e=>{if(t===n.length-1&&"Tab"===e.key){e.preventDefault(),d(!1);const t=c.current.nextElementSibling;if(t){(t instanceof HTMLAnchorElement?t:t.querySelector("a")).focus()}}},activeClassName:"dropdown__link--active"},e,{key:t}))))))}function oe(e){var t;let{items:n,className:o,position:i,onClick:l,...s}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,ne.Z)(),{pathname:t}=(0,u.TH)();return t.replace(e,"/")}(),d=re(n,c),{collapsed:p,toggleCollapsed:f,setCollapsed:m}=(0,ee.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":p})},r.createElement(Q,(0,b.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",o)},s,{onClick:e=>{e.preventDefault(),f()}}),null!=(t=s.children)?t:s.label),r.createElement(ee.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p},n.map(((e,t)=>r.createElement(Me,(0,b.Z)({mobile:!0,isDropdownItem:!0,onClick:l,activeClassName:"menu__link--active"},e,{key:t}))))))}function ie(e){let{mobile:t=!1,...n}=e;const a=t?oe:ae;return r.createElement(a,n)}var le=n(4711);function se(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,b.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const ce="iconLanguage_nlXk";var ue=n(3935),de=n(5742),pe=n(6177);function fe(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var me=n(830),he=["translations"];function ge(){return ge=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var we="Ctrl";var ke=r.forwardRef((function(e,t){var n=e.translations,a=void 0===n?{}:n,o=ye(e,he),i=a.buttonText,l=void 0===i?"Search":i,s=a.buttonAriaLabel,c=void 0===s?"Search":s,u=be((0,r.useState)(null),2),d=u[0],p=u[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?p("\u2318"):p(we))}),[]),r.createElement("button",ge({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},o,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(me.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},l)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&r.createElement(r.Fragment,null,r.createElement("kbd",{className:"DocSearch-Button-Key"},d===we?r.createElement(fe,null):d),r.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))})),Ee=n(3320);const Se={button:{buttonText:(0,c.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,c.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,c.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,c.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,c.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,c.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,c.I)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,c.I)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,c.I)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,c.I)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,c.I)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,c.I)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,c.I)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,c.I)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,c.I)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,c.I)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let xe=null;function Te(e){let{hit:t,children:n}=e;return r.createElement(H.Z,{to:t.url},n)}function _e(e){let{state:t,onClose:n}=e;const{generateSearchPageLink:a}=(0,pe.O)();return r.createElement(H.Z,{to:a(t.query),onClick:n},r.createElement(c.Z,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits}},"See all {count} results"))}function Ce(e){var t,a;let{contextualSearch:o,externalUrlRegex:i,...l}=e;const{siteMetadata:s}=(0,ne.Z)(),c=function(){const{locale:e,tags:t}=(0,Ee._q)();return["language:"+e,t.map((e=>"docusaurus_tag:"+e))]}(),d=null!=(t=null==(a=l.searchParameters)?void 0:a.facetFilters)?t:[],p=o?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(c,d):d,f={...l.searchParameters,facetFilters:p},{withBaseUrl:m}=(0,Z.C)(),h=(0,u.k6)(),g=(0,r.useRef)(null),v=(0,r.useRef)(null),[y,w]=(0,r.useState)(!1),[k,E]=(0,r.useState)(void 0),S=(0,r.useCallback)((()=>xe?Promise.resolve():Promise.all([n.e(6780).then(n.bind(n,6780)),Promise.all([n.e(3312),n.e(6945)]).then(n.bind(n,6945)),Promise.all([n.e(3312),n.e(8894)]).then(n.bind(n,8894))]).then((e=>{let[{DocSearchModal:t}]=e;xe=t}))),[]),x=(0,r.useCallback)((()=>{S().then((()=>{g.current=document.createElement("div"),document.body.insertBefore(g.current,document.body.firstChild),w(!0)}))}),[S,w]),T=(0,r.useCallback)((()=>{var e;w(!1),null==(e=g.current)||e.remove()}),[w]),_=(0,r.useCallback)((e=>{S().then((()=>{w(!0),E(e.key)}))}),[S,w,E]),C=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,W.F)(i,t)?window.location.href=t:h.push(t)}}).current,P=(0,r.useRef)((e=>e.map((e=>{if((0,W.F)(i,e.url))return e;const t=new URL(e.url);return{...e,url:m(""+t.pathname+t.hash)}})))).current,A=(0,r.useMemo)((()=>e=>r.createElement(_e,(0,b.Z)({},e,{onClose:T}))),[T]),R=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",s.docusaurusVersion),e)),[s.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,a=e.onClose,o=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){(27===e.keyCode&&t||"k"===e.key&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?a():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&o&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&o(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,a,o,i])}({isOpen:y,onOpen:x,onClose:T,onInput:_,searchButtonRef:v}),r.createElement(r.Fragment,null,r.createElement(de.Z,null,r.createElement("link",{rel:"preconnect",href:"https://"+l.appId+"-dsn.algolia.net",crossOrigin:"anonymous"})),r.createElement(ke,{onTouchStart:S,onFocus:S,onMouseOver:S,onClick:x,ref:v,translations:Se.button}),y&&xe&&g.current&&(0,ue.createPortal)(r.createElement(xe,(0,b.Z)({onClose:T,initialScrollY:window.scrollY,initialQuery:k,navigator:C,transformItems:P,hitComponent:Te,transformSearchClient:R},l.searchPagePath&&{resultsFooterComponent:A},l,{searchParameters:f,placeholder:Se.placeholder,translations:Se.modal})),g.current))}function Pe(){const{siteConfig:e}=(0,ne.Z)();return r.createElement(Ce,e.themeConfig.algolia)}const Ae="searchBox_ZlJk";function Re(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,Ae)},t)}var Le=n(143),Oe=n(3438);var Ie=n(373);const Ne=e=>e.docs.find((t=>t.id===e.mainDocId));const De={default:J,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:l,localeConfigs:s}}=(0,ne.Z)(),u=(0,le.l)(),d=[...n,...l.map((e=>{const n="pathname://"+u.createUrl({locale:e,fullyQualified:!1});return{label:s[e].label,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...a],p=t?(0,c.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):s[i].label;return r.createElement(ie,(0,b.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(se,{className:ce}),p),items:d}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(Re,{className:n},r.createElement(Pe,null))},dropdown:ie,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,a.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Le.Iw)(a),l=(0,Oe.vY)(t,a);return null===l?null:r.createElement(J,(0,b.Z)({exact:!0},o,{isActive:()=>(null==i?void 0:i.path)===l.path||!(null==i||!i.sidebar)&&i.sidebar===l.sidebar,label:null!=n?n:l.id,to:l.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Le.Iw)(a),l=(0,Oe.oz)(t,a).link;if(!l)throw new Error('DocSidebarNavbarItem: Sidebar with ID "'+t+"\" doesn't have anything to be linked to.");return r.createElement(J,(0,b.Z)({exact:!0},o,{isActive:()=>(null==i?void 0:i.sidebar)===t,label:null!=n?n:l.label,to:l.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,Oe.lO)(a)[0],l=null!=t?t:i.label,s=null!=n?n:(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(J,(0,b.Z)({},o,{label:l,to:s}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...l}=e;const s=(0,Le.Iw)(n),u=(0,Le.gB)(n),{savePreferredVersionName:d}=(0,Ie.J)(n),p=[...o,...u.map((e=>{var t;const n=null!=(t=s.alternateDocVersions[e.name])?t:Ne(e);return{label:e.label,to:n.path,isActive:()=>e===s.activeVersion,onClick:()=>d(e.name)}})),...i],f=(0,Oe.lO)(n)[0],m=t&&p.length>1?(0,c.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):f.label,h=t&&p.length>1?void 0:Ne(f).path;return p.length<=1?r.createElement(J,(0,b.Z)({},l,{mobile:t,label:m,to:h,isActive:a?()=>!1:void 0})):r.createElement(ie,(0,b.Z)({},l,{mobile:t,label:m,to:h,items:p,isActive:a?()=>!1:void 0}))}};function Me(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=De[a];if(!o)throw new Error('No NavbarItem component found for type "'+t+'".');return r.createElement(o,n)}function Fe(){const e=(0,x.e)(),t=(0,h.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(Me,(0,b.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function je(e){return r.createElement("button",(0,b.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(c.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function Be(){const e=0===(0,h.L)().navbar.items.length,t=L();return r.createElement(r.Fragment,null,!e&&r.createElement(je,{onClick:()=>t.hide()}),t.content)}function Ue(){const e=(0,x.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(O,{header:r.createElement($,null),primaryMenu:r.createElement(Fe,null),secondaryMenu:r.createElement(Be,null)}):null}const ze="navbarHideable_m1mJ",Ge="navbarHidden_jGov";function qe(e){return r.createElement("div",(0,b.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function $e(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,h.L)(),i=(0,x.e)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,T.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+c{if(e)return t.location.hash?(a.current=!0,void n(!1)):void n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:l,className:(0,a.Z)("navbar","navbar--fixed-top",n&&[ze,!s&&Ge],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(qe,{onClick:i.toggle}),r.createElement(Ue,null))}function He(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,b.Z)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function Ze(){const e=(0,x.e)();return r.createElement("button",{onClick:e.toggle,onKeyDown:e.toggle,"aria-label":"Navigation bar toggle",className:"navbar__toggle clean-btn",type:"button",tabIndex:0},r.createElement(He,null))}const Ve="colorModeToggle_DEke";function We(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(Me,(0,b.Z)({},e,{key:t})))))}function Ke(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function Qe(){const e=(0,x.e)(),t=(0,h.L)().navbar.items,[n,a]=function(e){function t(e){var t;return"left"===(null!=(t=e.position)?t:"right")}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(Ke,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(Ze,null),r.createElement(G,null),r.createElement(We,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(We,{items:a}),r.createElement(U,{className:Ve}),!o&&r.createElement(Re,null,r.createElement(Pe,null)))})}function Ye(){return r.createElement($e,null,r.createElement(Qe,null))}function Xe(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...l}=t,s=(0,Z.Z)(n),c=(0,Z.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(H.Z,(0,b.Z)({className:"footer__link-item"},a?{href:i?c:a}:{to:s},l),o,a&&!(0,V.Z)(a)&&r.createElement(K.Z,null))}function Je(e){var t;let{item:n}=e;return n.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:n.html}}):r.createElement("li",{key:null!=(t=n.href)?t:n.to,className:"footer__item"},r.createElement(Xe,{item:n}))}function et(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(Je,{key:t,item:e})))))}function tt(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(et,{key:t,column:e}))))}function nt(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function rt(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(Xe,{item:t})}function at(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(rt,{item:e}),t.length!==n+1&&r.createElement(nt,null))))))}function ot(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(tt,{columns:t}):r.createElement(at,{links:t})}var it=n(941);const lt="footerLogoLink_BH7S";function st(e){var t;let{logo:n}=e;const{withBaseUrl:o}=(0,Z.C)(),i={light:o(n.src),dark:o(null!=(t=n.srcDark)?t:n.src)};return r.createElement(it.Z,{className:(0,a.Z)("footer__logo",n.className),alt:n.alt,sources:i,width:n.width,height:n.height,style:n.style})}function ct(e){let{logo:t}=e;return t.href?r.createElement(H.Z,{href:t.href,className:lt,target:t.target},r.createElement(st,{logo:t})):r.createElement(st,{logo:t})}function ut(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function dt(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function pt(){const{footer:e}=(0,h.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(dt,{style:o,links:n&&n.length>0&&r.createElement(ot,{links:n}),logo:a&&r.createElement(ct,{logo:a}),copyright:t&&r.createElement(ut,{copyright:t})})}const ft=r.memo(pt);var mt=n(7094);const ht=(0,_.Qc)([I.S,g.pl,mt.z,T.OC,Ie.L5,i.VC,function(e){let{children:t}=e;return r.createElement(C.n2,null,r.createElement(x.M,null,r.createElement(A,null,t)))}]);function gt(e){let{children:t}=e;return r.createElement(ht,null,t)}function bt(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(c.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("p",null,t.message),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},r.createElement(c.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again when the page crashed"},"Try again"))))))}const vt="mainWrapper_z2l0";function yt(e){const{children:t,noFooter:n,wrapperClassName:c,title:u,description:d}=e;return(0,s.t)(),r.createElement(gt,null,r.createElement(i.d,{title:u,description:d}),r.createElement(m,null),r.createElement(S,null),r.createElement(Ye,null),r.createElement("div",{className:(0,a.Z)(l.k.wrapper.main,vt,c)},r.createElement(o.Z,{fallback:e=>r.createElement(bt,e)},t)),!n&&r.createElement(ft,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),a=n(7294),o=n(9960),i=n(4996),l=n(2263),s=n(6668),c=n(941);function u(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=a.createElement(c.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},l):l}function d(e){var t;const{siteConfig:{title:n}}=(0,l.Z)(),{navbar:{title:c,logo:d}}=(0,s.L)(),{imageClassName:p,titleClassName:f,...m}=e,h=(0,i.Z)((null==d?void 0:d.href)||"/"),g=c?"":n,b=null!=(t=null==d?void 0:d.alt)?t:g;return a.createElement(o.Z,(0,r.Z)({to:h},m,(null==d?void 0:d.target)&&{target:d.target}),d&&a.createElement(u,{logo:d,alt:b,imageClassName:p}),null!=c&&a.createElement("b",{className:f},c))}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(5742);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(7462),a=n(7294),o=n(6010),i=n(2389),l=n(2949);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function c(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:c,className:u,alt:d,...p}=e,f=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,f.map((e=>a.createElement("img",(0,r.Z)({key:e,src:c[e],alt:d,className:(0,o.Z)(s.themedImage,s["themedImage--"+e],u)},p)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,z:()=>m});var r=n(7462),a=n(7294),o=n(412);function i(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(null!=t&&t),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const l={display:"none",overflow:"hidden",height:"0px"},s={display:"block",overflow:"visible",height:"auto"};function c(e,t){const n=t?l:s;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function u(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){var t,n;const a=e.scrollHeight,o=null!=(t=null==r?void 0:r.duration)?t:function(e){const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(a);return{transition:"height "+o+"ms "+(null!=(n=null==r?void 0:r.easing)?n:"ease-in-out"),height:a+"px"}}function i(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return c(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(i(),requestAnimationFrame((()=>{e.style.height=l.height,e.style.overflow=l.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{i()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function d(e){if(!o.Z.canUseDOM)return e?l:s}function p(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const p=(0,a.useRef)(null);return u({collapsibleRef:p,collapsed:n,animation:o}),a.createElement(t,{ref:p,style:s?void 0:d(n),onTransitionEnd:e=>{"height"===e.propertyName&&(c(p.current,n),null==i||i(n))},className:l},r)}function f(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[l,s]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?a.createElement(p,(0,r.Z)({},n,{collapsed:l})):null}function m(e){let{lazy:t,...n}=e;const r=t?f:p;return a.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>f});var r=n(7294),a=n(2389),o=n(12),i=n(902),l=n(6668);const s=(0,o.W)("docusaurus.announcement.dismiss"),c=(0,o.W)("docusaurus.announcement.id"),u=()=>"true"===s.get(),d=e=>s.set(String(e)),p=r.createContext(null);function f(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&u()));(0,r.useEffect)((()=>{o(u())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;c.set(t),r&&d(!1),!r&&u()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(p.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(p);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>g,S:()=>h});var r=n(7294),a=n(412),o=n(902),i=n(12),l=n(6668);const s=r.createContext(void 0),c="theme",u=(0,i.W)(c),d="light",p="dark",f=e=>e===p?p:d;function m(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[o,i]=(0,r.useState)((e=>a.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e))(e));(0,r.useEffect)((()=>{t&&u.del()}),[t]);const s=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(i(t),a&&(e=>{u.set(f(e))})(t)):(i(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p:d:e),u.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=u.get();null!==t&&s(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,s]);const m=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||m.current?m.current=window.matchMedia("print").matches:s(null)};return e.addListener(r),()=>e.removeListener(r)}),[s,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:s,get isDarkTheme(){return o===p},setLightTheme(){s(d)},setDarkTheme(){s(p)}})),[o,s])}function h(e){let{children:t}=e;const n=m();return r.createElement(s.Provider,{value:n},t)}function g(){const e=(0,r.useContext)(s);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>y,L5:()=>b,Oh:()=>w});var r=n(7294),a=n(143),o=n(9935),i=n(6668),l=n(3438),s=n(902),c=n(12);const u=e=>"docs-preferred-version-"+e,d=(e,t,n)=>{(0,c.W)(u(e),{persistence:t}).set(n)},p=(e,t)=>(0,c.W)(u(e),{persistence:t}).get(),f=(e,t)=>{(0,c.W)(u(e),{persistence:t}).del()};const m=r.createContext(null);function h(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>(e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}]))))(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=p(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(f(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=h();return r.createElement(m.Provider,{value:n},t)}function b(e){let{children:t}=e;return l.cE?r.createElement(g,null,t):r.createElement(r.Fragment,null,t)}function v(){const e=(0,r.useContext)(m);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function y(e){var t;void 0===e&&(e=o.m);const n=(0,a.zh)(e),[i,l]=v(),{preferredVersionName:s}=i[e];return{preferredVersion:null!=(t=n.versions.find((e=>e.name===s)))?t:null,savePreferredVersionName:(0,r.useCallback)((t=>{l.savePreferredVersion(e,t)}),[l,e])}}function w(){const e=(0,a._r)(),[t]=v();function n(n){var r;const a=e[n],{preferredVersionName:o}=t[n];return null!=(r=a.versions.find((e=>e.name===o)))?r:null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var r=n(7294),a=n(902);const o=Symbol("EmptyContext"),i=r.createContext(o);function l(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function s(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>l,q:()=>i});var r=n(7294),a=n(902);const o=r.createContext(null);function i(e){let{children:t,version:n}=e;return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(null===e)throw new a.i6("DocsVersionProvider");return e}},2961:(e,t,n)=>{"use strict";n.d(t,{M:()=>p,e:()=>f});var r=n(7294),a=n(3102),o=n(7524),i=n(6775),l=n(902);function s(e){!function(e){const t=(0,i.k6)(),n=(0,l.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var c=n(6668);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,c.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const u=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:i})),[e,n,u,i])}function p(e){let{children:t}=e;const n=d();return r.createElement(u.Provider,{value:n},t)}function f(){const e=r.useContext(u);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var r=n(7294),a=n(902);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,a.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},7094:(e,t,n)=>{"use strict";n.d(t,{U:()=>c,z:()=>s});var r=n(7294),a=n(12),o=n(902);const i="docusaurus.tab.",l=r.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const[e,t]=(0,r.useState)({}),n=(0,r.useCallback)(((e,t)=>{(0,a.W)("docusaurus.tab."+e).set(t)}),[]);(0,r.useEffect)((()=>{try{const e={};(0,a._)().forEach((t=>{if(t.startsWith(i)){const n=t.substring(i.length);e[n]=(0,a.W)(t).get()}})),t(e)}catch(e){console.error(e)}}),[]);const o=(0,r.useCallback)(((e,r)=>{t((t=>({...t,[e]:r}))),n(e,r)}),[n]);return(0,r.useMemo)((()=>({tabGroupChoices:e,setTabGroupChoices:o})),[e,o])}();return r.createElement(l.Provider,{value:n},t)}function c(){const e=(0,r.useContext)(l);if(null==e)throw new o.i6("TabGroupChoiceProvider");return e}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(7294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},6177:(e,t,n)=>{"use strict";n.d(t,{O:()=>l});var r=n(7294),a=n(6775),o=n(2263);const i="q";function l(){const e=(0,a.k6)(),{siteConfig:{baseUrl:t}}=(0,o.Z)(),[n,l]=(0,r.useState)("");(0,r.useEffect)((()=>{var e;const t=null!=(e=new URLSearchParams(window.location.search).get(i))?e:"";l(t)}),[]);return{searchQuery:n,setSearchQuery:(0,r.useCallback)((t=>{const n=new URLSearchParams(window.location.search);t?n.set(i,t):n.delete(i),e.replace({search:n.toString()}),l(t)}),[e]),generateSearchPageLink:(0,r.useCallback)((e=>t+"search?"+"q="+encodeURIComponent(e)),[t])}}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>c});var r=n(7294),a=n(412);const o="desktop",i="mobile",l="ssr";function s(){return a.Z.canUseDOM?window.innerWidth>996?o:i:l}function c(){const[e,t]=(0,r.useState)((()=>s()));return(0,r.useEffect)((()=>{function e(){t(s())}return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(undefined)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>"theme-admonition-"+e},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>"theme-doc-sidebar-item-category-level-"+e,docSidebarItemLinkLevel:e=>"theme-doc-sidebar-item-link-level-"+e},blog:{}}},3438:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>h,_F:()=>v,cE:()=>p,hI:()=>S,jA:()=>g,lO:()=>w,oz:()=>k,s1:()=>y,vY:()=>E,xz:()=>f});var r=n(7294),a=n(6775),o=n(8790),i=n(143),l=n(373),s=n(4477),c=n(1116),u=n(7392),d=n(8596);const p=!!i._r;function f(e){const t=(0,s.E)();if(!e)return;const n=t.docs[e];if(!n)throw new Error("no version doc found by id="+e);return n}function m(e,t){for(const n of e)if("category"===n.type){if(t(n))return n;const e=m(n.items,t);if(e)return e}}function h(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=h(t);if(e)return e}}}function g(){const{pathname:e}=(0,a.TH)(),t=(0,c.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=m(t.items,(t=>(0,d.Mg)(t.href,e)));if(!n)throw new Error(e+" is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.");return n}const b=(e,t)=>void 0!==e&&(0,d.Mg)(e,t);function v(e,t){return"link"===e.type?b(e.href,t):"category"===e.type&&(b(e.href,t)||((e,t)=>e.some((e=>v(e,t))))(e.items,t))}function y(){var e;const t=(0,c.V)(),{pathname:n}=(0,a.TH)();if(!1===(null==(e=(0,i.gA)())?void 0:e.pluginData.breadcrumbs)||!t)return null;const r=[];return function e(t){for(const a of t)if("category"===a.type&&((0,d.Mg)(a.href,n)||e(a.items))||"link"===a.type&&(0,d.Mg)(a.href,n))return r.push(a),!0;return!1}(t.items),r.reverse()}function w(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>(0,u.j)([t,n,a].filter(Boolean))),[t,n,a])}function k(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error("Can't find any sidebar with id \""+e+'" in version'+(n.length>1?"s":"")+" "+n.map((e=>e.name)).join(", ")+'".\n Available sidebar ids are:\n - '+Object.keys(t).join("\n- "));return r[1]}),[e,n])}function E(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error("DocNavbarItem: couldn't find any doc with id \""+e+'" in version'+(n.length>1?"s":"")+" "+n.map((e=>e.name)).join(", ")+'".\nAvailable doc ids are:\n- '+(0,u.j)(t.map((e=>e.id))).join("\n- "))}return r}),[e,n])}function S(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,l=i.find((e=>(0,a.LX)(r.pathname,e)));if(!l)return null;const s=l.sidebar,c=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.H)(i),sidebarName:s,sidebarItems:c}}},2128:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(2263);function a(e){const{siteConfig:t}=(0,r.Z)(),{title:n,titleDelimiter:a}=t;return null!=e&&e.trim().length?e.trim()+" "+a+" "+n:n}},7392:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function a(e){return Array.from(new Set(e))}n.d(t,{j:()=>a,l:()=>r})},833:(e,t,n)=>{"use strict";n.d(t,{FG:()=>p,d:()=>u,VC:()=>f});var r=n(7294),a=n(6010),o=n(5742),i=n(226);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(4996),c=n(2128);function u(e){let{title:t,description:n,keywords:a,image:i,children:l}=e;const u=(0,c.p)(t),{withBaseUrl:d}=(0,s.C)(),p=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,u),t&&r.createElement("meta",{property:"og:title",content:u}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),p&&r.createElement("meta",{property:"og:image",content:p}),p&&r.createElement("meta",{name:"twitter:image",content:p}),l)}const d=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(o.Z,null,r.createElement("html",{className:l})),n)}function f(e){let{children:t}=e;const n=l(),o="plugin-"+n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"");const i="plugin-id-"+n.plugin.id;return r.createElement(p,{className:(0,a.Z)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>c,Ql:()=>s,i6:()=>l,zX:()=>o});var r=n(7294);const a=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return a((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){var n,r,a,o;super(),this.name="ReactContextError",this.message="Hook "+(null!=(n=null==(r=this.stack)||null==(a=r.split("\n")[1])||null==(o=a.match(/at (?:\w+\.)?(?\w+)/))?void 0:o.groups.name)?n:"")+" is called outside the <"+e+">. "+(null!=t?t:"")}}function s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8022:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{F:()=>r})},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(7294),a=n(723),o=n(2263);function i(e,t){const n=e=>{var t;return null==(t=!e||e.endsWith("/")?e:e+"/")?void 0:t.toLowerCase()};return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>{var t;return null!=(t=e.routes)?t:[]})))}(n)}({routes:a.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>s,RF:()=>d,o5:()=>p});var r=n(7294),a=n(412),o=n(2389),i=n(902);const l=r.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(l.Provider,{value:n},t)}function c(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const u=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=c(),a=(0,r.useRef)(u()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=u();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function p(){const e=c(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),a=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,r.useLayoutEffect)((()=>{null==n.current||n.current()})),{blockElementScrollPositionUntilNextRender:a}}function f(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>null==e.current?void 0:e.current()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>i,_q:()=>s,os:()=>l});var r=n(143),a=n(2263),o=n(373);const i="default";function l(e,t){return"docs-"+e+"-"+t}function s(){const{i18n:e}=(0,a.Z)(),t=(0,r._r)(),n=(0,r.WS)(),s=(0,o.Oh)();const c=[i,...Object.keys(t).map((function(e){var r;const a=(null==n?void 0:n.activePlugin.pluginId)===e?n.activeVersion:void 0,o=s[e],i=t[e].versions.find((e=>e.isLast));return l(e,(null!=(r=null!=a?a:o)?r:i).name)}))];return{locale:e.currentLocale,tags:c}}},12:(e,t,n)=>{"use strict";n.d(t,{W:()=>l,_:()=>s});const r="localStorage";function a(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,o||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),o=!0),null}var t}let o=!1;const i={get:()=>null,set:()=>{},del:()=>{}};function l(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error('Illegal storage API usage for storage key "'+e+'".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.')}return{get:t,set:t,del:t}}(e);const n=a(null==t?void 0:t.persistence);return null===n?i:{get:()=>{try{return n.getItem(e)}catch(t){return console.error("Docusaurus storage error, can't get key="+e,t),null}},set:t=>{try{n.setItem(e,t)}catch(r){console.error("Docusaurus storage error, can't set "+e+"="+t,r)}},del:()=>{try{n.removeItem(e)}catch(t){console.error("Docusaurus storage error, can't delete key="+e,t)}}}}function s(e){void 0===e&&(e=r);const t=a(e);if(!t)return[];const n=[];for(let r=0;r{"use strict";n.d(t,{l:()=>o});var r=n(2263),a=n(6775);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,r.Z)(),{pathname:i}=(0,a.TH)(),l=o===n?e:e.replace("/"+o+"/","/"),s=i.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:a}=e;return""+(a?t:"")+function(e){return e===n?""+l:""+l+e+"/"}(r)+s}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6775),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:e+"/"}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="post-content";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}})},6010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{lX:()=>w,q_:()=>_,ob:()=>f,PP:()=>P,Ep:()=>p});var r=n(7462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;p--){var f=i[p];"."===f?o(i,p):".."===f?(o(i,p),d++):d&&(o(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(2177);function s(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function f(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=f(e,t,h(),w.location);u.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=f(n);a&&a!==m&&e(t,a,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),g=0;g{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,a,o,i,l],u=0;(s=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),c=o.querySelector(r.barSelector),u=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,i(e,u,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),c=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&f(a),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;function a(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,o){for(var i,l,s=a(e),c=1;c{"use strict";n.d(t,{Z:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);S+=E.value.length,E=E.next){var x=E.value;if(t.length>e.length)return;if(!(x instanceof a)){var T,_=1;if(v){if(!(T=o(k,S,e,b))||T.index>=e.length)break;var C=T.index,P=T.index+T[0].length,A=S;for(A+=E.value.length;C>=A;)A+=(E=E.next).value.length;if(S=A-=E.value.length,E.value instanceof a)continue;for(var R=E;R!==t.tail&&(Ad.reach&&(d.reach=N);var D=E.prev;if(O&&(D=s(t,D,O),S+=O.length),c(t,D,_),E=s(t,D,new a(p,g?r.tokenize(L,g):L,y,L)),I&&s(t,E,I),_>1){var M={cause:p+","+m,reach:N};i(e,t,n,E.prev,S,M),d&&M.reach>d.reach&&(d.reach=M.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function c(e,t,n){for(var r=t.next,a=0;a"+o.content+""},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var l=p(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s=0&&f(c,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function c(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function u(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,u={},d=s(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=l(i++,r)););return u[n]=a,n})).join(""),n,r),p=Object.keys(u);return i=0,function e(t){for(var n=0;n=p.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=p[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var s=o.substring(0,l),d=c(u[a]),f=o.substring(l+a.length),m=[];if(s&&m.push(s),m.push(d),f){var h=[f];e(h),m.push.apply(m,h)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var g=r.content;Array.isArray(g)?e(g):e([g])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function p(e){return"string"==typeof e?e:Array.isArray(e)?e.map(p).join(""):p(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function o(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(a);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}a.content&&"string"!=typeof a.content&&l(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=o.length);s++){var c=l[s];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[a],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),m=p.indexOf(f);if(m>-1){++a;var h=p.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(m+f.length),v=[];h&&v.push.apply(v,i([h])),v.push(g),b&&v.push.apply(v,i([b])),"string"==typeof c?l.splice.apply(l,[s,1].concat(v)):c.content=v}}else c.content&&i(c.content)}return l}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},9901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:"shell",aliasTitles:{shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (Scss)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),a=n(9642),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),o.add(e)}))}i.silent=!1,e.exports=i},6726:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6726},6500:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var l={},s=e[r];if(s){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in a(t,o),l[t]=!0,n[t])l[i]=!0}t(s.require,c),t(s.optional,c),t(s.modify,c)}n[r]=l,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,l){var s=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),c=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(s);i=i.map(c),l=(l||[]).map(c);var u=n(i),d=n(l);i.forEach((function e(n){var r=s[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var p,f=r(s),m=u;a(m);){for(var h in p={},m){var g=s[h];t(g&&g.modify,(function(e){e in d&&(p[e]=!0)}))}for(var b in d)if(!(b in u))for(var v in f(b))if(v in u){p[b]=!0;break}for(var y in m=p)u[y]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,a){var o=a?a.series:void 0,i=a?a.parallel:e,l={},s={};function c(e){if(e in l)return l[e];s[e]=!0;var a,u=[];for(var d in t(e))d in n&&u.push(d);if(0===u.length)a=r(e);else{var p=i(u.map((function(e){var t=c(e);return delete s[e],t})));o?a=o(p,(function(){return r(e)})):r(e)}return l[e]=a}for(var u in n)c(u);var d=[];for(var p in s)d.push(l[p]);return i(d)}(f,u,t,n)}};return w}}();e.exports=t},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(7418),o=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n