From 7af739375474b1180306c859fc0a3b7606cbf17a Mon Sep 17 00:00:00 2001 From: Ouziel Slama Date: Mon, 16 Sep 2024 10:56:24 +0200 Subject: [PATCH] Deploy website - based on eb2b33dbb9bca3f9c6a804e67a10eabee4cd9a41 --- 404.html | 4 +- ...gmoid-db828c73543dd1ab63b96593146d76a6.png | Bin 0 -> 64351 bytes assets/js/0d902d1d.c0441f09.js | 1 + assets/js/47dd2ef0.22e3295b.js | 1 + assets/js/4a97e2ba.05013fa6.js | 1 - assets/js/4a97e2ba.1612bc22.js | 1 + assets/js/825c9a32.063b5c32.js | 1 + assets/js/935f2afb.7864347a.js | 1 + assets/js/935f2afb.a2818b84.js | 1 - assets/js/aaef2cb0.932814c2.js | 1 + assets/js/aaef2cb0.9775ece7.js | 1 - assets/js/aeaaba45.197317f4.js | 1 - assets/js/aeaaba45.e439c077.js | 1 + assets/js/b7d3b5fd.a8f29e10.js | 1 + assets/js/c463f2d8.7b7e782d.js | 1 + assets/js/c66ced44.d100f20f.js | 1 + assets/js/e79842f2.47a4cd08.js | 1 + assets/js/e9ab1486.cadf83d1.js | 1 + assets/js/fe704f88.d78e1018.js | 1 + assets/js/main.1ee346cc.js | 2 - assets/js/main.4506c1ec.js | 2 + ...CENSE.txt => main.4506c1ec.js.LICENSE.txt} | 0 assets/js/runtime~main.7bdf2e2d.js | 1 + assets/js/runtime~main.9714e34e.js | 1 - .../api-v1/api-v1-changelog/index.html | 6 +- .../api-v1/api-v1-overview/index.html | 6 +- docs/advanced/api-v1/api-v1-spec/index.html | 6 +- docs/advanced/api-v2/node-api/index.html | 6 +- docs/advanced/api-v2/v1-to-v2/index.html | 6 +- docs/advanced/bounties/index.html | 8 +- .../multisig/index.html | 6 +- .../sending-bulk/index.html | 6 +- .../command-line-interface/usage/index.html | 6 +- docs/advanced/exchange-integration/index.html | 6 +- docs/advanced/how-to/atomic-swap/index.html | 64 +++++++++++++++ .../how-to/docker-kickstart/index.html | 6 +- .../how-to/sentry-integration/index.html | 8 +- docs/advanced/protocol/index.html | 6 +- .../allow-subassets-on-numerics/index.html | 22 +++++ .../index.html | 24 ++++++ .../enable-dispense-tx/index.html | 40 ++++++++++ .../specifications/fairminter/index.html | 75 ++++++++++++++++++ .../specifications/free-subassets/index.html | 21 +++++ .../specifications/gas-system/index.html | 36 +++++++++ .../lockable-issuance-descriptions/index.html | 32 ++++++++ .../specifications/utxo-support/index.html | 42 ++++++++++ .../assets/counterparty-assets/index.html | 4 +- docs/basics/assets/enhanced-asset/index.html | 4 +- docs/basics/assets/enhanced-feed/index.html | 4 +- docs/basics/faq/index.html | 4 +- docs/basics/getting-started/index.html | 15 ++-- docs/basics/manual-installation/index.html | 4 +- docs/basics/usage/index.html | 4 +- docs/basics/what-is-counterparty/index.html | 4 +- docs/basics/what-is-xcp/index.html | 4 +- img/sigmoid.png | Bin 0 -> 64351 bytes index.html | 4 +- sitemap.xml | 2 +- 58 files changed, 443 insertions(+), 75 deletions(-) create mode 100644 assets/images/sigmoid-db828c73543dd1ab63b96593146d76a6.png create mode 100644 assets/js/0d902d1d.c0441f09.js create mode 100644 assets/js/47dd2ef0.22e3295b.js delete mode 100644 assets/js/4a97e2ba.05013fa6.js create mode 100644 assets/js/4a97e2ba.1612bc22.js create mode 100644 assets/js/825c9a32.063b5c32.js create mode 100644 assets/js/935f2afb.7864347a.js delete mode 100644 assets/js/935f2afb.a2818b84.js create mode 100644 assets/js/aaef2cb0.932814c2.js delete mode 100644 assets/js/aaef2cb0.9775ece7.js delete mode 100644 assets/js/aeaaba45.197317f4.js create mode 100644 assets/js/aeaaba45.e439c077.js create mode 100644 assets/js/b7d3b5fd.a8f29e10.js create mode 100644 assets/js/c463f2d8.7b7e782d.js create mode 100644 assets/js/c66ced44.d100f20f.js create mode 100644 assets/js/e79842f2.47a4cd08.js create mode 100644 assets/js/e9ab1486.cadf83d1.js create mode 100644 assets/js/fe704f88.d78e1018.js delete mode 100644 assets/js/main.1ee346cc.js create mode 100644 assets/js/main.4506c1ec.js rename assets/js/{main.1ee346cc.js.LICENSE.txt => main.4506c1ec.js.LICENSE.txt} (100%) create mode 100644 assets/js/runtime~main.7bdf2e2d.js delete mode 100644 assets/js/runtime~main.9714e34e.js create mode 100644 docs/advanced/how-to/atomic-swap/index.html create mode 100644 docs/advanced/specifications/allow-subassets-on-numerics/index.html create mode 100644 docs/advanced/specifications/dispenser-must-be-created-by-source/index.html create mode 100644 docs/advanced/specifications/enable-dispense-tx/index.html create mode 100644 docs/advanced/specifications/fairminter/index.html create mode 100644 docs/advanced/specifications/free-subassets/index.html create mode 100644 docs/advanced/specifications/gas-system/index.html create mode 100644 docs/advanced/specifications/lockable-issuance-descriptions/index.html create mode 100644 docs/advanced/specifications/utxo-support/index.html create mode 100644 img/sigmoid.png diff --git a/404.html b/404.html index 8e515139..3eb0a384 100644 --- a/404.html +++ b/404.html @@ -4,8 +4,8 @@ Page Not Found | Counterparty - - + +
Skip to main content
diff --git a/assets/images/sigmoid-db828c73543dd1ab63b96593146d76a6.png b/assets/images/sigmoid-db828c73543dd1ab63b96593146d76a6.png new file mode 100644 index 0000000000000000000000000000000000000000..8dab00a06a49ecc027b8b7a36e51274dff7ded44 GIT binary patch literal 64351 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.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>d});var s=t(4848),a=t(8453);const o={},i="Require Dispenser to be Source Address",r={id:"advanced/specifications/dispenser-must-be-created-by-source",title:"Require Dispenser to be Source Address",description:"For an unknown reason, it has always been possible to open a dispenser on an address that you yourself do not own. Of course, this is a major security vulnerability as it can allow anyone on the network to force other users to sell assets without their consent (potentially with major legal consequences). Generally speaking, this is just a Bad Idea(TM).",source:"@site/docs/advanced/specifications/dispenser-must-be-created-by-source.md",sourceDirName:"advanced/specifications",slug:"/advanced/specifications/dispenser-must-be-created-by-source",permalink:"/docs/advanced/specifications/dispenser-must-be-created-by-source",draft:!1,unlisted:!1,editUrl:"https://github.com/facebook/docusaurus/edit/master/website/docs/advanced/specifications/dispenser-must-be-created-by-source.md",tags:[],version:"current",frontMatter:{},sidebar:"advanced",previous:{title:"Make Dispenses Normal Counterparty Transactions",permalink:"/docs/advanced/specifications/enable-dispense-tx"},next:{title:"Fair Minting",permalink:"/docs/advanced/specifications/fairminter"}},c={},d=[{value:"API Changes",id:"api-changes",level:2},{value:"Database Changes",id:"database-changes",level:2}];function l(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",p:"p",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.h1,{id:"require-dispenser-to-be-source-address",children:["Require Dispenser to be ",(0,s.jsx)(n.code,{children:"Source"})," Address"]}),"\n",(0,s.jsx)(n.h1,{id:"motivation",children:"Motivation"}),"\n",(0,s.jsx)(n.p,{children:"For an unknown reason, it has always been possible to open a dispenser on an address that you yourself do not own. Of course, this is a major security vulnerability as it can allow anyone on the network to force other users to sell assets without their consent (potentially with major legal consequences). Generally speaking, this is just a Bad Idea(TM)."}),"\n",(0,s.jsxs)(n.p,{children:['A hacky workaround was implemented in November 2023 (with the unhelpful ChangeLog entry "Redefined EMPTY address to mean no XCP or BTC history\u201d) which prevents dispensers from being opened on any address that does not have any XCP or BTC history. This probably resolves the security issue but ',(0,s.jsx)(n.a,{href:"https://github.com/CounterpartyXCP/counterparty-core/pull/1255/files#diff-446a2aa52fd57fd6379f4732ae36f794df6f0fb1585494f798f4aa3f7b94fca2R136",children:"that little patch"})," unintentionally (and retroactively!) made the entirety of AddrIndexRs (and its ~200GB database) consensus-critical and mandatory for parsing. AddrIndexRs is a broken, unmaintained fork of a third-party codebase that is\xa0",(0,s.jsx)(n.em,{children:"not"}),"\xa0deterministic and has been the cause of a ",(0,s.jsx)(n.a,{href:"https://github.com/CounterpartyXCP/counterparty-core/issues?q=is%3Aissue+addrindexrs+label%3Abug+",children:"large number of critical bugs in Counterparty"}),", not to mention the fact that it makes Counterparty deployment a total PITA. Thankfully, once this protocol change goes into effect, we can kill AddrIndexRs, per\xa0",(0,s.jsx)(n.a,{href:"https://github.com/CounterpartyXCP/counterparty-core/issues/1764",children:"#1764"}),"."]}),"\n",(0,s.jsx)(n.h1,{id:"design",children:"Design"}),"\n",(0,s.jsxs)(n.p,{children:["The implementation is straightforward, quick, and already done here: ",(0,s.jsx)(n.a,{href:"https://github.com/CounterpartyXCP/counterparty-core/pull/1792",children:"https://github.com/CounterpartyXCP/counterparty-core/pull/1792"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["A protocol change will be added ",(0,s.jsx)(n.code,{children:"dispenser_must_be_created_by_source"})," to the ",(0,s.jsx)(n.code,{children:"protocol_changes.json"})," file. From this block onwards, the ",(0,s.jsx)(n.code,{children:"compose.validate"})," function will verify that ",(0,s.jsx)(n.code,{children:"source == open_address"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["The only known downside to this change is that it will require a moving tokens to a wallet (e.g. a cold wallet) before using that wallet as a dispenser. (By differentiating between ",(0,s.jsx)(n.code,{children:"source"})," and ",(0,s.jsx)(n.code,{children:"origin"})," you can simulate Ordinals-like fair minting; but we\u2019re going to be implementing an ",(0,s.jsx)(n.em,{children:"actual"})," ",(0,s.jsx)(n.a,{href:"https://www.notion.so/Fair-Minting-17033d5385ab4a61808dbf31ea33daf9?pvs=21",children:"Fair Minting"})," contract, so no functionality will be lost.)"]}),"\n",(0,s.jsx)(n.h2,{id:"api-changes",children:"API Changes"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"No API changes"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"database-changes",children:"Database Changes"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"No database changes"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>r});var s=t(6540);const a={},o=s.createContext(a);function i(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/47dd2ef0.22e3295b.js b/assets/js/47dd2ef0.22e3295b.js new file mode 100644 index 00000000..992d82a0 --- /dev/null +++ b/assets/js/47dd2ef0.22e3295b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkxcpdoc=self.webpackChunkxcpdoc||[]).push([[369],{6914:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});var i=n(4848),t=n(8453);const a={},o="Make Dispenses Normal Counterparty Transactions",r={id:"advanced/specifications/enable-dispense-tx",title:"Make Dispenses Normal Counterparty Transactions",description:"Motivation",source:"@site/docs/advanced/specifications/enable-dispense-tx.md",sourceDirName:"advanced/specifications",slug:"/advanced/specifications/enable-dispense-tx",permalink:"/docs/advanced/specifications/enable-dispense-tx",draft:!1,unlisted:!1,editUrl:"https://github.com/facebook/docusaurus/edit/master/website/docs/advanced/specifications/enable-dispense-tx.md",tags:[],version:"current",frontMatter:{},sidebar:"advanced",previous:{title:"Atomic Swap with UTXO Support",permalink:"/docs/advanced/how-to/atomic-swap"},next:{title:"Require Dispenser to be Source Address",permalink:"/docs/advanced/specifications/dispenser-must-be-created-by-source"}},d={},c=[{value:"Motivation",id:"motivation",level:2},{value:"Design",id:"design",level:2},{value:"Implementation",id:"implementation",level:2},{value:"API Changes",id:"api-changes",level:2},{value:"Database Changes",id:"database-changes",level:2}];function l(e){const s={code:"code",em:"em",h1:"h1",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.h1,{id:"make-dispenses-normal-counterparty-transactions",children:"Make Dispenses Normal Counterparty Transactions"}),"\n",(0,i.jsx)(s.h2,{id:"motivation",children:"Motivation"}),"\n",(0,i.jsxs)(s.p,{children:["It is a serious flaw in the protocol that dispenses are not normal Counterparty transactions with the ",(0,i.jsx)(s.code,{children:"CNTRPRTY"})," prefix. Any BTC transaction sent to an address with an open dispenser will trigger that dispenser. This was not part of the original specification for the feature, and it causes major problems both in terms of the Counterparty user experience and in overall code-quality/performance."]}),"\n",(0,i.jsx)(s.p,{children:"That vanilla BTC transactions can trigger dispenses is responsible for significant loss of funds due to accidental and invalid dispenses. Some users now consider this to be a feature instead of a bug, however without a Counterparty wallet users are unable to detect whether a dispenser is already closed, whether they are using a compatible address type, etc. and they regularly lose funds due to those missing checks. Of course, after receiving the dispensed asset, the user is unable to view or spend that asset without migrating to a Counterparty wallet."}),"\n",(0,i.jsx)(s.h2,{id:"design",children:"Design"}),"\n",(0,i.jsxs)(s.p,{children:["Currently, it's possible to use a ",(0,i.jsx)(s.code,{children:"dispenser"})," with a vanilla BTC transaction. The ",(0,i.jsx)(s.code,{children:"get_tx_info"})," function examines each output of every transaction to determine if the destination address contains a dispenser. If so, ",(0,i.jsx)(s.code,{children:"get_tx_info"})," behaves as if the transaction contained the following data:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{children:'data = struct.pack(config.SHORT_TXTYPE_FORMAT, dispenser.DISPENSE_ID)\ndata += b"\\\\x00"\n'})}),"\n",(0,i.jsxs)(s.p,{children:["Subsequently, in the second parsing step, the ",(0,i.jsx)(s.code,{children:"parse_tx"})," function recognizes the ",(0,i.jsx)(s.code,{children:"dispenser.DISPENSE_ID"})," and invokes the ",(0,i.jsx)(s.code,{children:"dispenser.dispense"})," function."]}),"\n",(0,i.jsx)(s.h2,{id:"implementation",children:"Implementation"}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Introduce two protocol changes in the ",(0,i.jsx)(s.code,{children:"protocol_changes.json"})," file:","\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"enable_dispense_tx"}),": From this block onwards, transactions containing ",(0,i.jsx)(s.code,{children:"dispenser.DISPENSE_ID"})," will trigger one or more dispenses, similar to current vanilla BTC transactions."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"disable_vanilla_btc_dispense"}),": From this block onwards, vanilla BTC transactions will no longer trigger dispenses."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Add a new ",(0,i.jsx)(s.code,{children:"dispense.compose()"})," to construct a transaction with the same data as currently used (see above). This function will perform necessary sanity checks (e.g., empty dispenser, closed status)."]}),"\n",(0,i.jsxs)(s.li,{children:["Modify ",(0,i.jsx)(s.code,{children:"send.compose()"})," to check if the destination is a dispenser. If so, call the ",(0,i.jsx)(s.code,{children:"dispense.compose()"})," function."]}),"\n",(0,i.jsxs)(s.li,{children:["Update ",(0,i.jsx)(s.code,{children:"get_tx_info"})," so that from the ",(0,i.jsx)(s.code,{children:"disable_vanilla_btc_dispense"})," block onwards, transactions without ",(0,i.jsx)(s.code,{children:"data"})," will consistently raise a ",(0,i.jsx)(s.code,{children:"BTCOnlyError"}),", and outputs will no longer be checked for dispensers."]}),"\n",(0,i.jsxs)(s.li,{children:["For ",(0,i.jsx)(s.code,{children:"/v2/addresses/
/compose/send?asset=BTC"})," check if the destination is not a dispenser and if so return the same as ",(0,i.jsx)(s.code,{children:"/v2/addresses/
/compose/dispense"}),"(after ",(0,i.jsx)(s.code,{children:"enable_dispense_tx"}),")"]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"api-changes",children:"API Changes"}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["New route: ",(0,i.jsx)(s.code,{children:"/v2/addresses/
/compose/dispense"})]}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"NOTE: It will no longer be possible to trigger a dispense with a non-Counterparty wallet. Explorers should update their existing dispenser warnings accordingly."})}),"\n",(0,i.jsx)(s.h2,{id:"database-changes",children:"Database Changes"}),"\n",(0,i.jsx)(s.p,{children:"After this change has gone into effect, it will be possible to record in a separate file all historical vanilla BTC dispenses and parse this file during the initial catchup. (The same thing was done with the original BTC burns for XCP.) This will allow for a major simplification and optimization of the existing codebase. The file will be able to be validated simply using old versions of the Counterparty Core software."})]})}function h(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>o,x:()=>r});var i=n(6540);const t={},a=i.createContext(t);function o(e){const s=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),i.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4a97e2ba.05013fa6.js b/assets/js/4a97e2ba.05013fa6.js deleted file mode 100644 index 08ba19df..00000000 --- a/assets/js/4a97e2ba.05013fa6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkxcpdoc=self.webpackChunkxcpdoc||[]).push([[568],{7184:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>p,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var o=r(4848),n=r(8453);const s={title:"Getting Started"},c=void 0,a={id:"basics/getting-started",title:"Getting Started",description:"Install Counterparty Core",source:"@site/docs/basics/getting-started.md",sourceDirName:"basics",slug:"/basics/getting-started",permalink:"/docs/basics/getting-started",draft:!1,unlisted:!1,editUrl:"https://github.com/facebook/docusaurus/edit/master/website/docs/basics/getting-started.md",tags:[],version:"current",frontMatter:{title:"Getting Started"},sidebar:"basics",previous:{title:"What is Counterparty?",permalink:"/docs/basics/what-is-counterparty"},next:{title:"Manual Installation",permalink:"/docs/basics/manual-installation"}},i={},d=[{value:"Install Counterparty Core",id:"install-counterparty-core",level:2},{value:"Upgrade Counterparty Core",id:"upgrade-counterparty-core",level:2}];function l(e){const t={a:"a",code:"code",em:"em",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h2,{id:"install-counterparty-core",children:"Install Counterparty Core"}),"\n",(0,o.jsxs)(t.p,{children:["The simplest way to get your Counterparty node up and running is to use ",(0,o.jsx)(t.strong,{children:"Docker Compose"}),", which may be installed as described ",(0,o.jsx)(t.a,{href:"https://docs.docker.com/compose/install/",children:"here"}),"."]}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsxs)(t.em,{children:["Note: It is required that you use Docker Compose V2, and it is suggested that you install the plugin as opposed to the standalone ",(0,o.jsx)(t.code,{children:"docker-compose"})," executable"]}),"."]}),"\n",(0,o.jsx)(t.p,{children:"Then run the node services in background with:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"git clone git@github.com:CounterpartyXCP/counterparty-core.git\ncd counterparty-core\nmkdir ~/.local/share/counterparty-docker-data\ndocker compose --profile mainnet up -d\n"})}),"\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"To run a node you must have at least 1.5TB free."})," By default all data is stored in the ",(0,o.jsx)(t.code,{children:"~/counterparty-docker-data"})," folder. You can modify this folder with the environment variable ",(0,o.jsx)(t.code,{children:"$COUNTERPARTY_DOCKER_DATA"}),". For example:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"COUNTERPARTY_DOCKER_DATA=/var/data docker compose up -d\n"})}),"\n",(0,o.jsxs)(t.p,{children:["Use ",(0,o.jsx)(t.code,{children:"docker compose logs"})," to view output from services. For example:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"docker compose --profile mainnet logs --tail=10 -f bitcoind\ndocker compose --profile mainnet logs --tail=10 -f addrindexrs\ndocker compose --profile mainnet logs --tail=10 -f counterparty-core\n"})}),"\n",(0,o.jsxs)(t.p,{children:["You can use the ",(0,o.jsx)(t.code,{children:"testnet"})," profile to run a ",(0,o.jsx)(t.code,{children:"testnet"})," node:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"docker compose --profile testnet up -d\n"})}),"\n",(0,o.jsx)(t.p,{children:"NOTES:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:["By default, this Docker Compose script makes use of the ",(0,o.jsx)(t.code,{children:"bootstrap"})," functionality, because Docker makes it hard to use ",(0,o.jsx)(t.code,{children:"kickstart"}),". (See below.)"]}),"\n",(0,o.jsxs)(t.li,{children:["When working with a low-memory system, you can tell AddrIndexRs to use JSON-RPC to communicate with Bitcoin Core using the environment variable ",(0,o.jsx)(t.code,{children:"ADDRINDEXRS_JSONRPC_IMPORT"}),": ",(0,o.jsx)(t.code,{children:"ADDRINDEXRS_JSONRPC_IMPORT=true docker compose up -d"})]}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"upgrade-counterparty-core",children:"Upgrade Counterparty Core"}),"\n",(0,o.jsxs)(t.p,{children:["Download the latest version of ",(0,o.jsx)(t.code,{children:"counterparty-core"})," and restart ",(0,o.jsx)(t.code,{children:"counterparty-server"})]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"cd counterparty-core\ngit pull\ndocker compose stop counterparty-core\ndocker compose --profile mainnet up -d\n"})}),"\n",(0,o.jsxs)(t.p,{children:["NOTE:\nIf you were using a custom version of ",(0,o.jsx)(t.code,{children:"docker-compose.yml"})," that uses the ",(0,o.jsx)(t.code,{children:"latest"})," or ",(0,o.jsx)(t.code,{children:"develop"})," tag, it is recommended to delete the old image before restarting the server:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"docker compose stop counterparty-core\ndocker rmi counterparty/counterparty:latest\ndocker compose --profile mainnet up -d\n"})})]})}function p(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>c,x:()=>a});var o=r(6540);const n={},s=o.createContext(n);function c(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:c(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4a97e2ba.1612bc22.js b/assets/js/4a97e2ba.1612bc22.js new file mode 100644 index 00000000..be62a06f --- /dev/null +++ b/assets/js/4a97e2ba.1612bc22.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkxcpdoc=self.webpackChunkxcpdoc||[]).push([[568],{7184:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>p,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var n=r(4848),o=r(8453);const s={title:"Getting Started"},c=void 0,a={id:"basics/getting-started",title:"Getting Started",description:"Install Counterparty Core",source:"@site/docs/basics/getting-started.md",sourceDirName:"basics",slug:"/basics/getting-started",permalink:"/docs/basics/getting-started",draft:!1,unlisted:!1,editUrl:"https://github.com/facebook/docusaurus/edit/master/website/docs/basics/getting-started.md",tags:[],version:"current",frontMatter:{title:"Getting Started"},sidebar:"basics",previous:{title:"What is Counterparty?",permalink:"/docs/basics/what-is-counterparty"},next:{title:"Manual Installation",permalink:"/docs/basics/manual-installation"}},i={},d=[{value:"Install Counterparty Core",id:"install-counterparty-core",level:2},{value:"Upgrade Counterparty Core",id:"upgrade-counterparty-core",level:2}];function l(e){const t={a:"a",code:"code",em:"em",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h2,{id:"install-counterparty-core",children:"Install Counterparty Core"}),"\n",(0,n.jsxs)(t.p,{children:["The simplest way to get your Counterparty node up and running is to use ",(0,n.jsx)(t.strong,{children:"Docker Compose"}),", which may be installed as described ",(0,n.jsx)(t.a,{href:"https://docs.docker.com/compose/install/",children:"here"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsxs)(t.em,{children:["Note: It is required that you use Docker Compose V2, and it is suggested that you install the plugin as opposed to the standalone ",(0,n.jsx)(t.code,{children:"docker-compose"})," executable"]}),"."]}),"\n",(0,n.jsx)(t.p,{children:"Clone the repo:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"git clone git@github.com:CounterpartyXCP/counterparty-core.git\ncd counterparty-core\n"})}),"\n",(0,n.jsxs)(t.p,{children:["Next, create the directory that will be used to store Counterparty data.\n",(0,n.jsx)(t.strong,{children:"To run a node you must have at least 1.5TB free."})]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"mkdir ~/.local/share/counterparty-docker-data\n"})}),"\n",(0,n.jsx)(t.p,{children:"Now we can start the program."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"docker compose --profile mainnet up -d\n"})}),"\n",(0,n.jsxs)(t.p,{children:["Use ",(0,n.jsx)(t.code,{children:"docker compose logs"})," to view output from services. For example:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"docker compose --profile mainnet logs --tail=10 -f bitcoind\ndocker compose --profile mainnet logs --tail=10 -f addrindexrs\ndocker compose --profile mainnet logs --tail=10 -f counterparty-core\n"})}),"\n",(0,n.jsxs)(t.p,{children:["You can use the ",(0,n.jsx)(t.code,{children:"testnet"})," profile to run a ",(0,n.jsx)(t.code,{children:"testnet"})," node:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"docker compose --profile testnet up -d\n"})}),"\n",(0,n.jsx)(t.p,{children:"NOTES:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["By default, this Docker Compose script makes use of the ",(0,n.jsx)(t.code,{children:"bootstrap"})," functionality, because Docker makes it hard to use ",(0,n.jsx)(t.code,{children:"kickstart"}),". (See below.)"]}),"\n",(0,n.jsxs)(t.li,{children:["When working with a low-memory system, you can tell AddrIndexRs to use JSON-RPC to communicate with Bitcoin Core using the environment variable ",(0,n.jsx)(t.code,{children:"ADDRINDEXRS_JSONRPC_IMPORT"}),": ",(0,n.jsx)(t.code,{children:"ADDRINDEXRS_JSONRPC_IMPORT=true docker compose up -d"})]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"upgrade-counterparty-core",children:"Upgrade Counterparty Core"}),"\n",(0,n.jsxs)(t.p,{children:["Download the latest version of ",(0,n.jsx)(t.code,{children:"counterparty-core"})," and restart ",(0,n.jsx)(t.code,{children:"counterparty-server"})]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"cd counterparty-core\ngit pull\ndocker compose stop counterparty-core\ndocker compose --profile mainnet up -d\n"})}),"\n",(0,n.jsxs)(t.p,{children:["NOTE:\nIf you were using a custom version of ",(0,n.jsx)(t.code,{children:"docker-compose.yml"})," that uses the ",(0,n.jsx)(t.code,{children:"latest"})," or ",(0,n.jsx)(t.code,{children:"develop"})," tag, it is recommended to delete the old image before restarting the server:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"docker compose stop counterparty-core\ndocker rmi counterparty/counterparty:latest\ndocker compose --profile mainnet up -d\n"})})]})}function p(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>c,x:()=>a});var n=r(6540);const o={},s=n.createContext(o);function c(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/825c9a32.063b5c32.js b/assets/js/825c9a32.063b5c32.js new file mode 100644 index 00000000..b6221da2 --- /dev/null +++ b/assets/js/825c9a32.063b5c32.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkxcpdoc=self.webpackChunkxcpdoc||[]).push([[356],{9446:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>r,contentTitle:()=>c,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>d});var t=n(4848),a=n(8453);const i={},c="Eliminate XCP for Subasset Issuances",o={id:"advanced/specifications/free-subassets",title:"Eliminate XCP for Subasset Issuances",description:"Motivation",source:"@site/docs/advanced/specifications/free-subassets.md",sourceDirName:"advanced/specifications",slug:"/advanced/specifications/free-subassets",permalink:"/docs/advanced/specifications/free-subassets",draft:!1,unlisted:!1,editUrl:"https://github.com/facebook/docusaurus/edit/master/website/docs/advanced/specifications/free-subassets.md",tags:[],version:"current",frontMatter:{},sidebar:"advanced",previous:{title:"Be Able to Lock Descriptions",permalink:"/docs/advanced/specifications/lockable-issuance-descriptions"},next:{title:"Subassets on Numeric Assets",permalink:"/docs/advanced/specifications/allow-subassets-on-numerics"}},r={},d=[{value:"Motivation",id:"motivation",level:2},{value:"Design",id:"design",level:2},{value:"API Changes",id:"api-changes",level:2},{value:"Database Changes",id:"database-changes",level:2}];function l(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",p:"p",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.h1,{id:"eliminate-xcp-for-subasset-issuances",children:"Eliminate XCP for Subasset Issuances"}),"\n",(0,t.jsx)(s.h2,{id:"motivation",children:"Motivation"}),"\n",(0,t.jsxs)(s.p,{children:["XCP fees for issuances are principally an ",(0,t.jsx)(s.em,{children:"anti-squatting"})," mechanism (since the BTC fee is sufficient in this case to prevent true SPAM). For subassets, which are namespaced by the parent asset, there\u2019s no need to limit the number of issuances in any way."]}),"\n",(0,t.jsx)(s.h2,{id:"design",children:"Design"}),"\n",(0,t.jsxs)(s.p,{children:["Fees are calculated in the ",(0,t.jsx)(s.code,{children:"issuances.validate()"})," function.[",(0,t.jsx)(s.a,{href:"https://github.com/CounterpartyXCP/counterparty-core/blob/master/counterparty-core/counterpartycore/lib/messages/issuance.py#L279",children:"1"}),"] A protocol change ",(0,t.jsx)(s.code,{children:"free_subassets"})," will be added in the ",(0,t.jsx)(s.code,{children:"protocol_changes.json"})," file. From this block on, the function ",(0,t.jsx)(s.code,{children:"issuances.validate()"})," will return ",(0,t.jsx)(s.code,{children:"fee=0"})," for all subasset issuances."]}),"\n",(0,t.jsx)(s.h2,{id:"api-changes",children:"API Changes"}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.em,{children:"No API changes."})}),"\n",(0,t.jsx)(s.h2,{id:"database-changes",children:"Database Changes"}),"\n",(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.em,{children:"No database changes"}),"."]})]})}function u(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>c,x:()=>o});var t=n(6540);const a={},i=t.createContext(a);function c(e){const s=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:c(e.components),t.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.7864347a.js b/assets/js/935f2afb.7864347a.js new file mode 100644 index 00000000..dfd1582b --- /dev/null +++ b/assets/js/935f2afb.7864347a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkxcpdoc=self.webpackChunkxcpdoc||[]).push([[581],{5610:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"basics":[{"type":"link","label":"What is Counterparty?","href":"/docs/basics/what-is-counterparty","docId":"basics/what-is-counterparty","unlisted":false},{"type":"category","label":"Running a Counterparty Node","items":[{"type":"link","label":"Getting Started","href":"/docs/basics/getting-started","docId":"basics/getting-started","unlisted":false},{"type":"link","label":"Manual Installation","href":"/docs/basics/manual-installation","docId":"basics/manual-installation","unlisted":false},{"type":"link","label":"Basic Usage","href":"/docs/basics/usage","docId":"basics/usage","unlisted":false}],"collapsed":false,"collapsible":false},{"type":"link","label":"What is XCP?","href":"/docs/basics/what-is-xcp","docId":"basics/what-is-xcp","unlisted":false},{"type":"category","label":"Assets (Tokens/NFTs)","items":[{"type":"link","label":"Understanding Assets on Counterparty","href":"/docs/basics/assets/counterparty-assets","docId":"basics/assets/counterparty-assets","unlisted":false},{"type":"link","label":"Enhanced Asset Info","href":"/docs/basics/assets/enhanced-asset","docId":"basics/assets/enhanced-asset","unlisted":false},{"type":"link","label":"Enhanced Feed Info","href":"/docs/basics/assets/enhanced-feed","docId":"basics/assets/enhanced-feed","unlisted":false}],"collapsed":false,"collapsible":false}],"advanced":[{"type":"link","label":"Protocol Specification","href":"/docs/advanced/protocol","docId":"advanced/protocol","unlisted":false},{"type":"category","label":"Command Line Interface (CLI)","items":[{"type":"link","label":"Command-line (CLI) Guide","href":"/docs/advanced/command-line-interface/usage","docId":"advanced/command-line-interface/usage","unlisted":false},{"type":"link","label":"How to send Counterparty assets in bulk","href":"/docs/advanced/command-line-interface/sending-bulk","docId":"advanced/command-line-interface/sending-bulk","unlisted":false},{"type":"link","label":"Using multisig with counterparty-server","href":"/docs/advanced/command-line-interface/multisig","docId":"advanced/command-line-interface/multisig","unlisted":false}],"collapsed":false,"collapsible":false},{"type":"category","label":"Node API","items":[{"type":"link","label":"API v2","href":"/docs/advanced/api-v2/node-api","docId":"advanced/api-v2/node-api","unlisted":false},{"type":"link","label":"API v2 Migration Guide","href":"/docs/advanced/api-v2/v1-to-v2","docId":"advanced/api-v2/v1-to-v2","unlisted":false},{"type":"category","collapsible":true,"collapsed":true,"label":"API v1 (Deprecated)","items":[{"type":"link","label":"API v1 Overview","href":"/docs/advanced/api-v1/api-v1-overview","docId":"advanced/api-v1/api-v1-overview","unlisted":false},{"type":"link","label":"API v1 Specification","href":"/docs/advanced/api-v1/api-v1-spec","docId":"advanced/api-v1/api-v1-spec","unlisted":false},{"type":"link","label":"API v1 ChangeLog","href":"/docs/advanced/api-v1/api-v1-changelog","docId":"advanced/api-v1/api-v1-changelog","unlisted":false}]}],"collapsed":false,"collapsible":false},{"type":"category","label":"How-To","items":[{"type":"link","label":"Docker Kickstart","href":"/docs/advanced/how-to/docker-kickstart","docId":"advanced/how-to/docker-kickstart","unlisted":false},{"type":"link","label":"Sentry Integration","href":"/docs/advanced/how-to/sentry-integration","docId":"advanced/how-to/sentry-integration","unlisted":false},{"type":"link","label":"Atomic Swap with UTXO Support","href":"/docs/advanced/how-to/atomic-swap","docId":"advanced/how-to/atomic-swap","unlisted":false}],"collapsed":false,"collapsible":false},{"type":"category","label":"Specifications","items":[{"type":"link","label":"Make Dispenses Normal Counterparty Transactions","href":"/docs/advanced/specifications/enable-dispense-tx","docId":"advanced/specifications/enable-dispense-tx","unlisted":false},{"type":"link","label":"Require Dispenser to be Source Address","href":"/docs/advanced/specifications/dispenser-must-be-created-by-source","docId":"advanced/specifications/dispenser-must-be-created-by-source","unlisted":false},{"type":"link","label":"Fair Minting","href":"/docs/advanced/specifications/fairminter","docId":"advanced/specifications/fairminter","unlisted":false},{"type":"link","label":"Be Able to Lock Descriptions","href":"/docs/advanced/specifications/lockable-issuance-descriptions","docId":"advanced/specifications/lockable-issuance-descriptions","unlisted":false},{"type":"link","label":"Eliminate XCP for Subasset Issuances","href":"/docs/advanced/specifications/free-subassets","docId":"advanced/specifications/free-subassets","unlisted":false},{"type":"link","label":"Subassets on Numeric Assets","href":"/docs/advanced/specifications/allow-subassets-on-numerics","docId":"advanced/specifications/allow-subassets-on-numerics","unlisted":false},{"type":"link","label":"UTXO Support","href":"/docs/advanced/specifications/utxo-support","docId":"advanced/specifications/utxo-support","unlisted":false},{"type":"link","label":"Gas System","href":"/docs/advanced/specifications/gas-system","docId":"advanced/specifications/gas-system","unlisted":false}],"collapsed":false,"collapsible":false},{"type":"link","label":"Bug Bounties","href":"/docs/advanced/bounties","docId":"advanced/bounties","unlisted":false},{"type":"link","label":"Exchange Integration","href":"/docs/advanced/exchange-integration","docId":"advanced/exchange-integration","unlisted":false}]},"docs":{"advanced/api-v1/api-v1-changelog":{"id":"advanced/api-v1/api-v1-changelog","title":"API v1 ChangeLog","description":"This section documents any changes to the v1 API, for version numbers where there were API-level modifications.","sidebar":"advanced"},"advanced/api-v1/api-v1-overview":{"id":"advanced/api-v1/api-v1-overview","title":"API v1 Overview","description":"NOTE: This API has been deprecated and will eventually be removed entirely. The v1 API is now available only when the CLI flag --enable-api-v1 has been set, and then all v1 routes will be prefixed with /v1/.","sidebar":"advanced"},"advanced/api-v1/api-v1-spec":{"id":"advanced/api-v1/api-v1-spec","title":"API v1 Specification","description":"Read API Function Reference","sidebar":"advanced"},"advanced/api-v2/node-api":{"id":"advanced/api-v2/node-api","title":"API v2","description":"The Counterparty Core API is the recommended way to query the state of a Counterparty node. All other methods have no official support.","sidebar":"advanced"},"advanced/api-v2/v1-to-v2":{"id":"advanced/api-v2/v1-to-v2","title":"API v2 Migration Guide","description":"The main differences between the new v2 API and the deprecated v1 API are:","sidebar":"advanced"},"advanced/bounties":{"id":"advanced/bounties","title":"Bug Bounties","description":"According to\xa0Linus\u2019 Law, \u201cgiven enough eyeballs, all bugs are shallow\u201d. That\u2019s one of the reasons why Counterparty\u2019s source code is publicly available; but merely making the source code available doesn\'t accomplish anything if people don\u2019t read it!","sidebar":"advanced"},"advanced/command-line-interface/multisig":{"id":"advanced/command-line-interface/multisig","title":"Using multisig with counterparty-server","description":"\\"Bare Multisig\\" (i.e. not P2SH) is supported with Counterparty. This document shows you how to use it with counterparty-server on testnet.","sidebar":"advanced"},"advanced/command-line-interface/sending-bulk":{"id":"advanced/command-line-interface/sending-bulk","title":"How to send Counterparty assets in bulk","description":"Below is a script for constructing, signing and broadcasting a large","sidebar":"advanced"},"advanced/command-line-interface/usage":{"id":"advanced/command-line-interface/usage","title":"Command-line (CLI) Guide","description":"The following examples are abridged for parsimony (meaning: actions are","sidebar":"advanced"},"advanced/exchange-integration":{"id":"advanced/exchange-integration","title":"Exchange Integration","description":"Handling Deposits using Separate Addresses","sidebar":"advanced"},"advanced/how-to/atomic-swap":{"id":"advanced/how-to/atomic-swap","title":"Atomic Swap with UTXO Support","description":"With the new attach and detach functionalities which allow you to attach and detach assets from a UTXO, it is now possible to do Atomic Swaps like Ordinals.","sidebar":"advanced"},"advanced/how-to/docker-kickstart":{"id":"advanced/how-to/docker-kickstart","title":"Docker Kickstart","description":"1) Create a persistent volume","sidebar":"advanced"},"advanced/how-to/sentry-integration":{"id":"advanced/how-to/sentry-integration","title":"Sentry Integration","description":"Counterparty Core allows for easy integration with Sentry for error reporting and performance monitoring. This feature is opt-in for each node operator. To enable the integration, simply export the ( Data Source Name ) from your Sentry project as an environment variable before starting your node:","sidebar":"advanced"},"advanced/protocol":{"id":"advanced/protocol","title":"Protocol Specification","description":"Summary","sidebar":"advanced"},"advanced/specifications/allow-subassets-on-numerics":{"id":"advanced/specifications/allow-subassets-on-numerics","title":"Subassets on Numeric Assets","description":"Motivation","sidebar":"advanced"},"advanced/specifications/dispenser-must-be-created-by-source":{"id":"advanced/specifications/dispenser-must-be-created-by-source","title":"Require Dispenser to be Source Address","description":"For an unknown reason, it has always been possible to open a dispenser on an address that you yourself do not own. Of course, this is a major security vulnerability as it can allow anyone on the network to force other users to sell assets without their consent (potentially with major legal consequences). Generally speaking, this is just a Bad Idea(TM).","sidebar":"advanced"},"advanced/specifications/enable-dispense-tx":{"id":"advanced/specifications/enable-dispense-tx","title":"Make Dispenses Normal Counterparty Transactions","description":"Motivation","sidebar":"advanced"},"advanced/specifications/fairminter":{"id":"advanced/specifications/fairminter","title":"Fair Minting","description":"Fair Minting is a process whereby users are able to \u201cmint\u201d tokens in a decentralized manner. One user initiates the mint (either with or without a \u201cpremint\u201d), and then other users are able to trigger it to create tokens for themselves. Fair Minting was likely inspired by the original Counterparty Proof-of-Burn mechanism, by which users sent BTC to an unspendable address and XCP tokens were generate for them automatically.","sidebar":"advanced"},"advanced/specifications/free-subassets":{"id":"advanced/specifications/free-subassets","title":"Eliminate XCP for Subasset Issuances","description":"Motivation","sidebar":"advanced"},"advanced/specifications/gas-system":{"id":"advanced/specifications/gas-system","title":"Gas System","description":"When Counterparty was first created, the XCP fees for various transactions were hard-coded to low, constant values (e.g. 0.5 XCP for issuing a named asset). This system was chosen for its simplicity, but it creates significant friction when onboarding users to the Counterparty ecosystem (esp. since it is so hard to acquire XCP) and yet the fees are so low that they have little economic significance for market participants. A proper XCP fee system should be proportional to network traffic and transaction complexity without creating any unnecessary barriers to entry for users of the network. This protocol change will institute just such a system for the new UTXO Support feature by dynamically calculating the fees required to send assets from an address to a UTXO and from a UTXO to an address based on network congestion for this type of transaction.","sidebar":"advanced"},"advanced/specifications/lockable-issuance-descriptions":{"id":"advanced/specifications/lockable-issuance-descriptions","title":"Be Able to Lock Descriptions","description":"Motivation","sidebar":"advanced"},"advanced/specifications/utxo-support":{"id":"advanced/specifications/utxo-support","title":"UTXO Support","description":"With Ordinals, a user who does not own an Ordinal cannot create a valid Bitcoin transaction to move an Ordinal that is not in their wallet. This is because the user must possess the UTXO that holds the \\"sat\\". Unlike Ordinals, Counterparty as a metaprotcol is entirely detached from Layer-1 consensus rules\u2014this allows Counterparty to be much more versatile and extendable. However, Ordinals, given its large community, offers Counterparty asset owners the opportunity to benefit from greater liquidity and a larger ecosystem generally. For this it is necessary to be able to attach and detach Counterparty assets to/from UTXOs. This will allow Counterparty assets to be compliant with the Ordinals trading transactional structure, allowing the large players in the Ordinals ecosystem to seamlessly integrate with Counterparty assets.","sidebar":"advanced"},"basics/assets/counterparty-assets":{"id":"basics/assets/counterparty-assets","title":"Understanding Assets on Counterparty","description":"With Counterparty, users can create their own assets (also known as \\"tokens\\", \\"coins\\" or \\"currencies\\") inside the Bitcoin blockchain. These are seperate from Bitcoin the currency itself, but exist entirely inside ordinary Bitcoin transactions. Tokens can be received, stored, and sent from any Bitcoin address to any other. They can also be placed in cold storage. Unlike Colored Coins, Counterparty tokens are not tied to the BTC balance of any given address. This means that sending/receiving bitcoins has no effect on the balance of tokens.","sidebar":"basics"},"basics/assets/enhanced-asset":{"id":"basics/assets/enhanced-asset","title":"Enhanced Asset Info","description":"When initially setting or changing your asset\'s (token\'s) description, you can enable enhanced functionality (such as an token image and a longer description) by providing a URL to a specially formatted .json file (e.g. http://www.mydomain.com/foo.json) as the description. This allows the token owner to provide enhanced information to the token\'s holders, and enhances the user experience for these holders for wallet implementations that support this spec.","sidebar":"basics"},"basics/assets/enhanced-feed":{"id":"basics/assets/enhanced-feed","title":"Enhanced Feed Info","description":"Feed providers can initialize a feed via a broadcast where the broadcast text field contains a URL to a specially formatted .json file (e.g. http://www.mydomain.com/foo.json). This allows the feed operator to provide enhanced information to their users.","sidebar":"basics"},"basics/faq":{"id":"basics/faq","title":"Frequently Asked Questions","description":"Can I secure my XCP and Counterparty tokens in cold storage?"},"basics/getting-started":{"id":"basics/getting-started","title":"Getting Started","description":"Install Counterparty Core","sidebar":"basics"},"basics/manual-installation":{"id":"basics/manual-installation","title":"Manual Installation","description":"Counterparty Core can be installed on most platforms but, for now, manual installation is being tested and is only officially supported on Ubuntu 22.04 and MacOS.","sidebar":"basics"},"basics/usage":{"id":"basics/usage","title":"Basic Usage","description":"Configuration","sidebar":"basics"},"basics/what-is-counterparty":{"id":"basics/what-is-counterparty","title":"What is Counterparty?","description":"What is Counterparty?","sidebar":"basics"},"basics/what-is-xcp":{"id":"basics/what-is-xcp","title":"What is XCP?","description":"XCP is the native token of Counterparty. It is used in all cases where the Bitcoin token is not capable of acting as the working currency, either as a denominational unit or for paying network fees.","sidebar":"basics"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.a2818b84.js b/assets/js/935f2afb.a2818b84.js deleted file mode 100644 index 12f5ca5c..00000000 --- a/assets/js/935f2afb.a2818b84.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkxcpdoc=self.webpackChunkxcpdoc||[]).push([[581],{5610:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"basics":[{"type":"link","label":"What is Counterparty?","href":"/docs/basics/what-is-counterparty","docId":"basics/what-is-counterparty","unlisted":false},{"type":"category","label":"Running a Counterparty Node","items":[{"type":"link","label":"Getting Started","href":"/docs/basics/getting-started","docId":"basics/getting-started","unlisted":false},{"type":"link","label":"Manual Installation","href":"/docs/basics/manual-installation","docId":"basics/manual-installation","unlisted":false},{"type":"link","label":"Basic Usage","href":"/docs/basics/usage","docId":"basics/usage","unlisted":false}],"collapsed":false,"collapsible":false},{"type":"link","label":"What is XCP?","href":"/docs/basics/what-is-xcp","docId":"basics/what-is-xcp","unlisted":false},{"type":"category","label":"Assets (Tokens/NFTs)","items":[{"type":"link","label":"Understanding Assets on Counterparty","href":"/docs/basics/assets/counterparty-assets","docId":"basics/assets/counterparty-assets","unlisted":false},{"type":"link","label":"Enhanced Asset Info","href":"/docs/basics/assets/enhanced-asset","docId":"basics/assets/enhanced-asset","unlisted":false},{"type":"link","label":"Enhanced Feed Info","href":"/docs/basics/assets/enhanced-feed","docId":"basics/assets/enhanced-feed","unlisted":false}],"collapsed":false,"collapsible":false}],"advanced":[{"type":"link","label":"Protocol Specification","href":"/docs/advanced/protocol","docId":"advanced/protocol","unlisted":false},{"type":"category","label":"Command Line Interface (CLI)","items":[{"type":"link","label":"Command-line (CLI) Guide","href":"/docs/advanced/command-line-interface/usage","docId":"advanced/command-line-interface/usage","unlisted":false},{"type":"link","label":"How to send Counterparty assets in bulk","href":"/docs/advanced/command-line-interface/sending-bulk","docId":"advanced/command-line-interface/sending-bulk","unlisted":false},{"type":"link","label":"Using multisig with counterparty-server","href":"/docs/advanced/command-line-interface/multisig","docId":"advanced/command-line-interface/multisig","unlisted":false}],"collapsed":false,"collapsible":false},{"type":"category","label":"Node API","items":[{"type":"link","label":"API v2","href":"/docs/advanced/api-v2/node-api","docId":"advanced/api-v2/node-api","unlisted":false},{"type":"link","label":"API v2 Migration Guide","href":"/docs/advanced/api-v2/v1-to-v2","docId":"advanced/api-v2/v1-to-v2","unlisted":false},{"type":"category","collapsible":true,"collapsed":true,"label":"API v1 (Deprecated)","items":[{"type":"link","label":"API v1 Overview","href":"/docs/advanced/api-v1/api-v1-overview","docId":"advanced/api-v1/api-v1-overview","unlisted":false},{"type":"link","label":"API v1 Specification","href":"/docs/advanced/api-v1/api-v1-spec","docId":"advanced/api-v1/api-v1-spec","unlisted":false},{"type":"link","label":"API v1 ChangeLog","href":"/docs/advanced/api-v1/api-v1-changelog","docId":"advanced/api-v1/api-v1-changelog","unlisted":false}]}],"collapsed":false,"collapsible":false},{"type":"category","label":"How-To","items":[{"type":"link","label":"Docker Kickstart","href":"/docs/advanced/how-to/docker-kickstart","docId":"advanced/how-to/docker-kickstart","unlisted":false},{"type":"link","label":"Sentry Integration","href":"/docs/advanced/how-to/sentry-integration","docId":"advanced/how-to/sentry-integration","unlisted":false}],"collapsed":false,"collapsible":false},{"type":"link","label":"Bug Bounties","href":"/docs/advanced/bounties","docId":"advanced/bounties","unlisted":false},{"type":"link","label":"Exchange Integration","href":"/docs/advanced/exchange-integration","docId":"advanced/exchange-integration","unlisted":false}]},"docs":{"advanced/api-v1/api-v1-changelog":{"id":"advanced/api-v1/api-v1-changelog","title":"API v1 ChangeLog","description":"This section documents any changes to the v1 API, for version numbers where there were API-level modifications.","sidebar":"advanced"},"advanced/api-v1/api-v1-overview":{"id":"advanced/api-v1/api-v1-overview","title":"API v1 Overview","description":"NOTE: This API has been deprecated and will eventually be removed entirely. The v1 API is now available only when the CLI flag --enable-api-v1 has been set, and then all v1 routes will be prefixed with /v1/.","sidebar":"advanced"},"advanced/api-v1/api-v1-spec":{"id":"advanced/api-v1/api-v1-spec","title":"API v1 Specification","description":"Read API Function Reference","sidebar":"advanced"},"advanced/api-v2/node-api":{"id":"advanced/api-v2/node-api","title":"API v2","description":"The Counterparty Core API is the recommended way to query the state of a Counterparty node. All other methods have no official support.","sidebar":"advanced"},"advanced/api-v2/v1-to-v2":{"id":"advanced/api-v2/v1-to-v2","title":"API v2 Migration Guide","description":"The main differences between the new v2 API and the deprecated v1 API are:","sidebar":"advanced"},"advanced/bounties":{"id":"advanced/bounties","title":"Bug Bounties","description":"According to\xa0Linus\u2019 Law, \u201cgiven enough eyeballs, all bugs are shallow\u201d. That\u2019s one of the reasons why Counterparty\u2019s source code is publicly available; but merely making the source code available doesn\'t accomplish anything if people don\u2019t read it!","sidebar":"advanced"},"advanced/command-line-interface/multisig":{"id":"advanced/command-line-interface/multisig","title":"Using multisig with counterparty-server","description":"\\"Bare Multisig\\" (i.e. not P2SH) is supported with Counterparty. This document shows you how to use it with counterparty-server on testnet.","sidebar":"advanced"},"advanced/command-line-interface/sending-bulk":{"id":"advanced/command-line-interface/sending-bulk","title":"How to send Counterparty assets in bulk","description":"Below is a script for constructing, signing and broadcasting a large","sidebar":"advanced"},"advanced/command-line-interface/usage":{"id":"advanced/command-line-interface/usage","title":"Command-line (CLI) Guide","description":"The following examples are abridged for parsimony (meaning: actions are","sidebar":"advanced"},"advanced/exchange-integration":{"id":"advanced/exchange-integration","title":"Exchange Integration","description":"Handling Deposits using Separate Addresses","sidebar":"advanced"},"advanced/how-to/docker-kickstart":{"id":"advanced/how-to/docker-kickstart","title":"Docker Kickstart","description":"1) Create a persistent volume","sidebar":"advanced"},"advanced/how-to/sentry-integration":{"id":"advanced/how-to/sentry-integration","title":"Sentry Integration","description":"Counterparty Core allows for easy integration with Sentry for error reporting and performance monitoring. This feature is opt-in for each node operator. To enable the integration, simply export the ( Data Source Name ) from your Sentry project as an environment variable before starting your node:","sidebar":"advanced"},"advanced/protocol":{"id":"advanced/protocol","title":"Protocol Specification","description":"Summary","sidebar":"advanced"},"basics/assets/counterparty-assets":{"id":"basics/assets/counterparty-assets","title":"Understanding Assets on Counterparty","description":"With Counterparty, users can create their own assets (also known as \\"tokens\\", \\"coins\\" or \\"currencies\\") inside the Bitcoin blockchain. These are seperate from Bitcoin the currency itself, but exist entirely inside ordinary Bitcoin transactions. Tokens can be received, stored, and sent from any Bitcoin address to any other. They can also be placed in cold storage. Unlike Colored Coins, Counterparty tokens are not tied to the BTC balance of any given address. This means that sending/receiving bitcoins has no effect on the balance of tokens.","sidebar":"basics"},"basics/assets/enhanced-asset":{"id":"basics/assets/enhanced-asset","title":"Enhanced Asset Info","description":"When initially setting or changing your asset\'s (token\'s) description, you can enable enhanced functionality (such as an token image and a longer description) by providing a URL to a specially formatted .json file (e.g. http://www.mydomain.com/foo.json) as the description. This allows the token owner to provide enhanced information to the token\'s holders, and enhances the user experience for these holders for wallet implementations that support this spec.","sidebar":"basics"},"basics/assets/enhanced-feed":{"id":"basics/assets/enhanced-feed","title":"Enhanced Feed Info","description":"Feed providers can initialize a feed via a broadcast where the broadcast text field contains a URL to a specially formatted .json file (e.g. http://www.mydomain.com/foo.json). This allows the feed operator to provide enhanced information to their users.","sidebar":"basics"},"basics/faq":{"id":"basics/faq","title":"Frequently Asked Questions","description":"Can I secure my XCP and Counterparty tokens in cold storage?"},"basics/getting-started":{"id":"basics/getting-started","title":"Getting Started","description":"Install Counterparty Core","sidebar":"basics"},"basics/manual-installation":{"id":"basics/manual-installation","title":"Manual Installation","description":"Counterparty Core can be installed on most platforms but, for now, manual installation is being tested and is only officially supported on Ubuntu 22.04 and MacOS.","sidebar":"basics"},"basics/usage":{"id":"basics/usage","title":"Basic Usage","description":"Configuration","sidebar":"basics"},"basics/what-is-counterparty":{"id":"basics/what-is-counterparty","title":"What is Counterparty?","description":"What is Counterparty?","sidebar":"basics"},"basics/what-is-xcp":{"id":"basics/what-is-xcp","title":"What is XCP?","description":"XCP is the native token of Counterparty. It is used in all cases where the Bitcoin token is not capable of acting as the working currency, either as a denominational unit or for paying network fees.","sidebar":"basics"}}}')}}]); \ No newline at end of file diff --git a/assets/js/aaef2cb0.932814c2.js b/assets/js/aaef2cb0.932814c2.js new file mode 100644 index 00000000..bd6f65c2 --- /dev/null +++ b/assets/js/aaef2cb0.932814c2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkxcpdoc=self.webpackChunkxcpdoc||[]).push([[463],{912:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>l,frontMatter:()=>a,metadata:()=>s,toc:()=>d});var o=n(4848),r=n(8453);const a={title:"Sentry Integration"},i=void 0,s={id:"advanced/how-to/sentry-integration",title:"Sentry Integration",description:"Counterparty Core allows for easy integration with Sentry for error reporting and performance monitoring. This feature is opt-in for each node operator. To enable the integration, simply export the ( Data Source Name ) from your Sentry project as an environment variable before starting your node:",source:"@site/docs/advanced/how-to/sentry-integration.md",sourceDirName:"advanced/how-to",slug:"/advanced/how-to/sentry-integration",permalink:"/docs/advanced/how-to/sentry-integration",draft:!1,unlisted:!1,editUrl:"https://github.com/facebook/docusaurus/edit/master/website/docs/advanced/how-to/sentry-integration.md",tags:[],version:"current",frontMatter:{title:"Sentry Integration"},sidebar:"advanced",previous:{title:"Docker Kickstart",permalink:"/docs/advanced/how-to/docker-kickstart"},next:{title:"Atomic Swap with UTXO Support",permalink:"/docs/advanced/how-to/atomic-swap"}},c={},d=[];function p(e){const t={a:"a",code:"code",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(t.p,{children:["Counterparty Core allows for easy integration with ",(0,o.jsx)(t.a,{href:"http://sentry.io",children:"Sentry"})," for error reporting and performance monitoring. This feature is ",(0,o.jsx)(t.strong,{children:"opt-in"})," for each node operator. To enable the integration, simply export the ",(0,o.jsx)(t.a,{href:"https://docs.sentry.io/product/sentry-basics/concepts/dsn-explainer/",children:"( Data Source Name )"})," from your Sentry project as an environment variable before starting your node:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"export SENTRY_DSN=\n"})}),"\n",(0,o.jsxs)(t.p,{children:["You can find additional configuration options ",(0,o.jsx)(t.a,{href:"https://docs.sentry.io/platforms/python/configuration/",children:"here"})," (e.g. ",(0,o.jsx)(t.code,{children:"SENTRY_ENVIRONMENT"})," and ",(0,o.jsx)(t.code,{children:"SENTRY_RELEASE"}),")."]})]})}function l(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>s});var o=n(6540);const r={},a=o.createContext(r);function i(e){const t=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/aaef2cb0.9775ece7.js b/assets/js/aaef2cb0.9775ece7.js deleted file mode 100644 index f531ce19..00000000 --- a/assets/js/aaef2cb0.9775ece7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkxcpdoc=self.webpackChunkxcpdoc||[]).push([[463],{912:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>d});var o=n(4848),r=n(8453);const a={title:"Sentry Integration"},i=void 0,s={id:"advanced/how-to/sentry-integration",title:"Sentry Integration",description:"Counterparty Core allows for easy integration with Sentry for error reporting and performance monitoring. This feature is opt-in for each node operator. To enable the integration, simply export the ( Data Source Name ) from your Sentry project as an environment variable before starting your node:",source:"@site/docs/advanced/how-to/sentry-integration.md",sourceDirName:"advanced/how-to",slug:"/advanced/how-to/sentry-integration",permalink:"/docs/advanced/how-to/sentry-integration",draft:!1,unlisted:!1,editUrl:"https://github.com/facebook/docusaurus/edit/master/website/docs/advanced/how-to/sentry-integration.md",tags:[],version:"current",frontMatter:{title:"Sentry Integration"},sidebar:"advanced",previous:{title:"Docker Kickstart",permalink:"/docs/advanced/how-to/docker-kickstart"},next:{title:"Bug Bounties",permalink:"/docs/advanced/bounties"}},c={},d=[];function p(e){const t={a:"a",code:"code",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(t.p,{children:["Counterparty Core allows for easy integration with ",(0,o.jsx)(t.a,{href:"http://sentry.io",children:"Sentry"})," for error reporting and performance monitoring. This feature is ",(0,o.jsx)(t.strong,{children:"opt-in"})," for each node operator. To enable the integration, simply export the ",(0,o.jsx)(t.a,{href:"https://docs.sentry.io/product/sentry-basics/concepts/dsn-explainer/",children:"( Data Source Name )"})," from your Sentry project as an environment variable before starting your node:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"export SENTRY_DSN=\n"})}),"\n",(0,o.jsxs)(t.p,{children:["You can find additional configuration options ",(0,o.jsx)(t.a,{href:"https://docs.sentry.io/platforms/python/configuration/",children:"here"})," (e.g. ",(0,o.jsx)(t.code,{children:"SENTRY_ENVIRONMENT"})," and ",(0,o.jsx)(t.code,{children:"SENTRY_RELEASE"}),")."]})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>s});var o=n(6540);const r={},a=o.createContext(r);function i(e){const t=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/aeaaba45.197317f4.js b/assets/js/aeaaba45.197317f4.js deleted file mode 100644 index 2486c354..00000000 --- a/assets/js/aeaaba45.197317f4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkxcpdoc=self.webpackChunkxcpdoc||[]).push([[61],{4234:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var s=i(4848),n=i(8453);const r={title:"Bug Bounties"},o=void 0,a={id:"advanced/bounties",title:"Bug Bounties",description:"According to\xa0Linus\u2019 Law, \u201cgiven enough eyeballs, all bugs are shallow\u201d. That\u2019s one of the reasons why Counterparty\u2019s source code is publicly available; but merely making the source code available doesn't accomplish anything if people don\u2019t read it!",source:"@site/docs/advanced/bounties.md",sourceDirName:"advanced",slug:"/advanced/bounties",permalink:"/docs/advanced/bounties",draft:!1,unlisted:!1,editUrl:"https://github.com/facebook/docusaurus/edit/master/website/docs/advanced/bounties.md",tags:[],version:"current",frontMatter:{title:"Bug Bounties"},sidebar:"advanced",previous:{title:"Sentry Integration",permalink:"/docs/advanced/how-to/sentry-integration"},next:{title:"Exchange Integration",permalink:"/docs/advanced/exchange-integration"}},l={},d=[{value:"Things that do not qualify under the bug bounty",id:"things-that-do-not-qualify-under-the-bug-bounty",level:2},{value:"Bounties for counterparty-core",id:"bounties-for-counterparty-core",level:2},{value:"How to report a bug",id:"how-to-report-a-bug",level:2},{value:"For security-related issues",id:"for-security-related-issues",level:3},{value:"For code issues",id:"for-code-issues",level:3},{value:"For website issues",id:"for-website-issues",level:3},{value:"The fine print",id:"the-fine-print",level:2},{value:"CREDITS",id:"credits",level:2}];function c(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["According to\xa0",(0,s.jsx)(t.a,{href:"http://en.wikipedia.org/wiki/Linus",children:"Linus\u2019 Law"}),", \u201cgiven enough eyeballs, all bugs are shallow\u201d. That\u2019s one of the reasons why Counterparty\u2019s source code is publicly available; but merely making the source code available doesn't accomplish anything if people don\u2019t read it!"]}),"\n",(0,s.jsx)(t.p,{children:"For this reason, Counterparty has a series of\xa0bug bounties. Counterparty bug bounties provide an opportunity for people who find bugs to be compensated."}),"\n",(0,s.jsx)(t.p,{children:"Depending on the type of bug and when it is reported, different bounties will be awarded. Bounties are paid out in a mix of XCP and BTC (the ratio is negotiable), at the 3-day average of each to a fixed US Dollar value."}),"\n",(0,s.jsx)(t.h2,{id:"things-that-do-not-qualify-under-the-bug-bounty",children:"Things that do not qualify under the bug bounty"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"counterpartytalk.org website"})," (unless the issue is a serious misconfiguration where user security details are being leaked in a way that they can be proven to be exploited)"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Counterwallet or counterblock"})," (unless the issue allows for theft of funds, in that case the $1,500 bounty defined below would apply)"]}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.strong,{children:"Please do not try XSS attacks in the Counterwallet chat box. It is annoying, and it has already been tested extensively"})}),"\n",(0,s.jsx)(t.li,{children:"Vulnerabilities which are too broad or not documented properly (i.e. do not include a specific example relevant to a Counterparty-controlled site)"}),"\n",(0,s.jsxs)(t.li,{children:["Bugs or issues with a third-party site, software, or service that we use, such as support.counterparty.io (freshdesk.com), which is not due to an improper configuration issue specific to us. Please submit any potential issues ",(0,s.jsx)(t.strong,{children:"to the maintainers of that site or providers of that service"})]}),"\n",(0,s.jsx)(t.li,{children:"Usability issues"}),"\n",(0,s.jsx)(t.li,{children:"Anything requiring social engineering"}),"\n",(0,s.jsx)(t.li,{children:"DOS/DDOS attacks"}),"\n",(0,s.jsx)(t.li,{children:"Missing HSTS (HttpOnly flags), Secure flag, Browser Cache vulnerabilities"}),"\n",(0,s.jsx)(t.li,{children:"CSRF that doesn\u2019t affect the victim"}),"\n",(0,s.jsx)(t.li,{children:"Referrer leakage to pages an attacker cannot control"}),"\n",(0,s.jsx)(t.li,{children:"Lack of explicit rate-limiting for counterwallet.io passphrase entry"}),"\n",(0,s.jsx)(t.li,{children:"The presence of unnecessary files, e.g. for backups, when these files do not expose any sensitive information"}),"\n",(0,s.jsx)(t.li,{children:"Anything that is the result of an automated Nessus/PCI scans (too general)"}),"\n",(0,s.jsx)(t.li,{children:"DNS issues (e.g. lack of an SPF record)"}),"\n",(0,s.jsx)(t.li,{children:"SSL certificate issues (such as lack of Perfect Forward Secrecy on our SSL certificates)"}),"\n",(0,s.jsx)(t.li,{children:"Bugs that have received mainstream tech media attention before the date of your disclosure (e.g. Heartbleed, Poodlebleed, etc)"}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"bounties-for-counterparty-core",children:"Bounties for counterparty-core"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Total USD amount (BTC/XCP mix)"}),(0,s.jsx)(t.th,{children:"Type of bug"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"$1,500"}),(0,s.jsx)(t.td,{children:"A flaw in the protocol that allows for theft or loss of funds"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"$1,000"}),(0,s.jsx)(t.td,{children:"A bug in the reference client that leads to consensus issues"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"$750"}),(0,s.jsx)(t.td,{children:"A bug which causes data corruption or loss"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"$200"}),(0,s.jsx)(t.td,{children:"A bug which causes the application to crash"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"$100"}),(0,s.jsx)(t.td,{children:"Other non-harmless bugs"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"$50"}),(0,s.jsx)(t.td,{children:"Build breakage on a supported platform"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"$20"}),(0,s.jsx)(t.td,{children:"'Harmless' bugs, e.g. cosmetic errors"})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["Bounties will be paid out for bugs found in the ",(0,s.jsx)(t.code,{children:"master"})," branch of the official GitHub repositories."]}),"\n",(0,s.jsx)(t.h2,{id:"how-to-report-a-bug",children:"How to report a bug"}),"\n",(0,s.jsx)(t.h3,{id:"for-security-related-issues",children:"For security-related issues"}),"\n",(0,s.jsxs)(t.p,{children:["Email ",(0,s.jsx)(t.a,{href:"mailto:dev@counterparty.io",children:"the developers"})," ",(0,s.jsx)(t.strong,{children:"privately with the details of the issue."})]}),"\n",(0,s.jsx)(t.h3,{id:"for-code-issues",children:"For code issues"}),"\n",(0,s.jsxs)(t.p,{children:["We would strongly prefer if you create a pull request on GitHub in the proper repository with the necessary fix (along with your Bitcoin address to claim the bounty). For more information, see ",(0,s.jsx)(t.a,{href:"https://help.github.com/categories/63/articles",children:"this link"}),".\xa0"]}),"\n",(0,s.jsx)(t.h3,{id:"for-website-issues",children:"For website issues"}),"\n",(0,s.jsxs)(t.p,{children:["Please contact ",(0,s.jsx)(t.a,{href:"mailto:support@counterparty.io",children:"support"})," with the error, along with your Bitcoin address."]}),"\n",(0,s.jsx)(t.h2,{id:"the-fine-print",children:"The fine print"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"A bounty will only be awarded to the first person who reports a bug, unless two or more people report the same bug at approximately the same time, in which case the bounty may be split between them."}),"\n",(0,s.jsx)(t.li,{children:"If the same bug appears in multiple locations it will normally only receive a single bounty."}),"\n",(0,s.jsx)(t.li,{children:"Reports of security-related bugs are not eligible for bounties if the bugs are publicly disclosed prior to being fixed."}),"\n",(0,s.jsx)(t.li,{children:"The issue must be described in necessary detail to address it."}),"\n",(0,s.jsx)(t.li,{children:"Only the discoverer of a bug is eligible for the associated bounty."}),"\n",(0,s.jsxs)(t.li,{children:["Bounties will be confirmed and awarded within 10 days of their\nreporting. Inquiries on bounty status may be sent to ",(0,s.jsx)(t.a,{href:"mailto:bounties@counterparty.io",children:"bounties@counterparty.io"})]}),"\n",(0,s.jsx)(t.li,{children:"Bounties will not be awarded if it is illegal to do so."}),"\n",(0,s.jsx)(t.li,{children:"The classification of bugs, values of bounties, and conditions under which bounties are paid are subject to change without notice."}),"\n",(0,s.jsx)(t.li,{children:"The core Counterparty team has sole discretion to determine whether a bug report qualifies for a bounty and for which bounty it qualifies."}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"credits",children:"CREDITS"}),"\n",(0,s.jsxs)(t.p,{children:["Credit to the general structure of this program as well as much of the wording goes to ",(0,s.jsx)(t.a,{href:"http://www.tarsnap.com/bugbounty.html",children:"Tarsnap"}),"."]})]})}function h(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>o,x:()=>a});var s=i(6540);const n={},r=s.createContext(n);function o(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/aeaaba45.e439c077.js b/assets/js/aeaaba45.e439c077.js new file mode 100644 index 00000000..d3065592 --- /dev/null +++ b/assets/js/aeaaba45.e439c077.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkxcpdoc=self.webpackChunkxcpdoc||[]).push([[61],{4234:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var s=i(4848),n=i(8453);const r={title:"Bug Bounties"},o=void 0,a={id:"advanced/bounties",title:"Bug Bounties",description:"According to\xa0Linus\u2019 Law, \u201cgiven enough eyeballs, all bugs are shallow\u201d. That\u2019s one of the reasons why Counterparty\u2019s source code is publicly available; but merely making the source code available doesn't accomplish anything if people don\u2019t read it!",source:"@site/docs/advanced/bounties.md",sourceDirName:"advanced",slug:"/advanced/bounties",permalink:"/docs/advanced/bounties",draft:!1,unlisted:!1,editUrl:"https://github.com/facebook/docusaurus/edit/master/website/docs/advanced/bounties.md",tags:[],version:"current",frontMatter:{title:"Bug Bounties"},sidebar:"advanced",previous:{title:"Gas System",permalink:"/docs/advanced/specifications/gas-system"},next:{title:"Exchange Integration",permalink:"/docs/advanced/exchange-integration"}},l={},d=[{value:"Things that do not qualify under the bug bounty",id:"things-that-do-not-qualify-under-the-bug-bounty",level:2},{value:"Bounties for counterparty-core",id:"bounties-for-counterparty-core",level:2},{value:"How to report a bug",id:"how-to-report-a-bug",level:2},{value:"For security-related issues",id:"for-security-related-issues",level:3},{value:"For code issues",id:"for-code-issues",level:3},{value:"For website issues",id:"for-website-issues",level:3},{value:"The fine print",id:"the-fine-print",level:2},{value:"CREDITS",id:"credits",level:2}];function c(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["According to\xa0",(0,s.jsx)(t.a,{href:"http://en.wikipedia.org/wiki/Linus",children:"Linus\u2019 Law"}),", \u201cgiven enough eyeballs, all bugs are shallow\u201d. That\u2019s one of the reasons why Counterparty\u2019s source code is publicly available; but merely making the source code available doesn't accomplish anything if people don\u2019t read it!"]}),"\n",(0,s.jsx)(t.p,{children:"For this reason, Counterparty has a series of\xa0bug bounties. Counterparty bug bounties provide an opportunity for people who find bugs to be compensated."}),"\n",(0,s.jsx)(t.p,{children:"Depending on the type of bug and when it is reported, different bounties will be awarded. Bounties are paid out in a mix of XCP and BTC (the ratio is negotiable), at the 3-day average of each to a fixed US Dollar value."}),"\n",(0,s.jsx)(t.h2,{id:"things-that-do-not-qualify-under-the-bug-bounty",children:"Things that do not qualify under the bug bounty"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"counterpartytalk.org website"})," (unless the issue is a serious misconfiguration where user security details are being leaked in a way that they can be proven to be exploited)"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Counterwallet or counterblock"})," (unless the issue allows for theft of funds, in that case the $1,500 bounty defined below would apply)"]}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.strong,{children:"Please do not try XSS attacks in the Counterwallet chat box. It is annoying, and it has already been tested extensively"})}),"\n",(0,s.jsx)(t.li,{children:"Vulnerabilities which are too broad or not documented properly (i.e. do not include a specific example relevant to a Counterparty-controlled site)"}),"\n",(0,s.jsxs)(t.li,{children:["Bugs or issues with a third-party site, software, or service that we use, such as support.counterparty.io (freshdesk.com), which is not due to an improper configuration issue specific to us. Please submit any potential issues ",(0,s.jsx)(t.strong,{children:"to the maintainers of that site or providers of that service"})]}),"\n",(0,s.jsx)(t.li,{children:"Usability issues"}),"\n",(0,s.jsx)(t.li,{children:"Anything requiring social engineering"}),"\n",(0,s.jsx)(t.li,{children:"DOS/DDOS attacks"}),"\n",(0,s.jsx)(t.li,{children:"Missing HSTS (HttpOnly flags), Secure flag, Browser Cache vulnerabilities"}),"\n",(0,s.jsx)(t.li,{children:"CSRF that doesn\u2019t affect the victim"}),"\n",(0,s.jsx)(t.li,{children:"Referrer leakage to pages an attacker cannot control"}),"\n",(0,s.jsx)(t.li,{children:"Lack of explicit rate-limiting for counterwallet.io passphrase entry"}),"\n",(0,s.jsx)(t.li,{children:"The presence of unnecessary files, e.g. for backups, when these files do not expose any sensitive information"}),"\n",(0,s.jsx)(t.li,{children:"Anything that is the result of an automated Nessus/PCI scans (too general)"}),"\n",(0,s.jsx)(t.li,{children:"DNS issues (e.g. lack of an SPF record)"}),"\n",(0,s.jsx)(t.li,{children:"SSL certificate issues (such as lack of Perfect Forward Secrecy on our SSL certificates)"}),"\n",(0,s.jsx)(t.li,{children:"Bugs that have received mainstream tech media attention before the date of your disclosure (e.g. Heartbleed, Poodlebleed, etc)"}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"bounties-for-counterparty-core",children:"Bounties for counterparty-core"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Total USD amount (BTC/XCP mix)"}),(0,s.jsx)(t.th,{children:"Type of bug"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"$1,500"}),(0,s.jsx)(t.td,{children:"A flaw in the protocol that allows for theft or loss of funds"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"$1,000"}),(0,s.jsx)(t.td,{children:"A bug in the reference client that leads to consensus issues"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"$750"}),(0,s.jsx)(t.td,{children:"A bug which causes data corruption or loss"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"$200"}),(0,s.jsx)(t.td,{children:"A bug which causes the application to crash"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"$100"}),(0,s.jsx)(t.td,{children:"Other non-harmless bugs"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"$50"}),(0,s.jsx)(t.td,{children:"Build breakage on a supported platform"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"$20"}),(0,s.jsx)(t.td,{children:"'Harmless' bugs, e.g. cosmetic errors"})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["Bounties will be paid out for bugs found in the ",(0,s.jsx)(t.code,{children:"master"})," branch of the official GitHub repositories."]}),"\n",(0,s.jsx)(t.h2,{id:"how-to-report-a-bug",children:"How to report a bug"}),"\n",(0,s.jsx)(t.h3,{id:"for-security-related-issues",children:"For security-related issues"}),"\n",(0,s.jsxs)(t.p,{children:["Email ",(0,s.jsx)(t.a,{href:"mailto:dev@counterparty.io",children:"the developers"})," ",(0,s.jsx)(t.strong,{children:"privately with the details of the issue."})]}),"\n",(0,s.jsx)(t.h3,{id:"for-code-issues",children:"For code issues"}),"\n",(0,s.jsxs)(t.p,{children:["We would strongly prefer if you create a pull request on GitHub in the proper repository with the necessary fix (along with your Bitcoin address to claim the bounty). For more information, see ",(0,s.jsx)(t.a,{href:"https://help.github.com/categories/63/articles",children:"this link"}),".\xa0"]}),"\n",(0,s.jsx)(t.h3,{id:"for-website-issues",children:"For website issues"}),"\n",(0,s.jsxs)(t.p,{children:["Please contact ",(0,s.jsx)(t.a,{href:"mailto:support@counterparty.io",children:"support"})," with the error, along with your Bitcoin address."]}),"\n",(0,s.jsx)(t.h2,{id:"the-fine-print",children:"The fine print"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"A bounty will only be awarded to the first person who reports a bug, unless two or more people report the same bug at approximately the same time, in which case the bounty may be split between them."}),"\n",(0,s.jsx)(t.li,{children:"If the same bug appears in multiple locations it will normally only receive a single bounty."}),"\n",(0,s.jsx)(t.li,{children:"Reports of security-related bugs are not eligible for bounties if the bugs are publicly disclosed prior to being fixed."}),"\n",(0,s.jsx)(t.li,{children:"The issue must be described in necessary detail to address it."}),"\n",(0,s.jsx)(t.li,{children:"Only the discoverer of a bug is eligible for the associated bounty."}),"\n",(0,s.jsxs)(t.li,{children:["Bounties will be confirmed and awarded within 10 days of their\nreporting. Inquiries on bounty status may be sent to ",(0,s.jsx)(t.a,{href:"mailto:bounties@counterparty.io",children:"bounties@counterparty.io"})]}),"\n",(0,s.jsx)(t.li,{children:"Bounties will not be awarded if it is illegal to do so."}),"\n",(0,s.jsx)(t.li,{children:"The classification of bugs, values of bounties, and conditions under which bounties are paid are subject to change without notice."}),"\n",(0,s.jsx)(t.li,{children:"The core Counterparty team has sole discretion to determine whether a bug report qualifies for a bounty and for which bounty it qualifies."}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"credits",children:"CREDITS"}),"\n",(0,s.jsxs)(t.p,{children:["Credit to the general structure of this program as well as much of the wording goes to ",(0,s.jsx)(t.a,{href:"http://www.tarsnap.com/bugbounty.html",children:"Tarsnap"}),"."]})]})}function h(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>o,x:()=>a});var s=i(6540);const n={},r=s.createContext(n);function o(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b7d3b5fd.a8f29e10.js b/assets/js/b7d3b5fd.a8f29e10.js new file mode 100644 index 00000000..7427e0df --- /dev/null +++ b/assets/js/b7d3b5fd.a8f29e10.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkxcpdoc=self.webpackChunkxcpdoc||[]).push([[604],{8345:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var t=s(4848),n=s(8453);const o={},c="Be Able to Lock Descriptions",a={id:"advanced/specifications/lockable-issuance-descriptions",title:"Be Able to Lock Descriptions",description:"Motivation",source:"@site/docs/advanced/specifications/lockable-issuance-descriptions.md",sourceDirName:"advanced/specifications",slug:"/advanced/specifications/lockable-issuance-descriptions",permalink:"/docs/advanced/specifications/lockable-issuance-descriptions",draft:!1,unlisted:!1,editUrl:"https://github.com/facebook/docusaurus/edit/master/website/docs/advanced/specifications/lockable-issuance-descriptions.md",tags:[],version:"current",frontMatter:{},sidebar:"advanced",previous:{title:"Fair Minting",permalink:"/docs/advanced/specifications/fairminter"},next:{title:"Eliminate XCP for Subasset Issuances",permalink:"/docs/advanced/specifications/free-subassets"}},d={},l=[{value:"Motivation",id:"motivation",level:2},{value:"Design",id:"design",level:2},{value:"API Changes",id:"api-changes",level:2},{value:"Database Changes",id:"database-changes",level:2}];function r(e){const i={code:"code",h1:"h1",h2:"h2",li:"li",ol:"ol",p:"p",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.h1,{id:"be-able-to-lock-descriptions",children:"Be Able to Lock Descriptions"}),"\n",(0,t.jsx)(i.h2,{id:"motivation",children:"Motivation"}),"\n",(0,t.jsx)(i.p,{children:"From a collectors point of view, it is often important to be sure that all characteristics of an asset are immutable to establish the permanency of the object being traded. For this reason there is a strong demand from the community to add the possibility to lock the description of an asset. This feature is easy to implement, without any side effects, and without any consequences for existing assets."}),"\n",(0,t.jsx)(i.h2,{id:"design",children:"Design"}),"\n",(0,t.jsxs)(i.p,{children:["To lock an asset, there are currently two possibilities: perform an ",(0,t.jsx)(i.code,{children:"issuance"}),' with the description equal to "lock" or directly pass the parameter ',(0,t.jsx)(i.code,{children:"lock=True"}),". When an Asset is locked, however, it is still possible to modify the description."]}),"\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsxs)(i.li,{children:["Since there are two ways to lock an asset, the idea is to now use one of the two methods to specifically lock the description:","\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsxs)(i.li,{children:["If ",(0,t.jsx)(i.code,{children:"description=lock"}),", it means that the description should be locked."]}),"\n",(0,t.jsxs)(i.li,{children:["If ",(0,t.jsx)(i.code,{children:"lock=True"}),", we lock only the quantity (as it is done today)."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:["A ",(0,t.jsx)(i.code,{children:"description_locked"})," field will be added to the ",(0,t.jsx)(i.code,{children:"issuances"})," table."]}),"\n",(0,t.jsxs)(i.li,{children:["The ",(0,t.jsx)(i.code,{children:"issuances.validate"})," function will be modified to check that if ",(0,t.jsx)(i.code,{children:"description_locked"})," is equal to ",(0,t.jsx)(i.code,{children:"True"}),", the description must be necessarily equal to ",(0,t.jsx)(i.code,{children:"None"}),"."]}),"\n",(0,t.jsxs)(i.li,{children:["A protocol change ",(0,t.jsx)(i.code,{children:"lockable_description"})," will be added in the ",(0,t.jsx)(i.code,{children:"protocol_changes.json"})," file."]}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"api-changes",children:"API Changes"}),"\n",(0,t.jsxs)(i.p,{children:["No API changes, except for the documentation to indicate that ",(0,t.jsx)(i.code,{children:"description=lock"})," causes description only to be locked."]}),"\n",(0,t.jsx)(i.h2,{id:"database-changes",children:"Database Changes"}),"\n",(0,t.jsxs)(i.p,{children:["A ",(0,t.jsx)(i.code,{children:"description_locked"})," field will be added to the ",(0,t.jsx)(i.code,{children:"issuances"})," table."]})]})}function h(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(r,{...e})}):r(e)}},8453:(e,i,s)=>{s.d(i,{R:()=>c,x:()=>a});var t=s(6540);const n={},o=t.createContext(n);function c(e){const i=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:c(e.components),t.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c463f2d8.7b7e782d.js b/assets/js/c463f2d8.7b7e782d.js new file mode 100644 index 00000000..505c3c9b --- /dev/null +++ b/assets/js/c463f2d8.7b7e782d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkxcpdoc=self.webpackChunkxcpdoc||[]).push([[559],{7603:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>d});var n=s(4848),a=s(8453);const o={},i="Gas System",r={id:"advanced/specifications/gas-system",title:"Gas System",description:"When Counterparty was first created, the XCP fees for various transactions were hard-coded to low, constant values (e.g. 0.5 XCP for issuing a named asset). This system was chosen for its simplicity, but it creates significant friction when onboarding users to the Counterparty ecosystem (esp. since it is so hard to acquire XCP) and yet the fees are so low that they have little economic significance for market participants. A proper XCP fee system should be proportional to network traffic and transaction complexity without creating any unnecessary barriers to entry for users of the network. This protocol change will institute just such a system for the new UTXO Support feature by dynamically calculating the fees required to send assets from an address to a UTXO and from a UTXO to an address based on network congestion for this type of transaction.",source:"@site/docs/advanced/specifications/gas-system.md",sourceDirName:"advanced/specifications",slug:"/advanced/specifications/gas-system",permalink:"/docs/advanced/specifications/gas-system",draft:!1,unlisted:!1,editUrl:"https://github.com/facebook/docusaurus/edit/master/website/docs/advanced/specifications/gas-system.md",tags:[],version:"current",frontMatter:{},sidebar:"advanced",previous:{title:"UTXO Support",permalink:"/docs/advanced/specifications/utxo-support"},next:{title:"Bug Bounties",permalink:"/docs/advanced/bounties"}},c={},d=[];function l(e){const t={a:"a",code:"code",h1:"h1",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"gas-system",children:"Gas System"}),"\n",(0,n.jsx)(t.h1,{id:"motivation",children:"Motivation"}),"\n",(0,n.jsxs)(t.p,{children:["When Counterparty was first created, the XCP fees for various transactions were hard-coded to low, constant values (e.g. 0.5 XCP for issuing a named asset). This system was chosen for its simplicity, but it creates significant friction when onboarding users to the Counterparty ecosystem (esp. since it is so hard to acquire XCP) and yet the fees are so low that they have little economic significance for market participants. A proper XCP fee system should be proportional to network traffic and transaction complexity without creating any unnecessary barriers to entry for users of the network. This protocol change will institute just such a system for the new ",(0,n.jsx)(t.a,{href:"https://www.notion.so/UTXO-Support-7f70fdd934f94e6086716ed33d189e2f?pvs=21",children:"UTXO Support"})," feature by dynamically calculating the fees required to send assets from an address to a UTXO and from a UTXO to an address based on network congestion for this type of transaction."]}),"\n",(0,n.jsx)(t.h1,{id:"design",children:"Design"}),"\n",(0,n.jsx)(t.p,{children:"Fees are calculated based on the number of such transactions in the last difficulty period (2016 blocks) based on the average number of transactions per block in that period."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'def calculate_fee(x, a, b, base_fee, k):\n """\n Calculate the fee based on the number of transactions per block,\n ensuring continuity at the transition point.\n \n Parameters:\n x (float): Number of transactions per period\n a (float): Lower threshold (fee is zero below this)\n b (float): Upper threshold (transition point to exponential growth)\n base_fee (float): Base fee amount\n k (float): Sigmoid steepness factor\n \n Returns:\n float: Calculated fee\n """\n def sigmoid(t):\n return 1 / (1 + math.exp(-k * (t - 0.5)))\n \n if x <= a:\n return 0\n elif x <= b:\n return base_fee * sigmoid((x - a) / (b - a))\n else:\n # Calculate sigmoid value and derivative at x = b\n sigmoid_at_b = sigmoid(1)\n sigmoid_derivative_at_b = k * sigmoid_at_b * (1 - sigmoid_at_b)\n \n # Calculate parameters for the exponential part\n m = sigmoid_derivative_at_b * (b - a) / base_fee\n c = math.log(m)\n \n # Exponential function that matches sigmoid at x = b\n return base_fee * sigmoid_at_b * math.exp(c * ((x - b) / (b - a)))\n'})}),"\n",(0,n.jsxs)(t.p,{children:["The different parameters (",(0,n.jsx)(t.code,{children:"a"}),", ",(0,n.jsx)(t.code,{children:"b"}),", ",(0,n.jsx)(t.code,{children:"k"}),", ",(0,n.jsx)(t.code,{children:"base_fee"}),") will be stored in ",(0,n.jsx)(t.code,{children:"protocol_changes.json"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"Here is what the price evolution looks like as a function of the number of transactions using this function (a sigmoid to an exponential). (Parameters are not final.)"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"sigmoid.png",src:s(10).A+"",width:"719",height:"425"})}),"\n",(0,n.jsx)(t.h1,{id:"api-changes",children:"API Changes"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["New Routes","\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Get Estimated XCP Fees: ",(0,n.jsx)(t.code,{children:"/v2/addresses/
/send/compose/estimatexcpfees"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h1,{id:"database-changes",children:"Database Changes"}),"\n",(0,n.jsxs)(t.p,{children:["To facilitate the calculation of fees, a new table ",(0,n.jsx)(t.code,{children:"transaction_count"})," will be added. For each valid transaction a counter stored in this table will be incremented. This table will contain the following fields:"]}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"transaction_type"})," (for now ",(0,n.jsx)(t.code,{children:"send_from_address_to_utxo"})," or ",(0,n.jsx)(t.code,{children:"send_from_utxo_to_address"}),")"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"difficulty_period"})," (transaction block index modulo 2016)"]}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.strong,{children:"count"})}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},10:(e,t,s)=>{s.d(t,{A:()=>n});const n=s.p+"assets/images/sigmoid-db828c73543dd1ab63b96593146d76a6.png"},8453:(e,t,s)=>{s.d(t,{R:()=>i,x:()=>r});var n=s(6540);const a={},o=n.createContext(a);function i(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c66ced44.d100f20f.js b/assets/js/c66ced44.d100f20f.js new file mode 100644 index 00000000..01a67a1e --- /dev/null +++ b/assets/js/c66ced44.d100f20f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkxcpdoc=self.webpackChunkxcpdoc||[]).push([[738],{3857:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>a,default:()=>l,frontMatter:()=>o,metadata:()=>c,toc:()=>h});var s=n(4848),i=n(8453);const o={},a="Atomic Swap with UTXO Support",c={id:"advanced/how-to/atomic-swap",title:"Atomic Swap with UTXO Support",description:"With the new attach and detach functionalities which allow you to attach and detach assets from a UTXO, it is now possible to do Atomic Swaps like Ordinals.",source:"@site/docs/advanced/how-to/atomic-swap.md",sourceDirName:"advanced/how-to",slug:"/advanced/how-to/atomic-swap",permalink:"/docs/advanced/how-to/atomic-swap",draft:!1,unlisted:!1,editUrl:"https://github.com/facebook/docusaurus/edit/master/website/docs/advanced/how-to/atomic-swap.md",tags:[],version:"current",frontMatter:{},sidebar:"advanced",previous:{title:"Sentry Integration",permalink:"/docs/advanced/how-to/sentry-integration"},next:{title:"Make Dispenses Normal Counterparty Transactions",permalink:"/docs/advanced/specifications/enable-dispense-tx"}},r={},h=[];function d(e){const t={code:"code",h1:"h1",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"atomic-swap-with-utxo-support",children:"Atomic Swap with UTXO Support"}),"\n",(0,s.jsxs)(t.p,{children:["With the new ",(0,s.jsx)(t.code,{children:"attach"})," and ",(0,s.jsx)(t.code,{children:"detach"})," functionalities which allow you to attach and detach assets from a UTXO, it is now possible to do Atomic Swaps like Ordinals."]}),"\n",(0,s.jsx)(t.p,{children:"This guide details the different steps from opening a sell order to executing the buy order using Bitcoin Core for examples."}),"\n",(0,s.jsx)(t.h1,{id:"step-1-generation-of-a-psbt-by-the-seller",children:"Step 1: Generation of a PSBT by the seller"}),"\n",(0,s.jsxs)(t.p,{children:["After attaching assets to the UTXO ",(0,s.jsx)(t.code,{children:"$UTXO_TXID:$UTXO_VOUT"}),", the seller ",(0,s.jsx)(t.code,{children:"$SELLER_ADDRESS"})," can decide to sell them at the price ",(0,s.jsx)(t.code,{children:"$PRICE_BTC"}),". To do this, he must first prepare a \u201csale order\u201d in the form of a signed PSBT:"]}),"\n",(0,s.jsxs)(t.p,{children:["Creation of the PSBT ",(0,s.jsx)(t.code,{children:"$SELLER_PSBT"})]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:'$ bitcoin-cli createpsbt \'[{"txid":"$UTXO_TXID", "vout":"$UTXO_VOUT"}]\' \\\n\'[{"$SELLER_ADDRESS": "$PRICE_BTC"}]\'\n'})}),"\n",(0,s.jsx)(t.p,{children:"Signature of PSBT"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"$ bitcoin-cli walletprocesspsbt $SELLER_PSBT\n"})}),"\n",(0,s.jsx)(t.h1,{id:"step-2-dissemination-of-the-psbt",children:"Step 2: Dissemination of the PSBT"}),"\n",(0,s.jsx)(t.p,{children:"The seller can then share the PSBT in the way that seems most appropriate to him."}),"\n",(0,s.jsx)(t.h1,{id:"step-3-generation-of-a-psbt-by-the-buyer",children:"Step 3: Generation of a PSBT by the buyer"}),"\n",(0,s.jsx)(t.p,{children:"Once collected by a potential buyer, he creates a PSBT with the inputs of the sum necessary to pay for the assets and an output for the exchange."}),"\n",(0,s.jsxs)(t.p,{children:["After having determined the list of UTXOs with the ",(0,s.jsx)(t.code,{children:"listunspent"})," command, calculated the exchange ",(0,s.jsx)(t.code,{children:"$CHANGE"})," and the fees, the buyer ",(0,s.jsx)(t.code,{children:"$BUYER_ADDRESS"}),"can create his PSBT ",(0,s.jsx)(t.code,{children:"$BUYER_PSBT"}),":"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:'$ bitcoin-cli createpsbt \'[{"txid":"$UTXO1_TXID", "vout":"$UTXO2_VOUT"}, \u2026]\' \\\n\'[{"$BUYER_ADDRESS": "$CHANGE"}]\'\n'})}),"\n",(0,s.jsx)(t.h1,{id:"step-4-joining-the-psbts-of-the-seller-and-the-buyer",children:"Step 4: Joining the PSBTs of the seller and the buyer"}),"\n",(0,s.jsxs)(t.p,{children:["We must now join the two PSBTs into a single PSBT ",(0,s.jsx)(t.code,{children:"$PSBT_FINAL"})," with the ",(0,s.jsx)(t.code,{children:"joinpsbts"})," function."]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Attention"}),": the ",(0,s.jsx)(t.code,{children:"joinpsbts"})," function mixes the inputs and outputs randomly, you must therefore repeat the operation until the first output belongs to the buyer. Indeed, it is always the first non-OP_RETURN output which is the destination of the atomic swap."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:'$ bitcoin-cli joinpsbts \'["$BUYER_PSBT", "$SELLER_PSBT"]\'\n'})}),"\n",(0,s.jsx)(t.h1,{id:"step-5-signature-finalization-and-broadcast-of-the-transaction",children:"Step 5: Signature, finalization and broadcast of the transaction"}),"\n",(0,s.jsxs)(t.p,{children:["Signature of ",(0,s.jsx)(t.code,{children:"$PSBT_FINAL"})]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"$ bitcoin-cli walletprocesspsbt $PSBT_FINAL\n"})}),"\n",(0,s.jsxs)(t.p,{children:["Then finalizing ",(0,s.jsx)(t.code,{children:"$SIGNED_PSBT_FINAL"})]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"$ bitcoin-cli finalizepsbt $SIGNED_PSBT_FINAL\n"})}),"\n",(0,s.jsx)(t.p,{children:"And finally broadcast of the transaction"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"$ bitcoin-cli sendrawtransaction $RAWTRANSACTION\n"})}),"\n",(0,s.jsx)(t.h1,{id:"include-a-counterparty-transaction",children:"Include a Counterparty transaction"}),"\n",(0,s.jsx)(t.p,{children:"It is possible to include a Counterparty transaction inside the transaction used to finalize the atomic swap. For this it is enough:"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["use the composition API with the ",(0,s.jsx)(t.code,{children:"return_data_only"})," argument"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Add the ",(0,s.jsx)(t.code,{children:"CNTRPTY"})," prefix"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Encrypt with ARC4 using the ",(0,s.jsx)(t.code,{children:"txid"})," of the first input of the transaction"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Use the ",(0,s.jsx)(t.code,{children:"$DATA"})," obtained in \u201cStep 3: Generation of a PSBT by the buyer\u201d"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:'$ bitcoin-cli createpsbt \'[{"txid":"$UTXO1_TXID", "vout":"$UTXO2_VOUT"}, \u2026]\' \\\n\'[{"$BUYER_ADDRESS": "$CHANGE"}, {"data": "$DATA"}]\'\n'})}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"In \u201cStep 4: Joining the PSBTs of the seller and the buyer\u201d ensure that:"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"The first input belongs to the buyer"}),"\n",(0,s.jsx)(t.li,{children:"The first output is the OP_RETURN"}),"\n",(0,s.jsx)(t.li,{children:"The second output is to the buyer"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Attention"}),": this only works with an OP_RETURN, the size of ",(0,s.jsx)(t.code,{children:"$DATA"})," must therefore not exceed 80 bytes."]})]})}function l(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>c});var s=n(6540);const i={},o=s.createContext(i);function a(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e79842f2.47a4cd08.js b/assets/js/e79842f2.47a4cd08.js new file mode 100644 index 00000000..7b8fb550 --- /dev/null +++ b/assets/js/e79842f2.47a4cd08.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkxcpdoc=self.webpackChunkxcpdoc||[]).push([[10],{9759:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>l,frontMatter:()=>r,metadata:()=>a,toc:()=>o});var n=s(4848),i=s(8453);const r={},d="Fair Minting",a={id:"advanced/specifications/fairminter",title:"Fair Minting",description:"Fair Minting is a process whereby users are able to \u201cmint\u201d tokens in a decentralized manner. One user initiates the mint (either with or without a \u201cpremint\u201d), and then other users are able to trigger it to create tokens for themselves. Fair Minting was likely inspired by the original Counterparty Proof-of-Burn mechanism, by which users sent BTC to an unspendable address and XCP tokens were generate for them automatically.",source:"@site/docs/advanced/specifications/fairminter.md",sourceDirName:"advanced/specifications",slug:"/advanced/specifications/fairminter",permalink:"/docs/advanced/specifications/fairminter",draft:!1,unlisted:!1,editUrl:"https://github.com/facebook/docusaurus/edit/master/website/docs/advanced/specifications/fairminter.md",tags:[],version:"current",frontMatter:{},sidebar:"advanced",previous:{title:"Require Dispenser to be Source Address",permalink:"/docs/advanced/specifications/dispenser-must-be-created-by-source"},next:{title:"Be Able to Lock Descriptions",permalink:"/docs/advanced/specifications/lockable-issuance-descriptions"}},c={},o=[{value:"Function Signatures",id:"function-signatures",level:2},{value:"API Changes",id:"api-changes",level:2},{value:"Database Changes",id:"database-changes",level:2}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"fair-minting",children:"Fair Minting"}),"\n",(0,n.jsx)(t.h1,{id:"motivation",children:"Motivation"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Fair Minting"})," is a process whereby users are able to \u201cmint\u201d tokens in a decentralized manner. One user initiates the mint (either with or without a \u201cpremint\u201d), and then other users are able to trigger it to create tokens for themselves. Fair Minting was likely inspired by the original Counterparty ",(0,n.jsx)(t.strong,{children:"Proof-of-Burn"})," mechanism, by which users sent BTC to an unspendable address and XCP tokens were generate for them automatically."]}),"\n",(0,n.jsxs)(t.p,{children:["More recently, ",(0,n.jsx)(t.strong,{children:"BRC-20"}),' introduced a variant of the Fair Mint model that has been adopted by many fungible token protocols recently, including SRC-20 on Bitcoin Stamps. In this system, users are able to mint "for free" by paying only a miner fee: the term \u201cfair mint\u201d refers to the fact that the creator of the minting system is not enriched in the process, and that the minting process is decentralized']}),"\n",(0,n.jsxs)(t.p,{children:["In 2023, Joe Looney introduced the ",(0,n.jsxs)(t.a,{href:"https://xcp20.wtf/",children:[(0,n.jsx)(t.strong,{children:"\u201dXCP-20\u201d"})," Fair Mint model"]})," by setting up a ",(0,n.jsx)(t.strong,{children:"dispenser on a burn address; its name is"})," a tongue-in-cheek reference to BRC-20. Buyers, largely unaware that Counterparty existed\u2014and this was not new in any way\u2014sent massive amounts of Bitcoin to the burn address and received tokens in return. In this way, tokens got distributed, but the deployer was not directly enriched."]}),"\n",(0,n.jsx)(t.h1,{id:"design",children:"Design"}),"\n",(0,n.jsx)(t.p,{children:"It\u2019s desirable to create a native mechanism for Fair Minting so that a burn address isn\u2019t used. In the process, it is also natural to allow for multiple modes of operation that extend the Fair Mint model:"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Miner Fees Only, with a Max Mint per Transaction"}),"\n",(0,n.jsx)(t.li,{children:"XCP Fee with a Price per Unit Token (Distributed to Issuer)"}),"\n",(0,n.jsx)(t.li,{children:"XCP Fee with a Price per Unit (Burned)"}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Additional functionality may be added as well:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["A \u201csoft cap\u201d mechanism, establishing a minimum amount of the token to be issued, optionally by a particular block height. (Before ",(0,n.jsx)(t.code,{children:"soft_cap_deadline_block"})," payment will be escrowed trustlessly.)"]}),"\n",(0,n.jsx)(t.li,{children:"A commission in the new token sent to the creator of the mint for each mint operation (proportional to the quantity minted)"}),"\n",(0,n.jsx)(t.li,{children:"A \u201cStart Block\u201d and \u201cEnd Block\u201d"}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Implementation Notes:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Fair Mints will be possible by issuers of extant assets as long as those assets do not have locked quantities."}),"\n",(0,n.jsxs)(t.li,{children:["The ",(0,n.jsx)(t.code,{children:"premint"})," quantity will be credited to the issuer at the ",(0,n.jsx)(t.code,{children:"start_block"}),"."]}),"\n",(0,n.jsx)(t.li,{children:"If an asset can be reset it can also be Fair Minted, but fair minting itself would not first effect an asset reset."}),"\n",(0,n.jsxs)(t.li,{children:["Outside the fair minting period the ",(0,n.jsx)(t.code,{children:"hard_cap"})," has no effect. To lock the quantity you have to use the parameter ",(0,n.jsx)(t.code,{children:"lock_quantity=true"})," or use an issuance after the minting period."]}),"\n",(0,n.jsx)(t.li,{children:"For the duration of the mint period, the state of description lock and quantity lock cannot be changed."}),"\n"]}),"\n",(0,n.jsx)(t.h1,{id:"implementation",children:"Implementation"}),"\n",(0,n.jsxs)(t.p,{children:["It would be possible, to use the ",(0,n.jsx)(t.code,{children:"issuances.py"})," contract and add the fair minting implementation to it. However, this contract is already 1000 lines long and it is preferable not to add complexity to it. New contracts will therefore be implemented but, to ensure maximum compatibility with other assets, the ",(0,n.jsx)(t.code,{children:"issuances"})," and ",(0,n.jsx)(t.code,{children:"assets"})," tables will be used: the creation of a fair minting will result in the creation of a line in the ",(0,n.jsx)(t.code,{children:"assets"})," and ",(0,n.jsx)(t.code,{children:"issuances"})," tables and then each fair mining will result in the creation of a line in the ",(0,n.jsx)(t.code,{children:"issuances"})," table."]}),"\n",(0,n.jsxs)(t.p,{children:["There will be two new contracts: ",(0,n.jsx)(t.code,{children:"fairminter.py"})," and ",(0,n.jsx)(t.code,{children:"fairmint.py"}),". These two contracts will respect the usual interface of all other contracts, that is to say the functions ",(0,n.jsx)(t.code,{children:"initialise()"}),", ",(0,n.jsx)(t.code,{children:"validate()"}),", ",(0,n.jsx)(t.code,{children:"compose()"}),", ",(0,n.jsx)(t.code,{children:"unpack()"})," and ",(0,n.jsx)(t.code,{children:"parse()"}),'. The first will allow the creation of a "mintable" asset and the second will allow users to "mint" this asset. After the minting period, a minted asset functions just like a locked issuance asset.']}),"\n",(0,n.jsx)(t.h2,{id:"function-signatures",children:"Function Signatures"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"compose_fairminter"})}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Argument Name"}),(0,n.jsx)(t.th,{children:"Type"}),(0,n.jsx)(t.th,{children:"Defaut"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"address"}),(0,n.jsx)(t.td,{children:"str"}),(0,n.jsx)(t.td,{}),(0,n.jsx)(t.td,{children:"The address with which the transaction is signed and which is the issuer of the mined asset. This address receives the pre-minted assets, payments, and fees."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"asset"}),(0,n.jsx)(t.td,{children:"str"}),(0,n.jsx)(t.td,{}),(0,n.jsxs)(t.td,{children:["The name of the asset to be mined. If the asset doesn't exist, it is created. If it exists, it must belong to the issuer (",(0,n.jsx)(t.code,{children:"address"}),") and not be locked. In any case, the ",(0,n.jsx)(t.code,{children:"issuances"})," are locked for the asset as long as the fair minter is open."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"asset_parent"}),(0,n.jsx)(t.td,{children:"str"}),(0,n.jsx)(t.td,{children:"\u201c\u201d"}),(0,n.jsxs)(t.td,{children:["The name of the parent asset. The asset must exist and belong to the issuer (",(0,n.jsx)(t.code,{children:"address"}),"). If ",(0,n.jsx)(t.code,{children:"."})," doesn't exist, a new numeric asset with a random name is created. If ",(0,n.jsx)(t.code,{children:"."})," exists, it must belong to the issuer (",(0,n.jsx)(t.code,{children:"address"}),") and not be locked."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"price"}),(0,n.jsx)(t.td,{children:"int"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsxs)(t.td,{children:["The price for the ",(0,n.jsx)(t.code,{children:"quantity_by_price"})," units of the created asset in XCP-satoshis."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"quantity_by_price"}),(0,n.jsx)(t.td,{children:"int"}),(0,n.jsx)(t.td,{children:"1"}),(0,n.jsxs)(t.td,{children:["The amount of assets received by the miner for the price specified with the ",(0,n.jsx)(t.code,{children:"price"})," argument."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"max_mint_per_tx"}),(0,n.jsx)(t.td,{children:"int"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsxs)(t.td,{children:["If ",(0,n.jsx)(t.code,{children:"price"})," is different from 0, ",(0,n.jsx)(t.code,{children:"max_mint_per_tx"})," designates the maximum quantity a user can mine with one transaction. If ",(0,n.jsx)(t.code,{children:"price"})," is equal to 0, it designates the quantity the user receives with each transaction."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"hard_cap"}),(0,n.jsx)(t.td,{children:"int"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsxs)(t.td,{children:["The maximum number of assets that must not be exceeded by the fair minter. Any assets created before the fair minter opens are taken into account when verifying the ",(0,n.jsx)(t.code,{children:"hard_cap"}),"."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"premint_quantity"}),(0,n.jsx)(t.td,{children:"int"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsxs)(t.td,{children:["The quantity of assets to be mined at the creation of the fair minter. The pre-mined assets are sent to the issuer (",(0,n.jsx)(t.code,{children:"address"}),"). If a ",(0,n.jsx)(t.code,{children:"start_block"})," and/or a ",(0,n.jsx)(t.code,{children:"soft_cap"})," are defined, the pre-mined assets are escrowed until they are reached."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"start_block"}),(0,n.jsx)(t.td,{children:"int"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"The block from which users can mine assets. If equal to 0, the fair minter is available immediately after its creation."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"end_block"}),(0,n.jsx)(t.td,{children:"int"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsxs)(t.td,{children:["The block until which users can mine assets. If equal to 0, the fair minter is only closed if a ",(0,n.jsx)(t.code,{children:"soft_cap"})," is defined and not reached, or if a ",(0,n.jsx)(t.code,{children:"hard_cap"})," is defined and reached."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"soft_cap"}),(0,n.jsx)(t.td,{children:"int"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"The block until which users can mine assets. If equal to 0, the fair minter is only closed if a soft_cap is defined and not reached, or if a hard_cap is defined and reached. The soft_cap defines the minimum quantity of assets that must be mined, before soft_cap_deadline_block, for the fair minter not to be canceled and closed. Any assets created before the fair minter opens and premint_quantity are not taken into account when verifying the soft cap. As long as the soft cap is not reached, the mined assets, payments, and fees are escrowed. When the soft cap is reached, the assets are sent to the miners, the payments and fees to the issuer (address). If it is not reached, the payments are refunded, the assets destroyed, and the fair minter is closed."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"soft_cap_deadline_block"}),(0,n.jsx)(t.td,{children:"int"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsxs)(t.td,{children:["The block before which the ",(0,n.jsx)(t.code,{children:"soft_cap"})," must be reached (see ",(0,n.jsx)(t.code,{children:"soft_cap"}),")."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"minted_asset_commission"}),(0,n.jsx)(t.td,{children:"float"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsx)(t.td,{children:"Commission to be paid in minted asset, a fraction of 1 (i.e., 0.05 is five percent); the commission is deducted from the asset received by the minter and sent to the Fair Minter owner. If a soft cap is defined, the commissions are escrowed until it is reached."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"burn_payment"}),(0,n.jsx)(t.td,{children:"bool"}),(0,n.jsx)(t.td,{children:"False"}),(0,n.jsx)(t.td,{children:"This parameter allows for the destruction of XCP used to pay for the assets. If a soft cap is defined, the XCP are only destroyed if it is reached; otherwise, they are refunded."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"lock_description"}),(0,n.jsx)(t.td,{children:"bool"}),(0,n.jsx)(t.td,{children:"False"}),(0,n.jsxs)(t.td,{children:["Allows locking the asset description. This operation can also be performed with an ",(0,n.jsx)(t.code,{children:"issuance"})," once the fair minter is closed."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"lock_quantity"}),(0,n.jsx)(t.td,{children:"bool"}),(0,n.jsx)(t.td,{children:"False"}),(0,n.jsxs)(t.td,{children:["Allows locking the asset. This operation can also be performed with an ",(0,n.jsx)(t.code,{children:"issuance"})," once the fair minter is closed."]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"divisible"}),(0,n.jsx)(t.td,{children:"bool"}),(0,n.jsx)(t.td,{children:"True"}),(0,n.jsx)(t.td,{children:"Indicates whether the asset is divisible or not."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"description"}),(0,n.jsx)(t.td,{children:"str"}),(0,n.jsx)(t.td,{children:"\u201c\u201d"}),(0,n.jsx)(t.td,{children:"The description of the asset."})]})]})]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"compose_fairmint"})}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Argument Name"}),(0,n.jsx)(t.th,{children:"Type"}),(0,n.jsx)(t.th,{children:"Defaut"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"address"}),(0,n.jsx)(t.td,{children:"str"}),(0,n.jsx)(t.td,{}),(0,n.jsx)(t.td,{children:"The address with which the transaction is signed and which receives the minted assets."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"asset"}),(0,n.jsx)(t.td,{children:"str"}),(0,n.jsx)(t.td,{}),(0,n.jsx)(t.td,{children:"The name of the asset to be mined."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"quantity"}),(0,n.jsx)(t.td,{children:"int"}),(0,n.jsx)(t.td,{children:"0"}),(0,n.jsxs)(t.td,{children:["The quantity of assets to mine. If the asset price is greater than 0, ",(0,n.jsx)(t.code,{children:"quantity"})," must also be greater than 0, otherwise the mined quantity will in all cases be equal to the fair minter's ",(0,n.jsx)(t.code,{children:"mint_per_tx"}),"."]})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"api-changes",children:"API Changes"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["New Routes","\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Get All Fair Minters: ",(0,n.jsx)(t.code,{children:"/v2/fairminters"})]}),"\n",(0,n.jsxs)(t.li,{children:["Get Fair Minter By Tx Hash: ",(0,n.jsx)(t.code,{children:"/v2/fairminters/"})]}),"\n",(0,n.jsxs)(t.li,{children:["Get Fair Minter By Asset: ",(0,n.jsx)(t.code,{children:"/v2/assets//fairminter"})]}),"\n",(0,n.jsxs)(t.li,{children:["Get Fair Minters By Address: ",(0,n.jsx)(t.code,{children:"/v2/addresses/
/fairminters"})]}),"\n",(0,n.jsxs)(t.li,{children:["Get Mints By Fair Minter: ",(0,n.jsx)(t.code,{children:"/v2/fairminters//mints"})]}),"\n",(0,n.jsxs)(t.li,{children:["Get Mints By Asset: ",(0,n.jsx)(t.code,{children:"/v2/assets//mints"})]}),"\n",(0,n.jsxs)(t.li,{children:["Get Mints By Address: ",(0,n.jsx)(t.code,{children:"/v2/addresses/
/mints"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"database-changes",children:"Database Changes"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["A",(0,n.jsx)(t.code,{children:"fair_minting"})," field will be added to the ",(0,n.jsx)(t.code,{children:"issuances"})," table. This is the field that will be checked to prevent token issuance other than through fair minting."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["A new table ",(0,n.jsx)(t.code,{children:"fairminters"})," will be created with the following fields:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sql",children:"tx_hash TEXT, -- Fair Minter identifier\ntx_index INTEGER,\nblock_index INTEGER,\nsource TEXT,\nasset TEXT,\nasset_parent TEXT,\nasset_longname TEXT,\ndescription TEXT,\nprice INTEGER,\nquantity_by_price INTEGER,\nhard_cap INTEGER,\nburn_payment BOOL,\nmax_mint_per_tx INTEGER,\npremint_quantity INTEGER,\nstart_block INTEGER,\nend_block INTEGER,\nminted_asset_commission_int INTEGER,\nsoft_cap INTEGER,\nsoft_cap_deadline_block INTEGER,\nlock_description BOOL,\nlock_quantity BOOL,\ndivisible BOOL,\npre_minted BOOL DEFAULT 0,\nstatus TEXT -- pending, open, closed, invalid: \n"})}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:["A new table ",(0,n.jsx)(t.code,{children:"fairmints"})," will be created with the following fields:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sql",children:"tx_hash TEXT PRIMARY KEY, -- Mint identifier\ntx_index INTEGER,\nblock_index INTEGER,\nsource TEXT,\nfairminter_tx_hash TEXT,\nasset TEXT,\nearn_quantity INTEGER,\npaid_quantity INTEGER,\ncommission INTEGER,\nstatus TEXT -- valid, invalid: \n"})}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["For each row in the ",(0,n.jsx)(t.code,{children:"fairminters"})," and ",(0,n.jsx)(t.code,{children:"fairmints"})," table a row will be added to the ",(0,n.jsx)(t.code,{children:"issuances"})," table."]})]})}function l(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>d,x:()=>a});var n=s(6540);const i={},r=n.createContext(i);function d(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:d(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e9ab1486.cadf83d1.js b/assets/js/e9ab1486.cadf83d1.js new file mode 100644 index 00000000..68b3cd6b --- /dev/null +++ b/assets/js/e9ab1486.cadf83d1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkxcpdoc=self.webpackChunkxcpdoc||[]).push([[549],{7232:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>d});var n=s(4848),a=s(8453);const o={},i="UTXO Support",r={id:"advanced/specifications/utxo-support",title:"UTXO Support",description:'With Ordinals, a user who does not own an Ordinal cannot create a valid Bitcoin transaction to move an Ordinal that is not in their wallet. This is because the user must possess the UTXO that holds the "sat". Unlike Ordinals, Counterparty as a metaprotcol is entirely detached from Layer-1 consensus rules\u2014this allows Counterparty to be much more versatile and extendable. However, Ordinals, given its large community, offers Counterparty asset owners the opportunity to benefit from greater liquidity and a larger ecosystem generally. For this it is necessary to be able to attach and detach Counterparty assets to/from UTXOs. This will allow Counterparty assets to be compliant with the Ordinals trading transactional structure, allowing the large players in the Ordinals ecosystem to seamlessly integrate with Counterparty assets.',source:"@site/docs/advanced/specifications/utxo-support.md",sourceDirName:"advanced/specifications",slug:"/advanced/specifications/utxo-support",permalink:"/docs/advanced/specifications/utxo-support",draft:!1,unlisted:!1,editUrl:"https://github.com/facebook/docusaurus/edit/master/website/docs/advanced/specifications/utxo-support.md",tags:[],version:"current",frontMatter:{},sidebar:"advanced",previous:{title:"Subassets on Numeric Assets",permalink:"/docs/advanced/specifications/allow-subassets-on-numerics"},next:{title:"Gas System",permalink:"/docs/advanced/specifications/gas-system"}},c={},d=[{value:"Considerations",id:"considerations",level:2},{value:"API Changes",id:"api-changes",level:2},{value:"Database Changes",id:"database-changes",level:2}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"utxo-support",children:"UTXO Support"}),"\n",(0,n.jsx)(t.h1,{id:"motivations",children:"Motivations"}),"\n",(0,n.jsxs)(t.p,{children:['With Ordinals, a user who does not own an Ordinal cannot create a valid Bitcoin transaction to move an Ordinal that is not in their wallet. This is because the user must possess the UTXO that holds the "sat". Unlike Ordinals, Counterparty as a metaprotcol is entirely detached from Layer-1 consensus rules\u2014this allows Counterparty to be much more versatile and extendable. However, Ordinals, given its large community, offers Counterparty asset owners the opportunity to benefit from greater liquidity and a larger ecosystem generally. For this it is necessary to be able to ',(0,n.jsx)(t.strong,{children:"attach and detach Counterparty assets to/from UTXOs"}),". This will allow Counterparty assets to be compliant with the Ordinals trading transactional structure, allowing the large players in the Ordinals ecosystem to seamlessly integrate with Counterparty assets."]}),"\n",(0,n.jsx)(t.h1,{id:"design",children:"Design"}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"balances"}),", ",(0,n.jsx)(t.code,{children:"credits"})," and ",(0,n.jsx)(t.code,{children:"debits"})," tables, as well as the ",(0,n.jsx)(t.code,{children:"ledger.credit()"})," and ",(0,n.jsx)(t.code,{children:"ledger.debit()"})," functions will be modified to be able to support balances attached to UTXOs."]}),"\n",(0,n.jsxs)(t.p,{children:["A new contract ",(0,n.jsx)(t.code,{children:"utxo.py"})," will allow you to attach and detach assets from a UTXO. This new contract will be similar to a classic ",(0,n.jsx)(t.code,{children:"send"})," except that the source and destination will be integrated into the data embedded in the transaction."]}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"get_tx_info()"})," function will be modified to also return inputs with attached assets as well as the first non-OP_RETRUN output."]}),"\n",(0,n.jsxs)(t.p,{children:["The inputs and output returned by ",(0,n.jsx)(t.code,{children:"get_tx_info()"})," will be stored in the ",(0,n.jsx)(t.code,{children:"utxos_info"})," field of the ",(0,n.jsx)(t.code,{children:"transactions"})," table by the ",(0,n.jsx)(t.code,{children:"list_tx()"})," function."]}),"\n",(0,n.jsxs)(t.p,{children:["Then the ",(0,n.jsx)(t.code,{children:"parse_tx()"})," function will check that the ",(0,n.jsx)(t.code,{children:"utxos_info"})," field contains entries and if so will pass them to the ",(0,n.jsx)(t.code,{children:"utxo.move_assets()"})," function."]}),"\n",(0,n.jsxs)(t.p,{children:["Here is the signature of the ",(0,n.jsx)(t.code,{children:"utxo.compose()"})," function:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'def compose(db, source, destination, asset, quantity):\n """\n Compose a UTXO message.\n source: the source address or UTXO\n destination: the destination address or UTXO\n asset: the asset to transfer\n quantity: the quantity to transfer\n """\n'})}),"\n",(0,n.jsx)(t.p,{children:"For convenience, two functions, as well as two distinct routes, will be made available:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'"/v2/addresses/
/compose/attach": transaction.compose_attach,\n"/v2/utxos//compose/detach": transaction.compose_detach,\n'})}),"\n",(0,n.jsx)(t.h2,{id:"considerations",children:"Considerations"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["It is possible to attach and detach an arbitrary number of assets from an address or UTXO, however when a UTXO is used in a transaction, all assets attached to that UTXO are moved to the first UTXO non- ",(0,n.jsx)(t.code,{children:"OP_RETURN"})," output of the transaction."]}),"\n",(0,n.jsxs)(t.li,{children:["Fees in XCP, calculated using the ",(0,n.jsx)(t.a,{href:"https://gist.github.com/adamkrellenstein/7c7cab257cee162233fc2ba6682eb8da",children:"new Gas system"}),", will be paid by the source address for an ",(0,n.jsx)(t.code,{children:"attach"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"utxo.move_assets()"})," is executed before Counterparty contracts. This means that if a UTXO with attached assets is used for a Counterparty transaction, the assets are first moved and then the Counterparty transaction executed."]}),"\n",(0,n.jsxs)(t.li,{children:["To avoid problems due to (3), a new parameter ",(0,n.jsx)(t.code,{children:"exclude_utxos"})," will be added to all transaction composition functions."]}),"\n",(0,n.jsxs)(t.li,{children:["For each ",(0,n.jsx)(t.code,{children:"attach"})," and ",(0,n.jsx)(t.code,{children:"detach"}),", a row will be added to the ",(0,n.jsx)(t.code,{children:"send"})," table, triggering the ",(0,n.jsx)(t.code,{children:"ATTACH_TO_UTXO"})," and ",(0,n.jsx)(t.code,{children:"DETACH_FROM_UTXO"})," events respectively."]}),"\n",(0,n.jsxs)(t.li,{children:["When a UTXO is spent, a row is added to the ",(0,n.jsx)(t.code,{children:"send"})," table for each asset attached to this UTXO, triggering a ",(0,n.jsx)(t.code,{children:"UTXO_MOVE"})," event."]}),"\n",(0,n.jsxs)(t.li,{children:["When assets are attached to a UTXO, it is impossible to use them for a Counterparty transaction (",(0,n.jsx)(t.code,{children:"order"}),", ",(0,n.jsx)(t.code,{children:"send"}),", etc.) apart from ",(0,n.jsx)(t.code,{children:"detach"}),"."]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"api-changes",children:"API Changes"}),"\n",(0,n.jsx)(t.p,{children:"Three new routes will be added:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'"/v2/addresses/
/compose/attach": transaction.compose_attach,\n"/v2/utxos//compose/detach": transaction.compose_detach,\n"/v2/utxos//compose/movetoutxo": transaction.compose_movetoutxo,\n'})}),"\n",(0,n.jsxs)(t.p,{children:["Balances will now contain an additional ",(0,n.jsx)(t.code,{children:"utxo"})," field."]}),"\n",(0,n.jsx)(t.h2,{id:"database-changes",children:"Database Changes"}),"\n",(0,n.jsxs)(t.p,{children:["A ",(0,n.jsx)(t.code,{children:"utxo"})," field will be added to the ",(0,n.jsx)(t.code,{children:"credits"}),", ",(0,n.jsx)(t.code,{children:"debits"})," and ",(0,n.jsx)(t.code,{children:"balances"})," tables. One of the two fields, ",(0,n.jsx)(t.code,{children:"address"})," or ",(0,n.jsx)(t.code,{children:"utxo"})," will be null. The format of the ",(0,n.jsx)(t.code,{children:"utxo"})," field is ",(0,n.jsx)(t.code,{children:":"})," ."]}),"\n",(0,n.jsxs)(t.p,{children:["A ",(0,n.jsx)(t.code,{children:"utxos_info"})," field will be added to the ",(0,n.jsx)(t.code,{children:"transactions"})," table. This field will contain a list of UTXOs separated by spaces. The last in the list is the first non-",(0,n.jsx)(t.code,{children:"OP_RETURN"})," output of the transaction, and the previous ones, if present, are the transaction inputs with assets attached. If there is more than one, that means we need to move all the assets of the first(s) UTXO(s) to the last one."]})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>i,x:()=>r});var n=s(6540);const a={},o=n.createContext(a);function i(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fe704f88.d78e1018.js b/assets/js/fe704f88.d78e1018.js new file mode 100644 index 00000000..6c1533d1 --- /dev/null +++ b/assets/js/fe704f88.d78e1018.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkxcpdoc=self.webpackChunkxcpdoc||[]).push([[467],{1442:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>r,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var n=t(4848),a=t(8453);const o={},i="Subassets on Numeric Assets",c={id:"advanced/specifications/allow-subassets-on-numerics",title:"Subassets on Numeric Assets",description:"Motivation",source:"@site/docs/advanced/specifications/allow-subassets-on-numerics.md",sourceDirName:"advanced/specifications",slug:"/advanced/specifications/allow-subassets-on-numerics",permalink:"/docs/advanced/specifications/allow-subassets-on-numerics",draft:!1,unlisted:!1,editUrl:"https://github.com/facebook/docusaurus/edit/master/website/docs/advanced/specifications/allow-subassets-on-numerics.md",tags:[],version:"current",frontMatter:{},sidebar:"advanced",previous:{title:"Eliminate XCP for Subasset Issuances",permalink:"/docs/advanced/specifications/free-subassets"},next:{title:"UTXO Support",permalink:"/docs/advanced/specifications/utxo-support"}},r={},d=[{value:"Motivation",id:"motivation",level:2},{value:"Design",id:"design",level:2},{value:"API Changes",id:"api-changes",level:2},{value:"Database Changes",id:"database-changes",level:2}];function l(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.h1,{id:"subassets-on-numeric-assets",children:"Subassets on Numeric Assets"}),"\n",(0,n.jsx)(s.h2,{id:"motivation",children:"Motivation"}),"\n",(0,n.jsxs)(s.p,{children:["There is no particular reason to disallow subassets on numeric assets and there is a strong community demand to be able to do so (see for example ",(0,n.jsx)(s.a,{href:"https://github.com/mikeinspace/Glyphs/blob/main/README.md",children:"https://github.com/mikeinspace/Glyphs/blob/main/README.md"}),")"]}),"\n",(0,n.jsx)(s.h2,{id:"design",children:"Design"}),"\n",(0,n.jsxs)(s.p,{children:["Currently the ",(0,n.jsx)(s.code,{children:"validate_subasset_parent_name"})," function checks that the parent asset is not numeric: ",(0,n.jsx)(s.a,{href:"https://github.com/CounterpartyXCP/counterparty-core/blob/master/counterparty-core/counterpartycore/lib/util.py#L238",children:"https://github.com/CounterpartyXCP/counterparty-core/blob/master/counterparty-core/counterpartycore/lib/util.py#L238"})," This is the only place where this check is performed."]}),"\n",(0,n.jsxs)(s.p,{children:["A protocol change ",(0,n.jsx)(s.code,{children:"allow_subassets_on_numerics"})," will be added in the ",(0,n.jsx)(s.code,{children:"protocol_changes.json"})," file. From this block on, the verification will be removed from the function ",(0,n.jsx)(s.code,{children:"validate_subasset_parent_name"}),"."]}),"\n",(0,n.jsx)(s.h2,{id:"api-changes",children:"API Changes"}),"\n",(0,n.jsx)(s.p,{children:"No API changes."}),"\n",(0,n.jsx)(s.h2,{id:"database-changes",children:"Database Changes"}),"\n",(0,n.jsx)(s.p,{children:"No database changes."})]})}function u(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,s,t)=>{t.d(s,{R:()=>i,x:()=>c});var n=t(6540);const a={},o=n.createContext(a);function i(e){const s=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.1ee346cc.js b/assets/js/main.1ee346cc.js deleted file mode 100644 index 99f09a9b..00000000 --- a/assets/js/main.1ee346cc.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.1ee346cc.js.LICENSE.txt */ -(self.webpackChunkxcpdoc=self.webpackChunkxcpdoc||[]).push([[792],{8328:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});n(6540);var r=n(3259),a=n.n(r),o=n(4054);const i={17896441:[()=>Promise.all([n.e(869),n.e(401)]).then(n.bind(n,2535)),"@theme/DocItem",2535],"1a034fda":[()=>n.e(513).then(n.bind(n,1237)),"@site/docs/advanced/command-line-interface/usage.md",1237],"1cd19a42":[()=>n.e(466).then(n.bind(n,5800)),"@site/docs/advanced/api-v2/node-api.md",5800],"28a74b18":[()=>n.e(184).then(n.bind(n,9845)),"@site/docs/advanced/protocol.md",9845],"2ee84cfa":[()=>n.e(787).then(n.bind(n,7015)),"@site/docs/advanced/exchange-integration.md",7015],"3866f40a":[()=>n.e(25).then(n.bind(n,4063)),"@site/docs/advanced/api-v1/api-v1-changelog.md",4063],"39f92788":[()=>n.e(53).then(n.t.bind(n,1966,19)),"/Users/ouzielslama/Work/counterparty/Documentation/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",1966],"40cf6384":[()=>n.e(253).then(n.bind(n,7034)),"@site/docs/advanced/api-v1/api-v1-overview.md",7034],"418705b5":[()=>n.e(107).then(n.bind(n,4422)),"@site/docs/basics/what-is-counterparty.md",4422],"4a97e2ba":[()=>n.e(568).then(n.bind(n,7184)),"@site/docs/basics/getting-started.md",7184],"4ce8663f":[()=>n.e(380).then(n.bind(n,5859)),"@site/docs/advanced/how-to/docker-kickstart.md",5859],"4f873c4b":[()=>n.e(26).then(n.bind(n,4209)),"@site/docs/basics/assets/enhanced-asset.md",4209],"53a774fe":[()=>n.e(637).then(n.bind(n,6231)),"@site/docs/basics/what-is-xcp.md",6231],"5e95c892":[()=>n.e(647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"935f2afb":[()=>n.e(581).then(n.t.bind(n,5610,19)),"~docs/default/version-current-metadata-prop-751.json",5610],"9bf309c2":[()=>n.e(137).then(n.bind(n,981)),"@site/docs/advanced/command-line-interface/sending-bulk.md",981],"9e3db766":[()=>n.e(645).then(n.bind(n,6081)),"@site/docs/basics/manual-installation.md",6081],a00ce575:[()=>n.e(365).then(n.bind(n,876)),"@site/docs/basics/faq.md",876],a1c33974:[()=>n.e(398).then(n.bind(n,5902)),"@site/docs/advanced/command-line-interface/multisig.md",5902],a7852acd:[()=>n.e(228).then(n.bind(n,1298)),"@site/docs/advanced/api-v1/api-v1-spec.md",1298],a7bd4aaa:[()=>n.e(98).then(n.bind(n,4532)),"@theme/DocVersionRoot",4532],a94703ab:[()=>Promise.all([n.e(869),n.e(48)]).then(n.bind(n,2559)),"@theme/DocRoot",2559],aaef2cb0:[()=>n.e(463).then(n.bind(n,912)),"@site/docs/advanced/how-to/sentry-integration.md",912],aeaaba45:[()=>n.e(61).then(n.bind(n,4234)),"@site/docs/advanced/bounties.md",4234],b2ebb06c:[()=>n.e(133).then(n.bind(n,5814)),"@site/docs/basics/assets/counterparty-assets.md",5814],b7a88ac5:[()=>n.e(216).then(n.bind(n,6189)),"@site/docs/advanced/api-v2/v1-to-v2.md",6189],c4f5d8e4:[()=>n.e(634).then(n.bind(n,192)),"@site/src/pages/index.js",192],ceae6123:[()=>n.e(291).then(n.t.bind(n,4061,19)),"/Users/ouzielslama/Work/counterparty/Documentation/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",4061],e25eb256:[()=>n.e(929).then(n.bind(n,741)),"@site/docs/basics/assets/enhanced-feed.md",741],e74c2636:[()=>n.e(711).then(n.bind(n,2991)),"@site/docs/basics/usage.md",2991]};var l=n(4848);function s(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,l.jsxs)("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%"},children:[(0,l.jsx)("p",{children:String(t)}),(0,l.jsx)("div",{children:(0,l.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,l.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,l.jsx)("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",children:(0,l.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,l.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(6921),u=n(3102);function d(e,t){if("*"===e)return a()({loading:s,loader:()=>n.e(293).then(n.bind(n,9293)),modules:["@theme/NotFound"],webpack:()=>[9293],render(e,t){const n=e.default;return(0,l.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,l.jsx)(n,{...t})})}});const r=o[`${e}-${t}`],d={},p=[],f=[],m=(0,c.A)(r);return Object.entries(m).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),a().Map({loading:s,loader:d,modules:p,webpack:()=>f,render(t,n){const a=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const o=r.default;if(!o)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 o&&"function"!=typeof o||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{o[e]=r[e]}));let i=a;const l=n.split(".");l.slice(0,-1).forEach((e=>{i=i[e]})),i[l[l.length-1]]=o}));const o=a.__comp;delete a.__comp;const i=a.__context;return delete a.__context,(0,l.jsx)(u.W,{value:i,children:(0,l.jsx)(o,{...a,...n})})}})}const p=[{path:"/docs/",component:d("/docs/","f1a"),routes:[{path:"/docs/",component:d("/docs/","a47"),routes:[{path:"/docs/",component:d("/docs/","c04"),routes:[{path:"/docs/advanced/api-v1/api-v1-changelog/",component:d("/docs/advanced/api-v1/api-v1-changelog/","b11"),exact:!0,sidebar:"advanced"},{path:"/docs/advanced/api-v1/api-v1-overview/",component:d("/docs/advanced/api-v1/api-v1-overview/","32f"),exact:!0,sidebar:"advanced"},{path:"/docs/advanced/api-v1/api-v1-spec/",component:d("/docs/advanced/api-v1/api-v1-spec/","760"),exact:!0,sidebar:"advanced"},{path:"/docs/advanced/api-v2/node-api/",component:d("/docs/advanced/api-v2/node-api/","cc1"),exact:!0,sidebar:"advanced"},{path:"/docs/advanced/api-v2/v1-to-v2/",component:d("/docs/advanced/api-v2/v1-to-v2/","a99"),exact:!0,sidebar:"advanced"},{path:"/docs/advanced/bounties/",component:d("/docs/advanced/bounties/","c9d"),exact:!0,sidebar:"advanced"},{path:"/docs/advanced/command-line-interface/multisig/",component:d("/docs/advanced/command-line-interface/multisig/","2e5"),exact:!0,sidebar:"advanced"},{path:"/docs/advanced/command-line-interface/sending-bulk/",component:d("/docs/advanced/command-line-interface/sending-bulk/","4b6"),exact:!0,sidebar:"advanced"},{path:"/docs/advanced/command-line-interface/usage/",component:d("/docs/advanced/command-line-interface/usage/","2a2"),exact:!0,sidebar:"advanced"},{path:"/docs/advanced/exchange-integration/",component:d("/docs/advanced/exchange-integration/","482"),exact:!0,sidebar:"advanced"},{path:"/docs/advanced/how-to/docker-kickstart/",component:d("/docs/advanced/how-to/docker-kickstart/","6c6"),exact:!0,sidebar:"advanced"},{path:"/docs/advanced/how-to/sentry-integration/",component:d("/docs/advanced/how-to/sentry-integration/","4c4"),exact:!0,sidebar:"advanced"},{path:"/docs/advanced/protocol/",component:d("/docs/advanced/protocol/","e29"),exact:!0,sidebar:"advanced"},{path:"/docs/basics/assets/counterparty-assets/",component:d("/docs/basics/assets/counterparty-assets/","371"),exact:!0,sidebar:"basics"},{path:"/docs/basics/assets/enhanced-asset/",component:d("/docs/basics/assets/enhanced-asset/","5b9"),exact:!0,sidebar:"basics"},{path:"/docs/basics/assets/enhanced-feed/",component:d("/docs/basics/assets/enhanced-feed/","a68"),exact:!0,sidebar:"basics"},{path:"/docs/basics/faq/",component:d("/docs/basics/faq/","06c"),exact:!0},{path:"/docs/basics/getting-started/",component:d("/docs/basics/getting-started/","8fd"),exact:!0,sidebar:"basics"},{path:"/docs/basics/manual-installation/",component:d("/docs/basics/manual-installation/","d22"),exact:!0,sidebar:"basics"},{path:"/docs/basics/usage/",component:d("/docs/basics/usage/","dbf"),exact:!0,sidebar:"basics"},{path:"/docs/basics/what-is-counterparty/",component:d("/docs/basics/what-is-counterparty/","461"),exact:!0,sidebar:"basics"},{path:"/docs/basics/what-is-xcp/",component:d("/docs/basics/what-is-xcp/","a39"),exact:!0,sidebar:"basics"}]}]}]},{path:"/",component:d("/","b6b"),exact:!0},{path:"*",component:d("*")}]},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>o,x:()=>i});var r=n(6540),a=n(4848);const o=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,a.jsx)(o.Provider,{value:n,children:t})}},8536:(e,t,n)=>{"use strict";var r=n(6540),a=n(5338),o=n(4625),i=n(545),l=n(8193);const s=[n(119),n(6134),n(6294),n(1043)];var c=n(8328),u=n(6347),d=n(2831),p=n(4848);function f(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var m=n(5260),h=n(4586),g=n(6025),y=n(6342),b=n(1003),v=n(2131),w=n(4090),k=n(2967),x=n(440),S=n(1463);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,h.A)(),r=(0,v.o)(),a=n[e].htmlLang,o=e=>e.replace("-","_");return(0,p.jsxs)(m.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:o(a)}),Object.values(n).filter((e=>a!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:o(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function C(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.A)(),{pathname:r}=(0,u.zy)();return e+(0,x.applyTrailingSlash)((0,g.A)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:r;return(0,p.jsxs)(m.A,{children:[(0,p.jsx)("meta",{property:"og:url",content:a}),(0,p.jsx)("link",{rel:"canonical",href:a})]})}function _(){const{i18n:{currentLocale:e}}=(0,h.A)(),{metadata:t,image:n}=(0,y.p)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(m.A,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:w.w})]}),n&&(0,p.jsx)(b.be,{image:n}),(0,p.jsx)(C,{}),(0,p.jsx)(E,{}),(0,p.jsx)(S.A,{tag:k.Cy,locale:e}),(0,p.jsx)(m.A,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const A=new Map;function T(e){if(A.has(e.pathname))return{...e,pathname:A.get(e.pathname)};if((0,d.u)(c.A,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return A.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return A.set(e.pathname,t),{...e,pathname:t}}var j=n(6125),N=n(6988),L=n(205);function R(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const P=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,L.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),R("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function O(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.u)(c.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class D extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.A.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(0,p.jsx)(P,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(u.qh,{location:t,render:()=>e})})}}const I=D,F="__docusaurus-base-url-issue-banner-container",M="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${F}';\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(/{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}: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 Y=n(6921);const X=new Set,Z=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!Z.has(e)&&!X.has(e))(e))return!1;X.add(e);const t=(0,d.u)(c.A,e).flatMap((e=>{return t=e.route.path,Object.entries(Q).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Y.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?K(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!Z.has(e))(e)&&(Z.add(e),O(e))},te=Object.freeze(ee),ne=Boolean(!0);if(l.A.canUseDOM){window.docusaurus=te;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(i.vd,{children:(0,p.jsx)(o.Kd,{children:(0,p.jsx)(W,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},l=()=>{if(ne)r.startTransition((()=>{a.hydrateRoot(e,t,{onRecoverableError:n})}));else{const o=a.createRoot(e,{onRecoverableError:n});r.startTransition((()=>{o.render(t)}))}};O(window.location.pathname).then(l)}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>p});var r=n(6540),a=n(4784);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"basics/what-is-counterparty","docs":[{"id":"advanced/api-v1/api-v1-changelog","path":"/docs/advanced/api-v1/api-v1-changelog","sidebar":"advanced"},{"id":"advanced/api-v1/api-v1-overview","path":"/docs/advanced/api-v1/api-v1-overview","sidebar":"advanced"},{"id":"advanced/api-v1/api-v1-spec","path":"/docs/advanced/api-v1/api-v1-spec","sidebar":"advanced"},{"id":"advanced/api-v2/node-api","path":"/docs/advanced/api-v2/node-api","sidebar":"advanced"},{"id":"advanced/api-v2/v1-to-v2","path":"/docs/advanced/api-v2/v1-to-v2","sidebar":"advanced"},{"id":"advanced/bounties","path":"/docs/advanced/bounties","sidebar":"advanced"},{"id":"advanced/command-line-interface/multisig","path":"/docs/advanced/command-line-interface/multisig","sidebar":"advanced"},{"id":"advanced/command-line-interface/sending-bulk","path":"/docs/advanced/command-line-interface/sending-bulk","sidebar":"advanced"},{"id":"advanced/command-line-interface/usage","path":"/docs/advanced/command-line-interface/usage","sidebar":"advanced"},{"id":"advanced/exchange-integration","path":"/docs/advanced/exchange-integration","sidebar":"advanced"},{"id":"advanced/how-to/docker-kickstart","path":"/docs/advanced/how-to/docker-kickstart","sidebar":"advanced"},{"id":"advanced/how-to/sentry-integration","path":"/docs/advanced/how-to/sentry-integration","sidebar":"advanced"},{"id":"advanced/protocol","path":"/docs/advanced/protocol","sidebar":"advanced"},{"id":"basics/assets/counterparty-assets","path":"/docs/basics/assets/counterparty-assets","sidebar":"basics"},{"id":"basics/assets/enhanced-asset","path":"/docs/basics/assets/enhanced-asset","sidebar":"basics"},{"id":"basics/assets/enhanced-feed","path":"/docs/basics/assets/enhanced-feed","sidebar":"basics"},{"id":"basics/faq","path":"/docs/basics/faq"},{"id":"basics/getting-started","path":"/docs/basics/getting-started","sidebar":"basics"},{"id":"basics/manual-installation","path":"/docs/basics/manual-installation","sidebar":"basics"},{"id":"basics/usage","path":"/docs/basics/usage","sidebar":"basics"},{"id":"basics/what-is-counterparty","path":"/docs/basics/what-is-counterparty","sidebar":"basics"},{"id":"basics/what-is-xcp","path":"/docs/basics/what-is-xcp","sidebar":"basics"}],"draftIds":[],"sidebars":{"basics":{"link":{"path":"/docs/basics/what-is-counterparty","label":"basics/what-is-counterparty"}},"advanced":{"link":{"path":"/docs/advanced/protocol","label":"advanced/protocol"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(2654);const s=JSON.parse('{"docusaurusVersion":"3.1.0","siteVersion":"1.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.1.0"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.1.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.1.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.1.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.1.0"}}}');var c=n(4848);const u={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},d=r.createContext(u);function p(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},7489:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(6540),a=n(8193),o=n(5260),i=n(440),l=n(781),s=n(4848);function c(e){let{error:t,tryAgain:n}=e;return(0,s.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,s.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,s.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,s.jsx)(u,{error:t})]})}function u(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,s.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function d(e){let{error:t,tryAgain:n}=e;return(0,s.jsxs)(f,{fallback:()=>(0,s.jsx)(c,{error:t,tryAgain:n}),children:[(0,s.jsx)(o.A,{children:(0,s.jsx)("title",{children:"Page Error"})}),(0,s.jsx)(l.A,{children:(0,s.jsx)(c,{error:t,tryAgain:n})})]})}const p=e=>(0,s.jsx)(d,{...e});class f extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??p)(e)}return e??null}}},8193:(e,t,n)=>{"use strict";n.d(t,{A:()=>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}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);var r=n(545),a=n(4848);function o(e){return(0,a.jsx)(r.mg,{...e})}},8774:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(6540),a=n(4625),o=n(440),i=n(4586),l=n(6654),s=n(8193),c=n(3427),u=n(6025),d=n(4848);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:m,isActive:h,"data-noBrokenLinkCheck":g,autoAddBaseUrl:y=!0,...b}=e;const{siteConfig:{trailingSlash:v,baseUrl:w}}=(0,i.A)(),{withBaseUrl:k}=(0,u.h)(),x=(0,c.A)(),S=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>S.current));const E=p||f;const C=(0,l.A)(E),_=E?.replace("pathname://","");let A=void 0!==_?(T=_,y&&(e=>e.startsWith("/"))(T)?k(T):T):void 0;var T;A&&C&&(A=(0,o.applyTrailingSlash)(A,{trailingSlash:v,baseUrl:w}));const j=(0,r.useRef)(!1),N=n?a.k2:a.N_,L=s.A.canUseIntersectionObserver,R=(0,r.useRef)(),P=()=>{j.current||null==A||(window.docusaurus.preload(A),j.current=!0)};(0,r.useEffect)((()=>(!L&&C&&null!=A&&window.docusaurus.prefetch(A),()=>{L&&R.current&&R.current.disconnect()})),[R,A,L,C]);const O=A?.startsWith("#")??!1,D=!A||!C||O;return D||g||x.collectLink(A),D?(0,d.jsx)("a",{ref:S,href:A,...E&&!C&&{target:"_blank",rel:"noopener noreferrer"},...b}):(0,d.jsx)(N,{...b,onMouseEnter:P,onTouchStart:P,innerRef:e=>{S.current=e,L&&e&&C&&(R.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(R.current.unobserve(e),R.current.disconnect(),null!=A&&window.docusaurus.prefetch(A))}))})),R.current.observe(e))},to:A,...n&&{isActive:h,activeClassName:m}})}const f=r.forwardRef(p)},418:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=()=>null},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,T:()=>s});var r=n(6540),a=n(4848);function o(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=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 i=n(2654);function l(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function s(e,t){let{message:n,id:r}=e;return o(l({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=l({message:t,id:n});return(0,a.jsx)(a.Fragment,{children:o(i,r)})}},7065:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},6654:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>a,z:()=>r})},6025:(e,t,n)=>{"use strict";n.d(t,{A:()=>l,h:()=>i});var r=n(6540),a=n(4586),o=n(6654);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.A)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.z)(n))return n;if(a)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)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},3427:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6540);n(4848);const a=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),o=()=>(0,r.useContext)(a);function i(){return o()}},4586:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(6988);function o(){return(0,r.useContext)(a.o)}},2303:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(6125);function o(){return(0,r.useContext)(a.o)}},205:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540);const a=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect},6921:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const l=a?`${a}.${o}`:o;r(i)?e(i,l):t[l]=i}))}(e),t}},3102:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>o});var r=n(6540),a=n(4848);const o=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(o),l=(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,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,a.jsx)(o.Provider,{value:l,children:t})}},4070:(e,t,n)=>{"use strict";n.d(t,{zK:()=>h,vT:()=>p,Gy:()=>u,HW:()=>g,ht:()=>d,r7:()=>m,jh:()=>f});var r=n(6347),a=n(4586),o=n(7065);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.A)();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=function(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=n?.docs.find((e=>!!(0,r.B6)(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 c={},u=()=>i("docusaurus-plugin-content-docs")??c,d=e=>function(e,t,n){void 0===t&&(t=o.W),void 0===n&&(n={});const r=i(e),a=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 p(e){void 0===e&&(e={});const t=u(),{pathname:n}=(0,r.zy)();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.B6)(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 f(e){return d(e).versions}function m(e){const t=d(e);return l(t)}function h(e){const t=d(e),{pathname:n}=(0,r.zy)();return s(t,n)}function g(e){const t=d(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=l(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(5947),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()}}},6134:(e,t,n)=>{"use strict";n.r(t);var r=n(1765),a=n(4784);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(8692)(`./prism-${e}`)})),delete globalThis.Prism}(r.My)},1107:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(4164),a=n(1312),o=n(6342),i=n(8774),l=n(3427);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(4848);function u(e){let{as:t,id:n,...u}=e;const d=(0,l.A)(),{navbar:{hideOnScroll:p}}=(0,o.p)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const f=(0,a.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.A)("anchor",p?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,children:"\u200b"})]})}},3186:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};var a=n(4848);function o(e){let{width:t=13.5,height:n=13.5}=e;return(0,a.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,a.jsx)("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"})})}},781:(e,t,n)=>{"use strict";n.d(t,{A:()=>ft});var r=n(6540),a=n(4164),o=n(7489),i=n(1003),l=n(6347),s=n(1312),c=n(5062),u=n(4848);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,l.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const m=(0,s.T)({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",message:"Skip to main content"});function h(e){const t=e.children??m,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":m,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(7559),y=n(4090);const b={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(h,{className:b.skipToContent})}var w=n(6342),k=n(5041);function x(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:a=1.2,className:o,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:a,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function E(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,s.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,a.A)("clean-btn close",S.closeButton,e.className),children:(0,u.jsx)(x,{width:14,height:14,strokeWidth:3.1})})}const C={content:"content_knG7"};function _(e){const{announcementBar:t}=(0,w.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,a.A)(C.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const A={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function T(){const{announcementBar:e}=(0,w.p)(),{isActive:t,close:n}=(0,k.Mj)();if(!t)return null;const{backgroundColor:r,textColor:a,isCloseable:o}=e;return(0,u.jsxs)("div",{className:A.announcementBar,style:{backgroundColor:r,color:a},role:"banner",children:[o&&(0,u.jsx)("div",{className:A.announcementBarPlaceholder}),(0,u.jsx)(_,{className:A.announcementBarContent}),o&&(0,u.jsx)(E,{onClick:n,className:A.announcementBarClose})]})}var j=n(9876),N=n(3104);var L=n(9532),R=n(5600);const P=r.createContext(null);function O(e){let{children:t}=e;const n=function(){const e=(0,j.M)(),t=(0,R.YL)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,L.ZC)(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(0,u.jsx)(P.Provider,{value:n,children:t})}function D(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function I(){const e=(0,r.useContext)(P);if(!e)throw new L.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,R.YL)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:D(o)})),[a,o,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:o}=I();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,a.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":o}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var M=n(5293),z=n(2303);function B(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("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 $(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("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 U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:r,onChange:o}=e;const i=(0,z.A)(),l=(0,s.T)({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"===r?(0,s.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,s.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,a.A)(U.toggle,t),children:(0,u.jsxs)("button",{className:(0,a.A)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>o("dark"===r?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite",children:[(0,u.jsx)(B,{className:(0,a.A)(U.toggleIcon,U.lightToggleIcon)}),(0,u.jsx)($,{className:(0,a.A)(U.toggleIcon,U.darkToggleIcon)})]})})}const H=r.memo(q),G={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function V(e){let{className:t}=e;const n=(0,w.p)().navbar.style,r=(0,w.p)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,M.G)();return r?null:(0,u.jsx)(H,{className:t,buttonClassName:"dark"===n?G.darkNavbarColorModeToggle:void 0,value:a,onChange:o})}var W=n(3465);function Q(){return(0,u.jsx)(W.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function K(){const e=(0,j.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,s.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(x,{color:"var(--ifm-color-emphasis-600)"})})}function Y(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(Q,{}),(0,u.jsx)(V,{className:"margin-right--md"}),(0,u.jsx)(K,{})]})}var X=n(8774),Z=n(6025),J=n(6654);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(3186);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:a,label:o,html:i,isDropdownLink:l,prependBaseUrlToHref:s,...c}=e;const d=(0,Z.A)(r),p=(0,Z.A)(t),f=(0,Z.A)(a,{forcePrependBaseUrl:!0}),m=o&&a&&!(0,J.A)(a),h=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[o,m&&(0,u.jsx)(te.A,{...l&&{width:12,height:12}})]})};return a?(0,u.jsx)(X.A,{href:s?f:a,...c,...h}):(0,u.jsx)(X.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},...c,...h})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const o=(0,u.jsx)(ne,{className:(0,a.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:o}):o}function ae(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,a.A)("menu__link",t),...r})})}function oe(e){let{mobile:t=!1,position:n,...r}=e;const a=t?ae:re;return(0,u.jsx)(a,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(1422),le=n(9169),se=n(4586);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,le.ys)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:o,onClick:i,...l}=e;const s=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{s.current&&!s.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[s]),(0,u.jsxs)("div",{ref:s,className:(0,a.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:l.to?void 0:"#",className:(0,a.A)("navbar__link",o),...l,onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:l.children??l.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(Ce,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:o,onClick:i,...s}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,se.A)(),{pathname:t}=(0,l.zy)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),(0,u.jsxs)("li",{className:(0,a.A)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsx)(ne,{role:"button",className:(0,a.A)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...s,onClick:e=>{e.preventDefault(),f()},children:s.children??s.label}),(0,u.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(Ce,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,u.jsx)(r,{...n})}var me=n(2131);function he(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("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 ge="iconLanguage_nlXk";var ye=n(418);const be={navbarSearchContainer:"navbarSearchContainer_Bca1"};function ve(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,a.A)(n,be.navbarSearchContainer),children:t})}var we=n(4070),ke=n(1754);var xe=n(5597);const Se=e=>e.docs.find((t=>t.id===e.mainDocId));const Ee={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:a="",...o}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,se.A)(),p=(0,me.o)(),{search:f,hash:m}=(0,l.zy)(),h=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${m}${a}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],g=t?(0,s.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(fe,{...o,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(he,{className:ge}),g]}),items:h})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(ve,{className:n,children:(0,u.jsx)(ye.A,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:o=!1}=e;const i=o?"li":"div";return(0,u.jsx)(i,{className:(0,a.A)({navbar__item:!r&&!o,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.zK)(r),i=(0,ke.QB)(t,r),l=o?.path===i?.path;return null===i||i.unlisted&&!l?null:(0,u.jsx)(oe,{exact:!0,...a,isActive:()=>l||!!o?.sidebar&&o.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.zK)(r),i=(0,ke.fW)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(oe,{exact:!0,...a,isActive:()=>o?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...a}=e;const o=(0,ke.Vd)(r)[0],i=t??o.label,l=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(o).path;return(0,u.jsx)(oe,{...a,label:i,to:l})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:a,dropdownItemsAfter:o,...i}=e;const{search:c,hash:d}=(0,l.zy)(),p=(0,we.zK)(n),f=(0,we.jh)(n),{savePreferredVersionName:m}=(0,xe.g1)(n),h=[...a,...f.map((e=>{const t=p.alternateDocVersions[e.name]??Se(e);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>m(e.name)}})),...o],g=(0,ke.Vd)(n)[0],y=t&&h.length>1?(0,s.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):g.label,b=t&&h.length>1?void 0:Se(g).path;return h.length<=1?(0,u.jsx)(oe,{...i,mobile:t,label:y,to:b,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:y,to:b,items:h,isActive:r?()=>!1:void 0})}};function Ce(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=Ee[r];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(a,{...n})}function _e(){const e=(0,j.M)(),t=(0,w.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(Ce,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ae(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(s.A,{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)",children:"\u2190 Back to main menu"})})}function Te(){const e=0===(0,w.p)().navbar.items.length,t=I();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Ae,{onClick:()=>t.hide()}),t.content]})}function je(){const e=(0,j.M)();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?(0,u.jsx)(F,{header:(0,u.jsx)(Y,{}),primaryMenu:(0,u.jsx)(_e,{}),secondaryMenu:(0,u.jsx)(Te,{})}):null}const Ne={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Le(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,a.A)("navbar-sidebar__backdrop",e.className)})}function Re(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.p)(),i=(0,j.M)(),{navbarRef:l,isNavbarVisible:d}=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,N.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+c{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:l,"aria-label":(0,s.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.A)("navbar","navbar--fixed-top",n&&[Ne.navbarHideable,!d&&Ne.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Le,{onClick:i.toggle}),(0,u.jsx)(je,{})]})}var Pe=n(440);const Oe={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function De(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(s.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function Ie(e){let{error:t}=e;const n=(0,Pe.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:Oe.errorBoundaryError,children:n})}class Fe extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Me="right";function ze(e){let{width:t=30,height:n=30,className:r,...a}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...a,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function Be(){const{toggle:e,shown:t}=(0,j.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,s.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(ze,{})})}const $e={colorModeToggle:"colorModeToggle_DEke"};function Ue(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(Fe,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(Ce,{...e})},t)))})}function qe(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function He(){const e=(0,j.M)(),t=(0,w.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Me)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return(0,u.jsx)(qe,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(Be,{}),(0,u.jsx)(Q,{}),(0,u.jsx)(Ue,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Ue,{items:r}),(0,u.jsx)(V,{className:$e.colorModeToggle}),!a&&(0,u.jsx)(ve,{children:(0,u.jsx)(ye.A,{})})]})})}function Ge(){return(0,u.jsx)(Re,{children:(0,u.jsx)(He,{})})}function Ve(e){let{item:t}=e;const{to:n,href:r,label:a,prependBaseUrlToHref:o,...i}=t,l=(0,Z.A)(n),s=(0,Z.A)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(X.A,{className:"footer__link-item",...r?{href:o?s:r}:{to:l},...i,children:[a,r&&!(0,J.A)(r)&&(0,u.jsx)(te.A,{})]})}function We(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(Ve,{item:t})},t.href??t.to)}function Qe(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(We,{item:e},t)))})]})}function Ke(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(Qe,{column:e},t)))})}function Ye(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function Xe(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(Ve,{item:t})}function Ze(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(Xe,{item:e}),t.length!==n+1&&(0,u.jsx)(Ye,{})]},n)))})})}function Je(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(Ke,{columns:t}):(0,u.jsx)(Ze,{links:t})}var et=n(1122);const tt={footerLogoLink:"footerLogoLink_BH7S"};function nt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,Z.h)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(et.A,{className:(0,a.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function rt(e){let{logo:t}=e;return t.href?(0,u.jsx)(X.A,{href:t.href,className:tt.footerLogoLink,target:t.target,children:(0,u.jsx)(nt,{logo:t})}):(0,u.jsx)(nt,{logo:t})}function at(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function ot(e){let{style:t,links:n,logo:r,copyright:o}=e;return(0,u.jsx)("footer",{className:(0,a.A)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||o)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),o]})]})})}function it(){const{footer:e}=(0,w.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:a}=e;return(0,u.jsx)(ot,{style:a,links:n&&n.length>0&&(0,u.jsx)(Je,{links:n}),logo:r&&(0,u.jsx)(rt,{logo:r}),copyright:t&&(0,u.jsx)(at,{copyright:t})})}const lt=r.memo(it),st=(0,L.fM)([M.a,k.oq,N.Tv,xe.VQ,i.Jx,function(e){let{children:t}=e;return(0,u.jsx)(R.y_,{children:(0,u.jsx)(j.e,{children:(0,u.jsx)(O,{children:t})})})}]);function ct(e){let{children:t}=e;return(0,u.jsx)(st,{children:t})}var ut=n(1107);function dt(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(ut.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(s.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(De,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(Ie,{error:t})})]})})})}const pt={mainWrapper:"mainWrapper_z2l0"};function ft(e){const{children:t,noFooter:n,wrapperClassName:r,title:l,description:s}=e;return(0,y.J)(),(0,u.jsxs)(ct,{children:[(0,u.jsx)(i.be,{title:l,description:s}),(0,u.jsx)(v,{}),(0,u.jsx)(T,{}),(0,u.jsx)(Ge,{}),(0,u.jsx)("div",{id:d,className:(0,a.A)(g.G.wrapper.main,pt.mainWrapper,r),children:(0,u.jsx)(o.A,{fallback:e=>(0,u.jsx)(dt,{...e}),children:t})}),!n&&(0,u.jsx)(lt,{})]})}},3465:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(8774),a=n(6025),o=n(4586),i=n(6342),l=n(1122),s=n(4848);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,a.A)(t.src),dark:(0,a.A)(t.srcDark||t.src)},i=(0,s.jsx)(l.A,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,s.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,o.A)(),{navbar:{title:n,logo:l}}=(0,i.p)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,a.A)(l?.href||"/"),m=n?"":t,h=l?.alt??m;return(0,s.jsxs)(r.A,{to:f,...p,...l?.target&&{target:l.target},children:[l&&(0,s.jsx)(c,{logo:l,alt:h,imageClassName:u}),null!=n&&(0,s.jsx)("b",{className:d,children:n})]})}},1463:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);var r=n(5260),a=n(4848);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return(0,a.jsxs)(r.A,{children:[t&&(0,a.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,a.jsx)("meta",{name:"docusaurus_version",content:n}),o&&(0,a.jsx)("meta",{name:"docusaurus_tag",content:o}),i&&(0,a.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,a.jsx)("meta",{name:"docsearch:version",content:n}),o&&(0,a.jsx)("meta",{name:"docsearch:docusaurus_tag",content:o})]})}},1122:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(6540),a=n(4164),o=n(2303),i=n(5293);const l={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var s=n(4848);function c(e){let{className:t,children:n}=e;const c=(0,o.A)(),{colorMode:u}=(0,i.G)();return(0,s.jsx)(s.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const o=n({theme:e,className:(0,a.A)(t,l.themedComponent,l[`themedComponent--${e}`])});return(0,s.jsx)(r.Fragment,{children:o},e)}))})}function u(e){const{sources:t,className:n,alt:r,...a}=e;return(0,s.jsx)(c,{className:n,children:e=>{let{theme:n,className:o}=e;return(0,s.jsx)("img",{src:t[n],alt:r,className:o,...a})}})}},1422:(e,t,n)=>{"use strict";n.d(t,{N:()=>y,u:()=>c});var r=n(6540),a=n(8193),o=n(205),i=n(3109),l=n(4848);const s="ease-in-out";function c(e){let{initialState:t}=e;const[n,a]=(0,r.useState)(t??!1),o=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:o}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const o=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=a?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${a?.easing??s}`,height:`${t}px`}}function l(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return p(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,a])}function m(e){if(!a.A.canUseDOM)return e?u:d}function h(e){let{as:t="div",collapsed:n,children:a,animation:o,onCollapseTransitionEnd:i,className:s,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:o}),(0,l.jsx)(t,{ref:u,style:c?void 0:m(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(u.current,n),i?.(n))},className:s,children:a})}function g(e){let{collapsed:t,...n}=e;const[a,i]=(0,r.useState)(!t),[s,c]=(0,r.useState)(t);return(0,o.A)((()=>{t||i(!0)}),[t]),(0,o.A)((()=>{a&&c(t)}),[a,t]),a?(0,l.jsx)(h,{...n,collapsed:s}):null}function y(e){let{lazy:t,...n}=e;const r=t?g:h;return(0,l.jsx)(r,{...n})}},5041:(e,t,n)=>{"use strict";n.d(t,{Mj:()=>h,oq:()=>m});var r=n(6540),a=n(2303),o=n(9466),i=n(9532),l=n(6342),s=n(4848);const c=(0,o.Wf)("docusaurus.announcement.dismiss"),u=(0,o.Wf)("docusaurus.announcement.id"),d=()=>"true"===c.get(),p=e=>c.set(String(e)),f=r.createContext(null);function m(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.p)(),t=(0,a.A)(),[n,o]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{o(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&p(!1),!r&&d()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,s.jsx)(f.Provider,{value:n,children:t})}function h(){const e=(0,r.useContext)(f);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>y,a:()=>g});var r=n(6540),a=n(8193),o=n(9532),i=n(9466),l=n(6342),s=n(4848);const c=r.createContext(void 0),u="theme",d=(0,i.Wf)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,m=e=>a.A.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),h=e=>{d.set(f(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.p)(),[a,o]=(0,r.useState)(m(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&h(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(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||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[a,i])}();return(0,s.jsx)(c.Provider,{value:n,children:t})}function y(){const e=(0,r.useContext)(c);if(null==e)throw new o.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},5597:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>y,g1:()=>v});var r=n(6540),a=n(4070),o=n(7065),i=n(6342),l=n(1754),s=n(9532),c=n(9466),u=n(4848);const d=e=>`docs-preferred-version-${e}`,p={save:(e,t,n)=>{(0,c.Wf)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.Wf)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.Wf)(d(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const m=r.createContext(null);function h(){const e=(0,a.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=p.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p.clear(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){p.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=h();return(0,u.jsx)(m.Provider,{value:n,children:t})}function y(e){let{children:t}=e;return l.C5?(0,u.jsx)(g,{children:t}):(0,u.jsx)(u.Fragment,{children:t})}function b(){const e=(0,r.useContext)(m);if(!e)throw new s.dV("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.W);const t=(0,a.ht)(e),[n,i]=b(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},6588:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,t:()=>c});var r=n(6540),a=n(9532),o=n(4848);const i=Symbol("EmptyContext"),l=r.createContext(i);function s(e){let{children:t,name:n,items:a}=e;const i=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return(0,o.jsx)(l.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(l);if(e===i)throw new a.dV("DocsSidebarProvider");return e}},2252:(e,t,n)=>{"use strict";n.d(t,{n:()=>l,r:()=>s});var r=n(6540),a=n(9532),o=n(4848);const i=r.createContext(null);function l(e){let{children:t,version:n}=e;return(0,o.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(null===e)throw new a.dV("DocsVersionProvider");return e}},9876:(e,t,n)=>{"use strict";n.d(t,{e:()=>f,M:()=>m});var r=n(6540),a=n(5600),o=n(4581),i=n(6347),l=n(9532);function s(e){!function(e){const t=(0,i.W6)(),n=(0,l._q)(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(6342),u=n(4848);const d=r.createContext(void 0);function p(){const e=function(){const e=(0,a.YL)(),{items:t}=(0,c.p)().navbar;return 0===t.length&&!e.component}(),t=(0,o.l)(),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 f(e){let{children:t}=e;const n=p();return(0,u.jsx)(d.Provider,{value:n,children:t})}function m(){const e=r.useContext(d);if(void 0===e)throw new l.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>c,YL:()=>s,y_:()=>l});var r=n(6540),a=n(9532),o=n(4848);const i=r.createContext(null);function l(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,o.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(!e)throw new a.dV("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const o=(0,r.useContext)(i);if(!o)throw new a.dV("NavbarSecondaryMenuContentProvider");const[,l]=o,s=(0,a.Be)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>a,J:()=>o});var r=n(6540);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)}}),[])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>l});var r=n(6540),a=n(8193);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,l]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){l(function(e){if(!a.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?o.desktop:o.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},7559:(e,t,n)=>{"use strict";n.d(t,{G:()=>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",unlistedBanner:"theme-unlisted-banner",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:{}}},3109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},1754:(e,t,n)=>{"use strict";n.d(t,{Nr:()=>f,w8:()=>g,C5:()=>p,B5:()=>E,Vd:()=>k,QB:()=>S,fW:()=>x,OF:()=>w,Y:()=>b});var r=n(6540),a=n(6347),o=n(2831),i=n(4070),l=n(5597),s=n(2252),c=n(6588);function u(e){return Array.from(new Set(e))}var d=n(9169);const p=!!i.Gy;function f(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=f(t);if(e)return e}}(e):void 0:e.href}const m=(e,t)=>void 0!==e&&(0,d.ys)(e,t),h=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||h(e.items,t))}function y(e,t){switch(e.type){case"category":return g(e,t)||e.items.some((e=>y(e,t)));case"link":return!e.unlisted||g(e,t);default:return!0}}function b(e,t){return(0,r.useMemo)((()=>e.filter((e=>y(e,t)))),[e,t])}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,d.ys)(o.href,n)||e(o.items))||"link"===o.type&&(0,d.ys)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function w(){const e=(0,c.t)(),{pathname:t}=(0,a.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function k(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,l.g1)(e),a=(0,i.r7)(e);return(0,r.useMemo)((()=>u([t,n,a].filter(Boolean))),[t,n,a])}function x(e,t){const n=k(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(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function S(e,t){const n=k(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(`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- ${u(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function E(e){let{route:t}=e;const n=(0,a.zy)(),r=(0,s.r)(),i=t.routes,l=i.find((e=>(0,a.B6)(n.pathname,e)));if(!l)return null;const c=l.sidebar,u=c?r.docsSidebars[c]:void 0;return{docElement:(0,o.v)(i),sidebarName:c,sidebarItems:u}}},1003:(e,t,n)=>{"use strict";n.d(t,{e3:()=>f,be:()=>d,Jx:()=>m});var r=n(6540),a=n(4164),o=n(5260),i=n(3102);function l(){const e=r.useContext(i.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(6025),c=n(4586);var u=n(4848);function d(e){let{title:t,description:n,keywords:r,image:a,children:i}=e;const l=function(e){const{siteConfig:t}=(0,c.A)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.h)(),p=a?d(a,{absolute:!0}):void 0;return(0,u.jsxs)(o.A,{children:[t&&(0,u.jsx)("title",{children:l}),t&&(0,u.jsx)("meta",{property:"og:title",content:l}),n&&(0,u.jsx)("meta",{name:"description",content:n}),n&&(0,u.jsx)("meta",{property:"og:description",content:n}),r&&(0,u.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,u.jsx)("meta",{property:"og:image",content:p}),p&&(0,u.jsx)("meta",{name:"twitter:image",content:p}),i]})}const p=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(p),l=(0,a.A)(i,t);return(0,u.jsxs)(p.Provider,{value:l,children:[(0,u.jsx)(o.A,{children:(0,u.jsx)("html",{className:l})}),n]})}function m(e){let{children:t}=e;const n=l(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const o=`plugin-id-${n.plugin.id}`;return(0,u.jsx)(f,{className:(0,a.A)(r,o),children:t})}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>c,ZC:()=>l,_q:()=>i,dV:()=>s,fM:()=>u});var r=n(6540),a=n(205),o=n(4848);function i(e){const t=(0,r.useRef)(e);return(0,a.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function l(e){const t=(0,r.useRef)();return(0,a.A)((()=>{t.current=e})),t.current}class s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,o.jsx)(o.Fragment,{children:e.reduceRight(((e,t)=>(0,o.jsx)(t,{children:e})),n)})}}},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>l,ys:()=>i});var r=n(6540),a=n(8328),o=n(4586);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.A)().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=>e.routes??[])))}(n)}({routes:a.A,baseUrl:e})),[e])}},3104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>p,Tv:()=>c,gk:()=>f});var r=n(6540),a=n(8193),o=n(2303),i=(n(205),n(9532)),l=n(4848);const s=r.createContext(void 0);function c(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(0,l.jsx)(s.Provider,{value:n,children:t})}function u(){const e=(0,r.useContext)(s);if(null==e)throw new i.dV("ScrollControllerProvider");return e}const d=()=>a.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function p(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),a=(0,r.useRef)(d()),o=(0,i._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();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 f(){const e=(0,r.useRef)(null),t=(0,o.A)()&&"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:()=>e.current?.()}}},2967:(e,t,n)=>{"use strict";n.d(t,{Cy:()=>r,tU:()=>a});n(4586);const r="default";function a(e,t){return`docs-${e}-${t}`}},9466:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>s});n(6540);const r="localStorage";function a(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function o(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,i||(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),i=!0),null}var t}let i=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function s(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,listen:t}}(e);const n=o(t?.persistence);return null===n?l:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),a({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),a({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}},2131:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(4586),a=n(6347),o=n(440);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.A)(),{pathname:s}=(0,a.zy)(),c=(0,o.applyTrailingSlash)(s,{trailingSlash:n,baseUrl:e}),u=l===i?e:e.replace(`/${l}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},5062:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),a=n(6347),o=n(9532);function i(e){const t=(0,a.zy)(),n=(0,o.ZC)(t),i=(0,o._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6342:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(4586);function a(){return(0,r.A)().siteConfig.themeConfig}},2983:(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)}},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},440: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.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(2983);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(253);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},1513:(e,t,n)=>{"use strict";n.d(t,{zR:()=>w,TM:()=>_,yJ:()=>f,sC:()=>T,AO:()=>p});var r=n(8168);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(1561);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.A)({},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:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(4363),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}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},119:(e,t,n)=>{"use strict";n.r(t)},1043:(e,t,n)=>{"use strict";n.r(t)},5947: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)},5302:(e,t,n)=>{var r=n(4634);e.exports=f,e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=p;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,l="",u=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],p=n[1],f=n.index;if(l+=e.slice(i,f),i=f+d.length,p)l+=p[1];else{var m=e[i],h=n[2],g=n[3],y=n[4],b=n[5],v=n[6],w=n[7];l&&(r.push(l),l="");var k=null!=h&&null!=m&&m!==h,x="+"===v||"*"===v,S="?"===v||"*"===v,E=n[2]||u,C=y||b;r.push({name:g||o++,prefix:h||"",delimiter:E,optional:S,repeat:x,partial:k,asterisk:!!w,pattern:C?c(C):w?".*":"[^"+s(E)+"]+?"})}}return i{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:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},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"},bqn:{title:"BQN",owner:"yewscion"},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"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},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"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},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"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},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"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},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"}}})},8722:(e,t,n)=>{const r=n(6969),a=n(8380),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(3157).resolve(t)],delete Prism.languages[e],n(3157)(t),o.add(e)}))}i.silent=!1,e.exports=i},9700:()=>{!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),y=p.substring(m+f.length),b=[];h&&b.push.apply(b,i([h])),b.push(g),y&&b.push.apply(b,i([y])),"string"==typeof c?l.splice.apply(l,[s,1].concat(b)):c.content=b}}else c.content&&i(c.content)}return l}(n.tokens)}}}})}(Prism)},8692:(e,t,n)=>{var r={"./":8722};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=8692},3157:(e,t,n)=>{var r={"./":8722};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=3157},8380: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 y in d)if(!(y in u))for(var b in f(y))if(b in u){p[y]=!0;break}for(var v in m=p)u[v]=!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},2694:(e,t,n)=>{"use strict";var r=n(6925);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}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:(e,t,n)=>{"use strict";var r=n(6540),a=n(9982);function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n