diff --git a/.env b/.env index ad382c3ed..7c3578b60 100644 --- a/.env +++ b/.env @@ -1,2 +1,3 @@ -VITE_AMPLITUDE_PROXY_URL="https://amplitude-proxy.spectrum.fi" -VITE_SENTRY_DSN="https://9096bad706c5ecc72e40a700eaed59be@o1083190.ingest.sentry.io/4505758197612544" +VITE_AMPLITUDE_PROXY_URL="" +VITE_SENTRY_DSN="" +NODE_VERSION=19 diff --git a/.eslintrc.json b/.eslintrc.json index abe6e47c7..a6d12eb58 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -36,7 +36,7 @@ "prettier/prettier": ["error", { "endOfLine": "auto" }], "react-hooks/rules-of-hooks": "error", "react-hooks/exhaustive-deps": "off", - "no-console": ["warn", { "allow": ["warn", "error"] }], + // "no-console": ["warn", { "allow": ["warn", "error"] }], "@typescript-eslint/explicit-function-return-type": "off", "@typescript-eslint/indent": "off", "react/jsx-filename-extension": [ diff --git a/.github/workflows/crowdin.yml b/.github/workflows/crowdin.yml deleted file mode 100644 index f53a78845..000000000 --- a/.github/workflows/crowdin.yml +++ /dev/null @@ -1,51 +0,0 @@ -name: Crowdin Upload - -# on any push to main, we upload the translations to be translated -on: - push: - branches: - - dev - -jobs: - synchronize-with-crowdin: - name: Upload sources to Crowdin - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Set up node - uses: actions/setup-node@v2 - with: - node-version: 19 - registry-url: https://registry.npmjs.org - - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - - uses: actions/cache@v2 - id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - name: Install dependencies - run: yarn install --frozen-lockfile - - - name: Extract translations - run: "yarn i18n:extract" - - - name: Synchronize - uses: crowdin/github-action@1.1.0 - with: - upload_sources: true - download_translations: false - project_id: 504102 - token: ${{ secrets.CROWDIN_PERSONAL_TOKEN_SECRET }} - source: 'src/i18n/locales/en-US.po' - translation: 'src/i18n/locales/%locale%.po' - env: - GITHUB_TOKEN: ${{ secrets.SECTER_TOKEN }} diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml deleted file mode 100644 index 9e74e9dff..000000000 --- a/.github/workflows/dev.yml +++ /dev/null @@ -1,56 +0,0 @@ -name: Run on dev -on: - push: - branches: - - 'dev' -jobs: - build: - name: Build Artifacts - runs-on: ubuntu-latest - timeout-minutes: 40 - steps: - - name: Build Artifacts - uses: actions/checkout@v3 - - - name: Init Node.js - uses: actions/setup-node@v1 - with: - node-version: 19.x - - - name: Up Caches - uses: actions/cache@v2 - with: - path: '**/node_modules' - key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} - - - name: Generate deployable artifacts - run: | - yarn - yarn run prei18n:extract - yarn run i18n:extract - CI=false yarn build - - name: Store Artifacts - uses: actions/upload-artifact@v3 - with: - name: ${{ github.sha }} - path: build - retention-days: 1 - deploy: - needs: build - name: Deploy to Dev - runs-on: ubuntu-latest - timeout-minutes: 5 - steps: - - name: Extract Artifacts - uses: actions/download-artifact@v3 - with: - name: ${{ github.sha }} - path: ~/build - - name: Deploy to host - uses: garygrossgarten/github-action-scp@release - with: - local: /home/runner/build - remote: /var/www/dev0 - host: ${{ secrets.HOST }} - username: ${{ secrets.USERNAME }} - privateKey: ${{ secrets.KEY }} diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml deleted file mode 100644 index fd27b3807..000000000 --- a/.github/workflows/push.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: Push Worfklow - -on: - push: - branches-ignore: - - "master" - - "dev" - - "test" - - "demo" - -jobs: - build: - name: Build - runs-on: ubuntu-latest - env: - SKIP_PREFLIGHT_CHECK: true - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Install Node.js - uses: actions/setup-node@v1 - with: - node-version: 19.x - - - uses: actions/cache@v2 - with: - path: '**/node_modules' - key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} - - - name: Install packages - run: yarn install - - - name: Check packages integrity - run: yarn check --integrity - - - name: ESLint - run: yarn lint:eslint - - - name: Stylelint - run: yarn lint:stylelint - - - name: Build - run: CI=false yarn build diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 7dae0a905..000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Release app -on: - push: - tags: - - '[0-9]+.[0-9]+.[0-9]+' -jobs: - deploy: - name: Release - runs-on: ubuntu-latest - steps: - - name: Release - uses: appleboy/ssh-action@master - with: - host: ${{secrets.HOST}} - username: ${{secrets.USERNAME}} - key: ${{secrets.KEY}} - script: cp -r /var/www/test/. /var/www/app - - diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index c65b2581d..000000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,58 +0,0 @@ -name: Run on test -on: - push: - branches: - - 'master' - -jobs: - build: - name: Build Artifacts for Test - runs-on: ubuntu-latest - timeout-minutes: 40 - steps: - - name: Build Artifacts - uses: actions/checkout@v3 - - - name: Init Node.js - uses: actions/setup-node@v1 - with: - node-version: 19.x - - - name: Up Caches - uses: actions/cache@v2 - with: - path: '**/node_modules' - key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} - - - name: Generate deployable artifacts - run: | - yarn - yarn run prei18n:extract - yarn run i18n:extract - CI=false yarn build - - - name: Store Artifacts - uses: actions/upload-artifact@v3 - with: - name: ${{ github.sha }} - path: build - retention-days: 1 - deploy: - needs: build - name: Deploy to Dev - runs-on: ubuntu-latest - timeout-minutes: 5 - steps: - - name: Extract Artifacts - uses: actions/download-artifact@v3 - with: - name: ${{ github.sha }} - path: ~/build - - name: Deploy to host - uses: garygrossgarten/github-action-scp@release - with: - local: /home/runner/build - remote: /var/www/test - host: ${{ secrets.HOST }} - username: ${{ secrets.USERNAME }} - privateKey: ${{ secrets.KEY }} diff --git a/.gitignore b/.gitignore index 7fbacaafa..f3d171493 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ yarn-error.log* .idea .tool-versions +.yarn/cache diff --git a/.nvmrc b/.nvmrc index 6f7f377bf..9d87b3b2f 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v16 +v19 \ No newline at end of file diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz new file mode 100644 index 000000000..10b0dc227 Binary files /dev/null and b/.yarn/install-state.gz differ diff --git a/.yarn/releases/yarn-3.6.4.cjs b/.yarn/releases/yarn-3.6.4.cjs new file mode 100755 index 000000000..ebd9272da --- /dev/null +++ b/.yarn/releases/yarn-3.6.4.cjs @@ -0,0 +1,874 @@ +#!/usr/bin/env node +/* eslint-disable */ +//prettier-ignore +(()=>{var Dge=Object.create;var lS=Object.defineProperty;var kge=Object.getOwnPropertyDescriptor;var Rge=Object.getOwnPropertyNames;var Fge=Object.getPrototypeOf,Nge=Object.prototype.hasOwnProperty;var J=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+r+'" is not supported')});var Tge=(r,e)=>()=>(r&&(e=r(r=0)),e);var w=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ut=(r,e)=>{for(var t in e)lS(r,t,{get:e[t],enumerable:!0})},Lge=(r,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Rge(e))!Nge.call(r,n)&&n!==t&&lS(r,n,{get:()=>e[n],enumerable:!(i=kge(e,n))||i.enumerable});return r};var Pe=(r,e,t)=>(t=r!=null?Dge(Fge(r)):{},Lge(e||!r||!r.__esModule?lS(t,"default",{value:r,enumerable:!0}):t,r));var PK=w((zXe,xK)=>{xK.exports=vK;vK.sync=ife;var QK=J("fs");function rfe(r,e){var t=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!t||(t=t.split(";"),t.indexOf("")!==-1))return!0;for(var i=0;i{FK.exports=kK;kK.sync=nfe;var DK=J("fs");function kK(r,e,t){DK.stat(r,function(i,n){t(i,i?!1:RK(n,e))})}function nfe(r,e){return RK(DK.statSync(r),e)}function RK(r,e){return r.isFile()&&sfe(r,e)}function sfe(r,e){var t=r.mode,i=r.uid,n=r.gid,s=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),o=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),a=parseInt("100",8),l=parseInt("010",8),c=parseInt("001",8),u=a|l,g=t&c||t&l&&n===o||t&a&&i===s||t&u&&s===0;return g}});var LK=w((ZXe,TK)=>{var XXe=J("fs"),lI;process.platform==="win32"||global.TESTING_WINDOWS?lI=PK():lI=NK();TK.exports=SS;SS.sync=ofe;function SS(r,e,t){if(typeof e=="function"&&(t=e,e={}),!t){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(i,n){SS(r,e||{},function(s,o){s?n(s):i(o)})})}lI(r,e||{},function(i,n){i&&(i.code==="EACCES"||e&&e.ignoreErrors)&&(i=null,n=!1),t(i,n)})}function ofe(r,e){try{return lI.sync(r,e||{})}catch(t){if(e&&e.ignoreErrors||t.code==="EACCES")return!1;throw t}}});var YK=w((_Xe,GK)=>{var Dg=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",OK=J("path"),afe=Dg?";":":",MK=LK(),KK=r=>Object.assign(new Error(`not found: ${r}`),{code:"ENOENT"}),UK=(r,e)=>{let t=e.colon||afe,i=r.match(/\//)||Dg&&r.match(/\\/)?[""]:[...Dg?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(t)],n=Dg?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=Dg?n.split(t):[""];return Dg&&r.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:i,pathExt:s,pathExtExe:n}},HK=(r,e,t)=>{typeof e=="function"&&(t=e,e={}),e||(e={});let{pathEnv:i,pathExt:n,pathExtExe:s}=UK(r,e),o=[],a=c=>new Promise((u,g)=>{if(c===i.length)return e.all&&o.length?u(o):g(KK(r));let f=i[c],h=/^".*"$/.test(f)?f.slice(1,-1):f,p=OK.join(h,r),C=!h&&/^\.[\\\/]/.test(r)?r.slice(0,2)+p:p;u(l(C,c,0))}),l=(c,u,g)=>new Promise((f,h)=>{if(g===n.length)return f(a(u+1));let p=n[g];MK(c+p,{pathExt:s},(C,y)=>{if(!C&&y)if(e.all)o.push(c+p);else return f(c+p);return f(l(c,u,g+1))})});return t?a(0).then(c=>t(null,c),t):a(0)},Afe=(r,e)=>{e=e||{};let{pathEnv:t,pathExt:i,pathExtExe:n}=UK(r,e),s=[];for(let o=0;o{"use strict";var jK=(r={})=>{let e=r.env||process.env;return(r.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(i=>i.toUpperCase()==="PATH")||"Path"};vS.exports=jK;vS.exports.default=jK});var VK=w((eZe,zK)=>{"use strict";var JK=J("path"),lfe=YK(),cfe=qK();function WK(r,e){let t=r.options.env||process.env,i=process.cwd(),n=r.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(r.options.cwd)}catch{}let o;try{o=lfe.sync(r.command,{path:t[cfe({env:t})],pathExt:e?JK.delimiter:void 0})}catch{}finally{s&&process.chdir(i)}return o&&(o=JK.resolve(n?r.options.cwd:"",o)),o}function ufe(r){return WK(r)||WK(r,!0)}zK.exports=ufe});var XK=w((tZe,PS)=>{"use strict";var xS=/([()\][%!^"`<>&|;, *?])/g;function gfe(r){return r=r.replace(xS,"^$1"),r}function ffe(r,e){return r=`${r}`,r=r.replace(/(\\*)"/g,'$1$1\\"'),r=r.replace(/(\\*)$/,"$1$1"),r=`"${r}"`,r=r.replace(xS,"^$1"),e&&(r=r.replace(xS,"^$1")),r}PS.exports.command=gfe;PS.exports.argument=ffe});var _K=w((rZe,ZK)=>{"use strict";ZK.exports=/^#!(.*)/});var eU=w((iZe,$K)=>{"use strict";var hfe=_K();$K.exports=(r="")=>{let e=r.match(hfe);if(!e)return null;let[t,i]=e[0].replace(/#! ?/,"").split(" "),n=t.split("/").pop();return n==="env"?i:i?`${n} ${i}`:n}});var rU=w((nZe,tU)=>{"use strict";var DS=J("fs"),pfe=eU();function dfe(r){let t=Buffer.alloc(150),i;try{i=DS.openSync(r,"r"),DS.readSync(i,t,0,150,0),DS.closeSync(i)}catch{}return pfe(t.toString())}tU.exports=dfe});var oU=w((sZe,sU)=>{"use strict";var Cfe=J("path"),iU=VK(),nU=XK(),mfe=rU(),Efe=process.platform==="win32",Ife=/\.(?:com|exe)$/i,yfe=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function wfe(r){r.file=iU(r);let e=r.file&&mfe(r.file);return e?(r.args.unshift(r.file),r.command=e,iU(r)):r.file}function Bfe(r){if(!Efe)return r;let e=wfe(r),t=!Ife.test(e);if(r.options.forceShell||t){let i=yfe.test(e);r.command=Cfe.normalize(r.command),r.command=nU.command(r.command),r.args=r.args.map(s=>nU.argument(s,i));let n=[r.command].concat(r.args).join(" ");r.args=["/d","/s","/c",`"${n}"`],r.command=process.env.comspec||"cmd.exe",r.options.windowsVerbatimArguments=!0}return r}function bfe(r,e,t){e&&!Array.isArray(e)&&(t=e,e=null),e=e?e.slice(0):[],t=Object.assign({},t);let i={command:r,args:e,options:t,file:void 0,original:{command:r,args:e}};return t.shell?i:Bfe(i)}sU.exports=bfe});var lU=w((oZe,AU)=>{"use strict";var kS=process.platform==="win32";function RS(r,e){return Object.assign(new Error(`${e} ${r.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${r.command}`,path:r.command,spawnargs:r.args})}function Qfe(r,e){if(!kS)return;let t=r.emit;r.emit=function(i,n){if(i==="exit"){let s=aU(n,e,"spawn");if(s)return t.call(r,"error",s)}return t.apply(r,arguments)}}function aU(r,e){return kS&&r===1&&!e.file?RS(e.original,"spawn"):null}function Sfe(r,e){return kS&&r===1&&!e.file?RS(e.original,"spawnSync"):null}AU.exports={hookChildProcess:Qfe,verifyENOENT:aU,verifyENOENTSync:Sfe,notFoundError:RS}});var TS=w((aZe,kg)=>{"use strict";var cU=J("child_process"),FS=oU(),NS=lU();function uU(r,e,t){let i=FS(r,e,t),n=cU.spawn(i.command,i.args,i.options);return NS.hookChildProcess(n,i),n}function vfe(r,e,t){let i=FS(r,e,t),n=cU.spawnSync(i.command,i.args,i.options);return n.error=n.error||NS.verifyENOENTSync(n.status,i),n}kg.exports=uU;kg.exports.spawn=uU;kg.exports.sync=vfe;kg.exports._parse=FS;kg.exports._enoent=NS});var fU=w((AZe,gU)=>{"use strict";function xfe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function Zl(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Zl)}xfe(Zl,Error);Zl.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g>",ie=me(">>",!1),de=">&",_e=me(">&",!1),Pt=">",It=me(">",!1),Or="<<<",ii=me("<<<",!1),gi="<&",hr=me("<&",!1),fi="<",ni=me("<",!1),Ks=function(m){return{type:"argument",segments:[].concat(...m)}},pr=function(m){return m},Ii="$'",rs=me("$'",!1),fa="'",dA=me("'",!1),cg=function(m){return[{type:"text",text:m}]},is='""',CA=me('""',!1),ha=function(){return{type:"text",text:""}},wp='"',mA=me('"',!1),EA=function(m){return m},wr=function(m){return{type:"arithmetic",arithmetic:m,quoted:!0}},Tl=function(m){return{type:"shell",shell:m,quoted:!0}},ug=function(m){return{type:"variable",...m,quoted:!0}},yo=function(m){return{type:"text",text:m}},gg=function(m){return{type:"arithmetic",arithmetic:m,quoted:!1}},Bp=function(m){return{type:"shell",shell:m,quoted:!1}},bp=function(m){return{type:"variable",...m,quoted:!1}},vr=function(m){return{type:"glob",pattern:m}},se=/^[^']/,wo=Je(["'"],!0,!1),Fn=function(m){return m.join("")},fg=/^[^$"]/,bt=Je(["$",'"'],!0,!1),Ll=`\\ +`,Nn=me(`\\ +`,!1),ns=function(){return""},ss="\\",gt=me("\\",!1),Bo=/^[\\$"`]/,At=Je(["\\","$",'"',"`"],!1,!1),ln=function(m){return m},S="\\a",Lt=me("\\a",!1),hg=function(){return"a"},Ol="\\b",Qp=me("\\b",!1),Sp=function(){return"\b"},vp=/^[Ee]/,xp=Je(["E","e"],!1,!1),Pp=function(){return"\x1B"},G="\\f",yt=me("\\f",!1),IA=function(){return"\f"},zi="\\n",Ml=me("\\n",!1),Xe=function(){return` +`},pa="\\r",pg=me("\\r",!1),OE=function(){return"\r"},Dp="\\t",ME=me("\\t",!1),ar=function(){return" "},Tn="\\v",Kl=me("\\v",!1),kp=function(){return"\v"},Us=/^[\\'"?]/,da=Je(["\\","'",'"',"?"],!1,!1),cn=function(m){return String.fromCharCode(parseInt(m,16))},Le="\\x",dg=me("\\x",!1),Ul="\\u",Hs=me("\\u",!1),Hl="\\U",yA=me("\\U",!1),Cg=function(m){return String.fromCodePoint(parseInt(m,16))},mg=/^[0-7]/,Ca=Je([["0","7"]],!1,!1),ma=/^[0-9a-fA-f]/,rt=Je([["0","9"],["a","f"],["A","f"]],!1,!1),bo=nt(),wA="-",Gl=me("-",!1),Gs="+",Yl=me("+",!1),KE=".",Rp=me(".",!1),Eg=function(m,Q,N){return{type:"number",value:(m==="-"?-1:1)*parseFloat(Q.join("")+"."+N.join(""))}},Fp=function(m,Q){return{type:"number",value:(m==="-"?-1:1)*parseInt(Q.join(""))}},UE=function(m){return{type:"variable",...m}},jl=function(m){return{type:"variable",name:m}},HE=function(m){return m},Ig="*",BA=me("*",!1),Rr="/",GE=me("/",!1),Ys=function(m,Q,N){return{type:Q==="*"?"multiplication":"division",right:N}},js=function(m,Q){return Q.reduce((N,U)=>({left:N,...U}),m)},yg=function(m,Q,N){return{type:Q==="+"?"addition":"subtraction",right:N}},bA="$((",R=me("$((",!1),q="))",Ce=me("))",!1),Ke=function(m){return m},Re="$(",ze=me("$(",!1),dt=function(m){return m},Ft="${",Ln=me("${",!1),JQ=":-",k1=me(":-",!1),R1=function(m,Q){return{name:m,defaultValue:Q}},WQ=":-}",F1=me(":-}",!1),N1=function(m){return{name:m,defaultValue:[]}},zQ=":+",T1=me(":+",!1),L1=function(m,Q){return{name:m,alternativeValue:Q}},VQ=":+}",O1=me(":+}",!1),M1=function(m){return{name:m,alternativeValue:[]}},XQ=function(m){return{name:m}},K1="$",U1=me("$",!1),H1=function(m){return e.isGlobPattern(m)},G1=function(m){return m},ZQ=/^[a-zA-Z0-9_]/,_Q=Je([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),$Q=function(){return L()},eS=/^[$@*?#a-zA-Z0-9_\-]/,tS=Je(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),Y1=/^[(){}<>$|&; \t"']/,wg=Je(["(",")","{","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),rS=/^[<>&; \t"']/,iS=Je(["<",">","&",";"," "," ",'"',"'"],!1,!1),YE=/^[ \t]/,jE=Je([" "," "],!1,!1),b=0,Me=0,QA=[{line:1,column:1}],d=0,E=[],I=0,k;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function L(){return r.substring(Me,b)}function Z(){return Et(Me,b)}function te(m,Q){throw Q=Q!==void 0?Q:Et(Me,b),Ri([lt(m)],r.substring(Me,b),Q)}function we(m,Q){throw Q=Q!==void 0?Q:Et(Me,b),On(m,Q)}function me(m,Q){return{type:"literal",text:m,ignoreCase:Q}}function Je(m,Q,N){return{type:"class",parts:m,inverted:Q,ignoreCase:N}}function nt(){return{type:"any"}}function wt(){return{type:"end"}}function lt(m){return{type:"other",description:m}}function it(m){var Q=QA[m],N;if(Q)return Q;for(N=m-1;!QA[N];)N--;for(Q=QA[N],Q={line:Q.line,column:Q.column};Nd&&(d=b,E=[]),E.push(m))}function On(m,Q){return new Zl(m,null,null,Q)}function Ri(m,Q,N){return new Zl(Zl.buildMessage(m,Q),m,Q,N)}function SA(){var m,Q;return m=b,Q=Mr(),Q===t&&(Q=null),Q!==t&&(Me=m,Q=s(Q)),m=Q,m}function Mr(){var m,Q,N,U,ce;if(m=b,Q=Kr(),Q!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();N!==t?(U=Ea(),U!==t?(ce=os(),ce===t&&(ce=null),ce!==t?(Me=m,Q=o(Q,U,ce),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)}else b=m,m=t;if(m===t)if(m=b,Q=Kr(),Q!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();N!==t?(U=Ea(),U===t&&(U=null),U!==t?(Me=m,Q=a(Q,U),m=Q):(b=m,m=t)):(b=m,m=t)}else b=m,m=t;return m}function os(){var m,Q,N,U,ce;for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();if(Q!==t)if(N=Mr(),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,Q=l(N),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t;return m}function Ea(){var m;return r.charCodeAt(b)===59?(m=c,b++):(m=t,I===0&&be(u)),m===t&&(r.charCodeAt(b)===38?(m=g,b++):(m=t,I===0&&be(f))),m}function Kr(){var m,Q,N;return m=b,Q=j1(),Q!==t?(N=fge(),N===t&&(N=null),N!==t?(Me=m,Q=h(Q,N),m=Q):(b=m,m=t)):(b=m,m=t),m}function fge(){var m,Q,N,U,ce,Se,ht;for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();if(Q!==t)if(N=hge(),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=Kr(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();Se!==t?(Me=m,Q=p(N,ce),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t;return m}function hge(){var m;return r.substr(b,2)===C?(m=C,b+=2):(m=t,I===0&&be(y)),m===t&&(r.substr(b,2)===B?(m=B,b+=2):(m=t,I===0&&be(v))),m}function j1(){var m,Q,N;return m=b,Q=Cge(),Q!==t?(N=pge(),N===t&&(N=null),N!==t?(Me=m,Q=D(Q,N),m=Q):(b=m,m=t)):(b=m,m=t),m}function pge(){var m,Q,N,U,ce,Se,ht;for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();if(Q!==t)if(N=dge(),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=j1(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();Se!==t?(Me=m,Q=T(N,ce),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t;return m}function dge(){var m;return r.substr(b,2)===H?(m=H,b+=2):(m=t,I===0&&be(j)),m===t&&(r.charCodeAt(b)===124?(m=$,b++):(m=t,I===0&&be(V))),m}function qE(){var m,Q,N,U,ce,Se;if(m=b,Q=rK(),Q!==t)if(r.charCodeAt(b)===61?(N=W,b++):(N=t,I===0&&be(_)),N!==t)if(U=W1(),U!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(Me=m,Q=A(Q,U),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t;else b=m,m=t;if(m===t)if(m=b,Q=rK(),Q!==t)if(r.charCodeAt(b)===61?(N=W,b++):(N=t,I===0&&be(_)),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,Q=Ae(Q),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t;return m}function Cge(){var m,Q,N,U,ce,Se,ht,Bt,qr,hi,as;for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();if(Q!==t)if(r.charCodeAt(b)===40?(N=ge,b++):(N=t,I===0&&be(re)),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=Mr(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();if(Se!==t)if(r.charCodeAt(b)===41?(ht=O,b++):(ht=t,I===0&&be(F)),ht!==t){for(Bt=[],qr=He();qr!==t;)Bt.push(qr),qr=He();if(Bt!==t){for(qr=[],hi=Np();hi!==t;)qr.push(hi),hi=Np();if(qr!==t){for(hi=[],as=He();as!==t;)hi.push(as),as=He();hi!==t?(Me=m,Q=ue(ce,qr),m=Q):(b=m,m=t)}else b=m,m=t}else b=m,m=t}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t;if(m===t){for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();if(Q!==t)if(r.charCodeAt(b)===123?(N=pe,b++):(N=t,I===0&&be(ke)),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=Mr(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();if(Se!==t)if(r.charCodeAt(b)===125?(ht=Fe,b++):(ht=t,I===0&&be(Ne)),ht!==t){for(Bt=[],qr=He();qr!==t;)Bt.push(qr),qr=He();if(Bt!==t){for(qr=[],hi=Np();hi!==t;)qr.push(hi),hi=Np();if(qr!==t){for(hi=[],as=He();as!==t;)hi.push(as),as=He();hi!==t?(Me=m,Q=oe(ce,qr),m=Q):(b=m,m=t)}else b=m,m=t}else b=m,m=t}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t}else b=m,m=t;else b=m,m=t;if(m===t){for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();if(Q!==t){for(N=[],U=qE();U!==t;)N.push(U),U=qE();if(N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t){if(ce=[],Se=J1(),Se!==t)for(;Se!==t;)ce.push(Se),Se=J1();else ce=t;if(ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();Se!==t?(Me=m,Q=le(N,ce),m=Q):(b=m,m=t)}else b=m,m=t}else b=m,m=t}else b=m,m=t}else b=m,m=t;if(m===t){for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();if(Q!==t){if(N=[],U=qE(),U!==t)for(;U!==t;)N.push(U),U=qE();else N=t;if(N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,Q=Be(N),m=Q):(b=m,m=t)}else b=m,m=t}else b=m,m=t}}}return m}function q1(){var m,Q,N,U,ce;for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();if(Q!==t){if(N=[],U=JE(),U!==t)for(;U!==t;)N.push(U),U=JE();else N=t;if(N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,Q=fe(N),m=Q):(b=m,m=t)}else b=m,m=t}else b=m,m=t;return m}function J1(){var m,Q,N;for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();if(Q!==t?(N=Np(),N!==t?(Me=m,Q=ae(N),m=Q):(b=m,m=t)):(b=m,m=t),m===t){for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();Q!==t?(N=JE(),N!==t?(Me=m,Q=ae(N),m=Q):(b=m,m=t)):(b=m,m=t)}return m}function Np(){var m,Q,N,U,ce;for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();return Q!==t?(qe.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(ne)),N===t&&(N=null),N!==t?(U=mge(),U!==t?(ce=JE(),ce!==t?(Me=m,Q=Y(N,U,ce),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m}function mge(){var m;return r.substr(b,2)===he?(m=he,b+=2):(m=t,I===0&&be(ie)),m===t&&(r.substr(b,2)===de?(m=de,b+=2):(m=t,I===0&&be(_e)),m===t&&(r.charCodeAt(b)===62?(m=Pt,b++):(m=t,I===0&&be(It)),m===t&&(r.substr(b,3)===Or?(m=Or,b+=3):(m=t,I===0&&be(ii)),m===t&&(r.substr(b,2)===gi?(m=gi,b+=2):(m=t,I===0&&be(hr)),m===t&&(r.charCodeAt(b)===60?(m=fi,b++):(m=t,I===0&&be(ni))))))),m}function JE(){var m,Q,N;for(m=b,Q=[],N=He();N!==t;)Q.push(N),N=He();return Q!==t?(N=W1(),N!==t?(Me=m,Q=ae(N),m=Q):(b=m,m=t)):(b=m,m=t),m}function W1(){var m,Q,N;if(m=b,Q=[],N=z1(),N!==t)for(;N!==t;)Q.push(N),N=z1();else Q=t;return Q!==t&&(Me=m,Q=Ks(Q)),m=Q,m}function z1(){var m,Q;return m=b,Q=Ege(),Q!==t&&(Me=m,Q=pr(Q)),m=Q,m===t&&(m=b,Q=Ige(),Q!==t&&(Me=m,Q=pr(Q)),m=Q,m===t&&(m=b,Q=yge(),Q!==t&&(Me=m,Q=pr(Q)),m=Q,m===t&&(m=b,Q=wge(),Q!==t&&(Me=m,Q=pr(Q)),m=Q))),m}function Ege(){var m,Q,N,U;return m=b,r.substr(b,2)===Ii?(Q=Ii,b+=2):(Q=t,I===0&&be(rs)),Q!==t?(N=Qge(),N!==t?(r.charCodeAt(b)===39?(U=fa,b++):(U=t,I===0&&be(dA)),U!==t?(Me=m,Q=cg(N),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m}function Ige(){var m,Q,N,U;return m=b,r.charCodeAt(b)===39?(Q=fa,b++):(Q=t,I===0&&be(dA)),Q!==t?(N=Bge(),N!==t?(r.charCodeAt(b)===39?(U=fa,b++):(U=t,I===0&&be(dA)),U!==t?(Me=m,Q=cg(N),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m}function yge(){var m,Q,N,U;if(m=b,r.substr(b,2)===is?(Q=is,b+=2):(Q=t,I===0&&be(CA)),Q!==t&&(Me=m,Q=ha()),m=Q,m===t)if(m=b,r.charCodeAt(b)===34?(Q=wp,b++):(Q=t,I===0&&be(mA)),Q!==t){for(N=[],U=V1();U!==t;)N.push(U),U=V1();N!==t?(r.charCodeAt(b)===34?(U=wp,b++):(U=t,I===0&&be(mA)),U!==t?(Me=m,Q=EA(N),m=Q):(b=m,m=t)):(b=m,m=t)}else b=m,m=t;return m}function wge(){var m,Q,N;if(m=b,Q=[],N=X1(),N!==t)for(;N!==t;)Q.push(N),N=X1();else Q=t;return Q!==t&&(Me=m,Q=EA(Q)),m=Q,m}function V1(){var m,Q;return m=b,Q=eK(),Q!==t&&(Me=m,Q=wr(Q)),m=Q,m===t&&(m=b,Q=tK(),Q!==t&&(Me=m,Q=Tl(Q)),m=Q,m===t&&(m=b,Q=aS(),Q!==t&&(Me=m,Q=ug(Q)),m=Q,m===t&&(m=b,Q=bge(),Q!==t&&(Me=m,Q=yo(Q)),m=Q))),m}function X1(){var m,Q;return m=b,Q=eK(),Q!==t&&(Me=m,Q=gg(Q)),m=Q,m===t&&(m=b,Q=tK(),Q!==t&&(Me=m,Q=Bp(Q)),m=Q,m===t&&(m=b,Q=aS(),Q!==t&&(Me=m,Q=bp(Q)),m=Q,m===t&&(m=b,Q=xge(),Q!==t&&(Me=m,Q=vr(Q)),m=Q,m===t&&(m=b,Q=vge(),Q!==t&&(Me=m,Q=yo(Q)),m=Q)))),m}function Bge(){var m,Q,N;for(m=b,Q=[],se.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(wo));N!==t;)Q.push(N),se.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(wo));return Q!==t&&(Me=m,Q=Fn(Q)),m=Q,m}function bge(){var m,Q,N;if(m=b,Q=[],N=Z1(),N===t&&(fg.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(bt))),N!==t)for(;N!==t;)Q.push(N),N=Z1(),N===t&&(fg.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(bt)));else Q=t;return Q!==t&&(Me=m,Q=Fn(Q)),m=Q,m}function Z1(){var m,Q,N;return m=b,r.substr(b,2)===Ll?(Q=Ll,b+=2):(Q=t,I===0&&be(Nn)),Q!==t&&(Me=m,Q=ns()),m=Q,m===t&&(m=b,r.charCodeAt(b)===92?(Q=ss,b++):(Q=t,I===0&&be(gt)),Q!==t?(Bo.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(At)),N!==t?(Me=m,Q=ln(N),m=Q):(b=m,m=t)):(b=m,m=t)),m}function Qge(){var m,Q,N;for(m=b,Q=[],N=_1(),N===t&&(se.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(wo)));N!==t;)Q.push(N),N=_1(),N===t&&(se.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(wo)));return Q!==t&&(Me=m,Q=Fn(Q)),m=Q,m}function _1(){var m,Q,N;return m=b,r.substr(b,2)===S?(Q=S,b+=2):(Q=t,I===0&&be(Lt)),Q!==t&&(Me=m,Q=hg()),m=Q,m===t&&(m=b,r.substr(b,2)===Ol?(Q=Ol,b+=2):(Q=t,I===0&&be(Qp)),Q!==t&&(Me=m,Q=Sp()),m=Q,m===t&&(m=b,r.charCodeAt(b)===92?(Q=ss,b++):(Q=t,I===0&&be(gt)),Q!==t?(vp.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(xp)),N!==t?(Me=m,Q=Pp(),m=Q):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===G?(Q=G,b+=2):(Q=t,I===0&&be(yt)),Q!==t&&(Me=m,Q=IA()),m=Q,m===t&&(m=b,r.substr(b,2)===zi?(Q=zi,b+=2):(Q=t,I===0&&be(Ml)),Q!==t&&(Me=m,Q=Xe()),m=Q,m===t&&(m=b,r.substr(b,2)===pa?(Q=pa,b+=2):(Q=t,I===0&&be(pg)),Q!==t&&(Me=m,Q=OE()),m=Q,m===t&&(m=b,r.substr(b,2)===Dp?(Q=Dp,b+=2):(Q=t,I===0&&be(ME)),Q!==t&&(Me=m,Q=ar()),m=Q,m===t&&(m=b,r.substr(b,2)===Tn?(Q=Tn,b+=2):(Q=t,I===0&&be(Kl)),Q!==t&&(Me=m,Q=kp()),m=Q,m===t&&(m=b,r.charCodeAt(b)===92?(Q=ss,b++):(Q=t,I===0&&be(gt)),Q!==t?(Us.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(da)),N!==t?(Me=m,Q=ln(N),m=Q):(b=m,m=t)):(b=m,m=t),m===t&&(m=Sge()))))))))),m}function Sge(){var m,Q,N,U,ce,Se,ht,Bt,qr,hi,as,AS;return m=b,r.charCodeAt(b)===92?(Q=ss,b++):(Q=t,I===0&&be(gt)),Q!==t?(N=nS(),N!==t?(Me=m,Q=cn(N),m=Q):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Le?(Q=Le,b+=2):(Q=t,I===0&&be(dg)),Q!==t?(N=b,U=b,ce=nS(),ce!==t?(Se=Mn(),Se!==t?(ce=[ce,Se],U=ce):(b=U,U=t)):(b=U,U=t),U===t&&(U=nS()),U!==t?N=r.substring(N,b):N=U,N!==t?(Me=m,Q=cn(N),m=Q):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Ul?(Q=Ul,b+=2):(Q=t,I===0&&be(Hs)),Q!==t?(N=b,U=b,ce=Mn(),ce!==t?(Se=Mn(),Se!==t?(ht=Mn(),ht!==t?(Bt=Mn(),Bt!==t?(ce=[ce,Se,ht,Bt],U=ce):(b=U,U=t)):(b=U,U=t)):(b=U,U=t)):(b=U,U=t),U!==t?N=r.substring(N,b):N=U,N!==t?(Me=m,Q=cn(N),m=Q):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Hl?(Q=Hl,b+=2):(Q=t,I===0&&be(yA)),Q!==t?(N=b,U=b,ce=Mn(),ce!==t?(Se=Mn(),Se!==t?(ht=Mn(),ht!==t?(Bt=Mn(),Bt!==t?(qr=Mn(),qr!==t?(hi=Mn(),hi!==t?(as=Mn(),as!==t?(AS=Mn(),AS!==t?(ce=[ce,Se,ht,Bt,qr,hi,as,AS],U=ce):(b=U,U=t)):(b=U,U=t)):(b=U,U=t)):(b=U,U=t)):(b=U,U=t)):(b=U,U=t)):(b=U,U=t)):(b=U,U=t),U!==t?N=r.substring(N,b):N=U,N!==t?(Me=m,Q=Cg(N),m=Q):(b=m,m=t)):(b=m,m=t)))),m}function nS(){var m;return mg.test(r.charAt(b))?(m=r.charAt(b),b++):(m=t,I===0&&be(Ca)),m}function Mn(){var m;return ma.test(r.charAt(b))?(m=r.charAt(b),b++):(m=t,I===0&&be(rt)),m}function vge(){var m,Q,N,U,ce;if(m=b,Q=[],N=b,r.charCodeAt(b)===92?(U=ss,b++):(U=t,I===0&&be(gt)),U!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&be(bo)),ce!==t?(Me=N,U=ln(ce),N=U):(b=N,N=t)):(b=N,N=t),N===t&&(N=b,U=b,I++,ce=iK(),I--,ce===t?U=void 0:(b=U,U=t),U!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&be(bo)),ce!==t?(Me=N,U=ln(ce),N=U):(b=N,N=t)):(b=N,N=t)),N!==t)for(;N!==t;)Q.push(N),N=b,r.charCodeAt(b)===92?(U=ss,b++):(U=t,I===0&&be(gt)),U!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&be(bo)),ce!==t?(Me=N,U=ln(ce),N=U):(b=N,N=t)):(b=N,N=t),N===t&&(N=b,U=b,I++,ce=iK(),I--,ce===t?U=void 0:(b=U,U=t),U!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&be(bo)),ce!==t?(Me=N,U=ln(ce),N=U):(b=N,N=t)):(b=N,N=t));else Q=t;return Q!==t&&(Me=m,Q=Fn(Q)),m=Q,m}function sS(){var m,Q,N,U,ce,Se;if(m=b,r.charCodeAt(b)===45?(Q=wA,b++):(Q=t,I===0&&be(Gl)),Q===t&&(r.charCodeAt(b)===43?(Q=Gs,b++):(Q=t,I===0&&be(Yl))),Q===t&&(Q=null),Q!==t){if(N=[],qe.test(r.charAt(b))?(U=r.charAt(b),b++):(U=t,I===0&&be(ne)),U!==t)for(;U!==t;)N.push(U),qe.test(r.charAt(b))?(U=r.charAt(b),b++):(U=t,I===0&&be(ne));else N=t;if(N!==t)if(r.charCodeAt(b)===46?(U=KE,b++):(U=t,I===0&&be(Rp)),U!==t){if(ce=[],qe.test(r.charAt(b))?(Se=r.charAt(b),b++):(Se=t,I===0&&be(ne)),Se!==t)for(;Se!==t;)ce.push(Se),qe.test(r.charAt(b))?(Se=r.charAt(b),b++):(Se=t,I===0&&be(ne));else ce=t;ce!==t?(Me=m,Q=Eg(Q,N,ce),m=Q):(b=m,m=t)}else b=m,m=t;else b=m,m=t}else b=m,m=t;if(m===t){if(m=b,r.charCodeAt(b)===45?(Q=wA,b++):(Q=t,I===0&&be(Gl)),Q===t&&(r.charCodeAt(b)===43?(Q=Gs,b++):(Q=t,I===0&&be(Yl))),Q===t&&(Q=null),Q!==t){if(N=[],qe.test(r.charAt(b))?(U=r.charAt(b),b++):(U=t,I===0&&be(ne)),U!==t)for(;U!==t;)N.push(U),qe.test(r.charAt(b))?(U=r.charAt(b),b++):(U=t,I===0&&be(ne));else N=t;N!==t?(Me=m,Q=Fp(Q,N),m=Q):(b=m,m=t)}else b=m,m=t;if(m===t&&(m=b,Q=aS(),Q!==t&&(Me=m,Q=UE(Q)),m=Q,m===t&&(m=b,Q=ql(),Q!==t&&(Me=m,Q=jl(Q)),m=Q,m===t)))if(m=b,r.charCodeAt(b)===40?(Q=ge,b++):(Q=t,I===0&&be(re)),Q!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();if(N!==t)if(U=$1(),U!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(r.charCodeAt(b)===41?(Se=O,b++):(Se=t,I===0&&be(F)),Se!==t?(Me=m,Q=HE(U),m=Q):(b=m,m=t)):(b=m,m=t)}else b=m,m=t;else b=m,m=t}else b=m,m=t}return m}function oS(){var m,Q,N,U,ce,Se,ht,Bt;if(m=b,Q=sS(),Q!==t){for(N=[],U=b,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(b)===42?(Se=Ig,b++):(Se=t,I===0&&be(BA)),Se===t&&(r.charCodeAt(b)===47?(Se=Rr,b++):(Se=t,I===0&&be(GE))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=sS(),Bt!==t?(Me=U,ce=Ys(Q,Se,Bt),U=ce):(b=U,U=t)):(b=U,U=t)}else b=U,U=t;else b=U,U=t;for(;U!==t;){for(N.push(U),U=b,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(b)===42?(Se=Ig,b++):(Se=t,I===0&&be(BA)),Se===t&&(r.charCodeAt(b)===47?(Se=Rr,b++):(Se=t,I===0&&be(GE))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=sS(),Bt!==t?(Me=U,ce=Ys(Q,Se,Bt),U=ce):(b=U,U=t)):(b=U,U=t)}else b=U,U=t;else b=U,U=t}N!==t?(Me=m,Q=js(Q,N),m=Q):(b=m,m=t)}else b=m,m=t;return m}function $1(){var m,Q,N,U,ce,Se,ht,Bt;if(m=b,Q=oS(),Q!==t){for(N=[],U=b,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(b)===43?(Se=Gs,b++):(Se=t,I===0&&be(Yl)),Se===t&&(r.charCodeAt(b)===45?(Se=wA,b++):(Se=t,I===0&&be(Gl))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=oS(),Bt!==t?(Me=U,ce=yg(Q,Se,Bt),U=ce):(b=U,U=t)):(b=U,U=t)}else b=U,U=t;else b=U,U=t;for(;U!==t;){for(N.push(U),U=b,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(b)===43?(Se=Gs,b++):(Se=t,I===0&&be(Yl)),Se===t&&(r.charCodeAt(b)===45?(Se=wA,b++):(Se=t,I===0&&be(Gl))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=oS(),Bt!==t?(Me=U,ce=yg(Q,Se,Bt),U=ce):(b=U,U=t)):(b=U,U=t)}else b=U,U=t;else b=U,U=t}N!==t?(Me=m,Q=js(Q,N),m=Q):(b=m,m=t)}else b=m,m=t;return m}function eK(){var m,Q,N,U,ce,Se;if(m=b,r.substr(b,3)===bA?(Q=bA,b+=3):(Q=t,I===0&&be(R)),Q!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();if(N!==t)if(U=$1(),U!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(r.substr(b,2)===q?(Se=q,b+=2):(Se=t,I===0&&be(Ce)),Se!==t?(Me=m,Q=Ke(U),m=Q):(b=m,m=t)):(b=m,m=t)}else b=m,m=t;else b=m,m=t}else b=m,m=t;return m}function tK(){var m,Q,N,U;return m=b,r.substr(b,2)===Re?(Q=Re,b+=2):(Q=t,I===0&&be(ze)),Q!==t?(N=Mr(),N!==t?(r.charCodeAt(b)===41?(U=O,b++):(U=t,I===0&&be(F)),U!==t?(Me=m,Q=dt(N),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m}function aS(){var m,Q,N,U,ce,Se;return m=b,r.substr(b,2)===Ft?(Q=Ft,b+=2):(Q=t,I===0&&be(Ln)),Q!==t?(N=ql(),N!==t?(r.substr(b,2)===JQ?(U=JQ,b+=2):(U=t,I===0&&be(k1)),U!==t?(ce=q1(),ce!==t?(r.charCodeAt(b)===125?(Se=Fe,b++):(Se=t,I===0&&be(Ne)),Se!==t?(Me=m,Q=R1(N,ce),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Ft?(Q=Ft,b+=2):(Q=t,I===0&&be(Ln)),Q!==t?(N=ql(),N!==t?(r.substr(b,3)===WQ?(U=WQ,b+=3):(U=t,I===0&&be(F1)),U!==t?(Me=m,Q=N1(N),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Ft?(Q=Ft,b+=2):(Q=t,I===0&&be(Ln)),Q!==t?(N=ql(),N!==t?(r.substr(b,2)===zQ?(U=zQ,b+=2):(U=t,I===0&&be(T1)),U!==t?(ce=q1(),ce!==t?(r.charCodeAt(b)===125?(Se=Fe,b++):(Se=t,I===0&&be(Ne)),Se!==t?(Me=m,Q=L1(N,ce),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Ft?(Q=Ft,b+=2):(Q=t,I===0&&be(Ln)),Q!==t?(N=ql(),N!==t?(r.substr(b,3)===VQ?(U=VQ,b+=3):(U=t,I===0&&be(O1)),U!==t?(Me=m,Q=M1(N),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.substr(b,2)===Ft?(Q=Ft,b+=2):(Q=t,I===0&&be(Ln)),Q!==t?(N=ql(),N!==t?(r.charCodeAt(b)===125?(U=Fe,b++):(U=t,I===0&&be(Ne)),U!==t?(Me=m,Q=XQ(N),m=Q):(b=m,m=t)):(b=m,m=t)):(b=m,m=t),m===t&&(m=b,r.charCodeAt(b)===36?(Q=K1,b++):(Q=t,I===0&&be(U1)),Q!==t?(N=ql(),N!==t?(Me=m,Q=XQ(N),m=Q):(b=m,m=t)):(b=m,m=t)))))),m}function xge(){var m,Q,N;return m=b,Q=Pge(),Q!==t?(Me=b,N=H1(Q),N?N=void 0:N=t,N!==t?(Me=m,Q=G1(Q),m=Q):(b=m,m=t)):(b=m,m=t),m}function Pge(){var m,Q,N,U,ce;if(m=b,Q=[],N=b,U=b,I++,ce=nK(),I--,ce===t?U=void 0:(b=U,U=t),U!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&be(bo)),ce!==t?(Me=N,U=ln(ce),N=U):(b=N,N=t)):(b=N,N=t),N!==t)for(;N!==t;)Q.push(N),N=b,U=b,I++,ce=nK(),I--,ce===t?U=void 0:(b=U,U=t),U!==t?(r.length>b?(ce=r.charAt(b),b++):(ce=t,I===0&&be(bo)),ce!==t?(Me=N,U=ln(ce),N=U):(b=N,N=t)):(b=N,N=t);else Q=t;return Q!==t&&(Me=m,Q=Fn(Q)),m=Q,m}function rK(){var m,Q,N;if(m=b,Q=[],ZQ.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(_Q)),N!==t)for(;N!==t;)Q.push(N),ZQ.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(_Q));else Q=t;return Q!==t&&(Me=m,Q=$Q()),m=Q,m}function ql(){var m,Q,N;if(m=b,Q=[],eS.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(tS)),N!==t)for(;N!==t;)Q.push(N),eS.test(r.charAt(b))?(N=r.charAt(b),b++):(N=t,I===0&&be(tS));else Q=t;return Q!==t&&(Me=m,Q=$Q()),m=Q,m}function iK(){var m;return Y1.test(r.charAt(b))?(m=r.charAt(b),b++):(m=t,I===0&&be(wg)),m}function nK(){var m;return rS.test(r.charAt(b))?(m=r.charAt(b),b++):(m=t,I===0&&be(iS)),m}function He(){var m,Q;if(m=[],YE.test(r.charAt(b))?(Q=r.charAt(b),b++):(Q=t,I===0&&be(jE)),Q!==t)for(;Q!==t;)m.push(Q),YE.test(r.charAt(b))?(Q=r.charAt(b),b++):(Q=t,I===0&&be(jE));else m=t;return m}if(k=n(),k!==t&&b===r.length)return k;throw k!==t&&b{"use strict";function Dfe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function $l(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,$l)}Dfe($l,Error);$l.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;gH&&(H=v,j=[]),j.push(ne))}function Ne(ne,Y){return new $l(ne,null,null,Y)}function oe(ne,Y,he){return new $l($l.buildMessage(ne,Y),ne,Y,he)}function le(){var ne,Y,he,ie;return ne=v,Y=Be(),Y!==t?(r.charCodeAt(v)===47?(he=s,v++):(he=t,$===0&&Fe(o)),he!==t?(ie=Be(),ie!==t?(D=ne,Y=a(Y,ie),ne=Y):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t),ne===t&&(ne=v,Y=Be(),Y!==t&&(D=ne,Y=l(Y)),ne=Y),ne}function Be(){var ne,Y,he,ie;return ne=v,Y=fe(),Y!==t?(r.charCodeAt(v)===64?(he=c,v++):(he=t,$===0&&Fe(u)),he!==t?(ie=qe(),ie!==t?(D=ne,Y=g(Y,ie),ne=Y):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t),ne===t&&(ne=v,Y=fe(),Y!==t&&(D=ne,Y=f(Y)),ne=Y),ne}function fe(){var ne,Y,he,ie,de;return ne=v,r.charCodeAt(v)===64?(Y=c,v++):(Y=t,$===0&&Fe(u)),Y!==t?(he=ae(),he!==t?(r.charCodeAt(v)===47?(ie=s,v++):(ie=t,$===0&&Fe(o)),ie!==t?(de=ae(),de!==t?(D=ne,Y=h(),ne=Y):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t),ne===t&&(ne=v,Y=ae(),Y!==t&&(D=ne,Y=h()),ne=Y),ne}function ae(){var ne,Y,he;if(ne=v,Y=[],p.test(r.charAt(v))?(he=r.charAt(v),v++):(he=t,$===0&&Fe(C)),he!==t)for(;he!==t;)Y.push(he),p.test(r.charAt(v))?(he=r.charAt(v),v++):(he=t,$===0&&Fe(C));else Y=t;return Y!==t&&(D=ne,Y=h()),ne=Y,ne}function qe(){var ne,Y,he;if(ne=v,Y=[],y.test(r.charAt(v))?(he=r.charAt(v),v++):(he=t,$===0&&Fe(B)),he!==t)for(;he!==t;)Y.push(he),y.test(r.charAt(v))?(he=r.charAt(v),v++):(he=t,$===0&&Fe(B));else Y=t;return Y!==t&&(D=ne,Y=h()),ne=Y,ne}if(V=n(),V!==t&&v===r.length)return V;throw V!==t&&v{"use strict";function mU(r){return typeof r>"u"||r===null}function Rfe(r){return typeof r=="object"&&r!==null}function Ffe(r){return Array.isArray(r)?r:mU(r)?[]:[r]}function Nfe(r,e){var t,i,n,s;if(e)for(s=Object.keys(e),t=0,i=s.length;t{"use strict";function Vp(r,e){Error.call(this),this.name="YAMLException",this.reason=r,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}Vp.prototype=Object.create(Error.prototype);Vp.prototype.constructor=Vp;Vp.prototype.toString=function(e){var t=this.name+": ";return t+=this.reason||"(unknown reason)",!e&&this.mark&&(t+=" "+this.mark.toString()),t};EU.exports=Vp});var wU=w((SZe,yU)=>{"use strict";var IU=tc();function HS(r,e,t,i,n){this.name=r,this.buffer=e,this.position=t,this.line=i,this.column=n}HS.prototype.getSnippet=function(e,t){var i,n,s,o,a;if(!this.buffer)return null;for(e=e||4,t=t||75,i="",n=this.position;n>0&&`\0\r +\x85\u2028\u2029`.indexOf(this.buffer.charAt(n-1))===-1;)if(n-=1,this.position-n>t/2-1){i=" ... ",n+=5;break}for(s="",o=this.position;ot/2-1){s=" ... ",o-=5;break}return a=this.buffer.slice(n,o),IU.repeat(" ",e)+i+a+s+` +`+IU.repeat(" ",e+this.position-n+i.length)+"^"};HS.prototype.toString=function(e){var t,i="";return this.name&&(i+='in "'+this.name+'" '),i+="at line "+(this.line+1)+", column "+(this.column+1),e||(t=this.getSnippet(),t&&(i+=`: +`+t)),i};yU.exports=HS});var si=w((vZe,bU)=>{"use strict";var BU=Ng(),Ofe=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],Mfe=["scalar","sequence","mapping"];function Kfe(r){var e={};return r!==null&&Object.keys(r).forEach(function(t){r[t].forEach(function(i){e[String(i)]=t})}),e}function Ufe(r,e){if(e=e||{},Object.keys(e).forEach(function(t){if(Ofe.indexOf(t)===-1)throw new BU('Unknown option "'+t+'" is met in definition of "'+r+'" YAML type.')}),this.tag=r,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=Kfe(e.styleAliases||null),Mfe.indexOf(this.kind)===-1)throw new BU('Unknown kind "'+this.kind+'" is specified for "'+r+'" YAML type.')}bU.exports=Ufe});var rc=w((xZe,SU)=>{"use strict";var QU=tc(),dI=Ng(),Hfe=si();function GS(r,e,t){var i=[];return r.include.forEach(function(n){t=GS(n,e,t)}),r[e].forEach(function(n){t.forEach(function(s,o){s.tag===n.tag&&s.kind===n.kind&&i.push(o)}),t.push(n)}),t.filter(function(n,s){return i.indexOf(s)===-1})}function Gfe(){var r={scalar:{},sequence:{},mapping:{},fallback:{}},e,t;function i(n){r[n.kind][n.tag]=r.fallback[n.tag]=n}for(e=0,t=arguments.length;e{"use strict";var Yfe=si();vU.exports=new Yfe("tag:yaml.org,2002:str",{kind:"scalar",construct:function(r){return r!==null?r:""}})});var DU=w((DZe,PU)=>{"use strict";var jfe=si();PU.exports=new jfe("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(r){return r!==null?r:[]}})});var RU=w((kZe,kU)=>{"use strict";var qfe=si();kU.exports=new qfe("tag:yaml.org,2002:map",{kind:"mapping",construct:function(r){return r!==null?r:{}}})});var CI=w((RZe,FU)=>{"use strict";var Jfe=rc();FU.exports=new Jfe({explicit:[xU(),DU(),RU()]})});var TU=w((FZe,NU)=>{"use strict";var Wfe=si();function zfe(r){if(r===null)return!0;var e=r.length;return e===1&&r==="~"||e===4&&(r==="null"||r==="Null"||r==="NULL")}function Vfe(){return null}function Xfe(r){return r===null}NU.exports=new Wfe("tag:yaml.org,2002:null",{kind:"scalar",resolve:zfe,construct:Vfe,predicate:Xfe,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var OU=w((NZe,LU)=>{"use strict";var Zfe=si();function _fe(r){if(r===null)return!1;var e=r.length;return e===4&&(r==="true"||r==="True"||r==="TRUE")||e===5&&(r==="false"||r==="False"||r==="FALSE")}function $fe(r){return r==="true"||r==="True"||r==="TRUE"}function ehe(r){return Object.prototype.toString.call(r)==="[object Boolean]"}LU.exports=new Zfe("tag:yaml.org,2002:bool",{kind:"scalar",resolve:_fe,construct:$fe,predicate:ehe,represent:{lowercase:function(r){return r?"true":"false"},uppercase:function(r){return r?"TRUE":"FALSE"},camelcase:function(r){return r?"True":"False"}},defaultStyle:"lowercase"})});var KU=w((TZe,MU)=>{"use strict";var the=tc(),rhe=si();function ihe(r){return 48<=r&&r<=57||65<=r&&r<=70||97<=r&&r<=102}function nhe(r){return 48<=r&&r<=55}function she(r){return 48<=r&&r<=57}function ohe(r){if(r===null)return!1;var e=r.length,t=0,i=!1,n;if(!e)return!1;if(n=r[t],(n==="-"||n==="+")&&(n=r[++t]),n==="0"){if(t+1===e)return!0;if(n=r[++t],n==="b"){for(t++;t=0?"0b"+r.toString(2):"-0b"+r.toString(2).slice(1)},octal:function(r){return r>=0?"0"+r.toString(8):"-0"+r.toString(8).slice(1)},decimal:function(r){return r.toString(10)},hexadecimal:function(r){return r>=0?"0x"+r.toString(16).toUpperCase():"-0x"+r.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var GU=w((LZe,HU)=>{"use strict";var UU=tc(),lhe=si(),che=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function uhe(r){return!(r===null||!che.test(r)||r[r.length-1]==="_")}function ghe(r){var e,t,i,n;return e=r.replace(/_/g,"").toLowerCase(),t=e[0]==="-"?-1:1,n=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?t===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(s){n.unshift(parseFloat(s,10))}),e=0,i=1,n.forEach(function(s){e+=s*i,i*=60}),t*e):t*parseFloat(e,10)}var fhe=/^[-+]?[0-9]+e/;function hhe(r,e){var t;if(isNaN(r))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===r)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===r)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(UU.isNegativeZero(r))return"-0.0";return t=r.toString(10),fhe.test(t)?t.replace("e",".e"):t}function phe(r){return Object.prototype.toString.call(r)==="[object Number]"&&(r%1!==0||UU.isNegativeZero(r))}HU.exports=new lhe("tag:yaml.org,2002:float",{kind:"scalar",resolve:uhe,construct:ghe,predicate:phe,represent:hhe,defaultStyle:"lowercase"})});var YS=w((OZe,YU)=>{"use strict";var dhe=rc();YU.exports=new dhe({include:[CI()],implicit:[TU(),OU(),KU(),GU()]})});var jS=w((MZe,jU)=>{"use strict";var Che=rc();jU.exports=new Che({include:[YS()]})});var zU=w((KZe,WU)=>{"use strict";var mhe=si(),qU=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),JU=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function Ehe(r){return r===null?!1:qU.exec(r)!==null||JU.exec(r)!==null}function Ihe(r){var e,t,i,n,s,o,a,l=0,c=null,u,g,f;if(e=qU.exec(r),e===null&&(e=JU.exec(r)),e===null)throw new Error("Date resolve error");if(t=+e[1],i=+e[2]-1,n=+e[3],!e[4])return new Date(Date.UTC(t,i,n));if(s=+e[4],o=+e[5],a=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(u=+e[10],g=+(e[11]||0),c=(u*60+g)*6e4,e[9]==="-"&&(c=-c)),f=new Date(Date.UTC(t,i,n,s,o,a,l)),c&&f.setTime(f.getTime()-c),f}function yhe(r){return r.toISOString()}WU.exports=new mhe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:Ehe,construct:Ihe,instanceOf:Date,represent:yhe})});var XU=w((UZe,VU)=>{"use strict";var whe=si();function Bhe(r){return r==="<<"||r===null}VU.exports=new whe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:Bhe})});var $U=w((HZe,_U)=>{"use strict";var ic;try{ZU=J,ic=ZU("buffer").Buffer}catch{}var ZU,bhe=si(),qS=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= +\r`;function Qhe(r){if(r===null)return!1;var e,t,i=0,n=r.length,s=qS;for(t=0;t64)){if(e<0)return!1;i+=6}return i%8===0}function She(r){var e,t,i=r.replace(/[\r\n=]/g,""),n=i.length,s=qS,o=0,a=[];for(e=0;e>16&255),a.push(o>>8&255),a.push(o&255)),o=o<<6|s.indexOf(i.charAt(e));return t=n%4*6,t===0?(a.push(o>>16&255),a.push(o>>8&255),a.push(o&255)):t===18?(a.push(o>>10&255),a.push(o>>2&255)):t===12&&a.push(o>>4&255),ic?ic.from?ic.from(a):new ic(a):a}function vhe(r){var e="",t=0,i,n,s=r.length,o=qS;for(i=0;i>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]),t=(t<<8)+r[i];return n=s%3,n===0?(e+=o[t>>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]):n===2?(e+=o[t>>10&63],e+=o[t>>4&63],e+=o[t<<2&63],e+=o[64]):n===1&&(e+=o[t>>2&63],e+=o[t<<4&63],e+=o[64],e+=o[64]),e}function xhe(r){return ic&&ic.isBuffer(r)}_U.exports=new bhe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:Qhe,construct:She,predicate:xhe,represent:vhe})});var t2=w((YZe,e2)=>{"use strict";var Phe=si(),Dhe=Object.prototype.hasOwnProperty,khe=Object.prototype.toString;function Rhe(r){if(r===null)return!0;var e=[],t,i,n,s,o,a=r;for(t=0,i=a.length;t{"use strict";var Nhe=si(),The=Object.prototype.toString;function Lhe(r){if(r===null)return!0;var e,t,i,n,s,o=r;for(s=new Array(o.length),e=0,t=o.length;e{"use strict";var Mhe=si(),Khe=Object.prototype.hasOwnProperty;function Uhe(r){if(r===null)return!0;var e,t=r;for(e in t)if(Khe.call(t,e)&&t[e]!==null)return!1;return!0}function Hhe(r){return r!==null?r:{}}n2.exports=new Mhe("tag:yaml.org,2002:set",{kind:"mapping",resolve:Uhe,construct:Hhe})});var Lg=w((JZe,o2)=>{"use strict";var Ghe=rc();o2.exports=new Ghe({include:[jS()],implicit:[zU(),XU()],explicit:[$U(),t2(),i2(),s2()]})});var A2=w((WZe,a2)=>{"use strict";var Yhe=si();function jhe(){return!0}function qhe(){}function Jhe(){return""}function Whe(r){return typeof r>"u"}a2.exports=new Yhe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:jhe,construct:qhe,predicate:Whe,represent:Jhe})});var c2=w((zZe,l2)=>{"use strict";var zhe=si();function Vhe(r){if(r===null||r.length===0)return!1;var e=r,t=/\/([gim]*)$/.exec(r),i="";return!(e[0]==="/"&&(t&&(i=t[1]),i.length>3||e[e.length-i.length-1]!=="/"))}function Xhe(r){var e=r,t=/\/([gim]*)$/.exec(r),i="";return e[0]==="/"&&(t&&(i=t[1]),e=e.slice(1,e.length-i.length-1)),new RegExp(e,i)}function Zhe(r){var e="/"+r.source+"/";return r.global&&(e+="g"),r.multiline&&(e+="m"),r.ignoreCase&&(e+="i"),e}function _he(r){return Object.prototype.toString.call(r)==="[object RegExp]"}l2.exports=new zhe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:Vhe,construct:Xhe,predicate:_he,represent:Zhe})});var f2=w((VZe,g2)=>{"use strict";var mI;try{u2=J,mI=u2("esprima")}catch{typeof window<"u"&&(mI=window.esprima)}var u2,$he=si();function epe(r){if(r===null)return!1;try{var e="("+r+")",t=mI.parse(e,{range:!0});return!(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")}catch{return!1}}function tpe(r){var e="("+r+")",t=mI.parse(e,{range:!0}),i=[],n;if(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return t.body[0].expression.params.forEach(function(s){i.push(s.name)}),n=t.body[0].expression.body.range,t.body[0].expression.body.type==="BlockStatement"?new Function(i,e.slice(n[0]+1,n[1]-1)):new Function(i,"return "+e.slice(n[0],n[1]))}function rpe(r){return r.toString()}function ipe(r){return Object.prototype.toString.call(r)==="[object Function]"}g2.exports=new $he("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:epe,construct:tpe,predicate:ipe,represent:rpe})});var Xp=w((ZZe,p2)=>{"use strict";var h2=rc();p2.exports=h2.DEFAULT=new h2({include:[Lg()],explicit:[A2(),c2(),f2()]})});var N2=w((_Ze,Zp)=>{"use strict";var Ba=tc(),w2=Ng(),npe=wU(),B2=Lg(),spe=Xp(),kA=Object.prototype.hasOwnProperty,EI=1,b2=2,Q2=3,II=4,JS=1,ope=2,d2=3,ape=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,Ape=/[\x85\u2028\u2029]/,lpe=/[,\[\]\{\}]/,S2=/^(?:!|!!|![a-z\-]+!)$/i,v2=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function C2(r){return Object.prototype.toString.call(r)}function xo(r){return r===10||r===13}function sc(r){return r===9||r===32}function fn(r){return r===9||r===32||r===10||r===13}function Og(r){return r===44||r===91||r===93||r===123||r===125}function cpe(r){var e;return 48<=r&&r<=57?r-48:(e=r|32,97<=e&&e<=102?e-97+10:-1)}function upe(r){return r===120?2:r===117?4:r===85?8:0}function gpe(r){return 48<=r&&r<=57?r-48:-1}function m2(r){return r===48?"\0":r===97?"\x07":r===98?"\b":r===116||r===9?" ":r===110?` +`:r===118?"\v":r===102?"\f":r===114?"\r":r===101?"\x1B":r===32?" ":r===34?'"':r===47?"/":r===92?"\\":r===78?"\x85":r===95?"\xA0":r===76?"\u2028":r===80?"\u2029":""}function fpe(r){return r<=65535?String.fromCharCode(r):String.fromCharCode((r-65536>>10)+55296,(r-65536&1023)+56320)}var x2=new Array(256),P2=new Array(256);for(nc=0;nc<256;nc++)x2[nc]=m2(nc)?1:0,P2[nc]=m2(nc);var nc;function hpe(r,e){this.input=r,this.filename=e.filename||null,this.schema=e.schema||spe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=r.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function D2(r,e){return new w2(e,new npe(r.filename,r.input,r.position,r.line,r.position-r.lineStart))}function ft(r,e){throw D2(r,e)}function yI(r,e){r.onWarning&&r.onWarning.call(null,D2(r,e))}var E2={YAML:function(e,t,i){var n,s,o;e.version!==null&&ft(e,"duplication of %YAML directive"),i.length!==1&&ft(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(i[0]),n===null&&ft(e,"ill-formed argument of the YAML directive"),s=parseInt(n[1],10),o=parseInt(n[2],10),s!==1&&ft(e,"unacceptable YAML version of the document"),e.version=i[0],e.checkLineBreaks=o<2,o!==1&&o!==2&&yI(e,"unsupported YAML version of the document")},TAG:function(e,t,i){var n,s;i.length!==2&&ft(e,"TAG directive accepts exactly two arguments"),n=i[0],s=i[1],S2.test(n)||ft(e,"ill-formed tag handle (first argument) of the TAG directive"),kA.call(e.tagMap,n)&&ft(e,'there is a previously declared suffix for "'+n+'" tag handle'),v2.test(s)||ft(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=s}};function DA(r,e,t,i){var n,s,o,a;if(e1&&(r.result+=Ba.repeat(` +`,e-1))}function ppe(r,e,t){var i,n,s,o,a,l,c,u,g=r.kind,f=r.result,h;if(h=r.input.charCodeAt(r.position),fn(h)||Og(h)||h===35||h===38||h===42||h===33||h===124||h===62||h===39||h===34||h===37||h===64||h===96||(h===63||h===45)&&(n=r.input.charCodeAt(r.position+1),fn(n)||t&&Og(n)))return!1;for(r.kind="scalar",r.result="",s=o=r.position,a=!1;h!==0;){if(h===58){if(n=r.input.charCodeAt(r.position+1),fn(n)||t&&Og(n))break}else if(h===35){if(i=r.input.charCodeAt(r.position-1),fn(i))break}else{if(r.position===r.lineStart&&wI(r)||t&&Og(h))break;if(xo(h))if(l=r.line,c=r.lineStart,u=r.lineIndent,zr(r,!1,-1),r.lineIndent>=e){a=!0,h=r.input.charCodeAt(r.position);continue}else{r.position=o,r.line=l,r.lineStart=c,r.lineIndent=u;break}}a&&(DA(r,s,o,!1),zS(r,r.line-l),s=o=r.position,a=!1),sc(h)||(o=r.position+1),h=r.input.charCodeAt(++r.position)}return DA(r,s,o,!1),r.result?!0:(r.kind=g,r.result=f,!1)}function dpe(r,e){var t,i,n;if(t=r.input.charCodeAt(r.position),t!==39)return!1;for(r.kind="scalar",r.result="",r.position++,i=n=r.position;(t=r.input.charCodeAt(r.position))!==0;)if(t===39)if(DA(r,i,r.position,!0),t=r.input.charCodeAt(++r.position),t===39)i=r.position,r.position++,n=r.position;else return!0;else xo(t)?(DA(r,i,n,!0),zS(r,zr(r,!1,e)),i=n=r.position):r.position===r.lineStart&&wI(r)?ft(r,"unexpected end of the document within a single quoted scalar"):(r.position++,n=r.position);ft(r,"unexpected end of the stream within a single quoted scalar")}function Cpe(r,e){var t,i,n,s,o,a;if(a=r.input.charCodeAt(r.position),a!==34)return!1;for(r.kind="scalar",r.result="",r.position++,t=i=r.position;(a=r.input.charCodeAt(r.position))!==0;){if(a===34)return DA(r,t,r.position,!0),r.position++,!0;if(a===92){if(DA(r,t,r.position,!0),a=r.input.charCodeAt(++r.position),xo(a))zr(r,!1,e);else if(a<256&&x2[a])r.result+=P2[a],r.position++;else if((o=upe(a))>0){for(n=o,s=0;n>0;n--)a=r.input.charCodeAt(++r.position),(o=cpe(a))>=0?s=(s<<4)+o:ft(r,"expected hexadecimal character");r.result+=fpe(s),r.position++}else ft(r,"unknown escape sequence");t=i=r.position}else xo(a)?(DA(r,t,i,!0),zS(r,zr(r,!1,e)),t=i=r.position):r.position===r.lineStart&&wI(r)?ft(r,"unexpected end of the document within a double quoted scalar"):(r.position++,i=r.position)}ft(r,"unexpected end of the stream within a double quoted scalar")}function mpe(r,e){var t=!0,i,n=r.tag,s,o=r.anchor,a,l,c,u,g,f={},h,p,C,y;if(y=r.input.charCodeAt(r.position),y===91)l=93,g=!1,s=[];else if(y===123)l=125,g=!0,s={};else return!1;for(r.anchor!==null&&(r.anchorMap[r.anchor]=s),y=r.input.charCodeAt(++r.position);y!==0;){if(zr(r,!0,e),y=r.input.charCodeAt(r.position),y===l)return r.position++,r.tag=n,r.anchor=o,r.kind=g?"mapping":"sequence",r.result=s,!0;t||ft(r,"missed comma between flow collection entries"),p=h=C=null,c=u=!1,y===63&&(a=r.input.charCodeAt(r.position+1),fn(a)&&(c=u=!0,r.position++,zr(r,!0,e))),i=r.line,Kg(r,e,EI,!1,!0),p=r.tag,h=r.result,zr(r,!0,e),y=r.input.charCodeAt(r.position),(u||r.line===i)&&y===58&&(c=!0,y=r.input.charCodeAt(++r.position),zr(r,!0,e),Kg(r,e,EI,!1,!0),C=r.result),g?Mg(r,s,f,p,h,C):c?s.push(Mg(r,null,f,p,h,C)):s.push(h),zr(r,!0,e),y=r.input.charCodeAt(r.position),y===44?(t=!0,y=r.input.charCodeAt(++r.position)):t=!1}ft(r,"unexpected end of the stream within a flow collection")}function Epe(r,e){var t,i,n=JS,s=!1,o=!1,a=e,l=0,c=!1,u,g;if(g=r.input.charCodeAt(r.position),g===124)i=!1;else if(g===62)i=!0;else return!1;for(r.kind="scalar",r.result="";g!==0;)if(g=r.input.charCodeAt(++r.position),g===43||g===45)JS===n?n=g===43?d2:ope:ft(r,"repeat of a chomping mode identifier");else if((u=gpe(g))>=0)u===0?ft(r,"bad explicit indentation width of a block scalar; it cannot be less than one"):o?ft(r,"repeat of an indentation width identifier"):(a=e+u-1,o=!0);else break;if(sc(g)){do g=r.input.charCodeAt(++r.position);while(sc(g));if(g===35)do g=r.input.charCodeAt(++r.position);while(!xo(g)&&g!==0)}for(;g!==0;){for(WS(r),r.lineIndent=0,g=r.input.charCodeAt(r.position);(!o||r.lineIndenta&&(a=r.lineIndent),xo(g)){l++;continue}if(r.lineIndente)&&l!==0)ft(r,"bad indentation of a sequence entry");else if(r.lineIndente)&&(Kg(r,e,II,!0,n)&&(p?f=r.result:h=r.result),p||(Mg(r,c,u,g,f,h,s,o),g=f=h=null),zr(r,!0,-1),y=r.input.charCodeAt(r.position)),r.lineIndent>e&&y!==0)ft(r,"bad indentation of a mapping entry");else if(r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndent tag; it should be "scalar", not "'+r.kind+'"'),g=0,f=r.implicitTypes.length;g tag; it should be "'+h.kind+'", not "'+r.kind+'"'),h.resolve(r.result)?(r.result=h.construct(r.result),r.anchor!==null&&(r.anchorMap[r.anchor]=r.result)):ft(r,"cannot resolve a node with !<"+r.tag+"> explicit tag")):ft(r,"unknown tag !<"+r.tag+">");return r.listener!==null&&r.listener("close",r),r.tag!==null||r.anchor!==null||u}function bpe(r){var e=r.position,t,i,n,s=!1,o;for(r.version=null,r.checkLineBreaks=r.legacy,r.tagMap={},r.anchorMap={};(o=r.input.charCodeAt(r.position))!==0&&(zr(r,!0,-1),o=r.input.charCodeAt(r.position),!(r.lineIndent>0||o!==37));){for(s=!0,o=r.input.charCodeAt(++r.position),t=r.position;o!==0&&!fn(o);)o=r.input.charCodeAt(++r.position);for(i=r.input.slice(t,r.position),n=[],i.length<1&&ft(r,"directive name must not be less than one character in length");o!==0;){for(;sc(o);)o=r.input.charCodeAt(++r.position);if(o===35){do o=r.input.charCodeAt(++r.position);while(o!==0&&!xo(o));break}if(xo(o))break;for(t=r.position;o!==0&&!fn(o);)o=r.input.charCodeAt(++r.position);n.push(r.input.slice(t,r.position))}o!==0&&WS(r),kA.call(E2,i)?E2[i](r,i,n):yI(r,'unknown document directive "'+i+'"')}if(zr(r,!0,-1),r.lineIndent===0&&r.input.charCodeAt(r.position)===45&&r.input.charCodeAt(r.position+1)===45&&r.input.charCodeAt(r.position+2)===45?(r.position+=3,zr(r,!0,-1)):s&&ft(r,"directives end mark is expected"),Kg(r,r.lineIndent-1,II,!1,!0),zr(r,!0,-1),r.checkLineBreaks&&Ape.test(r.input.slice(e,r.position))&&yI(r,"non-ASCII line breaks are interpreted as content"),r.documents.push(r.result),r.position===r.lineStart&&wI(r)){r.input.charCodeAt(r.position)===46&&(r.position+=3,zr(r,!0,-1));return}if(r.position"u"&&(t=e,e=null);var i=k2(r,t);if(typeof e!="function")return i;for(var n=0,s=i.length;n"u"&&(t=e,e=null),R2(r,e,Ba.extend({schema:B2},t))}function Spe(r,e){return F2(r,Ba.extend({schema:B2},e))}Zp.exports.loadAll=R2;Zp.exports.load=F2;Zp.exports.safeLoadAll=Qpe;Zp.exports.safeLoad=Spe});var iH=w(($Ze,_S)=>{"use strict";var $p=tc(),ed=Ng(),vpe=Xp(),xpe=Lg(),G2=Object.prototype.toString,Y2=Object.prototype.hasOwnProperty,Ppe=9,_p=10,Dpe=13,kpe=32,Rpe=33,Fpe=34,j2=35,Npe=37,Tpe=38,Lpe=39,Ope=42,q2=44,Mpe=45,J2=58,Kpe=61,Upe=62,Hpe=63,Gpe=64,W2=91,z2=93,Ype=96,V2=123,jpe=124,X2=125,Ni={};Ni[0]="\\0";Ni[7]="\\a";Ni[8]="\\b";Ni[9]="\\t";Ni[10]="\\n";Ni[11]="\\v";Ni[12]="\\f";Ni[13]="\\r";Ni[27]="\\e";Ni[34]='\\"';Ni[92]="\\\\";Ni[133]="\\N";Ni[160]="\\_";Ni[8232]="\\L";Ni[8233]="\\P";var qpe=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function Jpe(r,e){var t,i,n,s,o,a,l;if(e===null)return{};for(t={},i=Object.keys(e),n=0,s=i.length;n0?r.charCodeAt(s-1):null,f=f&&O2(o,a)}else{for(s=0;si&&r[g+1]!==" ",g=s);else if(!Ug(o))return BI;a=s>0?r.charCodeAt(s-1):null,f=f&&O2(o,a)}c=c||u&&s-g-1>i&&r[g+1]!==" "}return!l&&!c?f&&!n(r)?_2:$2:t>9&&Z2(r)?BI:c?tH:eH}function _pe(r,e,t,i){r.dump=function(){if(e.length===0)return"''";if(!r.noCompatMode&&qpe.indexOf(e)!==-1)return"'"+e+"'";var n=r.indent*Math.max(1,t),s=r.lineWidth===-1?-1:Math.max(Math.min(r.lineWidth,40),r.lineWidth-n),o=i||r.flowLevel>-1&&t>=r.flowLevel;function a(l){return zpe(r,l)}switch(Zpe(e,o,r.indent,s,a)){case _2:return e;case $2:return"'"+e.replace(/'/g,"''")+"'";case eH:return"|"+M2(e,r.indent)+K2(L2(e,n));case tH:return">"+M2(e,r.indent)+K2(L2($pe(e,s),n));case BI:return'"'+ede(e,s)+'"';default:throw new ed("impossible error: invalid scalar style")}}()}function M2(r,e){var t=Z2(r)?String(e):"",i=r[r.length-1]===` +`,n=i&&(r[r.length-2]===` +`||r===` +`),s=n?"+":i?"":"-";return t+s+` +`}function K2(r){return r[r.length-1]===` +`?r.slice(0,-1):r}function $pe(r,e){for(var t=/(\n+)([^\n]*)/g,i=function(){var c=r.indexOf(` +`);return c=c!==-1?c:r.length,t.lastIndex=c,U2(r.slice(0,c),e)}(),n=r[0]===` +`||r[0]===" ",s,o;o=t.exec(r);){var a=o[1],l=o[2];s=l[0]===" ",i+=a+(!n&&!s&&l!==""?` +`:"")+U2(l,e),n=s}return i}function U2(r,e){if(r===""||r[0]===" ")return r;for(var t=/ [^ ]/g,i,n=0,s,o=0,a=0,l="";i=t.exec(r);)a=i.index,a-n>e&&(s=o>n?o:a,l+=` +`+r.slice(n,s),n=s+1),o=a;return l+=` +`,r.length-n>e&&o>n?l+=r.slice(n,o)+` +`+r.slice(o+1):l+=r.slice(n),l.slice(1)}function ede(r){for(var e="",t,i,n,s=0;s=55296&&t<=56319&&(i=r.charCodeAt(s+1),i>=56320&&i<=57343)){e+=T2((t-55296)*1024+i-56320+65536),s++;continue}n=Ni[t],e+=!n&&Ug(t)?r[s]:n||T2(t)}return e}function tde(r,e,t){var i="",n=r.tag,s,o;for(s=0,o=t.length;s1024&&(u+="? "),u+=r.dump+(r.condenseFlow?'"':"")+":"+(r.condenseFlow?"":" "),oc(r,e,c,!1,!1)&&(u+=r.dump,i+=u));r.tag=n,r.dump="{"+i+"}"}function nde(r,e,t,i){var n="",s=r.tag,o=Object.keys(t),a,l,c,u,g,f;if(r.sortKeys===!0)o.sort();else if(typeof r.sortKeys=="function")o.sort(r.sortKeys);else if(r.sortKeys)throw new ed("sortKeys must be a boolean or a function");for(a=0,l=o.length;a1024,g&&(r.dump&&_p===r.dump.charCodeAt(0)?f+="?":f+="? "),f+=r.dump,g&&(f+=VS(r,e)),oc(r,e+1,u,!0,g)&&(r.dump&&_p===r.dump.charCodeAt(0)?f+=":":f+=": ",f+=r.dump,n+=f));r.tag=s,r.dump=n||"{}"}function H2(r,e,t){var i,n,s,o,a,l;for(n=t?r.explicitTypes:r.implicitTypes,s=0,o=n.length;s tag resolver accepts not "'+l+'" style');r.dump=i}return!0}return!1}function oc(r,e,t,i,n,s){r.tag=null,r.dump=t,H2(r,t,!1)||H2(r,t,!0);var o=G2.call(r.dump);i&&(i=r.flowLevel<0||r.flowLevel>e);var a=o==="[object Object]"||o==="[object Array]",l,c;if(a&&(l=r.duplicates.indexOf(t),c=l!==-1),(r.tag!==null&&r.tag!=="?"||c||r.indent!==2&&e>0)&&(n=!1),c&&r.usedDuplicates[l])r.dump="*ref_"+l;else{if(a&&c&&!r.usedDuplicates[l]&&(r.usedDuplicates[l]=!0),o==="[object Object]")i&&Object.keys(r.dump).length!==0?(nde(r,e,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(ide(r,e,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump));else if(o==="[object Array]"){var u=r.noArrayIndent&&e>0?e-1:e;i&&r.dump.length!==0?(rde(r,u,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(tde(r,u,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump))}else if(o==="[object String]")r.tag!=="?"&&_pe(r,r.dump,e,s);else{if(r.skipInvalid)return!1;throw new ed("unacceptable kind of an object to dump "+o)}r.tag!==null&&r.tag!=="?"&&(r.dump="!<"+r.tag+"> "+r.dump)}return!0}function sde(r,e){var t=[],i=[],n,s;for(XS(r,t,i),n=0,s=i.length;n{"use strict";var bI=N2(),nH=iH();function QI(r){return function(){throw new Error("Function "+r+" is deprecated and cannot be used.")}}Fr.exports.Type=si();Fr.exports.Schema=rc();Fr.exports.FAILSAFE_SCHEMA=CI();Fr.exports.JSON_SCHEMA=YS();Fr.exports.CORE_SCHEMA=jS();Fr.exports.DEFAULT_SAFE_SCHEMA=Lg();Fr.exports.DEFAULT_FULL_SCHEMA=Xp();Fr.exports.load=bI.load;Fr.exports.loadAll=bI.loadAll;Fr.exports.safeLoad=bI.safeLoad;Fr.exports.safeLoadAll=bI.safeLoadAll;Fr.exports.dump=nH.dump;Fr.exports.safeDump=nH.safeDump;Fr.exports.YAMLException=Ng();Fr.exports.MINIMAL_SCHEMA=CI();Fr.exports.SAFE_SCHEMA=Lg();Fr.exports.DEFAULT_SCHEMA=Xp();Fr.exports.scan=QI("scan");Fr.exports.parse=QI("parse");Fr.exports.compose=QI("compose");Fr.exports.addConstructor=QI("addConstructor")});var aH=w((t_e,oH)=>{"use strict";var ade=sH();oH.exports=ade});var lH=w((r_e,AH)=>{"use strict";function Ade(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function ac(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,ac)}Ade(ac,Error);ac.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g({[Ke]:Ce})))},H=function(R){return R},j=function(R){return R},$=Us("correct indentation"),V=" ",W=ar(" ",!1),_=function(R){return R.length===bA*yg},A=function(R){return R.length===(bA+1)*yg},Ae=function(){return bA++,!0},ge=function(){return bA--,!0},re=function(){return pg()},O=Us("pseudostring"),F=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,ue=Tn(["\r",` +`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),pe=/^[^\r\n\t ,\][{}:#"']/,ke=Tn(["\r",` +`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),Fe=function(){return pg().replace(/^ *| *$/g,"")},Ne="--",oe=ar("--",!1),le=/^[a-zA-Z\/0-9]/,Be=Tn([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),fe=/^[^\r\n\t :,]/,ae=Tn(["\r",` +`," "," ",":",","],!0,!1),qe="null",ne=ar("null",!1),Y=function(){return null},he="true",ie=ar("true",!1),de=function(){return!0},_e="false",Pt=ar("false",!1),It=function(){return!1},Or=Us("string"),ii='"',gi=ar('"',!1),hr=function(){return""},fi=function(R){return R},ni=function(R){return R.join("")},Ks=/^[^"\\\0-\x1F\x7F]/,pr=Tn(['"',"\\",["\0",""],"\x7F"],!0,!1),Ii='\\"',rs=ar('\\"',!1),fa=function(){return'"'},dA="\\\\",cg=ar("\\\\",!1),is=function(){return"\\"},CA="\\/",ha=ar("\\/",!1),wp=function(){return"/"},mA="\\b",EA=ar("\\b",!1),wr=function(){return"\b"},Tl="\\f",ug=ar("\\f",!1),yo=function(){return"\f"},gg="\\n",Bp=ar("\\n",!1),bp=function(){return` +`},vr="\\r",se=ar("\\r",!1),wo=function(){return"\r"},Fn="\\t",fg=ar("\\t",!1),bt=function(){return" "},Ll="\\u",Nn=ar("\\u",!1),ns=function(R,q,Ce,Ke){return String.fromCharCode(parseInt(`0x${R}${q}${Ce}${Ke}`))},ss=/^[0-9a-fA-F]/,gt=Tn([["0","9"],["a","f"],["A","F"]],!1,!1),Bo=Us("blank space"),At=/^[ \t]/,ln=Tn([" "," "],!1,!1),S=Us("white space"),Lt=/^[ \t\n\r]/,hg=Tn([" "," ",` +`,"\r"],!1,!1),Ol=`\r +`,Qp=ar(`\r +`,!1),Sp=` +`,vp=ar(` +`,!1),xp="\r",Pp=ar("\r",!1),G=0,yt=0,IA=[{line:1,column:1}],zi=0,Ml=[],Xe=0,pa;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function pg(){return r.substring(yt,G)}function OE(){return cn(yt,G)}function Dp(R,q){throw q=q!==void 0?q:cn(yt,G),Ul([Us(R)],r.substring(yt,G),q)}function ME(R,q){throw q=q!==void 0?q:cn(yt,G),dg(R,q)}function ar(R,q){return{type:"literal",text:R,ignoreCase:q}}function Tn(R,q,Ce){return{type:"class",parts:R,inverted:q,ignoreCase:Ce}}function Kl(){return{type:"any"}}function kp(){return{type:"end"}}function Us(R){return{type:"other",description:R}}function da(R){var q=IA[R],Ce;if(q)return q;for(Ce=R-1;!IA[Ce];)Ce--;for(q=IA[Ce],q={line:q.line,column:q.column};Cezi&&(zi=G,Ml=[]),Ml.push(R))}function dg(R,q){return new ac(R,null,null,q)}function Ul(R,q,Ce){return new ac(ac.buildMessage(R,q),R,q,Ce)}function Hs(){var R;return R=Cg(),R}function Hl(){var R,q,Ce;for(R=G,q=[],Ce=yA();Ce!==t;)q.push(Ce),Ce=yA();return q!==t&&(yt=R,q=s(q)),R=q,R}function yA(){var R,q,Ce,Ke,Re;return R=G,q=ma(),q!==t?(r.charCodeAt(G)===45?(Ce=o,G++):(Ce=t,Xe===0&&Le(a)),Ce!==t?(Ke=Rr(),Ke!==t?(Re=Ca(),Re!==t?(yt=R,q=l(Re),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R}function Cg(){var R,q,Ce;for(R=G,q=[],Ce=mg();Ce!==t;)q.push(Ce),Ce=mg();return q!==t&&(yt=R,q=c(q)),R=q,R}function mg(){var R,q,Ce,Ke,Re,ze,dt,Ft,Ln;if(R=G,q=Rr(),q===t&&(q=null),q!==t){if(Ce=G,r.charCodeAt(G)===35?(Ke=u,G++):(Ke=t,Xe===0&&Le(g)),Ke!==t){if(Re=[],ze=G,dt=G,Xe++,Ft=js(),Xe--,Ft===t?dt=void 0:(G=dt,dt=t),dt!==t?(r.length>G?(Ft=r.charAt(G),G++):(Ft=t,Xe===0&&Le(f)),Ft!==t?(dt=[dt,Ft],ze=dt):(G=ze,ze=t)):(G=ze,ze=t),ze!==t)for(;ze!==t;)Re.push(ze),ze=G,dt=G,Xe++,Ft=js(),Xe--,Ft===t?dt=void 0:(G=dt,dt=t),dt!==t?(r.length>G?(Ft=r.charAt(G),G++):(Ft=t,Xe===0&&Le(f)),Ft!==t?(dt=[dt,Ft],ze=dt):(G=ze,ze=t)):(G=ze,ze=t);else Re=t;Re!==t?(Ke=[Ke,Re],Ce=Ke):(G=Ce,Ce=t)}else G=Ce,Ce=t;if(Ce===t&&(Ce=null),Ce!==t){if(Ke=[],Re=Ys(),Re!==t)for(;Re!==t;)Ke.push(Re),Re=Ys();else Ke=t;Ke!==t?(yt=R,q=h(),R=q):(G=R,R=t)}else G=R,R=t}else G=R,R=t;if(R===t&&(R=G,q=ma(),q!==t?(Ce=Gl(),Ce!==t?(Ke=Rr(),Ke===t&&(Ke=null),Ke!==t?(r.charCodeAt(G)===58?(Re=p,G++):(Re=t,Xe===0&&Le(C)),Re!==t?(ze=Rr(),ze===t&&(ze=null),ze!==t?(dt=Ca(),dt!==t?(yt=R,q=y(Ce,dt),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,q=ma(),q!==t?(Ce=Gs(),Ce!==t?(Ke=Rr(),Ke===t&&(Ke=null),Ke!==t?(r.charCodeAt(G)===58?(Re=p,G++):(Re=t,Xe===0&&Le(C)),Re!==t?(ze=Rr(),ze===t&&(ze=null),ze!==t?(dt=Ca(),dt!==t?(yt=R,q=y(Ce,dt),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t))){if(R=G,q=ma(),q!==t)if(Ce=Gs(),Ce!==t)if(Ke=Rr(),Ke!==t)if(Re=KE(),Re!==t){if(ze=[],dt=Ys(),dt!==t)for(;dt!==t;)ze.push(dt),dt=Ys();else ze=t;ze!==t?(yt=R,q=y(Ce,Re),R=q):(G=R,R=t)}else G=R,R=t;else G=R,R=t;else G=R,R=t;else G=R,R=t;if(R===t)if(R=G,q=ma(),q!==t)if(Ce=Gs(),Ce!==t){if(Ke=[],Re=G,ze=Rr(),ze===t&&(ze=null),ze!==t?(r.charCodeAt(G)===44?(dt=B,G++):(dt=t,Xe===0&&Le(v)),dt!==t?(Ft=Rr(),Ft===t&&(Ft=null),Ft!==t?(Ln=Gs(),Ln!==t?(yt=Re,ze=D(Ce,Ln),Re=ze):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t),Re!==t)for(;Re!==t;)Ke.push(Re),Re=G,ze=Rr(),ze===t&&(ze=null),ze!==t?(r.charCodeAt(G)===44?(dt=B,G++):(dt=t,Xe===0&&Le(v)),dt!==t?(Ft=Rr(),Ft===t&&(Ft=null),Ft!==t?(Ln=Gs(),Ln!==t?(yt=Re,ze=D(Ce,Ln),Re=ze):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t);else Ke=t;Ke!==t?(Re=Rr(),Re===t&&(Re=null),Re!==t?(r.charCodeAt(G)===58?(ze=p,G++):(ze=t,Xe===0&&Le(C)),ze!==t?(dt=Rr(),dt===t&&(dt=null),dt!==t?(Ft=Ca(),Ft!==t?(yt=R,q=T(Ce,Ke,Ft),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)}else G=R,R=t;else G=R,R=t}return R}function Ca(){var R,q,Ce,Ke,Re,ze,dt;if(R=G,q=G,Xe++,Ce=G,Ke=js(),Ke!==t?(Re=rt(),Re!==t?(r.charCodeAt(G)===45?(ze=o,G++):(ze=t,Xe===0&&Le(a)),ze!==t?(dt=Rr(),dt!==t?(Ke=[Ke,Re,ze,dt],Ce=Ke):(G=Ce,Ce=t)):(G=Ce,Ce=t)):(G=Ce,Ce=t)):(G=Ce,Ce=t),Xe--,Ce!==t?(G=q,q=void 0):q=t,q!==t?(Ce=Ys(),Ce!==t?(Ke=bo(),Ke!==t?(Re=Hl(),Re!==t?(ze=wA(),ze!==t?(yt=R,q=H(Re),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,q=js(),q!==t?(Ce=bo(),Ce!==t?(Ke=Cg(),Ke!==t?(Re=wA(),Re!==t?(yt=R,q=H(Ke),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t))if(R=G,q=Yl(),q!==t){if(Ce=[],Ke=Ys(),Ke!==t)for(;Ke!==t;)Ce.push(Ke),Ke=Ys();else Ce=t;Ce!==t?(yt=R,q=j(q),R=q):(G=R,R=t)}else G=R,R=t;return R}function ma(){var R,q,Ce;for(Xe++,R=G,q=[],r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Le(W));Ce!==t;)q.push(Ce),r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Le(W));return q!==t?(yt=G,Ce=_(q),Ce?Ce=void 0:Ce=t,Ce!==t?(q=[q,Ce],R=q):(G=R,R=t)):(G=R,R=t),Xe--,R===t&&(q=t,Xe===0&&Le($)),R}function rt(){var R,q,Ce;for(R=G,q=[],r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Le(W));Ce!==t;)q.push(Ce),r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Le(W));return q!==t?(yt=G,Ce=A(q),Ce?Ce=void 0:Ce=t,Ce!==t?(q=[q,Ce],R=q):(G=R,R=t)):(G=R,R=t),R}function bo(){var R;return yt=G,R=Ae(),R?R=void 0:R=t,R}function wA(){var R;return yt=G,R=ge(),R?R=void 0:R=t,R}function Gl(){var R;return R=jl(),R===t&&(R=Rp()),R}function Gs(){var R,q,Ce;if(R=jl(),R===t){if(R=G,q=[],Ce=Eg(),Ce!==t)for(;Ce!==t;)q.push(Ce),Ce=Eg();else q=t;q!==t&&(yt=R,q=re()),R=q}return R}function Yl(){var R;return R=Fp(),R===t&&(R=UE(),R===t&&(R=jl(),R===t&&(R=Rp()))),R}function KE(){var R;return R=Fp(),R===t&&(R=jl(),R===t&&(R=Eg())),R}function Rp(){var R,q,Ce,Ke,Re,ze;if(Xe++,R=G,F.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Le(ue)),q!==t){for(Ce=[],Ke=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(pe.test(r.charAt(G))?(ze=r.charAt(G),G++):(ze=t,Xe===0&&Le(ke)),ze!==t?(Re=[Re,ze],Ke=Re):(G=Ke,Ke=t)):(G=Ke,Ke=t);Ke!==t;)Ce.push(Ke),Ke=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(pe.test(r.charAt(G))?(ze=r.charAt(G),G++):(ze=t,Xe===0&&Le(ke)),ze!==t?(Re=[Re,ze],Ke=Re):(G=Ke,Ke=t)):(G=Ke,Ke=t);Ce!==t?(yt=R,q=Fe(),R=q):(G=R,R=t)}else G=R,R=t;return Xe--,R===t&&(q=t,Xe===0&&Le(O)),R}function Eg(){var R,q,Ce,Ke,Re;if(R=G,r.substr(G,2)===Ne?(q=Ne,G+=2):(q=t,Xe===0&&Le(oe)),q===t&&(q=null),q!==t)if(le.test(r.charAt(G))?(Ce=r.charAt(G),G++):(Ce=t,Xe===0&&Le(Be)),Ce!==t){for(Ke=[],fe.test(r.charAt(G))?(Re=r.charAt(G),G++):(Re=t,Xe===0&&Le(ae));Re!==t;)Ke.push(Re),fe.test(r.charAt(G))?(Re=r.charAt(G),G++):(Re=t,Xe===0&&Le(ae));Ke!==t?(yt=R,q=Fe(),R=q):(G=R,R=t)}else G=R,R=t;else G=R,R=t;return R}function Fp(){var R,q;return R=G,r.substr(G,4)===qe?(q=qe,G+=4):(q=t,Xe===0&&Le(ne)),q!==t&&(yt=R,q=Y()),R=q,R}function UE(){var R,q;return R=G,r.substr(G,4)===he?(q=he,G+=4):(q=t,Xe===0&&Le(ie)),q!==t&&(yt=R,q=de()),R=q,R===t&&(R=G,r.substr(G,5)===_e?(q=_e,G+=5):(q=t,Xe===0&&Le(Pt)),q!==t&&(yt=R,q=It()),R=q),R}function jl(){var R,q,Ce,Ke;return Xe++,R=G,r.charCodeAt(G)===34?(q=ii,G++):(q=t,Xe===0&&Le(gi)),q!==t?(r.charCodeAt(G)===34?(Ce=ii,G++):(Ce=t,Xe===0&&Le(gi)),Ce!==t?(yt=R,q=hr(),R=q):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,r.charCodeAt(G)===34?(q=ii,G++):(q=t,Xe===0&&Le(gi)),q!==t?(Ce=HE(),Ce!==t?(r.charCodeAt(G)===34?(Ke=ii,G++):(Ke=t,Xe===0&&Le(gi)),Ke!==t?(yt=R,q=fi(Ce),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)),Xe--,R===t&&(q=t,Xe===0&&Le(Or)),R}function HE(){var R,q,Ce;if(R=G,q=[],Ce=Ig(),Ce!==t)for(;Ce!==t;)q.push(Ce),Ce=Ig();else q=t;return q!==t&&(yt=R,q=ni(q)),R=q,R}function Ig(){var R,q,Ce,Ke,Re,ze;return Ks.test(r.charAt(G))?(R=r.charAt(G),G++):(R=t,Xe===0&&Le(pr)),R===t&&(R=G,r.substr(G,2)===Ii?(q=Ii,G+=2):(q=t,Xe===0&&Le(rs)),q!==t&&(yt=R,q=fa()),R=q,R===t&&(R=G,r.substr(G,2)===dA?(q=dA,G+=2):(q=t,Xe===0&&Le(cg)),q!==t&&(yt=R,q=is()),R=q,R===t&&(R=G,r.substr(G,2)===CA?(q=CA,G+=2):(q=t,Xe===0&&Le(ha)),q!==t&&(yt=R,q=wp()),R=q,R===t&&(R=G,r.substr(G,2)===mA?(q=mA,G+=2):(q=t,Xe===0&&Le(EA)),q!==t&&(yt=R,q=wr()),R=q,R===t&&(R=G,r.substr(G,2)===Tl?(q=Tl,G+=2):(q=t,Xe===0&&Le(ug)),q!==t&&(yt=R,q=yo()),R=q,R===t&&(R=G,r.substr(G,2)===gg?(q=gg,G+=2):(q=t,Xe===0&&Le(Bp)),q!==t&&(yt=R,q=bp()),R=q,R===t&&(R=G,r.substr(G,2)===vr?(q=vr,G+=2):(q=t,Xe===0&&Le(se)),q!==t&&(yt=R,q=wo()),R=q,R===t&&(R=G,r.substr(G,2)===Fn?(q=Fn,G+=2):(q=t,Xe===0&&Le(fg)),q!==t&&(yt=R,q=bt()),R=q,R===t&&(R=G,r.substr(G,2)===Ll?(q=Ll,G+=2):(q=t,Xe===0&&Le(Nn)),q!==t?(Ce=BA(),Ce!==t?(Ke=BA(),Ke!==t?(Re=BA(),Re!==t?(ze=BA(),ze!==t?(yt=R,q=ns(Ce,Ke,Re,ze),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)))))))))),R}function BA(){var R;return ss.test(r.charAt(G))?(R=r.charAt(G),G++):(R=t,Xe===0&&Le(gt)),R}function Rr(){var R,q;if(Xe++,R=[],At.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Le(ln)),q!==t)for(;q!==t;)R.push(q),At.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Le(ln));else R=t;return Xe--,R===t&&(q=t,Xe===0&&Le(Bo)),R}function GE(){var R,q;if(Xe++,R=[],Lt.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Le(hg)),q!==t)for(;q!==t;)R.push(q),Lt.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Le(hg));else R=t;return Xe--,R===t&&(q=t,Xe===0&&Le(S)),R}function Ys(){var R,q,Ce,Ke,Re,ze;if(R=G,q=js(),q!==t){for(Ce=[],Ke=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(ze=js(),ze!==t?(Re=[Re,ze],Ke=Re):(G=Ke,Ke=t)):(G=Ke,Ke=t);Ke!==t;)Ce.push(Ke),Ke=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(ze=js(),ze!==t?(Re=[Re,ze],Ke=Re):(G=Ke,Ke=t)):(G=Ke,Ke=t);Ce!==t?(q=[q,Ce],R=q):(G=R,R=t)}else G=R,R=t;return R}function js(){var R;return r.substr(G,2)===Ol?(R=Ol,G+=2):(R=t,Xe===0&&Le(Qp)),R===t&&(r.charCodeAt(G)===10?(R=Sp,G++):(R=t,Xe===0&&Le(vp)),R===t&&(r.charCodeAt(G)===13?(R=xp,G++):(R=t,Xe===0&&Le(Pp)))),R}let yg=2,bA=0;if(pa=n(),pa!==t&&G===r.length)return pa;throw pa!==t&&G{"use strict";var hde=r=>{let e=!1,t=!1,i=!1;for(let n=0;n{if(!(typeof r=="string"||Array.isArray(r)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let t=n=>e.pascalCase?n.charAt(0).toUpperCase()+n.slice(1):n;return Array.isArray(r)?r=r.map(n=>n.trim()).filter(n=>n.length).join("-"):r=r.trim(),r.length===0?"":r.length===1?e.pascalCase?r.toUpperCase():r.toLowerCase():(r!==r.toLowerCase()&&(r=hde(r)),r=r.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(n,s)=>s.toUpperCase()).replace(/\d+(\w|$)/g,n=>n.toUpperCase()),t(r))};ev.exports=hH;ev.exports.default=hH});var dH=w((A_e,pde)=>{pde.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vercel",constant:"VERCEL",env:"NOW_BUILDER"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"}]});var Ac=w(Un=>{"use strict";var mH=dH(),Po=process.env;Object.defineProperty(Un,"_vendors",{value:mH.map(function(r){return r.constant})});Un.name=null;Un.isPR=null;mH.forEach(function(r){let t=(Array.isArray(r.env)?r.env:[r.env]).every(function(i){return CH(i)});if(Un[r.constant]=t,t)switch(Un.name=r.name,typeof r.pr){case"string":Un.isPR=!!Po[r.pr];break;case"object":"env"in r.pr?Un.isPR=r.pr.env in Po&&Po[r.pr.env]!==r.pr.ne:"any"in r.pr?Un.isPR=r.pr.any.some(function(i){return!!Po[i]}):Un.isPR=CH(r.pr);break;default:Un.isPR=null}});Un.isCI=!!(Po.CI||Po.CONTINUOUS_INTEGRATION||Po.BUILD_NUMBER||Po.RUN_ID||Un.name);function CH(r){return typeof r=="string"?!!Po[r]:Object.keys(r).every(function(e){return Po[e]===r[e]})}});var hn={};ut(hn,{KeyRelationship:()=>lc,applyCascade:()=>od,base64RegExp:()=>BH,colorStringAlphaRegExp:()=>wH,colorStringRegExp:()=>yH,computeKey:()=>RA,getPrintable:()=>Vr,hasExactLength:()=>xH,hasForbiddenKeys:()=>Wde,hasKeyRelationship:()=>av,hasMaxLength:()=>Dde,hasMinLength:()=>Pde,hasMutuallyExclusiveKeys:()=>zde,hasRequiredKeys:()=>Jde,hasUniqueItems:()=>kde,isArray:()=>yde,isAtLeast:()=>Nde,isAtMost:()=>Tde,isBase64:()=>jde,isBoolean:()=>mde,isDate:()=>Ide,isDict:()=>Bde,isEnum:()=>Zi,isHexColor:()=>Yde,isISO8601:()=>Gde,isInExclusiveRange:()=>Ode,isInInclusiveRange:()=>Lde,isInstanceOf:()=>Qde,isInteger:()=>Mde,isJSON:()=>qde,isLiteral:()=>dde,isLowerCase:()=>Kde,isNegative:()=>Rde,isNullable:()=>xde,isNumber:()=>Ede,isObject:()=>bde,isOneOf:()=>Sde,isOptional:()=>vde,isPositive:()=>Fde,isString:()=>sd,isTuple:()=>wde,isUUID4:()=>Hde,isUnknown:()=>vH,isUpperCase:()=>Ude,iso8601RegExp:()=>ov,makeCoercionFn:()=>cc,makeSetter:()=>SH,makeTrait:()=>QH,makeValidator:()=>Qt,matchesRegExp:()=>ad,plural:()=>kI,pushError:()=>pt,simpleKeyRegExp:()=>IH,uuid4RegExp:()=>bH});function Qt({test:r}){return QH(r)()}function Vr(r){return r===null?"null":r===void 0?"undefined":r===""?"an empty string":JSON.stringify(r)}function RA(r,e){var t,i,n;return typeof e=="number"?`${(t=r==null?void 0:r.p)!==null&&t!==void 0?t:"."}[${e}]`:IH.test(e)?`${(i=r==null?void 0:r.p)!==null&&i!==void 0?i:""}.${e}`:`${(n=r==null?void 0:r.p)!==null&&n!==void 0?n:"."}[${JSON.stringify(e)}]`}function cc(r,e){return t=>{let i=r[e];return r[e]=t,cc(r,e).bind(null,i)}}function SH(r,e){return t=>{r[e]=t}}function kI(r,e,t){return r===1?e:t}function pt({errors:r,p:e}={},t){return r==null||r.push(`${e!=null?e:"."}: ${t}`),!1}function dde(r){return Qt({test:(e,t)=>e!==r?pt(t,`Expected a literal (got ${Vr(r)})`):!0})}function Zi(r){let e=Array.isArray(r)?r:Object.values(r),t=new Set(e);return Qt({test:(i,n)=>t.has(i)?!0:pt(n,`Expected a valid enumeration value (got ${Vr(i)})`)})}var IH,yH,wH,BH,bH,ov,QH,vH,sd,Cde,mde,Ede,Ide,yde,wde,Bde,bde,Qde,Sde,od,vde,xde,Pde,Dde,xH,kde,Rde,Fde,Nde,Tde,Lde,Ode,Mde,ad,Kde,Ude,Hde,Gde,Yde,jde,qde,Jde,Wde,zde,lc,Vde,av,ls=Tge(()=>{IH=/^[a-zA-Z_][a-zA-Z0-9_]*$/,yH=/^#[0-9a-f]{6}$/i,wH=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,BH=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,bH=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,ov=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/,QH=r=>()=>r;vH=()=>Qt({test:(r,e)=>!0});sd=()=>Qt({test:(r,e)=>typeof r!="string"?pt(e,`Expected a string (got ${Vr(r)})`):!0});Cde=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]),mde=()=>Qt({test:(r,e)=>{var t;if(typeof r!="boolean"){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return pt(e,"Unbound coercion result");let i=Cde.get(r);if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a boolean (got ${Vr(r)})`)}return!0}}),Ede=()=>Qt({test:(r,e)=>{var t;if(typeof r!="number"){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return pt(e,"Unbound coercion result");let i;if(typeof r=="string"){let n;try{n=JSON.parse(r)}catch{}if(typeof n=="number")if(JSON.stringify(n)===r)i=n;else return pt(e,`Received a number that can't be safely represented by the runtime (${r})`)}if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a number (got ${Vr(r)})`)}return!0}}),Ide=()=>Qt({test:(r,e)=>{var t;if(!(r instanceof Date)){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return pt(e,"Unbound coercion result");let i;if(typeof r=="string"&&ov.test(r))i=new Date(r);else{let n;if(typeof r=="string"){let s;try{s=JSON.parse(r)}catch{}typeof s=="number"&&(n=s)}else typeof r=="number"&&(n=r);if(typeof n<"u")if(Number.isSafeInteger(n)||!Number.isSafeInteger(n*1e3))i=new Date(n*1e3);else return pt(e,`Received a timestamp that can't be safely represented by the runtime (${r})`)}if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a date (got ${Vr(r)})`)}return!0}}),yde=(r,{delimiter:e}={})=>Qt({test:(t,i)=>{var n;if(typeof t=="string"&&typeof e<"u"&&typeof(i==null?void 0:i.coercions)<"u"){if(typeof(i==null?void 0:i.coercion)>"u")return pt(i,"Unbound coercion result");t=t.split(e),i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,t)])}if(!Array.isArray(t))return pt(i,`Expected an array (got ${Vr(t)})`);let s=!0;for(let o=0,a=t.length;o{let t=xH(r.length);return Qt({test:(i,n)=>{var s;if(typeof i=="string"&&typeof e<"u"&&typeof(n==null?void 0:n.coercions)<"u"){if(typeof(n==null?void 0:n.coercion)>"u")return pt(n,"Unbound coercion result");i=i.split(e),n.coercions.push([(s=n.p)!==null&&s!==void 0?s:".",n.coercion.bind(null,i)])}if(!Array.isArray(i))return pt(n,`Expected a tuple (got ${Vr(i)})`);let o=t(i,Object.assign({},n));for(let a=0,l=i.length;aQt({test:(t,i)=>{if(typeof t!="object"||t===null)return pt(i,`Expected an object (got ${Vr(t)})`);let n=Object.keys(t),s=!0;for(let o=0,a=n.length;o{let t=Object.keys(r);return Qt({test:(i,n)=>{if(typeof i!="object"||i===null)return pt(n,`Expected an object (got ${Vr(i)})`);let s=new Set([...t,...Object.keys(i)]),o={},a=!0;for(let l of s){if(l==="constructor"||l==="__proto__")a=pt(Object.assign(Object.assign({},n),{p:RA(n,l)}),"Unsafe property name");else{let c=Object.prototype.hasOwnProperty.call(r,l)?r[l]:void 0,u=Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0;typeof c<"u"?a=c(u,Object.assign(Object.assign({},n),{p:RA(n,l),coercion:cc(i,l)}))&&a:e===null?a=pt(Object.assign(Object.assign({},n),{p:RA(n,l)}),`Extraneous property (got ${Vr(u)})`):Object.defineProperty(o,l,{enumerable:!0,get:()=>u,set:SH(i,l)})}if(!a&&(n==null?void 0:n.errors)==null)break}return e!==null&&(a||(n==null?void 0:n.errors)!=null)&&(a=e(o,n)&&a),a}})},Qde=r=>Qt({test:(e,t)=>e instanceof r?!0:pt(t,`Expected an instance of ${r.name} (got ${Vr(e)})`)}),Sde=(r,{exclusive:e=!1}={})=>Qt({test:(t,i)=>{var n,s,o;let a=[],l=typeof(i==null?void 0:i.errors)<"u"?[]:void 0;for(let c=0,u=r.length;c1?pt(i,`Expected to match exactly a single predicate (matched ${a.join(", ")})`):(o=i==null?void 0:i.errors)===null||o===void 0||o.push(...l),!1}}),od=(r,e)=>Qt({test:(t,i)=>{var n,s;let o={value:t},a=typeof(i==null?void 0:i.coercions)<"u"?cc(o,"value"):void 0,l=typeof(i==null?void 0:i.coercions)<"u"?[]:void 0;if(!r(t,Object.assign(Object.assign({},i),{coercion:a,coercions:l})))return!1;let c=[];if(typeof l<"u")for(let[,u]of l)c.push(u());try{if(typeof(i==null?void 0:i.coercions)<"u"){if(o.value!==t){if(typeof(i==null?void 0:i.coercion)>"u")return pt(i,"Unbound coercion result");i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,o.value)])}(s=i==null?void 0:i.coercions)===null||s===void 0||s.push(...l)}return e.every(u=>u(o.value,i))}finally{for(let u of c)u()}}}),vde=r=>Qt({test:(e,t)=>typeof e>"u"?!0:r(e,t)}),xde=r=>Qt({test:(e,t)=>e===null?!0:r(e,t)}),Pde=r=>Qt({test:(e,t)=>e.length>=r?!0:pt(t,`Expected to have a length of at least ${r} elements (got ${e.length})`)}),Dde=r=>Qt({test:(e,t)=>e.length<=r?!0:pt(t,`Expected to have a length of at most ${r} elements (got ${e.length})`)}),xH=r=>Qt({test:(e,t)=>e.length!==r?pt(t,`Expected to have a length of exactly ${r} elements (got ${e.length})`):!0}),kde=({map:r}={})=>Qt({test:(e,t)=>{let i=new Set,n=new Set;for(let s=0,o=e.length;sQt({test:(r,e)=>r<=0?!0:pt(e,`Expected to be negative (got ${r})`)}),Fde=()=>Qt({test:(r,e)=>r>=0?!0:pt(e,`Expected to be positive (got ${r})`)}),Nde=r=>Qt({test:(e,t)=>e>=r?!0:pt(t,`Expected to be at least ${r} (got ${e})`)}),Tde=r=>Qt({test:(e,t)=>e<=r?!0:pt(t,`Expected to be at most ${r} (got ${e})`)}),Lde=(r,e)=>Qt({test:(t,i)=>t>=r&&t<=e?!0:pt(i,`Expected to be in the [${r}; ${e}] range (got ${t})`)}),Ode=(r,e)=>Qt({test:(t,i)=>t>=r&&tQt({test:(e,t)=>e!==Math.round(e)?pt(t,`Expected to be an integer (got ${e})`):Number.isSafeInteger(e)?!0:pt(t,`Expected to be a safe integer (got ${e})`)}),ad=r=>Qt({test:(e,t)=>r.test(e)?!0:pt(t,`Expected to match the pattern ${r.toString()} (got ${Vr(e)})`)}),Kde=()=>Qt({test:(r,e)=>r!==r.toLowerCase()?pt(e,`Expected to be all-lowercase (got ${r})`):!0}),Ude=()=>Qt({test:(r,e)=>r!==r.toUpperCase()?pt(e,`Expected to be all-uppercase (got ${r})`):!0}),Hde=()=>Qt({test:(r,e)=>bH.test(r)?!0:pt(e,`Expected to be a valid UUID v4 (got ${Vr(r)})`)}),Gde=()=>Qt({test:(r,e)=>ov.test(r)?!1:pt(e,`Expected to be a valid ISO 8601 date string (got ${Vr(r)})`)}),Yde=({alpha:r=!1})=>Qt({test:(e,t)=>(r?yH.test(e):wH.test(e))?!0:pt(t,`Expected to be a valid hexadecimal color string (got ${Vr(e)})`)}),jde=()=>Qt({test:(r,e)=>BH.test(r)?!0:pt(e,`Expected to be a valid base 64 string (got ${Vr(r)})`)}),qde=(r=vH())=>Qt({test:(e,t)=>{let i;try{i=JSON.parse(e)}catch{return pt(t,`Expected to be a valid JSON string (got ${Vr(e)})`)}return r(i,t)}}),Jde=r=>{let e=new Set(r);return Qt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)||s.push(o);return s.length>0?pt(i,`Missing required ${kI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},Wde=r=>{let e=new Set(r);return Qt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>0?pt(i,`Forbidden ${kI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},zde=r=>{let e=new Set(r);return Qt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>1?pt(i,`Mutually exclusive properties ${s.map(o=>`"${o}"`).join(", ")}`):!0}})};(function(r){r.Forbids="Forbids",r.Requires="Requires"})(lc||(lc={}));Vde={[lc.Forbids]:{expect:!1,message:"forbids using"},[lc.Requires]:{expect:!0,message:"requires using"}},av=(r,e,t,{ignore:i=[]}={})=>{let n=new Set(i),s=new Set(t),o=Vde[e];return Qt({test:(a,l)=>{let c=new Set(Object.keys(a));if(!c.has(r)||n.has(a[r]))return!0;let u=[];for(let g of s)(c.has(g)&&!n.has(a[g]))!==o.expect&&u.push(g);return u.length>=1?pt(l,`Property "${r}" ${o.message} ${kI(u.length,"property","properties")} ${u.map(g=>`"${g}"`).join(", ")}`):!0}})}});var qH=w((A$e,jH)=>{"use strict";jH.exports=(r,...e)=>new Promise(t=>{t(r(...e))})});var Jg=w((l$e,pv)=>{"use strict";var gCe=qH(),JH=r=>{if(r<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],t=0,i=()=>{t--,e.length>0&&e.shift()()},n=(a,l,...c)=>{t++;let u=gCe(a,...c);l(u),u.then(i,i)},s=(a,l,...c)=>{tnew Promise(c=>s(a,c,...l));return Object.defineProperties(o,{activeCount:{get:()=>t},pendingCount:{get:()=>e.length}}),o};pv.exports=JH;pv.exports.default=JH});var gd=w((u$e,WH)=>{var fCe="2.0.0",hCe=Number.MAX_SAFE_INTEGER||9007199254740991,pCe=16;WH.exports={SEMVER_SPEC_VERSION:fCe,MAX_LENGTH:256,MAX_SAFE_INTEGER:hCe,MAX_SAFE_COMPONENT_LENGTH:pCe}});var fd=w((g$e,zH)=>{var dCe=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...r)=>console.error("SEMVER",...r):()=>{};zH.exports=dCe});var uc=w((NA,VH)=>{var{MAX_SAFE_COMPONENT_LENGTH:dv}=gd(),CCe=fd();NA=VH.exports={};var mCe=NA.re=[],et=NA.src=[],tt=NA.t={},ECe=0,St=(r,e,t)=>{let i=ECe++;CCe(i,e),tt[r]=i,et[i]=e,mCe[i]=new RegExp(e,t?"g":void 0)};St("NUMERICIDENTIFIER","0|[1-9]\\d*");St("NUMERICIDENTIFIERLOOSE","[0-9]+");St("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*");St("MAINVERSION",`(${et[tt.NUMERICIDENTIFIER]})\\.(${et[tt.NUMERICIDENTIFIER]})\\.(${et[tt.NUMERICIDENTIFIER]})`);St("MAINVERSIONLOOSE",`(${et[tt.NUMERICIDENTIFIERLOOSE]})\\.(${et[tt.NUMERICIDENTIFIERLOOSE]})\\.(${et[tt.NUMERICIDENTIFIERLOOSE]})`);St("PRERELEASEIDENTIFIER",`(?:${et[tt.NUMERICIDENTIFIER]}|${et[tt.NONNUMERICIDENTIFIER]})`);St("PRERELEASEIDENTIFIERLOOSE",`(?:${et[tt.NUMERICIDENTIFIERLOOSE]}|${et[tt.NONNUMERICIDENTIFIER]})`);St("PRERELEASE",`(?:-(${et[tt.PRERELEASEIDENTIFIER]}(?:\\.${et[tt.PRERELEASEIDENTIFIER]})*))`);St("PRERELEASELOOSE",`(?:-?(${et[tt.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${et[tt.PRERELEASEIDENTIFIERLOOSE]})*))`);St("BUILDIDENTIFIER","[0-9A-Za-z-]+");St("BUILD",`(?:\\+(${et[tt.BUILDIDENTIFIER]}(?:\\.${et[tt.BUILDIDENTIFIER]})*))`);St("FULLPLAIN",`v?${et[tt.MAINVERSION]}${et[tt.PRERELEASE]}?${et[tt.BUILD]}?`);St("FULL",`^${et[tt.FULLPLAIN]}$`);St("LOOSEPLAIN",`[v=\\s]*${et[tt.MAINVERSIONLOOSE]}${et[tt.PRERELEASELOOSE]}?${et[tt.BUILD]}?`);St("LOOSE",`^${et[tt.LOOSEPLAIN]}$`);St("GTLT","((?:<|>)?=?)");St("XRANGEIDENTIFIERLOOSE",`${et[tt.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);St("XRANGEIDENTIFIER",`${et[tt.NUMERICIDENTIFIER]}|x|X|\\*`);St("XRANGEPLAIN",`[v=\\s]*(${et[tt.XRANGEIDENTIFIER]})(?:\\.(${et[tt.XRANGEIDENTIFIER]})(?:\\.(${et[tt.XRANGEIDENTIFIER]})(?:${et[tt.PRERELEASE]})?${et[tt.BUILD]}?)?)?`);St("XRANGEPLAINLOOSE",`[v=\\s]*(${et[tt.XRANGEIDENTIFIERLOOSE]})(?:\\.(${et[tt.XRANGEIDENTIFIERLOOSE]})(?:\\.(${et[tt.XRANGEIDENTIFIERLOOSE]})(?:${et[tt.PRERELEASELOOSE]})?${et[tt.BUILD]}?)?)?`);St("XRANGE",`^${et[tt.GTLT]}\\s*${et[tt.XRANGEPLAIN]}$`);St("XRANGELOOSE",`^${et[tt.GTLT]}\\s*${et[tt.XRANGEPLAINLOOSE]}$`);St("COERCE",`(^|[^\\d])(\\d{1,${dv}})(?:\\.(\\d{1,${dv}}))?(?:\\.(\\d{1,${dv}}))?(?:$|[^\\d])`);St("COERCERTL",et[tt.COERCE],!0);St("LONETILDE","(?:~>?)");St("TILDETRIM",`(\\s*)${et[tt.LONETILDE]}\\s+`,!0);NA.tildeTrimReplace="$1~";St("TILDE",`^${et[tt.LONETILDE]}${et[tt.XRANGEPLAIN]}$`);St("TILDELOOSE",`^${et[tt.LONETILDE]}${et[tt.XRANGEPLAINLOOSE]}$`);St("LONECARET","(?:\\^)");St("CARETTRIM",`(\\s*)${et[tt.LONECARET]}\\s+`,!0);NA.caretTrimReplace="$1^";St("CARET",`^${et[tt.LONECARET]}${et[tt.XRANGEPLAIN]}$`);St("CARETLOOSE",`^${et[tt.LONECARET]}${et[tt.XRANGEPLAINLOOSE]}$`);St("COMPARATORLOOSE",`^${et[tt.GTLT]}\\s*(${et[tt.LOOSEPLAIN]})$|^$`);St("COMPARATOR",`^${et[tt.GTLT]}\\s*(${et[tt.FULLPLAIN]})$|^$`);St("COMPARATORTRIM",`(\\s*)${et[tt.GTLT]}\\s*(${et[tt.LOOSEPLAIN]}|${et[tt.XRANGEPLAIN]})`,!0);NA.comparatorTrimReplace="$1$2$3";St("HYPHENRANGE",`^\\s*(${et[tt.XRANGEPLAIN]})\\s+-\\s+(${et[tt.XRANGEPLAIN]})\\s*$`);St("HYPHENRANGELOOSE",`^\\s*(${et[tt.XRANGEPLAINLOOSE]})\\s+-\\s+(${et[tt.XRANGEPLAINLOOSE]})\\s*$`);St("STAR","(<|>)?=?\\s*\\*");St("GTE0","^\\s*>=\\s*0.0.0\\s*$");St("GTE0PRE","^\\s*>=\\s*0.0.0-0\\s*$")});var hd=w((f$e,XH)=>{var ICe=["includePrerelease","loose","rtl"],yCe=r=>r?typeof r!="object"?{loose:!0}:ICe.filter(e=>r[e]).reduce((e,t)=>(e[t]=!0,e),{}):{};XH.exports=yCe});var OI=w((h$e,$H)=>{var ZH=/^[0-9]+$/,_H=(r,e)=>{let t=ZH.test(r),i=ZH.test(e);return t&&i&&(r=+r,e=+e),r===e?0:t&&!i?-1:i&&!t?1:r_H(e,r);$H.exports={compareIdentifiers:_H,rcompareIdentifiers:wCe}});var Li=w((p$e,iG)=>{var MI=fd(),{MAX_LENGTH:eG,MAX_SAFE_INTEGER:KI}=gd(),{re:tG,t:rG}=uc(),BCe=hd(),{compareIdentifiers:pd}=OI(),Yn=class{constructor(e,t){if(t=BCe(t),e instanceof Yn){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid Version: ${e}`);if(e.length>eG)throw new TypeError(`version is longer than ${eG} characters`);MI("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let i=e.trim().match(t.loose?tG[rG.LOOSE]:tG[rG.FULL]);if(!i)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+i[1],this.minor=+i[2],this.patch=+i[3],this.major>KI||this.major<0)throw new TypeError("Invalid major version");if(this.minor>KI||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>KI||this.patch<0)throw new TypeError("Invalid patch version");i[4]?this.prerelease=i[4].split(".").map(n=>{if(/^[0-9]+$/.test(n)){let s=+n;if(s>=0&&s=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);i===-1&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error(`invalid increment argument: ${e}`)}return this.format(),this.raw=this.version,this}};iG.exports=Yn});var gc=w((d$e,aG)=>{var{MAX_LENGTH:bCe}=gd(),{re:nG,t:sG}=uc(),oG=Li(),QCe=hd(),SCe=(r,e)=>{if(e=QCe(e),r instanceof oG)return r;if(typeof r!="string"||r.length>bCe||!(e.loose?nG[sG.LOOSE]:nG[sG.FULL]).test(r))return null;try{return new oG(r,e)}catch{return null}};aG.exports=SCe});var lG=w((C$e,AG)=>{var vCe=gc(),xCe=(r,e)=>{let t=vCe(r,e);return t?t.version:null};AG.exports=xCe});var uG=w((m$e,cG)=>{var PCe=gc(),DCe=(r,e)=>{let t=PCe(r.trim().replace(/^[=v]+/,""),e);return t?t.version:null};cG.exports=DCe});var fG=w((E$e,gG)=>{var kCe=Li(),RCe=(r,e,t,i)=>{typeof t=="string"&&(i=t,t=void 0);try{return new kCe(r,t).inc(e,i).version}catch{return null}};gG.exports=RCe});var cs=w((I$e,pG)=>{var hG=Li(),FCe=(r,e,t)=>new hG(r,t).compare(new hG(e,t));pG.exports=FCe});var UI=w((y$e,dG)=>{var NCe=cs(),TCe=(r,e,t)=>NCe(r,e,t)===0;dG.exports=TCe});var EG=w((w$e,mG)=>{var CG=gc(),LCe=UI(),OCe=(r,e)=>{if(LCe(r,e))return null;{let t=CG(r),i=CG(e),n=t.prerelease.length||i.prerelease.length,s=n?"pre":"",o=n?"prerelease":"";for(let a in t)if((a==="major"||a==="minor"||a==="patch")&&t[a]!==i[a])return s+a;return o}};mG.exports=OCe});var yG=w((B$e,IG)=>{var MCe=Li(),KCe=(r,e)=>new MCe(r,e).major;IG.exports=KCe});var BG=w((b$e,wG)=>{var UCe=Li(),HCe=(r,e)=>new UCe(r,e).minor;wG.exports=HCe});var QG=w((Q$e,bG)=>{var GCe=Li(),YCe=(r,e)=>new GCe(r,e).patch;bG.exports=YCe});var vG=w((S$e,SG)=>{var jCe=gc(),qCe=(r,e)=>{let t=jCe(r,e);return t&&t.prerelease.length?t.prerelease:null};SG.exports=qCe});var PG=w((v$e,xG)=>{var JCe=cs(),WCe=(r,e,t)=>JCe(e,r,t);xG.exports=WCe});var kG=w((x$e,DG)=>{var zCe=cs(),VCe=(r,e)=>zCe(r,e,!0);DG.exports=VCe});var HI=w((P$e,FG)=>{var RG=Li(),XCe=(r,e,t)=>{let i=new RG(r,t),n=new RG(e,t);return i.compare(n)||i.compareBuild(n)};FG.exports=XCe});var TG=w((D$e,NG)=>{var ZCe=HI(),_Ce=(r,e)=>r.sort((t,i)=>ZCe(t,i,e));NG.exports=_Ce});var OG=w((k$e,LG)=>{var $Ce=HI(),eme=(r,e)=>r.sort((t,i)=>$Ce(i,t,e));LG.exports=eme});var dd=w((R$e,MG)=>{var tme=cs(),rme=(r,e,t)=>tme(r,e,t)>0;MG.exports=rme});var GI=w((F$e,KG)=>{var ime=cs(),nme=(r,e,t)=>ime(r,e,t)<0;KG.exports=nme});var Cv=w((N$e,UG)=>{var sme=cs(),ome=(r,e,t)=>sme(r,e,t)!==0;UG.exports=ome});var YI=w((T$e,HG)=>{var ame=cs(),Ame=(r,e,t)=>ame(r,e,t)>=0;HG.exports=Ame});var jI=w((L$e,GG)=>{var lme=cs(),cme=(r,e,t)=>lme(r,e,t)<=0;GG.exports=cme});var mv=w((O$e,YG)=>{var ume=UI(),gme=Cv(),fme=dd(),hme=YI(),pme=GI(),dme=jI(),Cme=(r,e,t,i)=>{switch(e){case"===":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r===t;case"!==":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r!==t;case"":case"=":case"==":return ume(r,t,i);case"!=":return gme(r,t,i);case">":return fme(r,t,i);case">=":return hme(r,t,i);case"<":return pme(r,t,i);case"<=":return dme(r,t,i);default:throw new TypeError(`Invalid operator: ${e}`)}};YG.exports=Cme});var qG=w((M$e,jG)=>{var mme=Li(),Eme=gc(),{re:qI,t:JI}=uc(),Ime=(r,e)=>{if(r instanceof mme)return r;if(typeof r=="number"&&(r=String(r)),typeof r!="string")return null;e=e||{};let t=null;if(!e.rtl)t=r.match(qI[JI.COERCE]);else{let i;for(;(i=qI[JI.COERCERTL].exec(r))&&(!t||t.index+t[0].length!==r.length);)(!t||i.index+i[0].length!==t.index+t[0].length)&&(t=i),qI[JI.COERCERTL].lastIndex=i.index+i[1].length+i[2].length;qI[JI.COERCERTL].lastIndex=-1}return t===null?null:Eme(`${t[2]}.${t[3]||"0"}.${t[4]||"0"}`,e)};jG.exports=Ime});var WG=w((K$e,JG)=>{"use strict";JG.exports=function(r){r.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var WI=w((U$e,zG)=>{"use strict";zG.exports=Ht;Ht.Node=fc;Ht.create=Ht;function Ht(r){var e=this;if(e instanceof Ht||(e=new Ht),e.tail=null,e.head=null,e.length=0,r&&typeof r.forEach=="function")r.forEach(function(n){e.push(n)});else if(arguments.length>0)for(var t=0,i=arguments.length;t1)t=e;else if(this.head)i=this.head.next,t=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;i!==null;n++)t=r(t,i.value,n),i=i.next;return t};Ht.prototype.reduceReverse=function(r,e){var t,i=this.tail;if(arguments.length>1)t=e;else if(this.tail)i=this.tail.prev,t=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=this.length-1;i!==null;n--)t=r(t,i.value,n),i=i.prev;return t};Ht.prototype.toArray=function(){for(var r=new Array(this.length),e=0,t=this.head;t!==null;e++)r[e]=t.value,t=t.next;return r};Ht.prototype.toArrayReverse=function(){for(var r=new Array(this.length),e=0,t=this.tail;t!==null;e++)r[e]=t.value,t=t.prev;return r};Ht.prototype.slice=function(r,e){e=e||this.length,e<0&&(e+=this.length),r=r||0,r<0&&(r+=this.length);var t=new Ht;if(ethis.length&&(e=this.length);for(var i=0,n=this.head;n!==null&&ithis.length&&(e=this.length);for(var i=this.length,n=this.tail;n!==null&&i>e;i--)n=n.prev;for(;n!==null&&i>r;i--,n=n.prev)t.push(n.value);return t};Ht.prototype.splice=function(r,e,...t){r>this.length&&(r=this.length-1),r<0&&(r=this.length+r);for(var i=0,n=this.head;n!==null&&i{"use strict";var bme=WI(),hc=Symbol("max"),va=Symbol("length"),Wg=Symbol("lengthCalculator"),md=Symbol("allowStale"),pc=Symbol("maxAge"),Sa=Symbol("dispose"),VG=Symbol("noDisposeOnSet"),di=Symbol("lruList"),Zs=Symbol("cache"),ZG=Symbol("updateAgeOnGet"),Ev=()=>1,yv=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let t=this[hc]=e.max||1/0,i=e.length||Ev;if(this[Wg]=typeof i!="function"?Ev:i,this[md]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[pc]=e.maxAge||0,this[Sa]=e.dispose,this[VG]=e.noDisposeOnSet||!1,this[ZG]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[hc]=e||1/0,Cd(this)}get max(){return this[hc]}set allowStale(e){this[md]=!!e}get allowStale(){return this[md]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[pc]=e,Cd(this)}get maxAge(){return this[pc]}set lengthCalculator(e){typeof e!="function"&&(e=Ev),e!==this[Wg]&&(this[Wg]=e,this[va]=0,this[di].forEach(t=>{t.length=this[Wg](t.value,t.key),this[va]+=t.length})),Cd(this)}get lengthCalculator(){return this[Wg]}get length(){return this[va]}get itemCount(){return this[di].length}rforEach(e,t){t=t||this;for(let i=this[di].tail;i!==null;){let n=i.prev;XG(this,e,i,t),i=n}}forEach(e,t){t=t||this;for(let i=this[di].head;i!==null;){let n=i.next;XG(this,e,i,t),i=n}}keys(){return this[di].toArray().map(e=>e.key)}values(){return this[di].toArray().map(e=>e.value)}reset(){this[Sa]&&this[di]&&this[di].length&&this[di].forEach(e=>this[Sa](e.key,e.value)),this[Zs]=new Map,this[di]=new bme,this[va]=0}dump(){return this[di].map(e=>zI(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[di]}set(e,t,i){if(i=i||this[pc],i&&typeof i!="number")throw new TypeError("maxAge must be a number");let n=i?Date.now():0,s=this[Wg](t,e);if(this[Zs].has(e)){if(s>this[hc])return zg(this,this[Zs].get(e)),!1;let l=this[Zs].get(e).value;return this[Sa]&&(this[VG]||this[Sa](e,l.value)),l.now=n,l.maxAge=i,l.value=t,this[va]+=s-l.length,l.length=s,this.get(e),Cd(this),!0}let o=new wv(e,t,s,n,i);return o.length>this[hc]?(this[Sa]&&this[Sa](e,t),!1):(this[va]+=o.length,this[di].unshift(o),this[Zs].set(e,this[di].head),Cd(this),!0)}has(e){if(!this[Zs].has(e))return!1;let t=this[Zs].get(e).value;return!zI(this,t)}get(e){return Iv(this,e,!0)}peek(e){return Iv(this,e,!1)}pop(){let e=this[di].tail;return e?(zg(this,e),e.value):null}del(e){zg(this,this[Zs].get(e))}load(e){this.reset();let t=Date.now();for(let i=e.length-1;i>=0;i--){let n=e[i],s=n.e||0;if(s===0)this.set(n.k,n.v);else{let o=s-t;o>0&&this.set(n.k,n.v,o)}}}prune(){this[Zs].forEach((e,t)=>Iv(this,t,!1))}},Iv=(r,e,t)=>{let i=r[Zs].get(e);if(i){let n=i.value;if(zI(r,n)){if(zg(r,i),!r[md])return}else t&&(r[ZG]&&(i.value.now=Date.now()),r[di].unshiftNode(i));return n.value}},zI=(r,e)=>{if(!e||!e.maxAge&&!r[pc])return!1;let t=Date.now()-e.now;return e.maxAge?t>e.maxAge:r[pc]&&t>r[pc]},Cd=r=>{if(r[va]>r[hc])for(let e=r[di].tail;r[va]>r[hc]&&e!==null;){let t=e.prev;zg(r,e),e=t}},zg=(r,e)=>{if(e){let t=e.value;r[Sa]&&r[Sa](t.key,t.value),r[va]-=t.length,r[Zs].delete(t.key),r[di].removeNode(e)}},wv=class{constructor(e,t,i,n,s){this.key=e,this.value=t,this.length=i,this.now=n,this.maxAge=s||0}},XG=(r,e,t,i)=>{let n=t.value;zI(r,n)&&(zg(r,t),r[md]||(n=void 0)),n&&e.call(i,n.value,n.key,r)};_G.exports=yv});var us=w((G$e,iY)=>{var dc=class{constructor(e,t){if(t=Sme(t),e instanceof dc)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new dc(e.raw,t);if(e instanceof Bv)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(i=>this.parseRange(i.trim())).filter(i=>i.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${e}`);if(this.set.length>1){let i=this.set[0];if(this.set=this.set.filter(n=>!tY(n[0])),this.set.length===0)this.set=[i];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&kme(n[0])){this.set=[n];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){e=e.trim();let i=`parseRange:${Object.keys(this.options).join(",")}:${e}`,n=eY.get(i);if(n)return n;let s=this.options.loose,o=s?Oi[bi.HYPHENRANGELOOSE]:Oi[bi.HYPHENRANGE];e=e.replace(o,Hme(this.options.includePrerelease)),Hr("hyphen replace",e),e=e.replace(Oi[bi.COMPARATORTRIM],xme),Hr("comparator trim",e,Oi[bi.COMPARATORTRIM]),e=e.replace(Oi[bi.TILDETRIM],Pme),e=e.replace(Oi[bi.CARETTRIM],Dme),e=e.split(/\s+/).join(" ");let a=s?Oi[bi.COMPARATORLOOSE]:Oi[bi.COMPARATOR],l=e.split(" ").map(f=>Rme(f,this.options)).join(" ").split(/\s+/).map(f=>Ume(f,this.options)).filter(this.options.loose?f=>!!f.match(a):()=>!0).map(f=>new Bv(f,this.options)),c=l.length,u=new Map;for(let f of l){if(tY(f))return[f];u.set(f.value,f)}u.size>1&&u.has("")&&u.delete("");let g=[...u.values()];return eY.set(i,g),g}intersects(e,t){if(!(e instanceof dc))throw new TypeError("a Range is required");return this.set.some(i=>rY(i,t)&&e.set.some(n=>rY(n,t)&&i.every(s=>n.every(o=>s.intersects(o,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new vme(e,this.options)}catch{return!1}for(let t=0;tr.value==="<0.0.0-0",kme=r=>r.value==="",rY=(r,e)=>{let t=!0,i=r.slice(),n=i.pop();for(;t&&i.length;)t=i.every(s=>n.intersects(s,e)),n=i.pop();return t},Rme=(r,e)=>(Hr("comp",r,e),r=Tme(r,e),Hr("caret",r),r=Fme(r,e),Hr("tildes",r),r=Ome(r,e),Hr("xrange",r),r=Kme(r,e),Hr("stars",r),r),$i=r=>!r||r.toLowerCase()==="x"||r==="*",Fme=(r,e)=>r.trim().split(/\s+/).map(t=>Nme(t,e)).join(" "),Nme=(r,e)=>{let t=e.loose?Oi[bi.TILDELOOSE]:Oi[bi.TILDE];return r.replace(t,(i,n,s,o,a)=>{Hr("tilde",r,i,n,s,o,a);let l;return $i(n)?l="":$i(s)?l=`>=${n}.0.0 <${+n+1}.0.0-0`:$i(o)?l=`>=${n}.${s}.0 <${n}.${+s+1}.0-0`:a?(Hr("replaceTilde pr",a),l=`>=${n}.${s}.${o}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${o} <${n}.${+s+1}.0-0`,Hr("tilde return",l),l})},Tme=(r,e)=>r.trim().split(/\s+/).map(t=>Lme(t,e)).join(" "),Lme=(r,e)=>{Hr("caret",r,e);let t=e.loose?Oi[bi.CARETLOOSE]:Oi[bi.CARET],i=e.includePrerelease?"-0":"";return r.replace(t,(n,s,o,a,l)=>{Hr("caret",r,n,s,o,a,l);let c;return $i(s)?c="":$i(o)?c=`>=${s}.0.0${i} <${+s+1}.0.0-0`:$i(a)?s==="0"?c=`>=${s}.${o}.0${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.0${i} <${+s+1}.0.0-0`:l?(Hr("replaceCaret pr",l),s==="0"?o==="0"?c=`>=${s}.${o}.${a}-${l} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}-${l} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a}-${l} <${+s+1}.0.0-0`):(Hr("no pr"),s==="0"?o==="0"?c=`>=${s}.${o}.${a}${i} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a} <${+s+1}.0.0-0`),Hr("caret return",c),c})},Ome=(r,e)=>(Hr("replaceXRanges",r,e),r.split(/\s+/).map(t=>Mme(t,e)).join(" ")),Mme=(r,e)=>{r=r.trim();let t=e.loose?Oi[bi.XRANGELOOSE]:Oi[bi.XRANGE];return r.replace(t,(i,n,s,o,a,l)=>{Hr("xRange",r,i,n,s,o,a,l);let c=$i(s),u=c||$i(o),g=u||$i(a),f=g;return n==="="&&f&&(n=""),l=e.includePrerelease?"-0":"",c?n===">"||n==="<"?i="<0.0.0-0":i="*":n&&f?(u&&(o=0),a=0,n===">"?(n=">=",u?(s=+s+1,o=0,a=0):(o=+o+1,a=0)):n==="<="&&(n="<",u?s=+s+1:o=+o+1),n==="<"&&(l="-0"),i=`${n+s}.${o}.${a}${l}`):u?i=`>=${s}.0.0${l} <${+s+1}.0.0-0`:g&&(i=`>=${s}.${o}.0${l} <${s}.${+o+1}.0-0`),Hr("xRange return",i),i})},Kme=(r,e)=>(Hr("replaceStars",r,e),r.trim().replace(Oi[bi.STAR],"")),Ume=(r,e)=>(Hr("replaceGTE0",r,e),r.trim().replace(Oi[e.includePrerelease?bi.GTE0PRE:bi.GTE0],"")),Hme=r=>(e,t,i,n,s,o,a,l,c,u,g,f,h)=>($i(i)?t="":$i(n)?t=`>=${i}.0.0${r?"-0":""}`:$i(s)?t=`>=${i}.${n}.0${r?"-0":""}`:o?t=`>=${t}`:t=`>=${t}${r?"-0":""}`,$i(c)?l="":$i(u)?l=`<${+c+1}.0.0-0`:$i(g)?l=`<${c}.${+u+1}.0-0`:f?l=`<=${c}.${u}.${g}-${f}`:r?l=`<${c}.${u}.${+g+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),Gme=(r,e,t)=>{for(let i=0;i0){let n=r[i].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0}});var Ed=w((Y$e,AY)=>{var Id=Symbol("SemVer ANY"),Vg=class{static get ANY(){return Id}constructor(e,t){if(t=Yme(t),e instanceof Vg){if(e.loose===!!t.loose)return e;e=e.value}Qv("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===Id?this.value="":this.value=this.operator+this.semver.version,Qv("comp",this)}parse(e){let t=this.options.loose?nY[sY.COMPARATORLOOSE]:nY[sY.COMPARATOR],i=e.match(t);if(!i)throw new TypeError(`Invalid comparator: ${e}`);this.operator=i[1]!==void 0?i[1]:"",this.operator==="="&&(this.operator=""),i[2]?this.semver=new oY(i[2],this.options.loose):this.semver=Id}toString(){return this.value}test(e){if(Qv("Comparator.test",e,this.options.loose),this.semver===Id||e===Id)return!0;if(typeof e=="string")try{e=new oY(e,this.options)}catch{return!1}return bv(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof Vg))throw new TypeError("a Comparator is required");if((!t||typeof t!="object")&&(t={loose:!!t,includePrerelease:!1}),this.operator==="")return this.value===""?!0:new aY(e.value,t).test(this.value);if(e.operator==="")return e.value===""?!0:new aY(this.value,t).test(e.semver);let i=(this.operator===">="||this.operator===">")&&(e.operator===">="||e.operator===">"),n=(this.operator==="<="||this.operator==="<")&&(e.operator==="<="||e.operator==="<"),s=this.semver.version===e.semver.version,o=(this.operator===">="||this.operator==="<=")&&(e.operator===">="||e.operator==="<="),a=bv(this.semver,"<",e.semver,t)&&(this.operator===">="||this.operator===">")&&(e.operator==="<="||e.operator==="<"),l=bv(this.semver,">",e.semver,t)&&(this.operator==="<="||this.operator==="<")&&(e.operator===">="||e.operator===">");return i||n||s&&o||a||l}};AY.exports=Vg;var Yme=hd(),{re:nY,t:sY}=uc(),bv=mv(),Qv=fd(),oY=Li(),aY=us()});var yd=w((j$e,lY)=>{var jme=us(),qme=(r,e,t)=>{try{e=new jme(e,t)}catch{return!1}return e.test(r)};lY.exports=qme});var uY=w((q$e,cY)=>{var Jme=us(),Wme=(r,e)=>new Jme(r,e).set.map(t=>t.map(i=>i.value).join(" ").trim().split(" "));cY.exports=Wme});var fY=w((J$e,gY)=>{var zme=Li(),Vme=us(),Xme=(r,e,t)=>{let i=null,n=null,s=null;try{s=new Vme(e,t)}catch{return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===-1)&&(i=o,n=new zme(i,t))}),i};gY.exports=Xme});var pY=w((W$e,hY)=>{var Zme=Li(),_me=us(),$me=(r,e,t)=>{let i=null,n=null,s=null;try{s=new _me(e,t)}catch{return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===1)&&(i=o,n=new Zme(i,t))}),i};hY.exports=$me});var mY=w((z$e,CY)=>{var Sv=Li(),eEe=us(),dY=dd(),tEe=(r,e)=>{r=new eEe(r,e);let t=new Sv("0.0.0");if(r.test(t)||(t=new Sv("0.0.0-0"),r.test(t)))return t;t=null;for(let i=0;i{let a=new Sv(o.semver.version);switch(o.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!s||dY(a,s))&&(s=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),s&&(!t||dY(t,s))&&(t=s)}return t&&r.test(t)?t:null};CY.exports=tEe});var IY=w((V$e,EY)=>{var rEe=us(),iEe=(r,e)=>{try{return new rEe(r,e).range||"*"}catch{return null}};EY.exports=iEe});var VI=w((X$e,bY)=>{var nEe=Li(),BY=Ed(),{ANY:sEe}=BY,oEe=us(),aEe=yd(),yY=dd(),wY=GI(),AEe=jI(),lEe=YI(),cEe=(r,e,t,i)=>{r=new nEe(r,i),e=new oEe(e,i);let n,s,o,a,l;switch(t){case">":n=yY,s=AEe,o=wY,a=">",l=">=";break;case"<":n=wY,s=lEe,o=yY,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(aEe(r,e,i))return!1;for(let c=0;c{h.semver===sEe&&(h=new BY(">=0.0.0")),g=g||h,f=f||h,n(h.semver,g.semver,i)?g=h:o(h.semver,f.semver,i)&&(f=h)}),g.operator===a||g.operator===l||(!f.operator||f.operator===a)&&s(r,f.semver))return!1;if(f.operator===l&&o(r,f.semver))return!1}return!0};bY.exports=cEe});var SY=w((Z$e,QY)=>{var uEe=VI(),gEe=(r,e,t)=>uEe(r,e,">",t);QY.exports=gEe});var xY=w((_$e,vY)=>{var fEe=VI(),hEe=(r,e,t)=>fEe(r,e,"<",t);vY.exports=hEe});var kY=w(($$e,DY)=>{var PY=us(),pEe=(r,e,t)=>(r=new PY(r,t),e=new PY(e,t),r.intersects(e));DY.exports=pEe});var FY=w((eet,RY)=>{var dEe=yd(),CEe=cs();RY.exports=(r,e,t)=>{let i=[],n=null,s=null,o=r.sort((u,g)=>CEe(u,g,t));for(let u of o)dEe(u,e,t)?(s=u,n||(n=u)):(s&&i.push([n,s]),s=null,n=null);n&&i.push([n,null]);let a=[];for(let[u,g]of i)u===g?a.push(u):!g&&u===o[0]?a.push("*"):g?u===o[0]?a.push(`<=${g}`):a.push(`${u} - ${g}`):a.push(`>=${u}`);let l=a.join(" || "),c=typeof e.raw=="string"?e.raw:String(e);return l.length{var NY=us(),XI=Ed(),{ANY:vv}=XI,wd=yd(),xv=cs(),mEe=(r,e,t={})=>{if(r===e)return!0;r=new NY(r,t),e=new NY(e,t);let i=!1;e:for(let n of r.set){for(let s of e.set){let o=EEe(n,s,t);if(i=i||o!==null,o)continue e}if(i)return!1}return!0},EEe=(r,e,t)=>{if(r===e)return!0;if(r.length===1&&r[0].semver===vv){if(e.length===1&&e[0].semver===vv)return!0;t.includePrerelease?r=[new XI(">=0.0.0-0")]:r=[new XI(">=0.0.0")]}if(e.length===1&&e[0].semver===vv){if(t.includePrerelease)return!0;e=[new XI(">=0.0.0")]}let i=new Set,n,s;for(let h of r)h.operator===">"||h.operator===">="?n=TY(n,h,t):h.operator==="<"||h.operator==="<="?s=LY(s,h,t):i.add(h.semver);if(i.size>1)return null;let o;if(n&&s){if(o=xv(n.semver,s.semver,t),o>0)return null;if(o===0&&(n.operator!==">="||s.operator!=="<="))return null}for(let h of i){if(n&&!wd(h,String(n),t)||s&&!wd(h,String(s),t))return null;for(let p of e)if(!wd(h,String(p),t))return!1;return!0}let a,l,c,u,g=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,f=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1;g&&g.prerelease.length===1&&s.operator==="<"&&g.prerelease[0]===0&&(g=!1);for(let h of e){if(u=u||h.operator===">"||h.operator===">=",c=c||h.operator==="<"||h.operator==="<=",n){if(f&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===f.major&&h.semver.minor===f.minor&&h.semver.patch===f.patch&&(f=!1),h.operator===">"||h.operator===">="){if(a=TY(n,h,t),a===h&&a!==n)return!1}else if(n.operator===">="&&!wd(n.semver,String(h),t))return!1}if(s){if(g&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===g.major&&h.semver.minor===g.minor&&h.semver.patch===g.patch&&(g=!1),h.operator==="<"||h.operator==="<="){if(l=LY(s,h,t),l===h&&l!==s)return!1}else if(s.operator==="<="&&!wd(s.semver,String(h),t))return!1}if(!h.operator&&(s||n)&&o!==0)return!1}return!(n&&c&&!s&&o!==0||s&&u&&!n&&o!==0||f||g)},TY=(r,e,t)=>{if(!r)return e;let i=xv(r.semver,e.semver,t);return i>0?r:i<0||e.operator===">"&&r.operator===">="?e:r},LY=(r,e,t)=>{if(!r)return e;let i=xv(r.semver,e.semver,t);return i<0?r:i>0||e.operator==="<"&&r.operator==="<="?e:r};OY.exports=mEe});var Xr=w((ret,KY)=>{var Pv=uc();KY.exports={re:Pv.re,src:Pv.src,tokens:Pv.t,SEMVER_SPEC_VERSION:gd().SEMVER_SPEC_VERSION,SemVer:Li(),compareIdentifiers:OI().compareIdentifiers,rcompareIdentifiers:OI().rcompareIdentifiers,parse:gc(),valid:lG(),clean:uG(),inc:fG(),diff:EG(),major:yG(),minor:BG(),patch:QG(),prerelease:vG(),compare:cs(),rcompare:PG(),compareLoose:kG(),compareBuild:HI(),sort:TG(),rsort:OG(),gt:dd(),lt:GI(),eq:UI(),neq:Cv(),gte:YI(),lte:jI(),cmp:mv(),coerce:qG(),Comparator:Ed(),Range:us(),satisfies:yd(),toComparators:uY(),maxSatisfying:fY(),minSatisfying:pY(),minVersion:mY(),validRange:IY(),outside:VI(),gtr:SY(),ltr:xY(),intersects:kY(),simplifyRange:FY(),subset:MY()}});var Dv=w(ZI=>{"use strict";Object.defineProperty(ZI,"__esModule",{value:!0});ZI.VERSION=void 0;ZI.VERSION="9.1.0"});var Gt=w((exports,module)=>{"use strict";var __spreadArray=exports&&exports.__spreadArray||function(r,e,t){if(t||arguments.length===2)for(var i=0,n=e.length,s;i{(function(r,e){typeof define=="function"&&define.amd?define([],e):typeof _I=="object"&&_I.exports?_I.exports=e():r.regexpToAst=e()})(typeof self<"u"?self:UY,function(){function r(){}r.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},r.prototype.restoreState=function(p){this.idx=p.idx,this.input=p.input,this.groupIdx=p.groupIdx},r.prototype.pattern=function(p){this.idx=0,this.input=p,this.groupIdx=0,this.consumeChar("/");var C=this.disjunction();this.consumeChar("/");for(var y={type:"Flags",loc:{begin:this.idx,end:p.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case"g":o(y,"global");break;case"i":o(y,"ignoreCase");break;case"m":o(y,"multiLine");break;case"u":o(y,"unicode");break;case"y":o(y,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:y,value:C,loc:this.loc(0)}},r.prototype.disjunction=function(){var p=[],C=this.idx;for(p.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),p.push(this.alternative());return{type:"Disjunction",value:p,loc:this.loc(C)}},r.prototype.alternative=function(){for(var p=[],C=this.idx;this.isTerm();)p.push(this.term());return{type:"Alternative",value:p,loc:this.loc(C)}},r.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},r.prototype.assertion=function(){var p=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(p)};case"$":return{type:"EndAnchor",loc:this.loc(p)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(p)};case"B":return{type:"NonWordBoundary",loc:this.loc(p)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");var C;switch(this.popChar()){case"=":C="Lookahead";break;case"!":C="NegativeLookahead";break}a(C);var y=this.disjunction();return this.consumeChar(")"),{type:C,value:y,loc:this.loc(p)}}l()},r.prototype.quantifier=function(p){var C,y=this.idx;switch(this.popChar()){case"*":C={atLeast:0,atMost:1/0};break;case"+":C={atLeast:1,atMost:1/0};break;case"?":C={atLeast:0,atMost:1};break;case"{":var B=this.integerIncludingZero();switch(this.popChar()){case"}":C={atLeast:B,atMost:B};break;case",":var v;this.isDigit()?(v=this.integerIncludingZero(),C={atLeast:B,atMost:v}):C={atLeast:B,atMost:1/0},this.consumeChar("}");break}if(p===!0&&C===void 0)return;a(C);break}if(!(p===!0&&C===void 0))return a(C),this.peekChar(0)==="?"?(this.consumeChar("?"),C.greedy=!1):C.greedy=!0,C.type="Quantifier",C.loc=this.loc(y),C},r.prototype.atom=function(){var p,C=this.idx;switch(this.peekChar()){case".":p=this.dotAll();break;case"\\":p=this.atomEscape();break;case"[":p=this.characterClass();break;case"(":p=this.group();break}return p===void 0&&this.isPatternCharacter()&&(p=this.patternCharacter()),a(p),p.loc=this.loc(C),this.isQuantifier()&&(p.quantifier=this.quantifier()),p},r.prototype.dotAll=function(){return this.consumeChar("."),{type:"Set",complement:!0,value:[n(` +`),n("\r"),n("\u2028"),n("\u2029")]}},r.prototype.atomEscape=function(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},r.prototype.decimalEscapeAtom=function(){var p=this.positiveInteger();return{type:"GroupBackReference",value:p}},r.prototype.characterClassEscape=function(){var p,C=!1;switch(this.popChar()){case"d":p=u;break;case"D":p=u,C=!0;break;case"s":p=f;break;case"S":p=f,C=!0;break;case"w":p=g;break;case"W":p=g,C=!0;break}return a(p),{type:"Set",value:p,complement:C}},r.prototype.controlEscapeAtom=function(){var p;switch(this.popChar()){case"f":p=n("\f");break;case"n":p=n(` +`);break;case"r":p=n("\r");break;case"t":p=n(" ");break;case"v":p=n("\v");break}return a(p),{type:"Character",value:p}},r.prototype.controlLetterEscapeAtom=function(){this.consumeChar("c");var p=this.popChar();if(/[a-zA-Z]/.test(p)===!1)throw Error("Invalid ");var C=p.toUpperCase().charCodeAt(0)-64;return{type:"Character",value:C}},r.prototype.nulCharacterAtom=function(){return this.consumeChar("0"),{type:"Character",value:n("\0")}},r.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar("x"),this.parseHexDigits(2)},r.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar("u"),this.parseHexDigits(4)},r.prototype.identityEscapeAtom=function(){var p=this.popChar();return{type:"Character",value:n(p)}},r.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case` +`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:var p=this.popChar();return{type:"Character",value:n(p)}}},r.prototype.characterClass=function(){var p=[],C=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),C=!0);this.isClassAtom();){var y=this.classAtom(),B=y.type==="Character";if(B&&this.isRangeDash()){this.consumeChar("-");var v=this.classAtom(),D=v.type==="Character";if(D){if(v.value=this.input.length)throw Error("Unexpected end of input");this.idx++},r.prototype.loc=function(p){return{begin:p,end:this.idx}};var e=/[0-9a-fA-F]/,t=/[0-9]/,i=/[1-9]/;function n(p){return p.charCodeAt(0)}function s(p,C){p.length!==void 0?p.forEach(function(y){C.push(y)}):C.push(p)}function o(p,C){if(p[C]===!0)throw"duplicate flag "+C;p[C]=!0}function a(p){if(p===void 0)throw Error("Internal Error - Should never get here!")}function l(){throw Error("Internal Error - Should never get here!")}var c,u=[];for(c=n("0");c<=n("9");c++)u.push(c);var g=[n("_")].concat(u);for(c=n("a");c<=n("z");c++)g.push(c);for(c=n("A");c<=n("Z");c++)g.push(c);var f=[n(" "),n("\f"),n(` +`),n("\r"),n(" "),n("\v"),n(" "),n("\xA0"),n("\u1680"),n("\u2000"),n("\u2001"),n("\u2002"),n("\u2003"),n("\u2004"),n("\u2005"),n("\u2006"),n("\u2007"),n("\u2008"),n("\u2009"),n("\u200A"),n("\u2028"),n("\u2029"),n("\u202F"),n("\u205F"),n("\u3000"),n("\uFEFF")];function h(){}return h.prototype.visitChildren=function(p){for(var C in p){var y=p[C];p.hasOwnProperty(C)&&(y.type!==void 0?this.visit(y):Array.isArray(y)&&y.forEach(function(B){this.visit(B)},this))}},h.prototype.visit=function(p){switch(p.type){case"Pattern":this.visitPattern(p);break;case"Flags":this.visitFlags(p);break;case"Disjunction":this.visitDisjunction(p);break;case"Alternative":this.visitAlternative(p);break;case"StartAnchor":this.visitStartAnchor(p);break;case"EndAnchor":this.visitEndAnchor(p);break;case"WordBoundary":this.visitWordBoundary(p);break;case"NonWordBoundary":this.visitNonWordBoundary(p);break;case"Lookahead":this.visitLookahead(p);break;case"NegativeLookahead":this.visitNegativeLookahead(p);break;case"Character":this.visitCharacter(p);break;case"Set":this.visitSet(p);break;case"Group":this.visitGroup(p);break;case"GroupBackReference":this.visitGroupBackReference(p);break;case"Quantifier":this.visitQuantifier(p);break}this.visitChildren(p)},h.prototype.visitPattern=function(p){},h.prototype.visitFlags=function(p){},h.prototype.visitDisjunction=function(p){},h.prototype.visitAlternative=function(p){},h.prototype.visitStartAnchor=function(p){},h.prototype.visitEndAnchor=function(p){},h.prototype.visitWordBoundary=function(p){},h.prototype.visitNonWordBoundary=function(p){},h.prototype.visitLookahead=function(p){},h.prototype.visitNegativeLookahead=function(p){},h.prototype.visitCharacter=function(p){},h.prototype.visitSet=function(p){},h.prototype.visitGroup=function(p){},h.prototype.visitGroupBackReference=function(p){},h.prototype.visitQuantifier=function(p){},{RegExpParser:r,BaseRegExpVisitor:h,VERSION:"0.5.0"}})});var ty=w(Xg=>{"use strict";Object.defineProperty(Xg,"__esModule",{value:!0});Xg.clearRegExpParserCache=Xg.getRegExpAst=void 0;var IEe=$I(),ey={},yEe=new IEe.RegExpParser;function wEe(r){var e=r.toString();if(ey.hasOwnProperty(e))return ey[e];var t=yEe.pattern(e);return ey[e]=t,t}Xg.getRegExpAst=wEe;function BEe(){ey={}}Xg.clearRegExpParserCache=BEe});var qY=w(Cn=>{"use strict";var bEe=Cn&&Cn.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Cn,"__esModule",{value:!0});Cn.canMatchCharCode=Cn.firstCharOptimizedIndices=Cn.getOptimizedStartCodesIndices=Cn.failedOptimizationPrefixMsg=void 0;var GY=$I(),gs=Gt(),YY=ty(),xa=Rv(),jY="Complement Sets are not supported for first char optimization";Cn.failedOptimizationPrefixMsg=`Unable to use "first char" lexer optimizations: +`;function QEe(r,e){e===void 0&&(e=!1);try{var t=(0,YY.getRegExpAst)(r),i=iy(t.value,{},t.flags.ignoreCase);return i}catch(s){if(s.message===jY)e&&(0,gs.PRINT_WARNING)(""+Cn.failedOptimizationPrefixMsg+(" Unable to optimize: < "+r.toString()+` > +`)+` Complement Sets cannot be automatically optimized. + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{var n="";e&&(n=` + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),(0,gs.PRINT_ERROR)(Cn.failedOptimizationPrefixMsg+` +`+(" Failed parsing: < "+r.toString()+` > +`)+(" Using the regexp-to-ast library version: "+GY.VERSION+` +`)+" Please open an issue at: https://github.com/bd82/regexp-to-ast/issues"+n)}}return[]}Cn.getOptimizedStartCodesIndices=QEe;function iy(r,e,t){switch(r.type){case"Disjunction":for(var i=0;i=xa.minOptimizationVal)for(var f=u.from>=xa.minOptimizationVal?u.from:xa.minOptimizationVal,h=u.to,p=(0,xa.charCodeToOptimizedIndex)(f),C=(0,xa.charCodeToOptimizedIndex)(h),y=p;y<=C;y++)e[y]=y}}});break;case"Group":iy(o.value,e,t);break;default:throw Error("Non Exhaustive Match")}var a=o.quantifier!==void 0&&o.quantifier.atLeast===0;if(o.type==="Group"&&kv(o)===!1||o.type!=="Group"&&a===!1)break}break;default:throw Error("non exhaustive match!")}return(0,gs.values)(e)}Cn.firstCharOptimizedIndices=iy;function ry(r,e,t){var i=(0,xa.charCodeToOptimizedIndex)(r);e[i]=i,t===!0&&SEe(r,e)}function SEe(r,e){var t=String.fromCharCode(r),i=t.toUpperCase();if(i!==t){var n=(0,xa.charCodeToOptimizedIndex)(i.charCodeAt(0));e[n]=n}else{var s=t.toLowerCase();if(s!==t){var n=(0,xa.charCodeToOptimizedIndex)(s.charCodeAt(0));e[n]=n}}}function HY(r,e){return(0,gs.find)(r.value,function(t){if(typeof t=="number")return(0,gs.contains)(e,t);var i=t;return(0,gs.find)(e,function(n){return i.from<=n&&n<=i.to})!==void 0})}function kv(r){return r.quantifier&&r.quantifier.atLeast===0?!0:r.value?(0,gs.isArray)(r.value)?(0,gs.every)(r.value,kv):kv(r.value):!1}var vEe=function(r){bEe(e,r);function e(t){var i=r.call(this)||this;return i.targetCharCodes=t,i.found=!1,i}return e.prototype.visitChildren=function(t){if(this.found!==!0){switch(t.type){case"Lookahead":this.visitLookahead(t);return;case"NegativeLookahead":this.visitNegativeLookahead(t);return}r.prototype.visitChildren.call(this,t)}},e.prototype.visitCharacter=function(t){(0,gs.contains)(this.targetCharCodes,t.value)&&(this.found=!0)},e.prototype.visitSet=function(t){t.complement?HY(t,this.targetCharCodes)===void 0&&(this.found=!0):HY(t,this.targetCharCodes)!==void 0&&(this.found=!0)},e}(GY.BaseRegExpVisitor);function xEe(r,e){if(e instanceof RegExp){var t=(0,YY.getRegExpAst)(e),i=new vEe(r);return i.visit(t),i.found}else return(0,gs.find)(e,function(n){return(0,gs.contains)(r,n.charCodeAt(0))})!==void 0}Cn.canMatchCharCode=xEe});var Rv=w(Ve=>{"use strict";var JY=Ve&&Ve.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Ve,"__esModule",{value:!0});Ve.charCodeToOptimizedIndex=Ve.minOptimizationVal=Ve.buildLineBreakIssueMessage=Ve.LineTerminatorOptimizedTester=Ve.isShortPattern=Ve.isCustomPattern=Ve.cloneEmptyGroups=Ve.performWarningRuntimeChecks=Ve.performRuntimeChecks=Ve.addStickyFlag=Ve.addStartOfInput=Ve.findUnreachablePatterns=Ve.findModesThatDoNotExist=Ve.findInvalidGroupType=Ve.findDuplicatePatterns=Ve.findUnsupportedFlags=Ve.findStartOfInputAnchor=Ve.findEmptyMatchRegExps=Ve.findEndOfInputAnchor=Ve.findInvalidPatterns=Ve.findMissingPatterns=Ve.validatePatterns=Ve.analyzeTokenTypes=Ve.enableSticky=Ve.disableSticky=Ve.SUPPORT_STICKY=Ve.MODES=Ve.DEFAULT_MODE=void 0;var WY=$I(),ir=Bd(),xe=Gt(),Zg=qY(),zY=ty(),ko="PATTERN";Ve.DEFAULT_MODE="defaultMode";Ve.MODES="modes";Ve.SUPPORT_STICKY=typeof new RegExp("(?:)").sticky=="boolean";function PEe(){Ve.SUPPORT_STICKY=!1}Ve.disableSticky=PEe;function DEe(){Ve.SUPPORT_STICKY=!0}Ve.enableSticky=DEe;function kEe(r,e){e=(0,xe.defaults)(e,{useSticky:Ve.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` +`],tracer:function(v,D){return D()}});var t=e.tracer;t("initCharCodeToOptimizedIndexMap",function(){HEe()});var i;t("Reject Lexer.NA",function(){i=(0,xe.reject)(r,function(v){return v[ko]===ir.Lexer.NA})});var n=!1,s;t("Transform Patterns",function(){n=!1,s=(0,xe.map)(i,function(v){var D=v[ko];if((0,xe.isRegExp)(D)){var T=D.source;return T.length===1&&T!=="^"&&T!=="$"&&T!=="."&&!D.ignoreCase?T:T.length===2&&T[0]==="\\"&&!(0,xe.contains)(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],T[1])?T[1]:e.useSticky?Tv(D):Nv(D)}else{if((0,xe.isFunction)(D))return n=!0,{exec:D};if((0,xe.has)(D,"exec"))return n=!0,D;if(typeof D=="string"){if(D.length===1)return D;var H=D.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),j=new RegExp(H);return e.useSticky?Tv(j):Nv(j)}else throw Error("non exhaustive match")}})});var o,a,l,c,u;t("misc mapping",function(){o=(0,xe.map)(i,function(v){return v.tokenTypeIdx}),a=(0,xe.map)(i,function(v){var D=v.GROUP;if(D!==ir.Lexer.SKIPPED){if((0,xe.isString)(D))return D;if((0,xe.isUndefined)(D))return!1;throw Error("non exhaustive match")}}),l=(0,xe.map)(i,function(v){var D=v.LONGER_ALT;if(D){var T=(0,xe.isArray)(D)?(0,xe.map)(D,function(H){return(0,xe.indexOf)(i,H)}):[(0,xe.indexOf)(i,D)];return T}}),c=(0,xe.map)(i,function(v){return v.PUSH_MODE}),u=(0,xe.map)(i,function(v){return(0,xe.has)(v,"POP_MODE")})});var g;t("Line Terminator Handling",function(){var v=Aj(e.lineTerminatorCharacters);g=(0,xe.map)(i,function(D){return!1}),e.positionTracking!=="onlyOffset"&&(g=(0,xe.map)(i,function(D){if((0,xe.has)(D,"LINE_BREAKS"))return D.LINE_BREAKS;if(oj(D,v)===!1)return(0,Zg.canMatchCharCode)(v,D.PATTERN)}))});var f,h,p,C;t("Misc Mapping #2",function(){f=(0,xe.map)(i,Ov),h=(0,xe.map)(s,sj),p=(0,xe.reduce)(i,function(v,D){var T=D.GROUP;return(0,xe.isString)(T)&&T!==ir.Lexer.SKIPPED&&(v[T]=[]),v},{}),C=(0,xe.map)(s,function(v,D){return{pattern:s[D],longerAlt:l[D],canLineTerminator:g[D],isCustom:f[D],short:h[D],group:a[D],push:c[D],pop:u[D],tokenTypeIdx:o[D],tokenType:i[D]}})});var y=!0,B=[];return e.safeMode||t("First Char Optimization",function(){B=(0,xe.reduce)(i,function(v,D,T){if(typeof D.PATTERN=="string"){var H=D.PATTERN.charCodeAt(0),j=Lv(H);Fv(v,j,C[T])}else if((0,xe.isArray)(D.START_CHARS_HINT)){var $;(0,xe.forEach)(D.START_CHARS_HINT,function(W){var _=typeof W=="string"?W.charCodeAt(0):W,A=Lv(_);$!==A&&($=A,Fv(v,A,C[T]))})}else if((0,xe.isRegExp)(D.PATTERN))if(D.PATTERN.unicode)y=!1,e.ensureOptimizations&&(0,xe.PRINT_ERROR)(""+Zg.failedOptimizationPrefixMsg+(" Unable to analyze < "+D.PATTERN.toString()+` > pattern. +`)+` The regexp unicode flag is not currently supported by the regexp-to-ast library. + This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{var V=(0,Zg.getOptimizedStartCodesIndices)(D.PATTERN,e.ensureOptimizations);(0,xe.isEmpty)(V)&&(y=!1),(0,xe.forEach)(V,function(W){Fv(v,W,C[T])})}else e.ensureOptimizations&&(0,xe.PRINT_ERROR)(""+Zg.failedOptimizationPrefixMsg+(" TokenType: <"+D.name+`> is using a custom token pattern without providing parameter. +`)+` This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),y=!1;return v},[])}),t("ArrayPacking",function(){B=(0,xe.packArray)(B)}),{emptyGroups:p,patternIdxToConfig:C,charCodeToPatternIdxToConfig:B,hasCustom:n,canBeOptimized:y}}Ve.analyzeTokenTypes=kEe;function REe(r,e){var t=[],i=VY(r);t=t.concat(i.errors);var n=XY(i.valid),s=n.valid;return t=t.concat(n.errors),t=t.concat(FEe(s)),t=t.concat(rj(s)),t=t.concat(ij(s,e)),t=t.concat(nj(s)),t}Ve.validatePatterns=REe;function FEe(r){var e=[],t=(0,xe.filter)(r,function(i){return(0,xe.isRegExp)(i[ko])});return e=e.concat(ZY(t)),e=e.concat($Y(t)),e=e.concat(ej(t)),e=e.concat(tj(t)),e=e.concat(_Y(t)),e}function VY(r){var e=(0,xe.filter)(r,function(n){return!(0,xe.has)(n,ko)}),t=(0,xe.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- missing static 'PATTERN' property",type:ir.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[n]}}),i=(0,xe.difference)(r,e);return{errors:t,valid:i}}Ve.findMissingPatterns=VY;function XY(r){var e=(0,xe.filter)(r,function(n){var s=n[ko];return!(0,xe.isRegExp)(s)&&!(0,xe.isFunction)(s)&&!(0,xe.has)(s,"exec")&&!(0,xe.isString)(s)}),t=(0,xe.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:ir.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[n]}}),i=(0,xe.difference)(r,e);return{errors:t,valid:i}}Ve.findInvalidPatterns=XY;var NEe=/[^\\][\$]/;function ZY(r){var e=function(n){JY(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitEndAnchor=function(o){this.found=!0},s}(WY.BaseRegExpVisitor),t=(0,xe.filter)(r,function(n){var s=n[ko];try{var o=(0,zY.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch{return NEe.test(s.source)}}),i=(0,xe.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error: + Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain end of input anchor '$' + See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:ir.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ve.findEndOfInputAnchor=ZY;function _Y(r){var e=(0,xe.filter)(r,function(i){var n=i[ko];return n.test("")}),t=(0,xe.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' must not match an empty string",type:ir.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[i]}});return t}Ve.findEmptyMatchRegExps=_Y;var TEe=/[^\\[][\^]|^\^/;function $Y(r){var e=function(n){JY(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitStartAnchor=function(o){this.found=!0},s}(WY.BaseRegExpVisitor),t=(0,xe.filter)(r,function(n){var s=n[ko];try{var o=(0,zY.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch{return TEe.test(s.source)}}),i=(0,xe.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error: + Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain start of input anchor '^' + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:ir.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ve.findStartOfInputAnchor=$Y;function ej(r){var e=(0,xe.filter)(r,function(i){var n=i[ko];return n instanceof RegExp&&(n.multiline||n.global)}),t=(0,xe.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:ir.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[i]}});return t}Ve.findUnsupportedFlags=ej;function tj(r){var e=[],t=(0,xe.map)(r,function(s){return(0,xe.reduce)(r,function(o,a){return s.PATTERN.source===a.PATTERN.source&&!(0,xe.contains)(e,a)&&a.PATTERN!==ir.Lexer.NA&&(e.push(a),o.push(a)),o},[])});t=(0,xe.compact)(t);var i=(0,xe.filter)(t,function(s){return s.length>1}),n=(0,xe.map)(i,function(s){var o=(0,xe.map)(s,function(l){return l.name}),a=(0,xe.first)(s).PATTERN;return{message:"The same RegExp pattern ->"+a+"<-"+("has been used in all of the following Token Types: "+o.join(", ")+" <-"),type:ir.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:s}});return n}Ve.findDuplicatePatterns=tj;function rj(r){var e=(0,xe.filter)(r,function(i){if(!(0,xe.has)(i,"GROUP"))return!1;var n=i.GROUP;return n!==ir.Lexer.SKIPPED&&n!==ir.Lexer.NA&&!(0,xe.isString)(n)}),t=(0,xe.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:ir.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[i]}});return t}Ve.findInvalidGroupType=rj;function ij(r,e){var t=(0,xe.filter)(r,function(n){return n.PUSH_MODE!==void 0&&!(0,xe.contains)(e,n.PUSH_MODE)}),i=(0,xe.map)(t,function(n){var s="Token Type: ->"+n.name+"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->"+n.PUSH_MODE+"<-which does not exist";return{message:s,type:ir.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[n]}});return i}Ve.findModesThatDoNotExist=ij;function nj(r){var e=[],t=(0,xe.reduce)(r,function(i,n,s){var o=n.PATTERN;return o===ir.Lexer.NA||((0,xe.isString)(o)?i.push({str:o,idx:s,tokenType:n}):(0,xe.isRegExp)(o)&&OEe(o)&&i.push({str:o.source,idx:s,tokenType:n})),i},[]);return(0,xe.forEach)(r,function(i,n){(0,xe.forEach)(t,function(s){var o=s.str,a=s.idx,l=s.tokenType;if(n"+i.name+"<-")+`in the lexer's definition. +See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:c,type:ir.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[i,l]})}})}),e}Ve.findUnreachablePatterns=nj;function LEe(r,e){if((0,xe.isRegExp)(e)){var t=e.exec(r);return t!==null&&t.index===0}else{if((0,xe.isFunction)(e))return e(r,0,[],{});if((0,xe.has)(e,"exec"))return e.exec(r,0,[],{});if(typeof e=="string")return e===r;throw Error("non exhaustive match")}}function OEe(r){var e=[".","\\","[","]","|","^","$","(",")","?","*","+","{"];return(0,xe.find)(e,function(t){return r.source.indexOf(t)!==-1})===void 0}function Nv(r){var e=r.ignoreCase?"i":"";return new RegExp("^(?:"+r.source+")",e)}Ve.addStartOfInput=Nv;function Tv(r){var e=r.ignoreCase?"iy":"y";return new RegExp(""+r.source,e)}Ve.addStickyFlag=Tv;function MEe(r,e,t){var i=[];return(0,xe.has)(r,Ve.DEFAULT_MODE)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Ve.DEFAULT_MODE+`> property in its definition +`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,xe.has)(r,Ve.MODES)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Ve.MODES+`> property in its definition +`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,xe.has)(r,Ve.MODES)&&(0,xe.has)(r,Ve.DEFAULT_MODE)&&!(0,xe.has)(r.modes,r.defaultMode)&&i.push({message:"A MultiMode Lexer cannot be initialized with a "+Ve.DEFAULT_MODE+": <"+r.defaultMode+`>which does not exist +`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,xe.has)(r,Ve.MODES)&&(0,xe.forEach)(r.modes,function(n,s){(0,xe.forEach)(n,function(o,a){(0,xe.isUndefined)(o)&&i.push({message:"A Lexer cannot be initialized using an undefined Token Type. Mode:"+("<"+s+"> at index: <"+a+`> +`),type:ir.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED})})}),i}Ve.performRuntimeChecks=MEe;function KEe(r,e,t){var i=[],n=!1,s=(0,xe.compact)((0,xe.flatten)((0,xe.mapValues)(r.modes,function(l){return l}))),o=(0,xe.reject)(s,function(l){return l[ko]===ir.Lexer.NA}),a=Aj(t);return e&&(0,xe.forEach)(o,function(l){var c=oj(l,a);if(c!==!1){var u=aj(l,c),g={message:u,type:c.issue,tokenType:l};i.push(g)}else(0,xe.has)(l,"LINE_BREAKS")?l.LINE_BREAKS===!0&&(n=!0):(0,Zg.canMatchCharCode)(a,l.PATTERN)&&(n=!0)}),e&&!n&&i.push({message:`Warning: No LINE_BREAKS Found. + This Lexer has been defined to track line and column information, + But none of the Token Types can be identified as matching a line terminator. + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS + for details.`,type:ir.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),i}Ve.performWarningRuntimeChecks=KEe;function UEe(r){var e={},t=(0,xe.keys)(r);return(0,xe.forEach)(t,function(i){var n=r[i];if((0,xe.isArray)(n))e[i]=[];else throw Error("non exhaustive match")}),e}Ve.cloneEmptyGroups=UEe;function Ov(r){var e=r.PATTERN;if((0,xe.isRegExp)(e))return!1;if((0,xe.isFunction)(e))return!0;if((0,xe.has)(e,"exec"))return!0;if((0,xe.isString)(e))return!1;throw Error("non exhaustive match")}Ve.isCustomPattern=Ov;function sj(r){return(0,xe.isString)(r)&&r.length===1?r.charCodeAt(0):!1}Ve.isShortPattern=sj;Ve.LineTerminatorOptimizedTester={test:function(r){for(var e=r.length,t=this.lastIndex;t Token Type +`)+(" Root cause: "+e.errMsg+`. +`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR";if(e.issue===ir.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. +`+(" The problem is in the <"+r.name+`> Token Type +`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK";throw Error("non exhaustive match")}Ve.buildLineBreakIssueMessage=aj;function Aj(r){var e=(0,xe.map)(r,function(t){return(0,xe.isString)(t)&&t.length>0?t.charCodeAt(0):t});return e}function Fv(r,e,t){r[e]===void 0?r[e]=[t]:r[e].push(t)}Ve.minOptimizationVal=256;var ny=[];function Lv(r){return r255?255+~~(r/255):r}}});var _g=w(Nt=>{"use strict";Object.defineProperty(Nt,"__esModule",{value:!0});Nt.isTokenType=Nt.hasExtendingTokensTypesMapProperty=Nt.hasExtendingTokensTypesProperty=Nt.hasCategoriesProperty=Nt.hasShortKeyProperty=Nt.singleAssignCategoriesToksMap=Nt.assignCategoriesMapProp=Nt.assignCategoriesTokensProp=Nt.assignTokenDefaultProps=Nt.expandCategories=Nt.augmentTokenTypes=Nt.tokenIdxToClass=Nt.tokenShortNameIdx=Nt.tokenStructuredMatcherNoCategories=Nt.tokenStructuredMatcher=void 0;var Zr=Gt();function GEe(r,e){var t=r.tokenTypeIdx;return t===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[t]===!0}Nt.tokenStructuredMatcher=GEe;function YEe(r,e){return r.tokenTypeIdx===e.tokenTypeIdx}Nt.tokenStructuredMatcherNoCategories=YEe;Nt.tokenShortNameIdx=1;Nt.tokenIdxToClass={};function jEe(r){var e=lj(r);cj(e),gj(e),uj(e),(0,Zr.forEach)(e,function(t){t.isParent=t.categoryMatches.length>0})}Nt.augmentTokenTypes=jEe;function lj(r){for(var e=(0,Zr.cloneArr)(r),t=r,i=!0;i;){t=(0,Zr.compact)((0,Zr.flatten)((0,Zr.map)(t,function(s){return s.CATEGORIES})));var n=(0,Zr.difference)(t,e);e=e.concat(n),(0,Zr.isEmpty)(n)?i=!1:t=n}return e}Nt.expandCategories=lj;function cj(r){(0,Zr.forEach)(r,function(e){fj(e)||(Nt.tokenIdxToClass[Nt.tokenShortNameIdx]=e,e.tokenTypeIdx=Nt.tokenShortNameIdx++),Mv(e)&&!(0,Zr.isArray)(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),Mv(e)||(e.CATEGORIES=[]),hj(e)||(e.categoryMatches=[]),pj(e)||(e.categoryMatchesMap={})})}Nt.assignTokenDefaultProps=cj;function uj(r){(0,Zr.forEach)(r,function(e){e.categoryMatches=[],(0,Zr.forEach)(e.categoryMatchesMap,function(t,i){e.categoryMatches.push(Nt.tokenIdxToClass[i].tokenTypeIdx)})})}Nt.assignCategoriesTokensProp=uj;function gj(r){(0,Zr.forEach)(r,function(e){Kv([],e)})}Nt.assignCategoriesMapProp=gj;function Kv(r,e){(0,Zr.forEach)(r,function(t){e.categoryMatchesMap[t.tokenTypeIdx]=!0}),(0,Zr.forEach)(e.CATEGORIES,function(t){var i=r.concat(e);(0,Zr.contains)(i,t)||Kv(i,t)})}Nt.singleAssignCategoriesToksMap=Kv;function fj(r){return(0,Zr.has)(r,"tokenTypeIdx")}Nt.hasShortKeyProperty=fj;function Mv(r){return(0,Zr.has)(r,"CATEGORIES")}Nt.hasCategoriesProperty=Mv;function hj(r){return(0,Zr.has)(r,"categoryMatches")}Nt.hasExtendingTokensTypesProperty=hj;function pj(r){return(0,Zr.has)(r,"categoryMatchesMap")}Nt.hasExtendingTokensTypesMapProperty=pj;function qEe(r){return(0,Zr.has)(r,"tokenTypeIdx")}Nt.isTokenType=qEe});var Uv=w(sy=>{"use strict";Object.defineProperty(sy,"__esModule",{value:!0});sy.defaultLexerErrorProvider=void 0;sy.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(r){return"Unable to pop Lexer Mode after encountering Token ->"+r.image+"<- The Mode Stack is empty"},buildUnexpectedCharactersMessage:function(r,e,t,i,n){return"unexpected character: ->"+r.charAt(e)+"<- at offset: "+e+","+(" skipped "+t+" characters.")}}});var Bd=w(Cc=>{"use strict";Object.defineProperty(Cc,"__esModule",{value:!0});Cc.Lexer=Cc.LexerDefinitionErrorType=void 0;var _s=Rv(),nr=Gt(),JEe=_g(),WEe=Uv(),zEe=ty(),VEe;(function(r){r[r.MISSING_PATTERN=0]="MISSING_PATTERN",r[r.INVALID_PATTERN=1]="INVALID_PATTERN",r[r.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",r[r.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",r[r.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",r[r.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",r[r.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",r[r.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",r[r.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",r[r.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",r[r.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",r[r.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",r[r.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",r[r.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",r[r.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",r[r.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",r[r.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK"})(VEe=Cc.LexerDefinitionErrorType||(Cc.LexerDefinitionErrorType={}));var bd={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` +`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:WEe.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1};Object.freeze(bd);var XEe=function(){function r(e,t){var i=this;if(t===void 0&&(t=bd),this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.config=void 0,this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},typeof t=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. +a boolean 2nd argument is no longer supported`);this.config=(0,nr.merge)(bd,t);var n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",function(){var s,o=!0;i.TRACE_INIT("Lexer Config handling",function(){if(i.config.lineTerminatorsPattern===bd.lineTerminatorsPattern)i.config.lineTerminatorsPattern=_s.LineTerminatorOptimizedTester;else if(i.config.lineTerminatorCharacters===bd.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(t.safeMode&&t.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');i.trackStartLines=/full|onlyStart/i.test(i.config.positionTracking),i.trackEndLines=/full/i.test(i.config.positionTracking),(0,nr.isArray)(e)?(s={modes:{}},s.modes[_s.DEFAULT_MODE]=(0,nr.cloneArr)(e),s[_s.DEFAULT_MODE]=_s.DEFAULT_MODE):(o=!1,s=(0,nr.cloneObj)(e))}),i.config.skipValidations===!1&&(i.TRACE_INIT("performRuntimeChecks",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,_s.performRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))}),i.TRACE_INIT("performWarningRuntimeChecks",function(){i.lexerDefinitionWarning=i.lexerDefinitionWarning.concat((0,_s.performWarningRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))})),s.modes=s.modes?s.modes:{},(0,nr.forEach)(s.modes,function(u,g){s.modes[g]=(0,nr.reject)(u,function(f){return(0,nr.isUndefined)(f)})});var a=(0,nr.keys)(s.modes);if((0,nr.forEach)(s.modes,function(u,g){i.TRACE_INIT("Mode: <"+g+"> processing",function(){if(i.modes.push(g),i.config.skipValidations===!1&&i.TRACE_INIT("validatePatterns",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,_s.validatePatterns)(u,a))}),(0,nr.isEmpty)(i.lexerDefinitionErrors)){(0,JEe.augmentTokenTypes)(u);var f;i.TRACE_INIT("analyzeTokenTypes",function(){f=(0,_s.analyzeTokenTypes)(u,{lineTerminatorCharacters:i.config.lineTerminatorCharacters,positionTracking:t.positionTracking,ensureOptimizations:t.ensureOptimizations,safeMode:t.safeMode,tracer:i.TRACE_INIT.bind(i)})}),i.patternIdxToConfig[g]=f.patternIdxToConfig,i.charCodeToPatternIdxToConfig[g]=f.charCodeToPatternIdxToConfig,i.emptyGroups=(0,nr.merge)(i.emptyGroups,f.emptyGroups),i.hasCustom=f.hasCustom||i.hasCustom,i.canModeBeOptimized[g]=f.canBeOptimized}})}),i.defaultMode=s.defaultMode,!(0,nr.isEmpty)(i.lexerDefinitionErrors)&&!i.config.deferDefinitionErrorsHandling){var l=(0,nr.map)(i.lexerDefinitionErrors,function(u){return u.message}),c=l.join(`----------------------- +`);throw new Error(`Errors detected in definition of Lexer: +`+c)}(0,nr.forEach)(i.lexerDefinitionWarning,function(u){(0,nr.PRINT_WARNING)(u.message)}),i.TRACE_INIT("Choosing sub-methods implementations",function(){if(_s.SUPPORT_STICKY?(i.chopInput=nr.IDENTITY,i.match=i.matchWithTest):(i.updateLastIndex=nr.NOOP,i.match=i.matchWithExec),o&&(i.handleModes=nr.NOOP),i.trackStartLines===!1&&(i.computeNewColumn=nr.IDENTITY),i.trackEndLines===!1&&(i.updateTokenEndLineColumnLocation=nr.NOOP),/full/i.test(i.config.positionTracking))i.createTokenInstance=i.createFullToken;else if(/onlyStart/i.test(i.config.positionTracking))i.createTokenInstance=i.createStartOnlyToken;else if(/onlyOffset/i.test(i.config.positionTracking))i.createTokenInstance=i.createOffsetOnlyToken;else throw Error('Invalid config option: "'+i.config.positionTracking+'"');i.hasCustom?(i.addToken=i.addTokenUsingPush,i.handlePayload=i.handlePayloadWithCustom):(i.addToken=i.addTokenUsingMemberAccess,i.handlePayload=i.handlePayloadNoCustom)}),i.TRACE_INIT("Failed Optimization Warnings",function(){var u=(0,nr.reduce)(i.canModeBeOptimized,function(g,f,h){return f===!1&&g.push(h),g},[]);if(t.ensureOptimizations&&!(0,nr.isEmpty)(u))throw Error("Lexer Modes: < "+u.join(", ")+` > cannot be optimized. + Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. + Or inspect the console log for details on how to resolve these issues.`)}),i.TRACE_INIT("clearRegExpParserCache",function(){(0,zEe.clearRegExpParserCache)()}),i.TRACE_INIT("toFastProperties",function(){(0,nr.toFastProperties)(i)})})}return r.prototype.tokenize=function(e,t){if(t===void 0&&(t=this.defaultMode),!(0,nr.isEmpty)(this.lexerDefinitionErrors)){var i=(0,nr.map)(this.lexerDefinitionErrors,function(o){return o.message}),n=i.join(`----------------------- +`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: +`+n)}var s=this.tokenizeInternal(e,t);return s},r.prototype.tokenizeInternal=function(e,t){var i=this,n,s,o,a,l,c,u,g,f,h,p,C,y,B,v,D,T=e,H=T.length,j=0,$=0,V=this.hasCustom?0:Math.floor(e.length/10),W=new Array(V),_=[],A=this.trackStartLines?1:void 0,Ae=this.trackStartLines?1:void 0,ge=(0,_s.cloneEmptyGroups)(this.emptyGroups),re=this.trackStartLines,O=this.config.lineTerminatorsPattern,F=0,ue=[],pe=[],ke=[],Fe=[];Object.freeze(Fe);var Ne=void 0;function oe(){return ue}function le(pr){var Ii=(0,_s.charCodeToOptimizedIndex)(pr),rs=pe[Ii];return rs===void 0?Fe:rs}var Be=function(pr){if(ke.length===1&&pr.tokenType.PUSH_MODE===void 0){var Ii=i.config.errorMessageProvider.buildUnableToPopLexerModeMessage(pr);_.push({offset:pr.startOffset,line:pr.startLine!==void 0?pr.startLine:void 0,column:pr.startColumn!==void 0?pr.startColumn:void 0,length:pr.image.length,message:Ii})}else{ke.pop();var rs=(0,nr.last)(ke);ue=i.patternIdxToConfig[rs],pe=i.charCodeToPatternIdxToConfig[rs],F=ue.length;var fa=i.canModeBeOptimized[rs]&&i.config.safeMode===!1;pe&&fa?Ne=le:Ne=oe}};function fe(pr){ke.push(pr),pe=this.charCodeToPatternIdxToConfig[pr],ue=this.patternIdxToConfig[pr],F=ue.length,F=ue.length;var Ii=this.canModeBeOptimized[pr]&&this.config.safeMode===!1;pe&&Ii?Ne=le:Ne=oe}fe.call(this,t);for(var ae;jc.length){c=a,u=g,ae=_e;break}}}break}}if(c!==null){if(f=c.length,h=ae.group,h!==void 0&&(p=ae.tokenTypeIdx,C=this.createTokenInstance(c,j,p,ae.tokenType,A,Ae,f),this.handlePayload(C,u),h===!1?$=this.addToken(W,$,C):ge[h].push(C)),e=this.chopInput(e,f),j=j+f,Ae=this.computeNewColumn(Ae,f),re===!0&&ae.canLineTerminator===!0){var It=0,Or=void 0,ii=void 0;O.lastIndex=0;do Or=O.test(c),Or===!0&&(ii=O.lastIndex-1,It++);while(Or===!0);It!==0&&(A=A+It,Ae=f-ii,this.updateTokenEndLineColumnLocation(C,h,ii,It,A,Ae,f))}this.handleModes(ae,Be,fe,C)}else{for(var gi=j,hr=A,fi=Ae,ni=!1;!ni&&j <"+e+">");var n=(0,nr.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r.SKIPPED="This marks a skipped Token pattern, this means each token identified by it willbe consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.",r.NA=/NOT_APPLICABLE/,r}();Cc.Lexer=XEe});var TA=w(Qi=>{"use strict";Object.defineProperty(Qi,"__esModule",{value:!0});Qi.tokenMatcher=Qi.createTokenInstance=Qi.EOF=Qi.createToken=Qi.hasTokenLabel=Qi.tokenName=Qi.tokenLabel=void 0;var $s=Gt(),ZEe=Bd(),Hv=_g();function _Ee(r){return bj(r)?r.LABEL:r.name}Qi.tokenLabel=_Ee;function $Ee(r){return r.name}Qi.tokenName=$Ee;function bj(r){return(0,$s.isString)(r.LABEL)&&r.LABEL!==""}Qi.hasTokenLabel=bj;var eIe="parent",dj="categories",Cj="label",mj="group",Ej="push_mode",Ij="pop_mode",yj="longer_alt",wj="line_breaks",Bj="start_chars_hint";function Qj(r){return tIe(r)}Qi.createToken=Qj;function tIe(r){var e=r.pattern,t={};if(t.name=r.name,(0,$s.isUndefined)(e)||(t.PATTERN=e),(0,$s.has)(r,eIe))throw`The parent property is no longer supported. +See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.`;return(0,$s.has)(r,dj)&&(t.CATEGORIES=r[dj]),(0,Hv.augmentTokenTypes)([t]),(0,$s.has)(r,Cj)&&(t.LABEL=r[Cj]),(0,$s.has)(r,mj)&&(t.GROUP=r[mj]),(0,$s.has)(r,Ij)&&(t.POP_MODE=r[Ij]),(0,$s.has)(r,Ej)&&(t.PUSH_MODE=r[Ej]),(0,$s.has)(r,yj)&&(t.LONGER_ALT=r[yj]),(0,$s.has)(r,wj)&&(t.LINE_BREAKS=r[wj]),(0,$s.has)(r,Bj)&&(t.START_CHARS_HINT=r[Bj]),t}Qi.EOF=Qj({name:"EOF",pattern:ZEe.Lexer.NA});(0,Hv.augmentTokenTypes)([Qi.EOF]);function rIe(r,e,t,i,n,s,o,a){return{image:e,startOffset:t,endOffset:i,startLine:n,endLine:s,startColumn:o,endColumn:a,tokenTypeIdx:r.tokenTypeIdx,tokenType:r}}Qi.createTokenInstance=rIe;function iIe(r,e){return(0,Hv.tokenStructuredMatcher)(r,e)}Qi.tokenMatcher=iIe});var mn=w(zt=>{"use strict";var Pa=zt&&zt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(zt,"__esModule",{value:!0});zt.serializeProduction=zt.serializeGrammar=zt.Terminal=zt.Alternation=zt.RepetitionWithSeparator=zt.Repetition=zt.RepetitionMandatoryWithSeparator=zt.RepetitionMandatory=zt.Option=zt.Alternative=zt.Rule=zt.NonTerminal=zt.AbstractProduction=void 0;var Ar=Gt(),nIe=TA(),Ro=function(){function r(e){this._definition=e}return Object.defineProperty(r.prototype,"definition",{get:function(){return this._definition},set:function(e){this._definition=e},enumerable:!1,configurable:!0}),r.prototype.accept=function(e){e.visit(this),(0,Ar.forEach)(this.definition,function(t){t.accept(e)})},r}();zt.AbstractProduction=Ro;var Sj=function(r){Pa(e,r);function e(t){var i=r.call(this,[])||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this.referencedRule!==void 0?this.referencedRule.definition:[]},set:function(t){},enumerable:!1,configurable:!0}),e.prototype.accept=function(t){t.visit(this)},e}(Ro);zt.NonTerminal=Sj;var vj=function(r){Pa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.orgText="",(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(Ro);zt.Rule=vj;var xj=function(r){Pa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.ignoreAmbiguities=!1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(Ro);zt.Alternative=xj;var Pj=function(r){Pa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(Ro);zt.Option=Pj;var Dj=function(r){Pa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(Ro);zt.RepetitionMandatory=Dj;var kj=function(r){Pa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(Ro);zt.RepetitionMandatoryWithSeparator=kj;var Rj=function(r){Pa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(Ro);zt.Repetition=Rj;var Fj=function(r){Pa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(Ro);zt.RepetitionWithSeparator=Fj;var Nj=function(r){Pa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,i.ignoreAmbiguities=!1,i.hasPredicates=!1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this._definition},set:function(t){this._definition=t},enumerable:!1,configurable:!0}),e}(Ro);zt.Alternation=Nj;var oy=function(){function r(e){this.idx=1,(0,Ar.assign)(this,(0,Ar.pick)(e,function(t){return t!==void 0}))}return r.prototype.accept=function(e){e.visit(this)},r}();zt.Terminal=oy;function sIe(r){return(0,Ar.map)(r,Qd)}zt.serializeGrammar=sIe;function Qd(r){function e(s){return(0,Ar.map)(s,Qd)}if(r instanceof Sj){var t={type:"NonTerminal",name:r.nonTerminalName,idx:r.idx};return(0,Ar.isString)(r.label)&&(t.label=r.label),t}else{if(r instanceof xj)return{type:"Alternative",definition:e(r.definition)};if(r instanceof Pj)return{type:"Option",idx:r.idx,definition:e(r.definition)};if(r instanceof Dj)return{type:"RepetitionMandatory",idx:r.idx,definition:e(r.definition)};if(r instanceof kj)return{type:"RepetitionMandatoryWithSeparator",idx:r.idx,separator:Qd(new oy({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof Fj)return{type:"RepetitionWithSeparator",idx:r.idx,separator:Qd(new oy({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof Rj)return{type:"Repetition",idx:r.idx,definition:e(r.definition)};if(r instanceof Nj)return{type:"Alternation",idx:r.idx,definition:e(r.definition)};if(r instanceof oy){var i={type:"Terminal",name:r.terminalType.name,label:(0,nIe.tokenLabel)(r.terminalType),idx:r.idx};(0,Ar.isString)(r.label)&&(i.terminalLabel=r.label);var n=r.terminalType.PATTERN;return r.terminalType.PATTERN&&(i.pattern=(0,Ar.isRegExp)(n)?n.source:n),i}else{if(r instanceof vj)return{type:"Rule",name:r.name,orgText:r.orgText,definition:e(r.definition)};throw Error("non exhaustive match")}}}zt.serializeProduction=Qd});var Ay=w(ay=>{"use strict";Object.defineProperty(ay,"__esModule",{value:!0});ay.RestWalker=void 0;var Gv=Gt(),En=mn(),oIe=function(){function r(){}return r.prototype.walk=function(e,t){var i=this;t===void 0&&(t=[]),(0,Gv.forEach)(e.definition,function(n,s){var o=(0,Gv.drop)(e.definition,s+1);if(n instanceof En.NonTerminal)i.walkProdRef(n,o,t);else if(n instanceof En.Terminal)i.walkTerminal(n,o,t);else if(n instanceof En.Alternative)i.walkFlat(n,o,t);else if(n instanceof En.Option)i.walkOption(n,o,t);else if(n instanceof En.RepetitionMandatory)i.walkAtLeastOne(n,o,t);else if(n instanceof En.RepetitionMandatoryWithSeparator)i.walkAtLeastOneSep(n,o,t);else if(n instanceof En.RepetitionWithSeparator)i.walkManySep(n,o,t);else if(n instanceof En.Repetition)i.walkMany(n,o,t);else if(n instanceof En.Alternation)i.walkOr(n,o,t);else throw Error("non exhaustive match")})},r.prototype.walkTerminal=function(e,t,i){},r.prototype.walkProdRef=function(e,t,i){},r.prototype.walkFlat=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkOption=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkAtLeastOne=function(e,t,i){var n=[new En.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkAtLeastOneSep=function(e,t,i){var n=Tj(e,t,i);this.walk(e,n)},r.prototype.walkMany=function(e,t,i){var n=[new En.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkManySep=function(e,t,i){var n=Tj(e,t,i);this.walk(e,n)},r.prototype.walkOr=function(e,t,i){var n=this,s=t.concat(i);(0,Gv.forEach)(e.definition,function(o){var a=new En.Alternative({definition:[o]});n.walk(a,s)})},r}();ay.RestWalker=oIe;function Tj(r,e,t){var i=[new En.Option({definition:[new En.Terminal({terminalType:r.separator})].concat(r.definition)})],n=i.concat(e,t);return n}});var $g=w(ly=>{"use strict";Object.defineProperty(ly,"__esModule",{value:!0});ly.GAstVisitor=void 0;var Fo=mn(),aIe=function(){function r(){}return r.prototype.visit=function(e){var t=e;switch(t.constructor){case Fo.NonTerminal:return this.visitNonTerminal(t);case Fo.Alternative:return this.visitAlternative(t);case Fo.Option:return this.visitOption(t);case Fo.RepetitionMandatory:return this.visitRepetitionMandatory(t);case Fo.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(t);case Fo.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(t);case Fo.Repetition:return this.visitRepetition(t);case Fo.Alternation:return this.visitAlternation(t);case Fo.Terminal:return this.visitTerminal(t);case Fo.Rule:return this.visitRule(t);default:throw Error("non exhaustive match")}},r.prototype.visitNonTerminal=function(e){},r.prototype.visitAlternative=function(e){},r.prototype.visitOption=function(e){},r.prototype.visitRepetition=function(e){},r.prototype.visitRepetitionMandatory=function(e){},r.prototype.visitRepetitionMandatoryWithSeparator=function(e){},r.prototype.visitRepetitionWithSeparator=function(e){},r.prototype.visitAlternation=function(e){},r.prototype.visitTerminal=function(e){},r.prototype.visitRule=function(e){},r}();ly.GAstVisitor=aIe});var vd=w(Mi=>{"use strict";var AIe=Mi&&Mi.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Mi,"__esModule",{value:!0});Mi.collectMethods=Mi.DslMethodsCollectorVisitor=Mi.getProductionDslName=Mi.isBranchingProd=Mi.isOptionalProd=Mi.isSequenceProd=void 0;var Sd=Gt(),br=mn(),lIe=$g();function cIe(r){return r instanceof br.Alternative||r instanceof br.Option||r instanceof br.Repetition||r instanceof br.RepetitionMandatory||r instanceof br.RepetitionMandatoryWithSeparator||r instanceof br.RepetitionWithSeparator||r instanceof br.Terminal||r instanceof br.Rule}Mi.isSequenceProd=cIe;function Yv(r,e){e===void 0&&(e=[]);var t=r instanceof br.Option||r instanceof br.Repetition||r instanceof br.RepetitionWithSeparator;return t?!0:r instanceof br.Alternation?(0,Sd.some)(r.definition,function(i){return Yv(i,e)}):r instanceof br.NonTerminal&&(0,Sd.contains)(e,r)?!1:r instanceof br.AbstractProduction?(r instanceof br.NonTerminal&&e.push(r),(0,Sd.every)(r.definition,function(i){return Yv(i,e)})):!1}Mi.isOptionalProd=Yv;function uIe(r){return r instanceof br.Alternation}Mi.isBranchingProd=uIe;function gIe(r){if(r instanceof br.NonTerminal)return"SUBRULE";if(r instanceof br.Option)return"OPTION";if(r instanceof br.Alternation)return"OR";if(r instanceof br.RepetitionMandatory)return"AT_LEAST_ONE";if(r instanceof br.RepetitionMandatoryWithSeparator)return"AT_LEAST_ONE_SEP";if(r instanceof br.RepetitionWithSeparator)return"MANY_SEP";if(r instanceof br.Repetition)return"MANY";if(r instanceof br.Terminal)return"CONSUME";throw Error("non exhaustive match")}Mi.getProductionDslName=gIe;var Lj=function(r){AIe(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.separator="-",t.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},t}return e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitTerminal=function(t){var i=t.terminalType.name+this.separator+"Terminal";(0,Sd.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitNonTerminal=function(t){var i=t.nonTerminalName+this.separator+"Terminal";(0,Sd.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitOption=function(t){this.dslMethods.option.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.dslMethods.repetitionWithSeparator.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.dslMethods.repetitionMandatory.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.dslMethods.repetitionMandatoryWithSeparator.push(t)},e.prototype.visitRepetition=function(t){this.dslMethods.repetition.push(t)},e.prototype.visitAlternation=function(t){this.dslMethods.alternation.push(t)},e}(lIe.GAstVisitor);Mi.DslMethodsCollectorVisitor=Lj;var cy=new Lj;function fIe(r){cy.reset(),r.accept(cy);var e=cy.dslMethods;return cy.reset(),e}Mi.collectMethods=fIe});var qv=w(No=>{"use strict";Object.defineProperty(No,"__esModule",{value:!0});No.firstForTerminal=No.firstForBranching=No.firstForSequence=No.first=void 0;var uy=Gt(),Oj=mn(),jv=vd();function gy(r){if(r instanceof Oj.NonTerminal)return gy(r.referencedRule);if(r instanceof Oj.Terminal)return Uj(r);if((0,jv.isSequenceProd)(r))return Mj(r);if((0,jv.isBranchingProd)(r))return Kj(r);throw Error("non exhaustive match")}No.first=gy;function Mj(r){for(var e=[],t=r.definition,i=0,n=t.length>i,s,o=!0;n&&o;)s=t[i],o=(0,jv.isOptionalProd)(s),e=e.concat(gy(s)),i=i+1,n=t.length>i;return(0,uy.uniq)(e)}No.firstForSequence=Mj;function Kj(r){var e=(0,uy.map)(r.definition,function(t){return gy(t)});return(0,uy.uniq)((0,uy.flatten)(e))}No.firstForBranching=Kj;function Uj(r){return[r.terminalType]}No.firstForTerminal=Uj});var Jv=w(fy=>{"use strict";Object.defineProperty(fy,"__esModule",{value:!0});fy.IN=void 0;fy.IN="_~IN~_"});var qj=w(fs=>{"use strict";var hIe=fs&&fs.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(fs,"__esModule",{value:!0});fs.buildInProdFollowPrefix=fs.buildBetweenProdsFollowPrefix=fs.computeAllProdsFollows=fs.ResyncFollowsWalker=void 0;var pIe=Ay(),dIe=qv(),Hj=Gt(),Gj=Jv(),CIe=mn(),Yj=function(r){hIe(e,r);function e(t){var i=r.call(this)||this;return i.topProd=t,i.follows={},i}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.follows},e.prototype.walkTerminal=function(t,i,n){},e.prototype.walkProdRef=function(t,i,n){var s=jj(t.referencedRule,t.idx)+this.topProd.name,o=i.concat(n),a=new CIe.Alternative({definition:o}),l=(0,dIe.first)(a);this.follows[s]=l},e}(pIe.RestWalker);fs.ResyncFollowsWalker=Yj;function mIe(r){var e={};return(0,Hj.forEach)(r,function(t){var i=new Yj(t).startWalking();(0,Hj.assign)(e,i)}),e}fs.computeAllProdsFollows=mIe;function jj(r,e){return r.name+e+Gj.IN}fs.buildBetweenProdsFollowPrefix=jj;function EIe(r){var e=r.terminalType.name;return e+r.idx+Gj.IN}fs.buildInProdFollowPrefix=EIe});var xd=w(Da=>{"use strict";Object.defineProperty(Da,"__esModule",{value:!0});Da.defaultGrammarValidatorErrorProvider=Da.defaultGrammarResolverErrorProvider=Da.defaultParserErrorProvider=void 0;var ef=TA(),IIe=Gt(),eo=Gt(),Wv=mn(),Jj=vd();Da.defaultParserErrorProvider={buildMismatchTokenMessage:function(r){var e=r.expected,t=r.actual,i=r.previous,n=r.ruleName,s=(0,ef.hasTokenLabel)(e),o=s?"--> "+(0,ef.tokenLabel)(e)+" <--":"token of type --> "+e.name+" <--",a="Expecting "+o+" but found --> '"+t.image+"' <--";return a},buildNotAllInputParsedMessage:function(r){var e=r.firstRedundant,t=r.ruleName;return"Redundant input, expecting EOF but found: "+e.image},buildNoViableAltMessage:function(r){var e=r.expectedPathsPerAlt,t=r.actual,i=r.previous,n=r.customUserDescription,s=r.ruleName,o="Expecting: ",a=(0,eo.first)(t).image,l=` +but found: '`+a+"'";if(n)return o+n+l;var c=(0,eo.reduce)(e,function(h,p){return h.concat(p)},[]),u=(0,eo.map)(c,function(h){return"["+(0,eo.map)(h,function(p){return(0,ef.tokenLabel)(p)}).join(", ")+"]"}),g=(0,eo.map)(u,function(h,p){return" "+(p+1)+". "+h}),f=`one of these possible Token sequences: +`+g.join(` +`);return o+f+l},buildEarlyExitMessage:function(r){var e=r.expectedIterationPaths,t=r.actual,i=r.customUserDescription,n=r.ruleName,s="Expecting: ",o=(0,eo.first)(t).image,a=` +but found: '`+o+"'";if(i)return s+i+a;var l=(0,eo.map)(e,function(u){return"["+(0,eo.map)(u,function(g){return(0,ef.tokenLabel)(g)}).join(",")+"]"}),c=`expecting at least one iteration which starts with one of these possible Token sequences:: + `+("<"+l.join(" ,")+">");return s+c+a}};Object.freeze(Da.defaultParserErrorProvider);Da.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(r,e){var t="Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- +inside top level rule: ->`+r.name+"<-";return t}};Da.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(r,e){function t(u){return u instanceof Wv.Terminal?u.terminalType.name:u instanceof Wv.NonTerminal?u.nonTerminalName:""}var i=r.name,n=(0,eo.first)(e),s=n.idx,o=(0,Jj.getProductionDslName)(n),a=t(n),l=s>0,c="->"+o+(l?s:"")+"<- "+(a?"with argument: ->"+a+"<-":"")+` + appears more than once (`+e.length+" times) in the top level rule: ->"+i+`<-. + For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES + `;return c=c.replace(/[ \t]+/g," "),c=c.replace(/\s\s+/g,` +`),c},buildNamespaceConflictError:function(r){var e=`Namespace conflict found in grammar. +`+("The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <"+r.name+`>. +`)+`To resolve this make sure each Terminal and Non-Terminal names are unique +This is easy to accomplish by using the convention that Terminal names start with an uppercase letter +and Non-Terminal names start with a lower case letter.`;return e},buildAlternationPrefixAmbiguityError:function(r){var e=(0,eo.map)(r.prefixPath,function(n){return(0,ef.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous alternatives: <"+r.ambiguityIndices.join(" ,")+`> due to common lookahead prefix +`+("in inside <"+r.topLevelRule.name+`> Rule, +`)+("<"+e+`> may appears as a prefix path in all these alternatives. +`)+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX +For Further details.`;return i},buildAlternationAmbiguityError:function(r){var e=(0,eo.map)(r.prefixPath,function(n){return(0,ef.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous Alternatives Detected: <"+r.ambiguityIndices.join(" ,")+"> in "+(" inside <"+r.topLevelRule.name+`> Rule, +`)+("<"+e+`> may appears as a prefix path in all these alternatives. +`);return i=i+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES +For Further details.`,i},buildEmptyRepetitionError:function(r){var e=(0,Jj.getProductionDslName)(r.repetition);r.repetition.idx!==0&&(e+=r.repetition.idx);var t="The repetition <"+e+"> within Rule <"+r.topLevelRule.name+`> can never consume any tokens. +This could lead to an infinite loop.`;return t},buildTokenNameError:function(r){return"deprecated"},buildEmptyAlternationError:function(r){var e="Ambiguous empty alternative: <"+(r.emptyChoiceIdx+1)+">"+(" in inside <"+r.topLevelRule.name+`> Rule. +`)+"Only the last alternative may be an empty alternative.";return e},buildTooManyAlternativesError:function(r){var e=`An Alternation cannot have more than 256 alternatives: +`+(" inside <"+r.topLevelRule.name+`> Rule. + has `+(r.alternation.definition.length+1)+" alternatives.");return e},buildLeftRecursionError:function(r){var e=r.topLevelRule.name,t=IIe.map(r.leftRecursionPath,function(s){return s.name}),i=e+" --> "+t.concat([e]).join(" --> "),n=`Left Recursion found in grammar. +`+("rule: <"+e+`> can be invoked from itself (directly or indirectly) +`)+(`without consuming any Tokens. The grammar path that causes this is: + `+i+` +`)+` To fix this refactor your grammar to remove the left recursion. +see: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.`;return n},buildInvalidRuleNameError:function(r){return"deprecated"},buildDuplicateRuleNameError:function(r){var e;r.topLevelRule instanceof Wv.Rule?e=r.topLevelRule.name:e=r.topLevelRule;var t="Duplicate definition, rule: ->"+e+"<- is already defined in the grammar: ->"+r.grammarName+"<-";return t}}});var Vj=w(LA=>{"use strict";var yIe=LA&&LA.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(LA,"__esModule",{value:!0});LA.GastRefResolverVisitor=LA.resolveGrammar=void 0;var wIe=jn(),Wj=Gt(),BIe=$g();function bIe(r,e){var t=new zj(r,e);return t.resolveRefs(),t.errors}LA.resolveGrammar=bIe;var zj=function(r){yIe(e,r);function e(t,i){var n=r.call(this)||this;return n.nameToTopRule=t,n.errMsgProvider=i,n.errors=[],n}return e.prototype.resolveRefs=function(){var t=this;(0,Wj.forEach)((0,Wj.values)(this.nameToTopRule),function(i){t.currTopLevel=i,i.accept(t)})},e.prototype.visitNonTerminal=function(t){var i=this.nameToTopRule[t.nonTerminalName];if(i)t.referencedRule=i;else{var n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,t);this.errors.push({message:n,type:wIe.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:t.nonTerminalName})}},e}(BIe.GAstVisitor);LA.GastRefResolverVisitor=zj});var Dd=w(Nr=>{"use strict";var mc=Nr&&Nr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Nr,"__esModule",{value:!0});Nr.nextPossibleTokensAfter=Nr.possiblePathsFrom=Nr.NextTerminalAfterAtLeastOneSepWalker=Nr.NextTerminalAfterAtLeastOneWalker=Nr.NextTerminalAfterManySepWalker=Nr.NextTerminalAfterManyWalker=Nr.AbstractNextTerminalAfterProductionWalker=Nr.NextAfterTokenWalker=Nr.AbstractNextPossibleTokensWalker=void 0;var Xj=Ay(),Kt=Gt(),QIe=qv(),kt=mn(),Zj=function(r){mc(e,r);function e(t,i){var n=r.call(this)||this;return n.topProd=t,n.path=i,n.possibleTokTypes=[],n.nextProductionName="",n.nextProductionOccurrence=0,n.found=!1,n.isAtEndOfPath=!1,n}return e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=(0,Kt.cloneArr)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,Kt.cloneArr)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(t,i){i===void 0&&(i=[]),this.found||r.prototype.walk.call(this,t,i)},e.prototype.walkProdRef=function(t,i,n){if(t.referencedRule.name===this.nextProductionName&&t.idx===this.nextProductionOccurrence){var s=i.concat(n);this.updateExpectedNext(),this.walk(t.referencedRule,s)}},e.prototype.updateExpectedNext=function(){(0,Kt.isEmpty)(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(Xj.RestWalker);Nr.AbstractNextPossibleTokensWalker=Zj;var SIe=function(r){mc(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.path=i,n.nextTerminalName="",n.nextTerminalOccurrence=0,n.nextTerminalName=n.path.lastTok.name,n.nextTerminalOccurrence=n.path.lastTokOccurrence,n}return e.prototype.walkTerminal=function(t,i,n){if(this.isAtEndOfPath&&t.terminalType.name===this.nextTerminalName&&t.idx===this.nextTerminalOccurrence&&!this.found){var s=i.concat(n),o=new kt.Alternative({definition:s});this.possibleTokTypes=(0,QIe.first)(o),this.found=!0}},e}(Zj);Nr.NextAfterTokenWalker=SIe;var Pd=function(r){mc(e,r);function e(t,i){var n=r.call(this)||this;return n.topRule=t,n.occurrence=i,n.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},n}return e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(Xj.RestWalker);Nr.AbstractNextTerminalAfterProductionWalker=Pd;var vIe=function(r){mc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkMany=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkMany.call(this,t,i,n)},e}(Pd);Nr.NextTerminalAfterManyWalker=vIe;var xIe=function(r){mc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkManySep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkManySep.call(this,t,i,n)},e}(Pd);Nr.NextTerminalAfterManySepWalker=xIe;var PIe=function(r){mc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOne=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOne.call(this,t,i,n)},e}(Pd);Nr.NextTerminalAfterAtLeastOneWalker=PIe;var DIe=function(r){mc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOneSep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOneSep.call(this,t,i,n)},e}(Pd);Nr.NextTerminalAfterAtLeastOneSepWalker=DIe;function _j(r,e,t){t===void 0&&(t=[]),t=(0,Kt.cloneArr)(t);var i=[],n=0;function s(c){return c.concat((0,Kt.drop)(r,n+1))}function o(c){var u=_j(s(c),e,t);return i.concat(u)}for(;t.length=0;ge--){var re=B.definition[ge],O={idx:p,def:re.definition.concat((0,Kt.drop)(h)),ruleStack:C,occurrenceStack:y};g.push(O),g.push(o)}else if(B instanceof kt.Alternative)g.push({idx:p,def:B.definition.concat((0,Kt.drop)(h)),ruleStack:C,occurrenceStack:y});else if(B instanceof kt.Rule)g.push(RIe(B,p,C,y));else throw Error("non exhaustive match")}}return u}Nr.nextPossibleTokensAfter=kIe;function RIe(r,e,t,i){var n=(0,Kt.cloneArr)(t);n.push(r.name);var s=(0,Kt.cloneArr)(i);return s.push(1),{idx:e,def:r.definition,ruleStack:n,occurrenceStack:s}}});var kd=w(Zt=>{"use strict";var tq=Zt&&Zt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Zt,"__esModule",{value:!0});Zt.areTokenCategoriesNotUsed=Zt.isStrictPrefixOfPath=Zt.containsPath=Zt.getLookaheadPathsForOptionalProd=Zt.getLookaheadPathsForOr=Zt.lookAheadSequenceFromAlternatives=Zt.buildSingleAlternativeLookaheadFunction=Zt.buildAlternativesLookAheadFunc=Zt.buildLookaheadFuncForOptionalProd=Zt.buildLookaheadFuncForOr=Zt.getProdType=Zt.PROD_TYPE=void 0;var sr=Gt(),$j=Dd(),FIe=Ay(),hy=_g(),OA=mn(),NIe=$g(),oi;(function(r){r[r.OPTION=0]="OPTION",r[r.REPETITION=1]="REPETITION",r[r.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",r[r.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",r[r.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",r[r.ALTERNATION=5]="ALTERNATION"})(oi=Zt.PROD_TYPE||(Zt.PROD_TYPE={}));function TIe(r){if(r instanceof OA.Option)return oi.OPTION;if(r instanceof OA.Repetition)return oi.REPETITION;if(r instanceof OA.RepetitionMandatory)return oi.REPETITION_MANDATORY;if(r instanceof OA.RepetitionMandatoryWithSeparator)return oi.REPETITION_MANDATORY_WITH_SEPARATOR;if(r instanceof OA.RepetitionWithSeparator)return oi.REPETITION_WITH_SEPARATOR;if(r instanceof OA.Alternation)return oi.ALTERNATION;throw Error("non exhaustive match")}Zt.getProdType=TIe;function LIe(r,e,t,i,n,s){var o=iq(r,e,t),a=Xv(o)?hy.tokenStructuredMatcherNoCategories:hy.tokenStructuredMatcher;return s(o,i,a,n)}Zt.buildLookaheadFuncForOr=LIe;function OIe(r,e,t,i,n,s){var o=nq(r,e,n,t),a=Xv(o)?hy.tokenStructuredMatcherNoCategories:hy.tokenStructuredMatcher;return s(o[0],a,i)}Zt.buildLookaheadFuncForOptionalProd=OIe;function MIe(r,e,t,i){var n=r.length,s=(0,sr.every)(r,function(l){return(0,sr.every)(l,function(c){return c.length===1})});if(e)return function(l){for(var c=(0,sr.map)(l,function(D){return D.GATE}),u=0;u{"use strict";var Zv=Vt&&Vt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Vt,"__esModule",{value:!0});Vt.checkPrefixAlternativesAmbiguities=Vt.validateSomeNonEmptyLookaheadPath=Vt.validateTooManyAlts=Vt.RepetionCollector=Vt.validateAmbiguousAlternationAlternatives=Vt.validateEmptyOrAlternative=Vt.getFirstNoneTerminal=Vt.validateNoLeftRecursion=Vt.validateRuleIsOverridden=Vt.validateRuleDoesNotAlreadyExist=Vt.OccurrenceValidationCollector=Vt.identifyProductionForDuplicates=Vt.validateGrammar=void 0;var er=Gt(),Qr=Gt(),To=jn(),_v=vd(),tf=kd(),YIe=Dd(),to=mn(),$v=$g();function jIe(r,e,t,i,n){var s=er.map(r,function(h){return qIe(h,i)}),o=er.map(r,function(h){return ex(h,h,i)}),a=[],l=[],c=[];(0,Qr.every)(o,Qr.isEmpty)&&(a=(0,Qr.map)(r,function(h){return cq(h,i)}),l=(0,Qr.map)(r,function(h){return uq(h,e,i)}),c=hq(r,e,i));var u=zIe(r,t,i),g=(0,Qr.map)(r,function(h){return fq(h,i)}),f=(0,Qr.map)(r,function(h){return lq(h,r,n,i)});return er.flatten(s.concat(c,o,a,l,u,g,f))}Vt.validateGrammar=jIe;function qIe(r,e){var t=new Aq;r.accept(t);var i=t.allProductions,n=er.groupBy(i,oq),s=er.pick(n,function(a){return a.length>1}),o=er.map(er.values(s),function(a){var l=er.first(a),c=e.buildDuplicateFoundError(r,a),u=(0,_v.getProductionDslName)(l),g={message:c,type:To.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:r.name,dslName:u,occurrence:l.idx},f=aq(l);return f&&(g.parameter=f),g});return o}function oq(r){return(0,_v.getProductionDslName)(r)+"_#_"+r.idx+"_#_"+aq(r)}Vt.identifyProductionForDuplicates=oq;function aq(r){return r instanceof to.Terminal?r.terminalType.name:r instanceof to.NonTerminal?r.nonTerminalName:""}var Aq=function(r){Zv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitNonTerminal=function(t){this.allProductions.push(t)},e.prototype.visitOption=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e.prototype.visitAlternation=function(t){this.allProductions.push(t)},e.prototype.visitTerminal=function(t){this.allProductions.push(t)},e}($v.GAstVisitor);Vt.OccurrenceValidationCollector=Aq;function lq(r,e,t,i){var n=[],s=(0,Qr.reduce)(e,function(a,l){return l.name===r.name?a+1:a},0);if(s>1){var o=i.buildDuplicateRuleNameError({topLevelRule:r,grammarName:t});n.push({message:o,type:To.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:r.name})}return n}Vt.validateRuleDoesNotAlreadyExist=lq;function JIe(r,e,t){var i=[],n;return er.contains(e,r)||(n="Invalid rule override, rule: ->"+r+"<- cannot be overridden in the grammar: ->"+t+"<-as it is not defined in any of the super grammars ",i.push({message:n,type:To.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:r})),i}Vt.validateRuleIsOverridden=JIe;function ex(r,e,t,i){i===void 0&&(i=[]);var n=[],s=Rd(e.definition);if(er.isEmpty(s))return[];var o=r.name,a=er.contains(s,r);a&&n.push({message:t.buildLeftRecursionError({topLevelRule:r,leftRecursionPath:i}),type:To.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:o});var l=er.difference(s,i.concat([r])),c=er.map(l,function(u){var g=er.cloneArr(i);return g.push(u),ex(r,u,t,g)});return n.concat(er.flatten(c))}Vt.validateNoLeftRecursion=ex;function Rd(r){var e=[];if(er.isEmpty(r))return e;var t=er.first(r);if(t instanceof to.NonTerminal)e.push(t.referencedRule);else if(t instanceof to.Alternative||t instanceof to.Option||t instanceof to.RepetitionMandatory||t instanceof to.RepetitionMandatoryWithSeparator||t instanceof to.RepetitionWithSeparator||t instanceof to.Repetition)e=e.concat(Rd(t.definition));else if(t instanceof to.Alternation)e=er.flatten(er.map(t.definition,function(o){return Rd(o.definition)}));else if(!(t instanceof to.Terminal))throw Error("non exhaustive match");var i=(0,_v.isOptionalProd)(t),n=r.length>1;if(i&&n){var s=er.drop(r);return e.concat(Rd(s))}else return e}Vt.getFirstNoneTerminal=Rd;var tx=function(r){Zv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.alternations=[],t}return e.prototype.visitAlternation=function(t){this.alternations.push(t)},e}($v.GAstVisitor);function cq(r,e){var t=new tx;r.accept(t);var i=t.alternations,n=er.reduce(i,function(s,o){var a=er.dropRight(o.definition),l=er.map(a,function(c,u){var g=(0,YIe.nextPossibleTokensAfter)([c],[],null,1);return er.isEmpty(g)?{message:e.buildEmptyAlternationError({topLevelRule:r,alternation:o,emptyChoiceIdx:u}),type:To.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:r.name,occurrence:o.idx,alternative:u+1}:null});return s.concat(er.compact(l))},[]);return n}Vt.validateEmptyOrAlternative=cq;function uq(r,e,t){var i=new tx;r.accept(i);var n=i.alternations;n=(0,Qr.reject)(n,function(o){return o.ignoreAmbiguities===!0});var s=er.reduce(n,function(o,a){var l=a.idx,c=a.maxLookahead||e,u=(0,tf.getLookaheadPathsForOr)(l,r,c,a),g=WIe(u,a,r,t),f=pq(u,a,r,t);return o.concat(g,f)},[]);return s}Vt.validateAmbiguousAlternationAlternatives=uq;var gq=function(r){Zv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e}($v.GAstVisitor);Vt.RepetionCollector=gq;function fq(r,e){var t=new tx;r.accept(t);var i=t.alternations,n=er.reduce(i,function(s,o){return o.definition.length>255&&s.push({message:e.buildTooManyAlternativesError({topLevelRule:r,alternation:o}),type:To.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:r.name,occurrence:o.idx}),s},[]);return n}Vt.validateTooManyAlts=fq;function hq(r,e,t){var i=[];return(0,Qr.forEach)(r,function(n){var s=new gq;n.accept(s);var o=s.allProductions;(0,Qr.forEach)(o,function(a){var l=(0,tf.getProdType)(a),c=a.maxLookahead||e,u=a.idx,g=(0,tf.getLookaheadPathsForOptionalProd)(u,n,l,c),f=g[0];if((0,Qr.isEmpty)((0,Qr.flatten)(f))){var h=t.buildEmptyRepetitionError({topLevelRule:n,repetition:a});i.push({message:h,type:To.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,ruleName:n.name})}})}),i}Vt.validateSomeNonEmptyLookaheadPath=hq;function WIe(r,e,t,i){var n=[],s=(0,Qr.reduce)(r,function(a,l,c){return e.definition[c].ignoreAmbiguities===!0||(0,Qr.forEach)(l,function(u){var g=[c];(0,Qr.forEach)(r,function(f,h){c!==h&&(0,tf.containsPath)(f,u)&&e.definition[h].ignoreAmbiguities!==!0&&g.push(h)}),g.length>1&&!(0,tf.containsPath)(n,u)&&(n.push(u),a.push({alts:g,path:u}))}),a},[]),o=er.map(s,function(a){var l=(0,Qr.map)(a.alts,function(u){return u+1}),c=i.buildAlternationAmbiguityError({topLevelRule:t,alternation:e,ambiguityIndices:l,prefixPath:a.path});return{message:c,type:To.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:t.name,occurrence:e.idx,alternatives:[a.alts]}});return o}function pq(r,e,t,i){var n=[],s=(0,Qr.reduce)(r,function(o,a,l){var c=(0,Qr.map)(a,function(u){return{idx:l,path:u}});return o.concat(c)},[]);return(0,Qr.forEach)(s,function(o){var a=e.definition[o.idx];if(a.ignoreAmbiguities!==!0){var l=o.idx,c=o.path,u=(0,Qr.findAll)(s,function(f){return e.definition[f.idx].ignoreAmbiguities!==!0&&f.idx{"use strict";Object.defineProperty(rf,"__esModule",{value:!0});rf.validateGrammar=rf.resolveGrammar=void 0;var ix=Gt(),VIe=Vj(),XIe=rx(),dq=xd();function ZIe(r){r=(0,ix.defaults)(r,{errMsgProvider:dq.defaultGrammarResolverErrorProvider});var e={};return(0,ix.forEach)(r.rules,function(t){e[t.name]=t}),(0,VIe.resolveGrammar)(e,r.errMsgProvider)}rf.resolveGrammar=ZIe;function _Ie(r){return r=(0,ix.defaults)(r,{errMsgProvider:dq.defaultGrammarValidatorErrorProvider}),(0,XIe.validateGrammar)(r.rules,r.maxLookahead,r.tokenTypes,r.errMsgProvider,r.grammarName)}rf.validateGrammar=_Ie});var nf=w(In=>{"use strict";var Fd=In&&In.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(In,"__esModule",{value:!0});In.EarlyExitException=In.NotAllInputParsedException=In.NoViableAltException=In.MismatchedTokenException=In.isRecognitionException=void 0;var $Ie=Gt(),mq="MismatchedTokenException",Eq="NoViableAltException",Iq="EarlyExitException",yq="NotAllInputParsedException",wq=[mq,Eq,Iq,yq];Object.freeze(wq);function eye(r){return(0,$Ie.contains)(wq,r.name)}In.isRecognitionException=eye;var py=function(r){Fd(e,r);function e(t,i){var n=this.constructor,s=r.call(this,t)||this;return s.token=i,s.resyncedTokens=[],Object.setPrototypeOf(s,n.prototype),Error.captureStackTrace&&Error.captureStackTrace(s,s.constructor),s}return e}(Error),tye=function(r){Fd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=mq,s}return e}(py);In.MismatchedTokenException=tye;var rye=function(r){Fd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=Eq,s}return e}(py);In.NoViableAltException=rye;var iye=function(r){Fd(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.name=yq,n}return e}(py);In.NotAllInputParsedException=iye;var nye=function(r){Fd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=Iq,s}return e}(py);In.EarlyExitException=nye});var sx=w(Ki=>{"use strict";Object.defineProperty(Ki,"__esModule",{value:!0});Ki.attemptInRepetitionRecovery=Ki.Recoverable=Ki.InRuleRecoveryException=Ki.IN_RULE_RECOVERY_EXCEPTION=Ki.EOF_FOLLOW_KEY=void 0;var dy=TA(),hs=Gt(),sye=nf(),oye=Jv(),aye=jn();Ki.EOF_FOLLOW_KEY={};Ki.IN_RULE_RECOVERY_EXCEPTION="InRuleRecoveryException";function nx(r){this.name=Ki.IN_RULE_RECOVERY_EXCEPTION,this.message=r}Ki.InRuleRecoveryException=nx;nx.prototype=Error.prototype;var Aye=function(){function r(){}return r.prototype.initRecoverable=function(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=(0,hs.has)(e,"recoveryEnabled")?e.recoveryEnabled:aye.DEFAULT_PARSER_CONFIG.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=Bq)},r.prototype.getTokenToInsert=function(e){var t=(0,dy.createTokenInstance)(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return t.isInsertedInRecovery=!0,t},r.prototype.canTokenTypeBeInsertedInRecovery=function(e){return!0},r.prototype.tryInRepetitionRecovery=function(e,t,i,n){for(var s=this,o=this.findReSyncTokenType(),a=this.exportLexerState(),l=[],c=!1,u=this.LA(1),g=this.LA(1),f=function(){var h=s.LA(0),p=s.errorMessageProvider.buildMismatchTokenMessage({expected:n,actual:u,previous:h,ruleName:s.getCurrRuleFullName()}),C=new sye.MismatchedTokenException(p,u,s.LA(0));C.resyncedTokens=(0,hs.dropRight)(l),s.SAVE_ERROR(C)};!c;)if(this.tokenMatcher(g,n)){f();return}else if(i.call(this)){f(),e.apply(this,t);return}else this.tokenMatcher(g,o)?c=!0:(g=this.SKIP_TOKEN(),this.addToResyncTokens(g,l));this.importLexerState(a)},r.prototype.shouldInRepetitionRecoveryBeTried=function(e,t,i){return!(i===!1||e===void 0||t===void 0||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,t)))},r.prototype.getFollowsForInRuleRecovery=function(e,t){var i=this.getCurrentGrammarPath(e,t),n=this.getNextPossibleTokenTypes(i);return n},r.prototype.tryInRuleRecovery=function(e,t){if(this.canRecoverWithSingleTokenInsertion(e,t)){var i=this.getTokenToInsert(e);return i}if(this.canRecoverWithSingleTokenDeletion(e)){var n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new nx("sad sad panda")},r.prototype.canPerformInRuleRecovery=function(e,t){return this.canRecoverWithSingleTokenInsertion(e,t)||this.canRecoverWithSingleTokenDeletion(e)},r.prototype.canRecoverWithSingleTokenInsertion=function(e,t){var i=this;if(!this.canTokenTypeBeInsertedInRecovery(e)||(0,hs.isEmpty)(t))return!1;var n=this.LA(1),s=(0,hs.find)(t,function(o){return i.tokenMatcher(n,o)})!==void 0;return s},r.prototype.canRecoverWithSingleTokenDeletion=function(e){var t=this.tokenMatcher(this.LA(2),e);return t},r.prototype.isInCurrentRuleReSyncSet=function(e){var t=this.getCurrFollowKey(),i=this.getFollowSetFromFollowKey(t);return(0,hs.contains)(i,e)},r.prototype.findReSyncTokenType=function(){for(var e=this.flattenFollowSet(),t=this.LA(1),i=2;;){var n=t.tokenType;if((0,hs.contains)(e,n))return n;t=this.LA(i),i++}},r.prototype.getCurrFollowKey=function(){if(this.RULE_STACK.length===1)return Ki.EOF_FOLLOW_KEY;var e=this.getLastExplicitRuleShortName(),t=this.getLastExplicitRuleOccurrenceIndex(),i=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:t,inRule:this.shortRuleNameToFullName(i)}},r.prototype.buildFullFollowKeyStack=function(){var e=this,t=this.RULE_STACK,i=this.RULE_OCCURRENCE_STACK;return(0,hs.map)(t,function(n,s){return s===0?Ki.EOF_FOLLOW_KEY:{ruleName:e.shortRuleNameToFullName(n),idxInCallingRule:i[s],inRule:e.shortRuleNameToFullName(t[s-1])}})},r.prototype.flattenFollowSet=function(){var e=this,t=(0,hs.map)(this.buildFullFollowKeyStack(),function(i){return e.getFollowSetFromFollowKey(i)});return(0,hs.flatten)(t)},r.prototype.getFollowSetFromFollowKey=function(e){if(e===Ki.EOF_FOLLOW_KEY)return[dy.EOF];var t=e.ruleName+e.idxInCallingRule+oye.IN+e.inRule;return this.resyncFollows[t]},r.prototype.addToResyncTokens=function(e,t){return this.tokenMatcher(e,dy.EOF)||t.push(e),t},r.prototype.reSyncTo=function(e){for(var t=[],i=this.LA(1);this.tokenMatcher(i,e)===!1;)i=this.SKIP_TOKEN(),this.addToResyncTokens(i,t);return(0,hs.dropRight)(t)},r.prototype.attemptInRepetitionRecovery=function(e,t,i,n,s,o,a){},r.prototype.getCurrentGrammarPath=function(e,t){var i=this.getHumanReadableRuleStack(),n=(0,hs.cloneArr)(this.RULE_OCCURRENCE_STACK),s={ruleStack:i,occurrenceStack:n,lastTok:e,lastTokOccurrence:t};return s},r.prototype.getHumanReadableRuleStack=function(){var e=this;return(0,hs.map)(this.RULE_STACK,function(t){return e.shortRuleNameToFullName(t)})},r}();Ki.Recoverable=Aye;function Bq(r,e,t,i,n,s,o){var a=this.getKeyForAutomaticLookahead(i,n),l=this.firstAfterRepMap[a];if(l===void 0){var c=this.getCurrRuleFullName(),u=this.getGAstProductions()[c],g=new s(u,n);l=g.startWalking(),this.firstAfterRepMap[a]=l}var f=l.token,h=l.occurrence,p=l.isEndOfRule;this.RULE_STACK.length===1&&p&&f===void 0&&(f=dy.EOF,h=1),this.shouldInRepetitionRecoveryBeTried(f,h,o)&&this.tryInRepetitionRecovery(r,e,t,f)}Ki.attemptInRepetitionRecovery=Bq});var Cy=w(Jt=>{"use strict";Object.defineProperty(Jt,"__esModule",{value:!0});Jt.getKeyForAutomaticLookahead=Jt.AT_LEAST_ONE_SEP_IDX=Jt.MANY_SEP_IDX=Jt.AT_LEAST_ONE_IDX=Jt.MANY_IDX=Jt.OPTION_IDX=Jt.OR_IDX=Jt.BITS_FOR_ALT_IDX=Jt.BITS_FOR_RULE_IDX=Jt.BITS_FOR_OCCURRENCE_IDX=Jt.BITS_FOR_METHOD_TYPE=void 0;Jt.BITS_FOR_METHOD_TYPE=4;Jt.BITS_FOR_OCCURRENCE_IDX=8;Jt.BITS_FOR_RULE_IDX=12;Jt.BITS_FOR_ALT_IDX=8;Jt.OR_IDX=1<{"use strict";Object.defineProperty(my,"__esModule",{value:!0});my.LooksAhead=void 0;var ka=kd(),ro=Gt(),bq=jn(),Ra=Cy(),Ec=vd(),cye=function(){function r(){}return r.prototype.initLooksAhead=function(e){this.dynamicTokensEnabled=(0,ro.has)(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:bq.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,ro.has)(e,"maxLookahead")?e.maxLookahead:bq.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookAheadFuncsCache=(0,ro.isES2015MapSupported)()?new Map:[],(0,ro.isES2015MapSupported)()?(this.getLaFuncFromCache=this.getLaFuncFromMap,this.setLaFuncCache=this.setLaFuncCacheUsingMap):(this.getLaFuncFromCache=this.getLaFuncFromObj,this.setLaFuncCache=this.setLaFuncUsingObj)},r.prototype.preComputeLookaheadFunctions=function(e){var t=this;(0,ro.forEach)(e,function(i){t.TRACE_INIT(i.name+" Rule Lookahead",function(){var n=(0,Ec.collectMethods)(i),s=n.alternation,o=n.repetition,a=n.option,l=n.repetitionMandatory,c=n.repetitionMandatoryWithSeparator,u=n.repetitionWithSeparator;(0,ro.forEach)(s,function(g){var f=g.idx===0?"":g.idx;t.TRACE_INIT(""+(0,Ec.getProductionDslName)(g)+f,function(){var h=(0,ka.buildLookaheadFuncForOr)(g.idx,i,g.maxLookahead||t.maxLookahead,g.hasPredicates,t.dynamicTokensEnabled,t.lookAheadBuilderForAlternatives),p=(0,Ra.getKeyForAutomaticLookahead)(t.fullRuleNameToShort[i.name],Ra.OR_IDX,g.idx);t.setLaFuncCache(p,h)})}),(0,ro.forEach)(o,function(g){t.computeLookaheadFunc(i,g.idx,Ra.MANY_IDX,ka.PROD_TYPE.REPETITION,g.maxLookahead,(0,Ec.getProductionDslName)(g))}),(0,ro.forEach)(a,function(g){t.computeLookaheadFunc(i,g.idx,Ra.OPTION_IDX,ka.PROD_TYPE.OPTION,g.maxLookahead,(0,Ec.getProductionDslName)(g))}),(0,ro.forEach)(l,function(g){t.computeLookaheadFunc(i,g.idx,Ra.AT_LEAST_ONE_IDX,ka.PROD_TYPE.REPETITION_MANDATORY,g.maxLookahead,(0,Ec.getProductionDslName)(g))}),(0,ro.forEach)(c,function(g){t.computeLookaheadFunc(i,g.idx,Ra.AT_LEAST_ONE_SEP_IDX,ka.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,g.maxLookahead,(0,Ec.getProductionDslName)(g))}),(0,ro.forEach)(u,function(g){t.computeLookaheadFunc(i,g.idx,Ra.MANY_SEP_IDX,ka.PROD_TYPE.REPETITION_WITH_SEPARATOR,g.maxLookahead,(0,Ec.getProductionDslName)(g))})})})},r.prototype.computeLookaheadFunc=function(e,t,i,n,s,o){var a=this;this.TRACE_INIT(""+o+(t===0?"":t),function(){var l=(0,ka.buildLookaheadFuncForOptionalProd)(t,e,s||a.maxLookahead,a.dynamicTokensEnabled,n,a.lookAheadBuilderForOptional),c=(0,Ra.getKeyForAutomaticLookahead)(a.fullRuleNameToShort[e.name],i,t);a.setLaFuncCache(c,l)})},r.prototype.lookAheadBuilderForOptional=function(e,t,i){return(0,ka.buildSingleAlternativeLookaheadFunction)(e,t,i)},r.prototype.lookAheadBuilderForAlternatives=function(e,t,i,n){return(0,ka.buildAlternativesLookAheadFunc)(e,t,i,n)},r.prototype.getKeyForAutomaticLookahead=function(e,t){var i=this.getLastExplicitRuleShortName();return(0,Ra.getKeyForAutomaticLookahead)(i,e,t)},r.prototype.getLaFuncFromCache=function(e){},r.prototype.getLaFuncFromMap=function(e){return this.lookAheadFuncsCache.get(e)},r.prototype.getLaFuncFromObj=function(e){return this.lookAheadFuncsCache[e]},r.prototype.setLaFuncCache=function(e,t){},r.prototype.setLaFuncCacheUsingMap=function(e,t){this.lookAheadFuncsCache.set(e,t)},r.prototype.setLaFuncUsingObj=function(e,t){this.lookAheadFuncsCache[e]=t},r}();my.LooksAhead=cye});var Sq=w(Lo=>{"use strict";Object.defineProperty(Lo,"__esModule",{value:!0});Lo.addNoneTerminalToCst=Lo.addTerminalToCst=Lo.setNodeLocationFull=Lo.setNodeLocationOnlyOffset=void 0;function uye(r,e){isNaN(r.startOffset)===!0?(r.startOffset=e.startOffset,r.endOffset=e.endOffset):r.endOffset{"use strict";Object.defineProperty(MA,"__esModule",{value:!0});MA.defineNameProp=MA.functionName=MA.classNameFromInstance=void 0;var pye=Gt();function dye(r){return xq(r.constructor)}MA.classNameFromInstance=dye;var vq="name";function xq(r){var e=r.name;return e||"anonymous"}MA.functionName=xq;function Cye(r,e){var t=Object.getOwnPropertyDescriptor(r,vq);return(0,pye.isUndefined)(t)||t.configurable?(Object.defineProperty(r,vq,{enumerable:!1,configurable:!0,writable:!1,value:e}),!0):!1}MA.defineNameProp=Cye});var Fq=w(Si=>{"use strict";Object.defineProperty(Si,"__esModule",{value:!0});Si.validateRedundantMethods=Si.validateMissingCstMethods=Si.validateVisitor=Si.CstVisitorDefinitionError=Si.createBaseVisitorConstructorWithDefaults=Si.createBaseSemanticVisitorConstructor=Si.defaultVisit=void 0;var ps=Gt(),Nd=ox();function Pq(r,e){for(var t=(0,ps.keys)(r),i=t.length,n=0;n: + `+(""+s.join(` + +`).replace(/\n/g,` + `)))}}};return t.prototype=i,t.prototype.constructor=t,t._RULE_NAMES=e,t}Si.createBaseSemanticVisitorConstructor=mye;function Eye(r,e,t){var i=function(){};(0,Nd.defineNameProp)(i,r+"BaseSemanticsWithDefaults");var n=Object.create(t.prototype);return(0,ps.forEach)(e,function(s){n[s]=Pq}),i.prototype=n,i.prototype.constructor=i,i}Si.createBaseVisitorConstructorWithDefaults=Eye;var ax;(function(r){r[r.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",r[r.MISSING_METHOD=1]="MISSING_METHOD"})(ax=Si.CstVisitorDefinitionError||(Si.CstVisitorDefinitionError={}));function Dq(r,e){var t=kq(r,e),i=Rq(r,e);return t.concat(i)}Si.validateVisitor=Dq;function kq(r,e){var t=(0,ps.map)(e,function(i){if(!(0,ps.isFunction)(r[i]))return{msg:"Missing visitor method: <"+i+"> on "+(0,Nd.functionName)(r.constructor)+" CST Visitor.",type:ax.MISSING_METHOD,methodName:i}});return(0,ps.compact)(t)}Si.validateMissingCstMethods=kq;var Iye=["constructor","visit","validateVisitor"];function Rq(r,e){var t=[];for(var i in r)(0,ps.isFunction)(r[i])&&!(0,ps.contains)(Iye,i)&&!(0,ps.contains)(e,i)&&t.push({msg:"Redundant visitor method: <"+i+"> on "+(0,Nd.functionName)(r.constructor)+` CST Visitor +There is no Grammar Rule corresponding to this method's name. +`,type:ax.REDUNDANT_METHOD,methodName:i});return t}Si.validateRedundantMethods=Rq});var Tq=w(Ey=>{"use strict";Object.defineProperty(Ey,"__esModule",{value:!0});Ey.TreeBuilder=void 0;var sf=Sq(),_r=Gt(),Nq=Fq(),yye=jn(),wye=function(){function r(){}return r.prototype.initTreeBuilder=function(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=(0,_r.has)(e,"nodeLocationTracking")?e.nodeLocationTracking:yye.DEFAULT_PARSER_CONFIG.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=_r.NOOP,this.cstFinallyStateUpdate=_r.NOOP,this.cstPostTerminal=_r.NOOP,this.cstPostNonTerminal=_r.NOOP,this.cstPostRule=_r.NOOP;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=sf.setNodeLocationFull,this.setNodeLocationFromNode=sf.setNodeLocationFull,this.cstPostRule=_r.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=_r.NOOP,this.setNodeLocationFromNode=_r.NOOP,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=sf.setNodeLocationOnlyOffset,this.setNodeLocationFromNode=sf.setNodeLocationOnlyOffset,this.cstPostRule=_r.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=_r.NOOP,this.setNodeLocationFromNode=_r.NOOP,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=_r.NOOP,this.setNodeLocationFromNode=_r.NOOP,this.cstPostRule=_r.NOOP,this.setInitialNodeLocation=_r.NOOP;else throw Error('Invalid config option: "'+e.nodeLocationTracking+'"')},r.prototype.setInitialNodeLocationOnlyOffsetRecovery=function(e){e.location={startOffset:NaN,endOffset:NaN}},r.prototype.setInitialNodeLocationOnlyOffsetRegular=function(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}},r.prototype.setInitialNodeLocationFullRecovery=function(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.setInitialNodeLocationFullRegular=function(e){var t=this.LA(1);e.location={startOffset:t.startOffset,startLine:t.startLine,startColumn:t.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.cstInvocationStateUpdate=function(e,t){var i={name:e,children:{}};this.setInitialNodeLocation(i),this.CST_STACK.push(i)},r.prototype.cstFinallyStateUpdate=function(){this.CST_STACK.pop()},r.prototype.cstPostRuleFull=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?(i.endOffset=t.endOffset,i.endLine=t.endLine,i.endColumn=t.endColumn):(i.startOffset=NaN,i.startLine=NaN,i.startColumn=NaN)},r.prototype.cstPostRuleOnlyOffset=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?i.endOffset=t.endOffset:i.startOffset=NaN},r.prototype.cstPostTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,sf.addTerminalToCst)(i,t,e),this.setNodeLocationFromToken(i.location,t)},r.prototype.cstPostNonTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,sf.addNoneTerminalToCst)(i,t,e),this.setNodeLocationFromNode(i.location,e.location)},r.prototype.getBaseCstVisitorConstructor=function(){if((0,_r.isUndefined)(this.baseCstVisitorConstructor)){var e=(0,Nq.createBaseSemanticVisitorConstructor)(this.className,(0,_r.keys)(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor},r.prototype.getBaseCstVisitorConstructorWithDefaults=function(){if((0,_r.isUndefined)(this.baseCstVisitorWithDefaultsConstructor)){var e=(0,Nq.createBaseVisitorConstructorWithDefaults)(this.className,(0,_r.keys)(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor},r.prototype.getLastExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-1]},r.prototype.getPreviousExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-2]},r.prototype.getLastExplicitRuleOccurrenceIndex=function(){var e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]},r}();Ey.TreeBuilder=wye});var Oq=w(Iy=>{"use strict";Object.defineProperty(Iy,"__esModule",{value:!0});Iy.LexerAdapter=void 0;var Lq=jn(),Bye=function(){function r(){}return r.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(r.prototype,"input",{get:function(){return this.tokVector},set:function(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length},enumerable:!1,configurable:!0}),r.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):Lq.END_OF_FILE},r.prototype.LA=function(e){var t=this.currIdx+e;return t<0||this.tokVectorLength<=t?Lq.END_OF_FILE:this.tokVector[t]},r.prototype.consumeToken=function(){this.currIdx++},r.prototype.exportLexerState=function(){return this.currIdx},r.prototype.importLexerState=function(e){this.currIdx=e},r.prototype.resetLexerState=function(){this.currIdx=-1},r.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},r.prototype.getLexerPosition=function(){return this.exportLexerState()},r}();Iy.LexerAdapter=Bye});var Kq=w(yy=>{"use strict";Object.defineProperty(yy,"__esModule",{value:!0});yy.RecognizerApi=void 0;var Mq=Gt(),bye=nf(),Ax=jn(),Qye=xd(),Sye=rx(),vye=mn(),xye=function(){function r(){}return r.prototype.ACTION=function(e){return e.call(this)},r.prototype.consume=function(e,t,i){return this.consumeInternal(t,e,i)},r.prototype.subrule=function(e,t,i){return this.subruleInternal(t,e,i)},r.prototype.option=function(e,t){return this.optionInternal(t,e)},r.prototype.or=function(e,t){return this.orInternal(t,e)},r.prototype.many=function(e,t){return this.manyInternal(e,t)},r.prototype.atLeastOne=function(e,t){return this.atLeastOneInternal(e,t)},r.prototype.CONSUME=function(e,t){return this.consumeInternal(e,0,t)},r.prototype.CONSUME1=function(e,t){return this.consumeInternal(e,1,t)},r.prototype.CONSUME2=function(e,t){return this.consumeInternal(e,2,t)},r.prototype.CONSUME3=function(e,t){return this.consumeInternal(e,3,t)},r.prototype.CONSUME4=function(e,t){return this.consumeInternal(e,4,t)},r.prototype.CONSUME5=function(e,t){return this.consumeInternal(e,5,t)},r.prototype.CONSUME6=function(e,t){return this.consumeInternal(e,6,t)},r.prototype.CONSUME7=function(e,t){return this.consumeInternal(e,7,t)},r.prototype.CONSUME8=function(e,t){return this.consumeInternal(e,8,t)},r.prototype.CONSUME9=function(e,t){return this.consumeInternal(e,9,t)},r.prototype.SUBRULE=function(e,t){return this.subruleInternal(e,0,t)},r.prototype.SUBRULE1=function(e,t){return this.subruleInternal(e,1,t)},r.prototype.SUBRULE2=function(e,t){return this.subruleInternal(e,2,t)},r.prototype.SUBRULE3=function(e,t){return this.subruleInternal(e,3,t)},r.prototype.SUBRULE4=function(e,t){return this.subruleInternal(e,4,t)},r.prototype.SUBRULE5=function(e,t){return this.subruleInternal(e,5,t)},r.prototype.SUBRULE6=function(e,t){return this.subruleInternal(e,6,t)},r.prototype.SUBRULE7=function(e,t){return this.subruleInternal(e,7,t)},r.prototype.SUBRULE8=function(e,t){return this.subruleInternal(e,8,t)},r.prototype.SUBRULE9=function(e,t){return this.subruleInternal(e,9,t)},r.prototype.OPTION=function(e){return this.optionInternal(e,0)},r.prototype.OPTION1=function(e){return this.optionInternal(e,1)},r.prototype.OPTION2=function(e){return this.optionInternal(e,2)},r.prototype.OPTION3=function(e){return this.optionInternal(e,3)},r.prototype.OPTION4=function(e){return this.optionInternal(e,4)},r.prototype.OPTION5=function(e){return this.optionInternal(e,5)},r.prototype.OPTION6=function(e){return this.optionInternal(e,6)},r.prototype.OPTION7=function(e){return this.optionInternal(e,7)},r.prototype.OPTION8=function(e){return this.optionInternal(e,8)},r.prototype.OPTION9=function(e){return this.optionInternal(e,9)},r.prototype.OR=function(e){return this.orInternal(e,0)},r.prototype.OR1=function(e){return this.orInternal(e,1)},r.prototype.OR2=function(e){return this.orInternal(e,2)},r.prototype.OR3=function(e){return this.orInternal(e,3)},r.prototype.OR4=function(e){return this.orInternal(e,4)},r.prototype.OR5=function(e){return this.orInternal(e,5)},r.prototype.OR6=function(e){return this.orInternal(e,6)},r.prototype.OR7=function(e){return this.orInternal(e,7)},r.prototype.OR8=function(e){return this.orInternal(e,8)},r.prototype.OR9=function(e){return this.orInternal(e,9)},r.prototype.MANY=function(e){this.manyInternal(0,e)},r.prototype.MANY1=function(e){this.manyInternal(1,e)},r.prototype.MANY2=function(e){this.manyInternal(2,e)},r.prototype.MANY3=function(e){this.manyInternal(3,e)},r.prototype.MANY4=function(e){this.manyInternal(4,e)},r.prototype.MANY5=function(e){this.manyInternal(5,e)},r.prototype.MANY6=function(e){this.manyInternal(6,e)},r.prototype.MANY7=function(e){this.manyInternal(7,e)},r.prototype.MANY8=function(e){this.manyInternal(8,e)},r.prototype.MANY9=function(e){this.manyInternal(9,e)},r.prototype.MANY_SEP=function(e){this.manySepFirstInternal(0,e)},r.prototype.MANY_SEP1=function(e){this.manySepFirstInternal(1,e)},r.prototype.MANY_SEP2=function(e){this.manySepFirstInternal(2,e)},r.prototype.MANY_SEP3=function(e){this.manySepFirstInternal(3,e)},r.prototype.MANY_SEP4=function(e){this.manySepFirstInternal(4,e)},r.prototype.MANY_SEP5=function(e){this.manySepFirstInternal(5,e)},r.prototype.MANY_SEP6=function(e){this.manySepFirstInternal(6,e)},r.prototype.MANY_SEP7=function(e){this.manySepFirstInternal(7,e)},r.prototype.MANY_SEP8=function(e){this.manySepFirstInternal(8,e)},r.prototype.MANY_SEP9=function(e){this.manySepFirstInternal(9,e)},r.prototype.AT_LEAST_ONE=function(e){this.atLeastOneInternal(0,e)},r.prototype.AT_LEAST_ONE1=function(e){return this.atLeastOneInternal(1,e)},r.prototype.AT_LEAST_ONE2=function(e){this.atLeastOneInternal(2,e)},r.prototype.AT_LEAST_ONE3=function(e){this.atLeastOneInternal(3,e)},r.prototype.AT_LEAST_ONE4=function(e){this.atLeastOneInternal(4,e)},r.prototype.AT_LEAST_ONE5=function(e){this.atLeastOneInternal(5,e)},r.prototype.AT_LEAST_ONE6=function(e){this.atLeastOneInternal(6,e)},r.prototype.AT_LEAST_ONE7=function(e){this.atLeastOneInternal(7,e)},r.prototype.AT_LEAST_ONE8=function(e){this.atLeastOneInternal(8,e)},r.prototype.AT_LEAST_ONE9=function(e){this.atLeastOneInternal(9,e)},r.prototype.AT_LEAST_ONE_SEP=function(e){this.atLeastOneSepFirstInternal(0,e)},r.prototype.AT_LEAST_ONE_SEP1=function(e){this.atLeastOneSepFirstInternal(1,e)},r.prototype.AT_LEAST_ONE_SEP2=function(e){this.atLeastOneSepFirstInternal(2,e)},r.prototype.AT_LEAST_ONE_SEP3=function(e){this.atLeastOneSepFirstInternal(3,e)},r.prototype.AT_LEAST_ONE_SEP4=function(e){this.atLeastOneSepFirstInternal(4,e)},r.prototype.AT_LEAST_ONE_SEP5=function(e){this.atLeastOneSepFirstInternal(5,e)},r.prototype.AT_LEAST_ONE_SEP6=function(e){this.atLeastOneSepFirstInternal(6,e)},r.prototype.AT_LEAST_ONE_SEP7=function(e){this.atLeastOneSepFirstInternal(7,e)},r.prototype.AT_LEAST_ONE_SEP8=function(e){this.atLeastOneSepFirstInternal(8,e)},r.prototype.AT_LEAST_ONE_SEP9=function(e){this.atLeastOneSepFirstInternal(9,e)},r.prototype.RULE=function(e,t,i){if(i===void 0&&(i=Ax.DEFAULT_RULE_CONFIG),(0,Mq.contains)(this.definedRulesNames,e)){var n=Qye.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),s={message:n,type:Ax.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);var o=this.defineRule(e,t,i);return this[e]=o,o},r.prototype.OVERRIDE_RULE=function(e,t,i){i===void 0&&(i=Ax.DEFAULT_RULE_CONFIG);var n=[];n=n.concat((0,Sye.validateRuleIsOverridden)(e,this.definedRulesNames,this.className)),this.definitionErrors=this.definitionErrors.concat(n);var s=this.defineRule(e,t,i);return this[e]=s,s},r.prototype.BACKTRACK=function(e,t){return function(){this.isBackTrackingStack.push(1);var i=this.saveRecogState();try{return e.apply(this,t),!0}catch(n){if((0,bye.isRecognitionException)(n))return!1;throw n}finally{this.reloadRecogState(i),this.isBackTrackingStack.pop()}}},r.prototype.getGAstProductions=function(){return this.gastProductionsCache},r.prototype.getSerializedGastProductions=function(){return(0,vye.serializeGrammar)((0,Mq.values)(this.gastProductionsCache))},r}();yy.RecognizerApi=xye});var Yq=w(By=>{"use strict";Object.defineProperty(By,"__esModule",{value:!0});By.RecognizerEngine=void 0;var Pr=Gt(),qn=Cy(),wy=nf(),Uq=kd(),of=Dd(),Hq=jn(),Pye=sx(),Gq=TA(),Td=_g(),Dye=ox(),kye=function(){function r(){}return r.prototype.initRecognizerEngine=function(e,t){if(this.className=(0,Dye.classNameFromInstance)(this),this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=Td.tokenStructuredMatcherNoCategories,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},(0,Pr.has)(t,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 + For Further details.`);if((0,Pr.isArray)(e)){if((0,Pr.isEmpty)(e))throw Error(`A Token Vocabulary cannot be empty. + Note that the first argument for the parser constructor + is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 + For Further details.`)}if((0,Pr.isArray)(e))this.tokensMap=(0,Pr.reduce)(e,function(o,a){return o[a.name]=a,o},{});else if((0,Pr.has)(e,"modes")&&(0,Pr.every)((0,Pr.flatten)((0,Pr.values)(e.modes)),Td.isTokenType)){var i=(0,Pr.flatten)((0,Pr.values)(e.modes)),n=(0,Pr.uniq)(i);this.tokensMap=(0,Pr.reduce)(n,function(o,a){return o[a.name]=a,o},{})}else if((0,Pr.isObject)(e))this.tokensMap=(0,Pr.cloneObj)(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=Gq.EOF;var s=(0,Pr.every)((0,Pr.values)(e),function(o){return(0,Pr.isEmpty)(o.categoryMatches)});this.tokenMatcher=s?Td.tokenStructuredMatcherNoCategories:Td.tokenStructuredMatcher,(0,Td.augmentTokenTypes)((0,Pr.values)(this.tokensMap))},r.prototype.defineRule=function(e,t,i){if(this.selfAnalysisDone)throw Error("Grammar rule <"+e+`> may not be defined after the 'performSelfAnalysis' method has been called' +Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);var n=(0,Pr.has)(i,"resyncEnabled")?i.resyncEnabled:Hq.DEFAULT_RULE_CONFIG.resyncEnabled,s=(0,Pr.has)(i,"recoveryValueFunc")?i.recoveryValueFunc:Hq.DEFAULT_RULE_CONFIG.recoveryValueFunc,o=this.ruleShortNameIdx<t},r.prototype.orInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(qn.OR_IDX,t),n=(0,Pr.isArray)(e)?e:e.DEF,s=this.getLaFuncFromCache(i),o=s.call(this,n);if(o!==void 0){var a=n[o];return a.ALT.call(this)}this.raiseNoAltException(t,e.ERR_MSG)},r.prototype.ruleFinallyStateUpdate=function(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){var e=this.LA(1),t=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new wy.NotAllInputParsedException(t,e))}},r.prototype.subruleInternal=function(e,t,i){var n;try{var s=i!==void 0?i.ARGS:void 0;return n=e.call(this,t,s),this.cstPostNonTerminal(n,i!==void 0&&i.LABEL!==void 0?i.LABEL:e.ruleName),n}catch(o){this.subruleInternalError(o,i,e.ruleName)}},r.prototype.subruleInternalError=function(e,t,i){throw(0,wy.isRecognitionException)(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,t!==void 0&&t.LABEL!==void 0?t.LABEL:i),delete e.partialCstResult),e},r.prototype.consumeInternal=function(e,t,i){var n;try{var s=this.LA(1);this.tokenMatcher(s,e)===!0?(this.consumeToken(),n=s):this.consumeInternalError(e,s,i)}catch(o){n=this.consumeInternalRecovery(e,t,o)}return this.cstPostTerminal(i!==void 0&&i.LABEL!==void 0?i.LABEL:e.name,n),n},r.prototype.consumeInternalError=function(e,t,i){var n,s=this.LA(0);throw i!==void 0&&i.ERR_MSG?n=i.ERR_MSG:n=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:t,previous:s,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new wy.MismatchedTokenException(n,t,s))},r.prototype.consumeInternalRecovery=function(e,t,i){if(this.recoveryEnabled&&i.name==="MismatchedTokenException"&&!this.isBackTracking()){var n=this.getFollowsForInRuleRecovery(e,t);try{return this.tryInRuleRecovery(e,n)}catch(s){throw s.name===Pye.IN_RULE_RECOVERY_EXCEPTION?i:s}}else throw i},r.prototype.saveRecogState=function(){var e=this.errors,t=(0,Pr.cloneArr)(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:t,CST_STACK:this.CST_STACK}},r.prototype.reloadRecogState=function(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK},r.prototype.ruleInvocationStateUpdate=function(e,t,i){this.RULE_OCCURRENCE_STACK.push(i),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(t,e)},r.prototype.isBackTracking=function(){return this.isBackTrackingStack.length!==0},r.prototype.getCurrRuleFullName=function(){var e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]},r.prototype.shortRuleNameToFullName=function(e){return this.shortRuleNameToFull[e]},r.prototype.isAtEndOfInput=function(){return this.tokenMatcher(this.LA(1),Gq.EOF)},r.prototype.reset=function(){this.resetLexerState(),this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]},r}();By.RecognizerEngine=kye});var qq=w(by=>{"use strict";Object.defineProperty(by,"__esModule",{value:!0});by.ErrorHandler=void 0;var lx=nf(),cx=Gt(),jq=kd(),Rye=jn(),Fye=function(){function r(){}return r.prototype.initErrorHandler=function(e){this._errors=[],this.errorMessageProvider=(0,cx.has)(e,"errorMessageProvider")?e.errorMessageProvider:Rye.DEFAULT_PARSER_CONFIG.errorMessageProvider},r.prototype.SAVE_ERROR=function(e){if((0,lx.isRecognitionException)(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:(0,cx.cloneArr)(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")},Object.defineProperty(r.prototype,"errors",{get:function(){return(0,cx.cloneArr)(this._errors)},set:function(e){this._errors=e},enumerable:!1,configurable:!0}),r.prototype.raiseEarlyExitException=function(e,t,i){for(var n=this.getCurrRuleFullName(),s=this.getGAstProductions()[n],o=(0,jq.getLookaheadPathsForOptionalProd)(e,s,t,this.maxLookahead),a=o[0],l=[],c=1;c<=this.maxLookahead;c++)l.push(this.LA(c));var u=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:a,actual:l,previous:this.LA(0),customUserDescription:i,ruleName:n});throw this.SAVE_ERROR(new lx.EarlyExitException(u,this.LA(1),this.LA(0)))},r.prototype.raiseNoAltException=function(e,t){for(var i=this.getCurrRuleFullName(),n=this.getGAstProductions()[i],s=(0,jq.getLookaheadPathsForOr)(e,n,this.maxLookahead),o=[],a=1;a<=this.maxLookahead;a++)o.push(this.LA(a));var l=this.LA(0),c=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:s,actual:o,previous:l,customUserDescription:t,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new lx.NoViableAltException(c,this.LA(1),l))},r}();by.ErrorHandler=Fye});var zq=w(Qy=>{"use strict";Object.defineProperty(Qy,"__esModule",{value:!0});Qy.ContentAssist=void 0;var Jq=Dd(),Wq=Gt(),Nye=function(){function r(){}return r.prototype.initContentAssist=function(){},r.prototype.computeContentAssist=function(e,t){var i=this.gastProductionsCache[e];if((0,Wq.isUndefined)(i))throw Error("Rule ->"+e+"<- does not exist in this grammar.");return(0,Jq.nextPossibleTokensAfter)([i],t,this.tokenMatcher,this.maxLookahead)},r.prototype.getNextPossibleTokenTypes=function(e){var t=(0,Wq.first)(e.ruleStack),i=this.getGAstProductions(),n=i[t],s=new Jq.NextAfterTokenWalker(n,e).startWalking();return s},r}();Qy.ContentAssist=Nye});var rJ=w(xy=>{"use strict";Object.defineProperty(xy,"__esModule",{value:!0});xy.GastRecorder=void 0;var yn=Gt(),Oo=mn(),Tye=Bd(),_q=_g(),$q=TA(),Lye=jn(),Oye=Cy(),vy={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(vy);var Vq=!0,Xq=Math.pow(2,Oye.BITS_FOR_OCCURRENCE_IDX)-1,eJ=(0,$q.createToken)({name:"RECORDING_PHASE_TOKEN",pattern:Tye.Lexer.NA});(0,_q.augmentTokenTypes)([eJ]);var tJ=(0,$q.createTokenInstance)(eJ,`This IToken indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(tJ);var Mye={name:`This CSTNode indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},Kye=function(){function r(){}return r.prototype.initGastRecorder=function(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1},r.prototype.enableRecording=function(){var e=this;this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",function(){for(var t=function(n){var s=n>0?n:"";e["CONSUME"+s]=function(o,a){return this.consumeInternalRecord(o,n,a)},e["SUBRULE"+s]=function(o,a){return this.subruleInternalRecord(o,n,a)},e["OPTION"+s]=function(o){return this.optionInternalRecord(o,n)},e["OR"+s]=function(o){return this.orInternalRecord(o,n)},e["MANY"+s]=function(o){this.manyInternalRecord(n,o)},e["MANY_SEP"+s]=function(o){this.manySepFirstInternalRecord(n,o)},e["AT_LEAST_ONE"+s]=function(o){this.atLeastOneInternalRecord(n,o)},e["AT_LEAST_ONE_SEP"+s]=function(o){this.atLeastOneSepFirstInternalRecord(n,o)}},i=0;i<10;i++)t(i);e.consume=function(n,s,o){return this.consumeInternalRecord(s,n,o)},e.subrule=function(n,s,o){return this.subruleInternalRecord(s,n,o)},e.option=function(n,s){return this.optionInternalRecord(s,n)},e.or=function(n,s){return this.orInternalRecord(s,n)},e.many=function(n,s){this.manyInternalRecord(n,s)},e.atLeastOne=function(n,s){this.atLeastOneInternalRecord(n,s)},e.ACTION=e.ACTION_RECORD,e.BACKTRACK=e.BACKTRACK_RECORD,e.LA=e.LA_RECORD})},r.prototype.disableRecording=function(){var e=this;this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",function(){for(var t=0;t<10;t++){var i=t>0?t:"";delete e["CONSUME"+i],delete e["SUBRULE"+i],delete e["OPTION"+i],delete e["OR"+i],delete e["MANY"+i],delete e["MANY_SEP"+i],delete e["AT_LEAST_ONE"+i],delete e["AT_LEAST_ONE_SEP"+i]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},r.prototype.ACTION_RECORD=function(e){},r.prototype.BACKTRACK_RECORD=function(e,t){return function(){return!0}},r.prototype.LA_RECORD=function(e){return Lye.END_OF_FILE},r.prototype.topLevelRuleRecord=function(e,t){try{var i=new Oo.Rule({definition:[],name:e});return i.name=e,this.recordingProdStack.push(i),t.call(this),this.recordingProdStack.pop(),i}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` + This error was thrown during the "grammar recording phase" For more info see: + https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch{throw n}throw n}},r.prototype.optionInternalRecord=function(e,t){return Ld.call(this,Oo.Option,e,t)},r.prototype.atLeastOneInternalRecord=function(e,t){Ld.call(this,Oo.RepetitionMandatory,t,e)},r.prototype.atLeastOneSepFirstInternalRecord=function(e,t){Ld.call(this,Oo.RepetitionMandatoryWithSeparator,t,e,Vq)},r.prototype.manyInternalRecord=function(e,t){Ld.call(this,Oo.Repetition,t,e)},r.prototype.manySepFirstInternalRecord=function(e,t){Ld.call(this,Oo.RepetitionWithSeparator,t,e,Vq)},r.prototype.orInternalRecord=function(e,t){return Uye.call(this,e,t)},r.prototype.subruleInternalRecord=function(e,t,i){if(Sy(t),!e||(0,yn.has)(e,"ruleName")===!1){var n=new Error(" argument is invalid"+(" expecting a Parser method reference but got: <"+JSON.stringify(e)+">")+(` + inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,yn.peek)(this.recordingProdStack),o=e.ruleName,a=new Oo.NonTerminal({idx:t,nonTerminalName:o,label:i==null?void 0:i.LABEL,referencedRule:void 0});return s.definition.push(a),this.outputCst?Mye:vy},r.prototype.consumeInternalRecord=function(e,t,i){if(Sy(t),!(0,_q.hasShortKeyProperty)(e)){var n=new Error(" argument is invalid"+(" expecting a TokenType reference but got: <"+JSON.stringify(e)+">")+(` + inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,yn.peek)(this.recordingProdStack),o=new Oo.Terminal({idx:t,terminalType:e,label:i==null?void 0:i.LABEL});return s.definition.push(o),tJ},r}();xy.GastRecorder=Kye;function Ld(r,e,t,i){i===void 0&&(i=!1),Sy(t);var n=(0,yn.peek)(this.recordingProdStack),s=(0,yn.isFunction)(e)?e:e.DEF,o=new r({definition:[],idx:t});return i&&(o.separator=e.SEP),(0,yn.has)(e,"MAX_LOOKAHEAD")&&(o.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(o),s.call(this),n.definition.push(o),this.recordingProdStack.pop(),vy}function Uye(r,e){var t=this;Sy(e);var i=(0,yn.peek)(this.recordingProdStack),n=(0,yn.isArray)(r)===!1,s=n===!1?r:r.DEF,o=new Oo.Alternation({definition:[],idx:e,ignoreAmbiguities:n&&r.IGNORE_AMBIGUITIES===!0});(0,yn.has)(r,"MAX_LOOKAHEAD")&&(o.maxLookahead=r.MAX_LOOKAHEAD);var a=(0,yn.some)(s,function(l){return(0,yn.isFunction)(l.GATE)});return o.hasPredicates=a,i.definition.push(o),(0,yn.forEach)(s,function(l){var c=new Oo.Alternative({definition:[]});o.definition.push(c),(0,yn.has)(l,"IGNORE_AMBIGUITIES")?c.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:(0,yn.has)(l,"GATE")&&(c.ignoreAmbiguities=!0),t.recordingProdStack.push(c),l.ALT.call(t),t.recordingProdStack.pop()}),vy}function Zq(r){return r===0?"":""+r}function Sy(r){if(r<0||r>Xq){var e=new Error("Invalid DSL Method idx value: <"+r+`> + `+("Idx value must be a none negative value smaller than "+(Xq+1)));throw e.KNOWN_RECORDER_ERROR=!0,e}}});var nJ=w(Py=>{"use strict";Object.defineProperty(Py,"__esModule",{value:!0});Py.PerformanceTracer=void 0;var iJ=Gt(),Hye=jn(),Gye=function(){function r(){}return r.prototype.initPerformanceTracer=function(e){if((0,iJ.has)(e,"traceInitPerf")){var t=e.traceInitPerf,i=typeof t=="number";this.traceInitMaxIdent=i?t:1/0,this.traceInitPerf=i?t>0:t}else this.traceInitMaxIdent=0,this.traceInitPerf=Hye.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},r.prototype.TRACE_INIT=function(e,t){if(this.traceInitPerf===!0){this.traceInitIndent++;var i=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <"+e+">");var n=(0,iJ.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r}();Py.PerformanceTracer=Gye});var sJ=w(Dy=>{"use strict";Object.defineProperty(Dy,"__esModule",{value:!0});Dy.applyMixins=void 0;function Yye(r,e){e.forEach(function(t){var i=t.prototype;Object.getOwnPropertyNames(i).forEach(function(n){if(n!=="constructor"){var s=Object.getOwnPropertyDescriptor(i,n);s&&(s.get||s.set)?Object.defineProperty(r.prototype,n,s):r.prototype[n]=t.prototype[n]}})})}Dy.applyMixins=Yye});var jn=w(dr=>{"use strict";var AJ=dr&&dr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(dr,"__esModule",{value:!0});dr.EmbeddedActionsParser=dr.CstParser=dr.Parser=dr.EMPTY_ALT=dr.ParserDefinitionErrorType=dr.DEFAULT_RULE_CONFIG=dr.DEFAULT_PARSER_CONFIG=dr.END_OF_FILE=void 0;var en=Gt(),jye=qj(),oJ=TA(),lJ=xd(),aJ=Cq(),qye=sx(),Jye=Qq(),Wye=Tq(),zye=Oq(),Vye=Kq(),Xye=Yq(),Zye=qq(),_ye=zq(),$ye=rJ(),ewe=nJ(),twe=sJ();dr.END_OF_FILE=(0,oJ.createTokenInstance)(oJ.EOF,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(dr.END_OF_FILE);dr.DEFAULT_PARSER_CONFIG=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:lJ.defaultParserErrorProvider,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1});dr.DEFAULT_RULE_CONFIG=Object.freeze({recoveryValueFunc:function(){},resyncEnabled:!0});var rwe;(function(r){r[r.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",r[r.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",r[r.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",r[r.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",r[r.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",r[r.LEFT_RECURSION=5]="LEFT_RECURSION",r[r.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",r[r.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",r[r.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",r[r.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",r[r.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",r[r.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",r[r.TOO_MANY_ALTS=12]="TOO_MANY_ALTS"})(rwe=dr.ParserDefinitionErrorType||(dr.ParserDefinitionErrorType={}));function iwe(r){return r===void 0&&(r=void 0),function(){return r}}dr.EMPTY_ALT=iwe;var ky=function(){function r(e,t){this.definitionErrors=[],this.selfAnalysisDone=!1;var i=this;if(i.initErrorHandler(t),i.initLexerAdapter(),i.initLooksAhead(t),i.initRecognizerEngine(e,t),i.initRecoverable(t),i.initTreeBuilder(t),i.initContentAssist(),i.initGastRecorder(t),i.initPerformanceTracer(t),(0,en.has)(t,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. + Please use the flag on the relevant DSL method instead. + See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES + For further details.`);this.skipValidations=(0,en.has)(t,"skipValidations")?t.skipValidations:dr.DEFAULT_PARSER_CONFIG.skipValidations}return r.performSelfAnalysis=function(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")},r.prototype.performSelfAnalysis=function(){var e=this;this.TRACE_INIT("performSelfAnalysis",function(){var t;e.selfAnalysisDone=!0;var i=e.className;e.TRACE_INIT("toFastProps",function(){(0,en.toFastProperties)(e)}),e.TRACE_INIT("Grammar Recording",function(){try{e.enableRecording(),(0,en.forEach)(e.definedRulesNames,function(s){var o=e[s],a=o.originalGrammarAction,l=void 0;e.TRACE_INIT(s+" Rule",function(){l=e.topLevelRuleRecord(s,a)}),e.gastProductionsCache[s]=l})}finally{e.disableRecording()}});var n=[];if(e.TRACE_INIT("Grammar Resolving",function(){n=(0,aJ.resolveGrammar)({rules:(0,en.values)(e.gastProductionsCache)}),e.definitionErrors=e.definitionErrors.concat(n)}),e.TRACE_INIT("Grammar Validations",function(){if((0,en.isEmpty)(n)&&e.skipValidations===!1){var s=(0,aJ.validateGrammar)({rules:(0,en.values)(e.gastProductionsCache),maxLookahead:e.maxLookahead,tokenTypes:(0,en.values)(e.tokensMap),errMsgProvider:lJ.defaultGrammarValidatorErrorProvider,grammarName:i});e.definitionErrors=e.definitionErrors.concat(s)}}),(0,en.isEmpty)(e.definitionErrors)&&(e.recoveryEnabled&&e.TRACE_INIT("computeAllProdsFollows",function(){var s=(0,jye.computeAllProdsFollows)((0,en.values)(e.gastProductionsCache));e.resyncFollows=s}),e.TRACE_INIT("ComputeLookaheadFunctions",function(){e.preComputeLookaheadFunctions((0,en.values)(e.gastProductionsCache))})),!r.DEFER_DEFINITION_ERRORS_HANDLING&&!(0,en.isEmpty)(e.definitionErrors))throw t=(0,en.map)(e.definitionErrors,function(s){return s.message}),new Error(`Parser Definition Errors detected: + `+t.join(` +------------------------------- +`))})},r.DEFER_DEFINITION_ERRORS_HANDLING=!1,r}();dr.Parser=ky;(0,twe.applyMixins)(ky,[qye.Recoverable,Jye.LooksAhead,Wye.TreeBuilder,zye.LexerAdapter,Xye.RecognizerEngine,Vye.RecognizerApi,Zye.ErrorHandler,_ye.ContentAssist,$ye.GastRecorder,ewe.PerformanceTracer]);var nwe=function(r){AJ(e,r);function e(t,i){i===void 0&&(i=dr.DEFAULT_PARSER_CONFIG);var n=this,s=(0,en.cloneObj)(i);return s.outputCst=!0,n=r.call(this,t,s)||this,n}return e}(ky);dr.CstParser=nwe;var swe=function(r){AJ(e,r);function e(t,i){i===void 0&&(i=dr.DEFAULT_PARSER_CONFIG);var n=this,s=(0,en.cloneObj)(i);return s.outputCst=!1,n=r.call(this,t,s)||this,n}return e}(ky);dr.EmbeddedActionsParser=swe});var uJ=w(Ry=>{"use strict";Object.defineProperty(Ry,"__esModule",{value:!0});Ry.createSyntaxDiagramsCode=void 0;var cJ=Dv();function owe(r,e){var t=e===void 0?{}:e,i=t.resourceBase,n=i===void 0?"https://unpkg.com/chevrotain@"+cJ.VERSION+"/diagrams/":i,s=t.css,o=s===void 0?"https://unpkg.com/chevrotain@"+cJ.VERSION+"/diagrams/diagrams.css":s,a=` + + + + + +`,l=` + +`,c=` + +
- diff --git a/package.json b/package.json index 181214f8b..29dee3553 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,11 @@ { - "name": "@spectrumlabs/interface", + "name": "@teddyswap/interface", + "homepage": "https://teddy-swap.github.io/teddy-swap-ui", "version": "5.0.32", - "private": false, "scripts": { "start": "vite", "build": "tsc && cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build", + "deploy": "yarn build && gh-pages -d build", "serve": "vite preview", "prei18n:extract": "touch src/i18n/locales/en-US.po", "i18n:extract": "lingui extract --locale en-US", @@ -25,7 +26,7 @@ "@sentry/react": "^6.16.1", "@sentry/tracing": "^6.16.1", "@spectrumlabs/analytics": "^1.1.9", - "@spectrumlabs/cardano-dex-sdk": "^0.1.225", + "@teddyswap/cardano-dex-sdk": "0.1.320", "@types/file-saver": "^2.0.5", "@types/lodash": "^4.14.172", "@types/numeral": "^2.0.2", @@ -38,8 +39,10 @@ "@types/recharts": "^1.8.23", "@types/styled-components": "^5.1.23", "axios": "^0.24.0", + "chart.js": "^4.4.1", "eslint-plugin-react-hooks": "^4.2.0", "file-saver": "^2.0.5", + "gh-pages": "^6.1.0", "js-cookie": "^3.0.0", "lodash": "^4.17.21", "luxon": "^3.3.0", @@ -48,6 +51,7 @@ "process": "^0.11.10", "qs": "^6.10.3", "react": "^18.2.0", + "react-chartjs-2": "^5.2.0", "react-confetti": "^6.1.0", "react-copy-to-clipboard": "^5.0.3", "react-device-detect": "^2.2.2", @@ -65,7 +69,7 @@ "styled-components": "^5.3.3", "stylelint-less": "^1.0.6", "typescript": "^5.0.4", - "vite-plugin-pwa": "^0.16.4", + "vite-plugin-pwa": "^0.17.0", "vite-plugin-svgr": "^2.4.0" }, "devDependencies": { @@ -112,5 +116,6 @@ }, "engines": { "node": "^19" - } + }, + "packageManager": "yarn@3.6.4" } diff --git a/public/CNAME b/public/CNAME new file mode 100644 index 000000000..7576437c4 --- /dev/null +++ b/public/CNAME @@ -0,0 +1 @@ +testnet.teddyswap.org \ No newline at end of file diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 000000000..a9958a286 Binary files /dev/null and b/public/android-chrome-192x192.png differ diff --git a/public/android-chrome-256x256.png b/public/android-chrome-256x256.png new file mode 100644 index 000000000..d71f22a02 Binary files /dev/null and b/public/android-chrome-256x256.png differ diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png deleted file mode 100644 index 3a03ba02c..000000000 Binary files a/public/android-chrome-512x512.png and /dev/null differ diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png index a93aa122b..af1a1d02d 100644 Binary files a/public/apple-touch-icon.png and b/public/apple-touch-icon.png differ diff --git a/public/browserconfig.xml b/public/browserconfig.xml new file mode 100644 index 000000000..10c60ed2e --- /dev/null +++ b/public/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #3dffdc + + + diff --git a/public/cardano-dapp-connector-bridge.min.js b/public/cardano-dapp-connector-bridge.min.js new file mode 100644 index 000000000..735dc1800 --- /dev/null +++ b/public/cardano-dapp-connector-bridge.min.js @@ -0,0 +1 @@ +function initCardanoDAppConnectorBridge(e){var n="DAppConnectorBridge: ",a=null,r=null,t={type:"cardano-dapp-connector-bridge",source:null,origin:null},o={},i={connect:"connect",handshake:"handshake",enable:"enable",isEnabled:"isEnabled"};function d(e){var n=[...arguments];return n.length>0&&n.shift(),new Promise((r,i)=>{var d={payload:{type:t.type,to:a,uid:("000"+(46656*Math.random()|0).toString(36)).slice(-3)+("000"+(46656*Math.random()|0).toString(36)).slice(-3),method:e,args:n},resolve:r,reject:i};o[d.payload.uid]=d,t.source.postMessage(d.payload,t.origin)})}function c(e){return function(){return d(e,...arguments)}}function s(e){var n={};for(var a in e){var r=e[a];"string"==typeof r?"feeAddress"===a?n[a]=r:(n[a]=c(r),i[r]=r):n[a]="object"==typeof r?s(r):r}return n}function l(e){if(!r){if(e.data.method!==i.connect)return console.error("Error: "+n+"send 'connect' first."),!1;var o=e.data.initialApi;if(!(o&&o.isBridge&&o.apiVersion&&o.name))return console.error("Error: "+n+"'connect' is missing correct initialApi.",o),!1;if(!e.data.walletNamespace)return console.error("Error: "+n+"'connect' is missing walletNamespace.",e.data.walletNamespace),!1;r=function(e,r,o,i){if(window.hasOwnProperty("cardano")||(window.cardano={}),window.cardano.hasOwnProperty(o))return console.warn("Warn: "+n+"window.cardano."+o+" already present, skipping initialApi creation."),null;t.source=e,t.origin=r,a=o;var c={isBridge:!0,isEnabled:function(){return d("isEnabled")},enable:function(){return d("enable")},apiVersion:i.apiVersion,name:i.name,icon:i.icon?i.icon:null,experimental:{}};return window.cardano[o]=c,i.experimental&&(c.experimental={...s(i.experimental)}),window.cardano[o]}(e.source,e.origin,e.data.walletNamespace,o)}return!(!r||!window.hasOwnProperty("cardano")||window.cardano[e.data.walletNamespace]!==r)||(console.warn("Warn: "+n+"bridge not set up correctly:",t,r,a),!1)}window.addEventListener("message",async function(n){if(function(e){return!(!(e.data&&e.origin&&e.source)||e.data.type!==t.type||!i.hasOwnProperty(e.data.method)||a&&e.data.walletNamespace!==a)}(n)&&l(n))if(n.data.method!==i.connect){if(n.data.uid){var c=o[n.data.uid];if(c){var u=n.data.response,p=n.data.error;if(p)return c.reject(p),void delete o[n.data.uid];n.data.method===i.enable&&(null,"object"==typeof u&&(u={...s(u)})),c.resolve(u),delete o[n.data.uid]}}}else await d("handshake")&&r&&e&&e(r)},!1)} diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 000000000..e1f072ae3 Binary files /dev/null and b/public/favicon-16x16.png differ diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png new file mode 100644 index 000000000..fe74837d1 Binary files /dev/null and b/public/favicon-32x32.png differ diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 000000000..3e3032c44 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/favicon.svg b/public/favicon.svg index 09866a13a..1f1537974 100644 --- a/public/favicon.svg +++ b/public/favicon.svg @@ -1,5 +1,21 @@ - - - - - + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/img/icons/arrow-down-short.svg b/public/img/icons/arrow-down-short.svg new file mode 100644 index 000000000..3e6b9a805 --- /dev/null +++ b/public/img/icons/arrow-down-short.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/img/icons/arrow-right.svg b/public/img/icons/arrow-right.svg new file mode 100644 index 000000000..9ed53305f --- /dev/null +++ b/public/img/icons/arrow-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/img/icons/bank.svg b/public/img/icons/bank.svg new file mode 100644 index 000000000..b514ef147 --- /dev/null +++ b/public/img/icons/bank.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/img/icons/check-circle.svg b/public/img/icons/check-circle.svg new file mode 100644 index 000000000..1f0c600a2 --- /dev/null +++ b/public/img/icons/check-circle.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/img/icons/chevron-down.svg b/public/img/icons/chevron-down.svg new file mode 100644 index 000000000..99c274aec --- /dev/null +++ b/public/img/icons/chevron-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/img/icons/coin.svg b/public/img/icons/coin.svg new file mode 100644 index 000000000..b84bd73eb --- /dev/null +++ b/public/img/icons/coin.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/img/icons/copy-dark.png b/public/img/icons/copy-dark.png new file mode 100644 index 000000000..4ae40483a Binary files /dev/null and b/public/img/icons/copy-dark.png differ diff --git a/public/img/icons/exclamation.png b/public/img/icons/exclamation.png new file mode 100644 index 000000000..1a1cf350a Binary files /dev/null and b/public/img/icons/exclamation.png differ diff --git a/public/img/icons/exclamation.svg b/public/img/icons/exclamation.svg new file mode 100644 index 000000000..e3381e951 --- /dev/null +++ b/public/img/icons/exclamation.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/img/icons/explore.png b/public/img/icons/explore.png new file mode 100644 index 000000000..0bcdd608d Binary files /dev/null and b/public/img/icons/explore.png differ diff --git a/public/img/icons/plus.svg b/public/img/icons/plus.svg new file mode 100644 index 000000000..aebd09ca6 --- /dev/null +++ b/public/img/icons/plus.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/img/icons/points.png b/public/img/icons/points.png new file mode 100644 index 000000000..ce8df5117 Binary files /dev/null and b/public/img/icons/points.png differ diff --git a/public/img/icons/search.svg b/public/img/icons/search.svg new file mode 100644 index 000000000..7a7fe2664 --- /dev/null +++ b/public/img/icons/search.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/img/icons/verified.png b/public/img/icons/verified.png new file mode 100644 index 000000000..775577b93 Binary files /dev/null and b/public/img/icons/verified.png differ diff --git a/public/img/icons/x-circle.svg b/public/img/icons/x-circle.svg new file mode 100644 index 000000000..7412a3045 --- /dev/null +++ b/public/img/icons/x-circle.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/img/icons/x.svg b/public/img/icons/x.svg new file mode 100644 index 000000000..a60e0353b --- /dev/null +++ b/public/img/icons/x.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/img/logo/teddy-logo-mob.png b/public/img/logo/teddy-logo-mob.png new file mode 100644 index 000000000..ab26d5619 Binary files /dev/null and b/public/img/logo/teddy-logo-mob.png differ diff --git a/public/img/logo/teddy-logo-mob.svg b/public/img/logo/teddy-logo-mob.svg new file mode 100644 index 000000000..103e6754f --- /dev/null +++ b/public/img/logo/teddy-logo-mob.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/img/logo/teddy-logo.png b/public/img/logo/teddy-logo.png new file mode 100644 index 000000000..f92afdde5 Binary files /dev/null and b/public/img/logo/teddy-logo.png differ diff --git a/public/img/logo/teddy-logo.svg b/public/img/logo/teddy-logo.svg new file mode 100644 index 000000000..1ad6064e9 --- /dev/null +++ b/public/img/logo/teddy-logo.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/img/logo/teddyMaintenance.png b/public/img/logo/teddyMaintenance.png new file mode 100644 index 000000000..3779c41a0 Binary files /dev/null and b/public/img/logo/teddyMaintenance.png differ diff --git a/public/img/tokens/ADA.png b/public/img/tokens/ADA.png new file mode 100644 index 000000000..148709c86 Binary files /dev/null and b/public/img/tokens/ADA.png differ diff --git a/public/img/tokens/CHRY.png b/public/img/tokens/CHRY.png new file mode 100644 index 000000000..7f54baefc Binary files /dev/null and b/public/img/tokens/CHRY.png differ diff --git a/public/img/tokens/DJED.png b/public/img/tokens/DJED.png new file mode 100644 index 000000000..4f84079f4 Binary files /dev/null and b/public/img/tokens/DJED.png differ diff --git a/public/img/tokens/ENCS.png b/public/img/tokens/ENCS.png new file mode 100644 index 000000000..e7845d5f9 Binary files /dev/null and b/public/img/tokens/ENCS.png differ diff --git a/public/img/tokens/FACT.png b/public/img/tokens/FACT.png new file mode 100644 index 000000000..dfe0e4d6f Binary files /dev/null and b/public/img/tokens/FACT.png differ diff --git a/public/img/tokens/HOSKY.png b/public/img/tokens/HOSKY.png new file mode 100644 index 000000000..7207cf0fa Binary files /dev/null and b/public/img/tokens/HOSKY.png differ diff --git a/public/img/tokens/INDY.png b/public/img/tokens/INDY.png new file mode 100644 index 000000000..725e862d4 Binary files /dev/null and b/public/img/tokens/INDY.png differ diff --git a/public/img/tokens/LENFI.png b/public/img/tokens/LENFI.png new file mode 100644 index 000000000..c31bc8ec7 Binary files /dev/null and b/public/img/tokens/LENFI.png differ diff --git a/public/img/tokens/OPTIM.png b/public/img/tokens/OPTIM.png new file mode 100644 index 000000000..e697b1fb1 Binary files /dev/null and b/public/img/tokens/OPTIM.png differ diff --git a/public/img/tokens/SNEK.png b/public/img/tokens/SNEK.png new file mode 100644 index 000000000..f26716099 Binary files /dev/null and b/public/img/tokens/SNEK.png differ diff --git a/public/img/tokens/TEDY.png b/public/img/tokens/TEDY.png new file mode 100644 index 000000000..3a18cabdd Binary files /dev/null and b/public/img/tokens/TEDY.png differ diff --git a/public/img/tokens/cBTC.png b/public/img/tokens/cBTC.png new file mode 100644 index 000000000..08a598060 Binary files /dev/null and b/public/img/tokens/cBTC.png differ diff --git a/public/img/tokens/cNETA.png b/public/img/tokens/cNETA.png new file mode 100644 index 000000000..3c78ebb7b Binary files /dev/null and b/public/img/tokens/cNETA.png differ diff --git a/public/img/tokens/iBTC.png b/public/img/tokens/iBTC.png new file mode 100644 index 000000000..fda5d4dc8 Binary files /dev/null and b/public/img/tokens/iBTC.png differ diff --git a/public/img/tokens/iETH.png b/public/img/tokens/iETH.png new file mode 100644 index 000000000..18a37ece6 Binary files /dev/null and b/public/img/tokens/iETH.png differ diff --git a/public/img/tokens/iUSD.png b/public/img/tokens/iUSD.png new file mode 100644 index 000000000..a00783ddf Binary files /dev/null and b/public/img/tokens/iUSD.png differ diff --git a/public/token-ada.svg b/public/img/tokens/token-ada.svg similarity index 100% rename from public/token-ada.svg rename to public/img/tokens/token-ada.svg diff --git a/public/spectrum-finance-token-logo.svg b/public/img/tokens/token-spectrum.svg similarity index 100% rename from public/spectrum-finance-token-logo.svg rename to public/img/tokens/token-spectrum.svg diff --git a/public/img/tokens/token-teddy.png b/public/img/tokens/token-teddy.png new file mode 100644 index 000000000..f5d3b663e Binary files /dev/null and b/public/img/tokens/token-teddy.png differ diff --git a/public/manifest.json b/public/manifest.json deleted file mode 100644 index aa8205c49..000000000 --- a/public/manifest.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "short_name": "Spectrum Finance", - "name": "Spectrum Finance is an open source cross-chain DEX", - "icons": [ - { - "src": "favicon.svg", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "apple-touch-icon.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "android-chrome-512x512.png", - "type": "image/png", - "sizes": "512x512" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} diff --git a/public/mstile-150x150.png b/public/mstile-150x150.png new file mode 100644 index 000000000..a7ce5d1ea Binary files /dev/null and b/public/mstile-150x150.png differ diff --git a/public/og-image.png b/public/og-image.png index cf7debf59..e75654f41 100644 Binary files a/public/og-image.png and b/public/og-image.png differ diff --git a/public/safari-pinned-tab.svg b/public/safari-pinned-tab.svg new file mode 100644 index 000000000..c808395a4 --- /dev/null +++ b/public/safari-pinned-tab.svg @@ -0,0 +1,28 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/public/site.webmanifest b/public/site.webmanifest new file mode 100644 index 000000000..de65106f4 --- /dev/null +++ b/public/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-256x256.png", + "sizes": "256x256", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/src/@types/dapp-cardano-wallet-web-bridge.d.ts b/src/@types/dapp-cardano-wallet-web-bridge.d.ts index 037cc3b4b..6489a2613 100644 --- a/src/@types/dapp-cardano-wallet-web-bridge.d.ts +++ b/src/@types/dapp-cardano-wallet-web-bridge.d.ts @@ -1,10 +1,10 @@ namespace CardanoBridge { import { HexString } from '@ergolabs/ergo-sdk'; - import { Paging } from '@spectrumlabs/cardano-dex-sdk'; + import { Paging } from '@teddyswap/cardano-dex-sdk'; import { RawTx, RawUnsignedTx, - } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/tx'; + } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/tx'; type EncodedTxOut = HexString; type EncodedBalance = HexString; @@ -35,6 +35,7 @@ namespace CardanoBridge { } export interface ConnectorAPI { + name?: string; enable(): Promise; isEnabled(): Promise; experimental?: any; @@ -42,3 +43,10 @@ namespace CardanoBridge { } declare let cardano: { [key: string]: CardanoBridge.ConnectorAPI }; + +interface Window { + initCardanoDAppConnectorBridge: ( + callback: (connector: CardanoBridge.ConnectorAPI) => void, + ) => void; + dAppConnectorBridge: CardanoBridge.ConnectorAPI | undefined; +} diff --git a/src/App.tsx b/src/App.tsx index 3e8005ecf..2c452935e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -8,15 +8,13 @@ import { BehaviorSubject, first, mapTo, Observable, tap, zip } from 'rxjs'; import { applicationConfig } from './applicationConfig'; import { ApplicationRoutes, routesConfig } from './ApplicationRoutes'; import { useObservable } from './common/hooks/useObservable'; -import { analyticsInitializer } from './common/initializers/analyticsInitializer'; -import { gaInitializer } from './common/initializers/gaInitializer'; import { networkDomInitializer } from './common/initializers/networkDomInitializer'; -import { sentryInitializer } from './common/initializers/sentryInitializer'; import { SelectDefaultNetwork } from './common/services/NetworkDomManager/SelectDefaultNetwork/SelectDefaultNetwork'; import { startAppTicks } from './common/streams/appTick'; import { Glow } from './components/common/Layout/Glow/Glow'; import { ErrorEventProvider } from './components/ErrorBoundary/ErrorEventProvider'; import { AppLoadingProvider, useApplicationSettings } from './context'; +import { AssetModeProvider } from './context/AssetModeContext'; import { useBodyClass } from './hooks/useBodyClass'; import { useMetaThemeColor } from './hooks/useMetaThemeColor'; import { LanguageProvider } from './i18n/i18n'; @@ -35,10 +33,7 @@ const Application = () => { }; const initializers: Observable[] = [ - sentryInitializer(), - analyticsInitializer(), networkDomInitializer(routesConfig), - gaInitializer(), ]; const isAppInitialized$ = new BehaviorSubject(false); @@ -79,7 +74,9 @@ export const ApplicationInitializer: React.FC = () => { - {isAppInitialized && } + + {isAppInitialized && } + diff --git a/src/ApplicationRoutes.tsx b/src/ApplicationRoutes.tsx index 39154a50c..4814c8aa8 100644 --- a/src/ApplicationRoutes.tsx +++ b/src/ApplicationRoutes.tsx @@ -6,18 +6,22 @@ import { Navigate, Outlet, useRoutes } from 'react-router-dom'; import { version } from '../package.json'; import { NetworkDomManager } from './common/services/NetworkDomManager/NetworkDomManager'; import { Layout } from './components/common/Layout/Layout'; +import { OperationHistoryV3 } from './components/OperationHistoryModal/OperationHistory/OperationHistoryV3.tsx'; import { RouteConfigExtended } from './components/RouterTitle/RouteConfigExtended'; import { RouterTitle } from './components/RouterTitle/RouterTitle'; import { useApplicationSettings } from './context'; import { AddLiquidity } from './pages/AddLiquidity/AddLiquidity'; import { CreatePool } from './pages/CreatePool/CreatePool'; +import Dashboard from './pages/Dashboard/Dashboard.tsx'; import { Farms } from './pages/Farms/Farms'; +import LBE from './pages/LBE/LBE.tsx'; import { Liquidity } from './pages/Liquidity/Liquidity'; import { LockLiquidity } from './pages/LockLiquidity/LockLiquidity'; +//import Maintenance from './pages/Maintenance/Maintenance.tsx'; import { PoolOverview } from './pages/PoolOverview/PoolOverview'; import { RelockLiquidity } from './pages/RelockLiquidity/RelockLiquidity'; import { RemoveLiquidity } from './pages/RemoveLiquidity/RemoveLiquidity'; -import { Rewards } from './pages/Rewards/Rewards'; +//import { Rewards } from './pages/RewardsV2/Rewards.tsx'; import { Swap } from './pages/Swap/Swap'; import { WithdrawalLiquidity } from './pages/WithdrawalLiquidity/WithdrawalLiquidity'; import { isPreLbspTimeGap } from './utils/lbsp.ts'; @@ -48,6 +52,21 @@ export const routesConfig: RouteConfigExtended[] = [ path: 'swap', element: , }, + { + title: 'Dashboard', + path: 'dashboard', + element: , + }, + /* { + title: 'Swap', + path: 'swap', + element: , + }, */ + /* { + title: 'Rewards', + path: 'rewards', + element: , + }, */ { title: 'Farm', path: 'farm', @@ -109,9 +128,14 @@ export const routesConfig: RouteConfigExtended[] = [ ], }, { - title: 'Rewards', - path: 'rewards', - element: , + title: 'LBE', + path: 'lbe', + element: , + }, + { + title: 'Transaction History', + path: 'history', + element: , }, { path: '*', @@ -143,7 +167,7 @@ export const ApplicationRoutes: FC = () => { <> {routes} diff --git a/src/applicationConfig.ts b/src/applicationConfig.ts index 54ee24ce1..f942e904f 100644 --- a/src/applicationConfig.ts +++ b/src/applicationConfig.ts @@ -22,6 +22,9 @@ interface NetworkConfig { readonly lowBalanceGuide?: string; readonly defaultTokenListUrl: string; readonly isCreatePoolAvailable: boolean; + readonly submitTxUrl?: string; + readonly lbeAddress: string; + readonly verifiedPoolListUrl: string; } interface CardanoUpdate { @@ -66,49 +69,63 @@ interface ApplicationConfig { export const applicationConfig: ApplicationConfig = { isRewardsAvailable: true, - spfUsdRateUrl: 'https://api.spectrum.fi/v1/price-tracking/spf/price', + spfUsdRateUrl: '', operationTimeoutTime: 60_000, - cookieDomain: isProductionEnv() ? 'spectrum.fi' : undefined, + cookieDomain: isProductionEnv() ? 'teddyswap.org' : undefined, cardanoMaintenance: false, // cardanoUpdate: { // title: 'On the way to the mainnet', // content: 'The Cardano AMM protocol will be available in mainnet soon', // }, - reCaptchaKey: '6LfCKZIiAAAAACypYW5pGlgZNTcwse1njmQMIUUL', + reCaptchaKey: '', requestRetryCount: 3, networksSettings: { cardano_preview: { - defaultTokenListUrl: 'https://spectrum.fi/cardano-token-list.json', + defaultTokenListUrl: + 'https://raw.githubusercontent.com/teddy-swap/tokenlist/main/preview.json', metadataUrl: - 'https://raw.githubusercontent.com/spectrum-finance/token-logos/master/logos/cardano', - networkUrl: 'https://explorer.spectrum.fi/cardano/preview/v1/', - explorerUrl: 'https://preview.cexplorer.io', + 'https://raw.githubusercontent.com/teddy-swap/token-logos/master/logos/cardano', + networkUrl: 'https://explorer.teddyswap.org/cardano/preview/v1/', + explorerUrl: 'https://preview.cardanoscan.io', lowBalanceGuide: '', - analyticUrl: 'https://analytics.spectrum.fi/cardano/', + analyticUrl: 'https://8081-cardano-markets-api.us1.demeter.run/v1/', isCreatePoolAvailable: false, + submitTxUrl: + 'https://submitapi-preview-api-tasteful-infusion-213dd4.us1.demeter.run/api/submit/tx', + lbeAddress: + 'addr_test1qzhwefhsv6xn2s4sn8a92f9m29lwj67aykn4plr9xal4r48del5pz2hf795j5wxzhzf405g377jmw7a92k9z2enhd6pqutz67m', + verifiedPoolListUrl: + 'https://raw.githubusercontent.com/teddy-swap/verified-pools/main/preview.json', }, cardano: { - defaultTokenListUrl: 'https://spectrum.fi/cardano-token-list.json', + defaultTokenListUrl: + 'https://raw.githubusercontent.com/teddy-swap/tokenlist/main/mainnet.json', metadataUrl: - 'https://raw.githubusercontent.com/spectrum-finance/token-logos/master/logos/cardano', - networkUrl: 'https://explorer.spectrum.fi/cardano/mainnet/v1/', + 'https://raw.githubusercontent.com/teddy-swap/token-logos/master/logos/cardano', + networkUrl: 'https://explorer.teddyswap.org/cardano/mainnet/v1/', explorerUrl: 'https://cardanoscan.io', lowBalanceGuide: '', - analyticUrl: 'https://analytics-balanced.spectrum.fi/cardano/', + analyticUrl: 'https://analytics.teddyswap.org/v1/', isCreatePoolAvailable: false, + submitTxUrl: + 'https://submitapi-mainnet-api-tasteful-infusion-213dd4.us1.demeter.run/api/submit/tx', + lbeAddress: + 'addr1q8aqtl375r0multvd2ekuvuqzxpltcqknq4t7jccht2ln7383r9tr2a445pm350p8lfmnu4tphdw9p3mjn4xq5nry28quf27d3', + verifiedPoolListUrl: + 'https://raw.githubusercontent.com/teddy-swap/verified-pools/main/mainnet.json', }, ergo: { - defaultTokenListUrl: 'https://spectrum.fi/ergo-token-list.json', - metadataUrl: - 'https://raw.githubusercontent.com/spectrum-finance/token-logos/master/logos/ergo', - spfFaucet: 'https://airdrop.spectrum.fi/v1/faucet/', - networkUrl: 'https://api.ergoplatform.com', - explorerUrl: 'https://explorer.ergoplatform.com', - analyticUrl: 'https://api.spectrum.fi/v1/', - lowBalanceGuide: - 'https://docs.spectrum.fi/docs/user-guides/quick-start#3-get-assets', - ergopayUrl: 'https://ergopay-backend.fly.dev', + defaultTokenListUrl: '', + metadataUrl: '', + spfFaucet: '', + networkUrl: '', + explorerUrl: '', + analyticUrl: '', + lowBalanceGuide: '', + ergopayUrl: '', isCreatePoolAvailable: true, + lbeAddress: '', + verifiedPoolListUrl: '', }, }, social: { @@ -122,7 +139,7 @@ export const applicationConfig: ApplicationConfig = { discord: 'https://discord.com/invite/zY2gmTYQVD', telegram: 'https://t.me/spectrum_labs_community', }, - applicationTick: 5 * 1000, + applicationTick: 10 * 1000, hiddenAssets: [ isProductionHost ? 'ef802b475c06189fdbf844153cdc1d449a5ba87cce13d11bb47b5a539f27f12b' diff --git a/src/assets/icons/arrows.png b/src/assets/icons/arrows.png new file mode 100644 index 000000000..57803d0ba Binary files /dev/null and b/src/assets/icons/arrows.png differ diff --git a/src/assets/icons/blockchain.svg b/src/assets/icons/blockchain.svg new file mode 100644 index 000000000..755bc56a8 --- /dev/null +++ b/src/assets/icons/blockchain.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/icon-military-tech.svg b/src/assets/icons/icon-military-tech.svg new file mode 100644 index 000000000..92ff55cd4 --- /dev/null +++ b/src/assets/icons/icon-military-tech.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/icon-sun-blue.svg b/src/assets/icons/icon-sun-blue.svg new file mode 100644 index 000000000..212659f56 --- /dev/null +++ b/src/assets/icons/icon-sun-blue.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/icon-white-sun.svg b/src/assets/icons/icon-white-sun.svg new file mode 100644 index 000000000..af93c0108 --- /dev/null +++ b/src/assets/icons/icon-white-sun.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/icon-world-blue.svg b/src/assets/icons/icon-world-blue.svg new file mode 100644 index 000000000..1e7dcce86 --- /dev/null +++ b/src/assets/icons/icon-world-blue.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/styles/fonts/Montserrat-Black.eot b/src/assets/styles/fonts/Montserrat-Black.eot new file mode 100644 index 000000000..59ad59d11 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Black.eot differ diff --git a/src/assets/styles/fonts/Montserrat-Black.ttf b/src/assets/styles/fonts/Montserrat-Black.ttf new file mode 100644 index 000000000..1c7ed9a5a Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Black.ttf differ diff --git a/src/assets/styles/fonts/Montserrat-Black.woff b/src/assets/styles/fonts/Montserrat-Black.woff new file mode 100644 index 000000000..009387f1e Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Black.woff differ diff --git a/src/assets/styles/fonts/Montserrat-Black.woff2 b/src/assets/styles/fonts/Montserrat-Black.woff2 new file mode 100644 index 000000000..3f6123213 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Black.woff2 differ diff --git a/src/assets/styles/fonts/Montserrat-BlackItalic.eot b/src/assets/styles/fonts/Montserrat-BlackItalic.eot new file mode 100644 index 000000000..6a536c057 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-BlackItalic.eot differ diff --git a/src/assets/styles/fonts/Montserrat-BlackItalic.ttf b/src/assets/styles/fonts/Montserrat-BlackItalic.ttf new file mode 100644 index 000000000..34e55ae12 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-BlackItalic.ttf differ diff --git a/src/assets/styles/fonts/Montserrat-BlackItalic.woff b/src/assets/styles/fonts/Montserrat-BlackItalic.woff new file mode 100644 index 000000000..035160d39 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-BlackItalic.woff differ diff --git a/src/assets/styles/fonts/Montserrat-BlackItalic.woff2 b/src/assets/styles/fonts/Montserrat-BlackItalic.woff2 new file mode 100644 index 000000000..381707013 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-BlackItalic.woff2 differ diff --git a/src/assets/styles/fonts/Montserrat-Bold.eot b/src/assets/styles/fonts/Montserrat-Bold.eot new file mode 100644 index 000000000..1b7b63f56 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Bold.eot differ diff --git a/src/assets/styles/fonts/Montserrat-Bold.ttf b/src/assets/styles/fonts/Montserrat-Bold.ttf new file mode 100644 index 000000000..4240cb6fb Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Bold.ttf differ diff --git a/src/assets/styles/fonts/Montserrat-Bold.woff b/src/assets/styles/fonts/Montserrat-Bold.woff new file mode 100644 index 000000000..b475832c8 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Bold.woff differ diff --git a/src/assets/styles/fonts/Montserrat-Bold.woff2 b/src/assets/styles/fonts/Montserrat-Bold.woff2 new file mode 100644 index 000000000..b1e1d2156 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Bold.woff2 differ diff --git a/src/assets/styles/fonts/Montserrat-BoldItalic.eot b/src/assets/styles/fonts/Montserrat-BoldItalic.eot new file mode 100644 index 000000000..c2903de7e Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-BoldItalic.eot differ diff --git a/src/assets/styles/fonts/Montserrat-BoldItalic.ttf b/src/assets/styles/fonts/Montserrat-BoldItalic.ttf new file mode 100644 index 000000000..68815a931 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-BoldItalic.ttf differ diff --git a/src/assets/styles/fonts/Montserrat-BoldItalic.woff b/src/assets/styles/fonts/Montserrat-BoldItalic.woff new file mode 100644 index 000000000..71f3cfce1 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-BoldItalic.woff differ diff --git a/src/assets/styles/fonts/Montserrat-BoldItalic.woff2 b/src/assets/styles/fonts/Montserrat-BoldItalic.woff2 new file mode 100644 index 000000000..9d12a2fc5 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-BoldItalic.woff2 differ diff --git a/src/assets/styles/fonts/Montserrat-ExtraBold.eot b/src/assets/styles/fonts/Montserrat-ExtraBold.eot new file mode 100644 index 000000000..75faef53c Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-ExtraBold.eot differ diff --git a/src/assets/styles/fonts/Montserrat-ExtraBold.ttf b/src/assets/styles/fonts/Montserrat-ExtraBold.ttf new file mode 100644 index 000000000..bd5bc7052 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-ExtraBold.ttf differ diff --git a/src/assets/styles/fonts/Montserrat-ExtraBold.woff b/src/assets/styles/fonts/Montserrat-ExtraBold.woff new file mode 100644 index 000000000..4b16773eb Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-ExtraBold.woff differ diff --git a/src/assets/styles/fonts/Montserrat-ExtraBold.woff2 b/src/assets/styles/fonts/Montserrat-ExtraBold.woff2 new file mode 100644 index 000000000..30453f2d7 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-ExtraBold.woff2 differ diff --git a/src/assets/styles/fonts/Montserrat-ExtraBoldItalic.eot b/src/assets/styles/fonts/Montserrat-ExtraBoldItalic.eot new file mode 100644 index 000000000..5921c2773 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-ExtraBoldItalic.eot differ diff --git a/src/assets/styles/fonts/Montserrat-ExtraBoldItalic.ttf b/src/assets/styles/fonts/Montserrat-ExtraBoldItalic.ttf new file mode 100644 index 000000000..96d185388 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-ExtraBoldItalic.ttf differ diff --git a/src/assets/styles/fonts/Montserrat-ExtraBoldItalic.woff b/src/assets/styles/fonts/Montserrat-ExtraBoldItalic.woff new file mode 100644 index 000000000..b4f6d6fe3 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-ExtraBoldItalic.woff differ diff --git a/src/assets/styles/fonts/Montserrat-ExtraBoldItalic.woff2 b/src/assets/styles/fonts/Montserrat-ExtraBoldItalic.woff2 new file mode 100644 index 000000000..54244a7fb Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-ExtraBoldItalic.woff2 differ diff --git a/src/assets/styles/fonts/Montserrat-ExtraLight.eot b/src/assets/styles/fonts/Montserrat-ExtraLight.eot new file mode 100644 index 000000000..f49feea4a Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-ExtraLight.eot differ diff --git a/src/assets/styles/fonts/Montserrat-ExtraLight.ttf b/src/assets/styles/fonts/Montserrat-ExtraLight.ttf new file mode 100644 index 000000000..2610c1120 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-ExtraLight.ttf differ diff --git a/src/assets/styles/fonts/Montserrat-ExtraLight.woff b/src/assets/styles/fonts/Montserrat-ExtraLight.woff new file mode 100644 index 000000000..cf4cfc897 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-ExtraLight.woff differ diff --git a/src/assets/styles/fonts/Montserrat-ExtraLight.woff2 b/src/assets/styles/fonts/Montserrat-ExtraLight.woff2 new file mode 100644 index 000000000..ac62652f7 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-ExtraLight.woff2 differ diff --git a/src/assets/styles/fonts/Montserrat-ExtraLightItalic.eot b/src/assets/styles/fonts/Montserrat-ExtraLightItalic.eot new file mode 100644 index 000000000..1fb1cb367 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-ExtraLightItalic.eot differ diff --git a/src/assets/styles/fonts/Montserrat-ExtraLightItalic.ttf b/src/assets/styles/fonts/Montserrat-ExtraLightItalic.ttf new file mode 100644 index 000000000..a47c93d22 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-ExtraLightItalic.ttf differ diff --git a/src/assets/styles/fonts/Montserrat-ExtraLightItalic.woff b/src/assets/styles/fonts/Montserrat-ExtraLightItalic.woff new file mode 100644 index 000000000..bd6733516 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-ExtraLightItalic.woff differ diff --git a/src/assets/styles/fonts/Montserrat-ExtraLightItalic.woff2 b/src/assets/styles/fonts/Montserrat-ExtraLightItalic.woff2 new file mode 100644 index 000000000..2fde5b882 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-ExtraLightItalic.woff2 differ diff --git a/src/assets/styles/fonts/Montserrat-Italic.eot b/src/assets/styles/fonts/Montserrat-Italic.eot new file mode 100644 index 000000000..0fbc70910 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Italic.eot differ diff --git a/src/assets/styles/fonts/Montserrat-Italic.ttf b/src/assets/styles/fonts/Montserrat-Italic.ttf new file mode 100644 index 000000000..000c0b95f Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Italic.ttf differ diff --git a/src/assets/styles/fonts/Montserrat-Italic.woff b/src/assets/styles/fonts/Montserrat-Italic.woff new file mode 100644 index 000000000..84ce56489 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Italic.woff differ diff --git a/src/assets/styles/fonts/Montserrat-Italic.woff2 b/src/assets/styles/fonts/Montserrat-Italic.woff2 new file mode 100644 index 000000000..c358d4080 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Italic.woff2 differ diff --git a/src/assets/styles/fonts/Montserrat-Light.eot b/src/assets/styles/fonts/Montserrat-Light.eot new file mode 100644 index 000000000..08c36fea4 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Light.eot differ diff --git a/src/assets/styles/fonts/Montserrat-Light.ttf b/src/assets/styles/fonts/Montserrat-Light.ttf new file mode 100644 index 000000000..258d56ccd Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Light.ttf differ diff --git a/src/assets/styles/fonts/Montserrat-Light.woff b/src/assets/styles/fonts/Montserrat-Light.woff new file mode 100644 index 000000000..39e5d0133 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Light.woff differ diff --git a/src/assets/styles/fonts/Montserrat-Light.woff2 b/src/assets/styles/fonts/Montserrat-Light.woff2 new file mode 100644 index 000000000..8add7d751 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Light.woff2 differ diff --git a/src/assets/styles/fonts/Montserrat-LightItalic.eot b/src/assets/styles/fonts/Montserrat-LightItalic.eot new file mode 100644 index 000000000..b38e358b5 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-LightItalic.eot differ diff --git a/src/assets/styles/fonts/Montserrat-LightItalic.ttf b/src/assets/styles/fonts/Montserrat-LightItalic.ttf new file mode 100644 index 000000000..088f42b8e Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-LightItalic.ttf differ diff --git a/src/assets/styles/fonts/Montserrat-LightItalic.woff b/src/assets/styles/fonts/Montserrat-LightItalic.woff new file mode 100644 index 000000000..997979996 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-LightItalic.woff differ diff --git a/src/assets/styles/fonts/Montserrat-LightItalic.woff2 b/src/assets/styles/fonts/Montserrat-LightItalic.woff2 new file mode 100644 index 000000000..455b973e3 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-LightItalic.woff2 differ diff --git a/src/assets/styles/fonts/Montserrat-Medium.eot b/src/assets/styles/fonts/Montserrat-Medium.eot new file mode 100644 index 000000000..c823b5630 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Medium.eot differ diff --git a/src/assets/styles/fonts/Montserrat-Medium.ttf b/src/assets/styles/fonts/Montserrat-Medium.ttf new file mode 100644 index 000000000..cb8600ae1 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Medium.ttf differ diff --git a/src/assets/styles/fonts/Montserrat-Medium.woff b/src/assets/styles/fonts/Montserrat-Medium.woff new file mode 100644 index 000000000..db0f779e3 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Medium.woff differ diff --git a/src/assets/styles/fonts/Montserrat-Medium.woff2 b/src/assets/styles/fonts/Montserrat-Medium.woff2 new file mode 100644 index 000000000..6af9451dd Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Medium.woff2 differ diff --git a/src/assets/styles/fonts/Montserrat-MediumItalic.eot b/src/assets/styles/fonts/Montserrat-MediumItalic.eot new file mode 100644 index 000000000..e69c636ae Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-MediumItalic.eot differ diff --git a/src/assets/styles/fonts/Montserrat-MediumItalic.ttf b/src/assets/styles/fonts/Montserrat-MediumItalic.ttf new file mode 100644 index 000000000..118fdb830 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-MediumItalic.ttf differ diff --git a/src/assets/styles/fonts/Montserrat-MediumItalic.woff b/src/assets/styles/fonts/Montserrat-MediumItalic.woff new file mode 100644 index 000000000..b3f5c6fe6 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-MediumItalic.woff differ diff --git a/src/assets/styles/fonts/Montserrat-MediumItalic.woff2 b/src/assets/styles/fonts/Montserrat-MediumItalic.woff2 new file mode 100644 index 000000000..bbaf2a720 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-MediumItalic.woff2 differ diff --git a/src/assets/styles/fonts/Montserrat-Regular.eot b/src/assets/styles/fonts/Montserrat-Regular.eot new file mode 100644 index 000000000..71ef5949a Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Regular.eot differ diff --git a/src/assets/styles/fonts/Montserrat-Regular.ttf b/src/assets/styles/fonts/Montserrat-Regular.ttf new file mode 100644 index 000000000..f8b66c3f3 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Regular.ttf differ diff --git a/src/assets/styles/fonts/Montserrat-Regular.woff b/src/assets/styles/fonts/Montserrat-Regular.woff new file mode 100644 index 000000000..84bfc7a95 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Regular.woff differ diff --git a/src/assets/styles/fonts/Montserrat-Regular.woff2 b/src/assets/styles/fonts/Montserrat-Regular.woff2 new file mode 100644 index 000000000..d7dd638a3 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Regular.woff2 differ diff --git a/src/assets/styles/fonts/Montserrat-SemiBold.eot b/src/assets/styles/fonts/Montserrat-SemiBold.eot new file mode 100644 index 000000000..72a6139bf Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-SemiBold.eot differ diff --git a/src/assets/styles/fonts/Montserrat-SemiBold.ttf b/src/assets/styles/fonts/Montserrat-SemiBold.ttf new file mode 100644 index 000000000..9ada83de0 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-SemiBold.ttf differ diff --git a/src/assets/styles/fonts/Montserrat-SemiBold.woff b/src/assets/styles/fonts/Montserrat-SemiBold.woff new file mode 100644 index 000000000..77e0cafc6 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-SemiBold.woff differ diff --git a/src/assets/styles/fonts/Montserrat-SemiBold.woff2 b/src/assets/styles/fonts/Montserrat-SemiBold.woff2 new file mode 100644 index 000000000..2c9e8ffc3 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-SemiBold.woff2 differ diff --git a/src/assets/styles/fonts/Montserrat-SemiBoldItalic.eot b/src/assets/styles/fonts/Montserrat-SemiBoldItalic.eot new file mode 100644 index 000000000..d98fdb4f3 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-SemiBoldItalic.eot differ diff --git a/src/assets/styles/fonts/Montserrat-SemiBoldItalic.ttf b/src/assets/styles/fonts/Montserrat-SemiBoldItalic.ttf new file mode 100644 index 000000000..d7be96be6 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-SemiBoldItalic.ttf differ diff --git a/src/assets/styles/fonts/Montserrat-SemiBoldItalic.woff b/src/assets/styles/fonts/Montserrat-SemiBoldItalic.woff new file mode 100644 index 000000000..77190c267 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-SemiBoldItalic.woff differ diff --git a/src/assets/styles/fonts/Montserrat-SemiBoldItalic.woff2 b/src/assets/styles/fonts/Montserrat-SemiBoldItalic.woff2 new file mode 100644 index 000000000..b8b28dc78 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-SemiBoldItalic.woff2 differ diff --git a/src/assets/styles/fonts/Montserrat-Thin.eot b/src/assets/styles/fonts/Montserrat-Thin.eot new file mode 100644 index 000000000..091a699f3 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Thin.eot differ diff --git a/src/assets/styles/fonts/Montserrat-Thin.ttf b/src/assets/styles/fonts/Montserrat-Thin.ttf new file mode 100644 index 000000000..5e1b1a4f1 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Thin.ttf differ diff --git a/src/assets/styles/fonts/Montserrat-Thin.woff b/src/assets/styles/fonts/Montserrat-Thin.woff new file mode 100644 index 000000000..ce5184e88 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Thin.woff differ diff --git a/src/assets/styles/fonts/Montserrat-Thin.woff2 b/src/assets/styles/fonts/Montserrat-Thin.woff2 new file mode 100644 index 000000000..189276931 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-Thin.woff2 differ diff --git a/src/assets/styles/fonts/Montserrat-ThinItalic.eot b/src/assets/styles/fonts/Montserrat-ThinItalic.eot new file mode 100644 index 000000000..16a4f9d49 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-ThinItalic.eot differ diff --git a/src/assets/styles/fonts/Montserrat-ThinItalic.ttf b/src/assets/styles/fonts/Montserrat-ThinItalic.ttf new file mode 100644 index 000000000..3d4b172d4 Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-ThinItalic.ttf differ diff --git a/src/assets/styles/fonts/Montserrat-ThinItalic.woff b/src/assets/styles/fonts/Montserrat-ThinItalic.woff new file mode 100644 index 000000000..5729cdb1a Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-ThinItalic.woff differ diff --git a/src/assets/styles/fonts/Montserrat-ThinItalic.woff2 b/src/assets/styles/fonts/Montserrat-ThinItalic.woff2 new file mode 100644 index 000000000..5c73863bb Binary files /dev/null and b/src/assets/styles/fonts/Montserrat-ThinItalic.woff2 differ diff --git a/src/assets/styles/fonts/typography.less b/src/assets/styles/fonts/typography.less new file mode 100644 index 000000000..fafa77a38 --- /dev/null +++ b/src/assets/styles/fonts/typography.less @@ -0,0 +1,217 @@ + + +@font-face { + font-family: 'Montserrat'; + src: url('Montserrat-ExtraLight.eot'); + src: local('Montserrat ExtraLight'), local('Montserrat-ExtraLight'), + url('Montserrat-ExtraLight.eot?#iefix') format('embedded-opentype'), + url('Montserrat-ExtraLight.woff2') format('woff2'), + url('Montserrat-ExtraLight.woff') format('woff'), + url('Montserrat-ExtraLight.ttf') format('truetype'); + font-weight: 200; + font-style: normal; +} + +@font-face { + font-family: 'Montserrat'; + src: url('Montserrat-MediumItalic.eot'); + src: local('Montserrat Medium Italic'), local('Montserrat-MediumItalic'), + url('Montserrat-MediumItalic.eot?#iefix') format('embedded-opentype'), + url('Montserrat-MediumItalic.woff2') format('woff2'), + url('Montserrat-MediumItalic.woff') format('woff'), + url('Montserrat-MediumItalic.ttf') format('truetype'); + font-weight: 500; + font-style: italic; +} + +@font-face { + font-family: 'Montserrat'; + src: url('Montserrat-Italic.eot'); + src: local('Montserrat Italic'), local('Montserrat-Italic'), + url('Montserrat-Italic.eot?#iefix') format('embedded-opentype'), + url('Montserrat-Italic.woff2') format('woff2'), + url('Montserrat-Italic.woff') format('woff'), + url('Montserrat-Italic.ttf') format('truetype'); + font-weight: normal; + font-style: italic; +} + +@font-face { + font-family: 'Montserrat'; + src: url('Montserrat-Regular.eot'); + src: local('Montserrat Regular'), local('Montserrat-Regular'), + url('Montserrat-Regular.eot?#iefix') format('embedded-opentype'), + url('Montserrat-Regular.woff2') format('woff2'), + url('Montserrat-Regular.woff') format('woff'), + url('Montserrat-Regular.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Montserrat'; + src: url('Montserrat-ThinItalic.eot'); + src: local('Montserrat Thin Italic'), local('Montserrat-ThinItalic'), + url('Montserrat-ThinItalic.eot?#iefix') format('embedded-opentype'), + url('Montserrat-ThinItalic.woff2') format('woff2'), + url('Montserrat-ThinItalic.woff') format('woff'), + url('Montserrat-ThinItalic.ttf') format('truetype'); + font-weight: 100; + font-style: italic; +} + +@font-face { + font-family: 'Montserrat'; + src: url('Montserrat-Bold.eot'); + src: local('Montserrat Bold'), local('Montserrat-Bold'), + url('Montserrat-Bold.eot?#iefix') format('embedded-opentype'), + url('Montserrat-Bold.woff2') format('woff2'), + url('Montserrat-Bold.woff') format('woff'), + url('Montserrat-Bold.ttf') format('truetype'); + font-weight: bold; + font-style: normal; +} + +@font-face { + font-family: 'Montserrat'; + src: url('Montserrat-Light.eot'); + src: local('Montserrat Light'), local('Montserrat-Light'), + url('Montserrat-Light.eot?#iefix') format('embedded-opentype'), + url('Montserrat-Light.woff2') format('woff2'), + url('Montserrat-Light.woff') format('woff'), + url('Montserrat-Light.ttf') format('truetype'); + font-weight: 300; + font-style: normal; +} + +@font-face { + font-family: 'Montserrat'; + src: url('Montserrat-Black.eot'); + src: local('Montserrat Black'), local('Montserrat-Black'), + url('Montserrat-Black.eot?#iefix') format('embedded-opentype'), + url('Montserrat-Black.woff2') format('woff2'), + url('Montserrat-Black.woff') format('woff'), + url('Montserrat-Black.ttf') format('truetype'); + font-weight: 900; + font-style: normal; +} + +@font-face { + font-family: 'Montserrat'; + src: url('Montserrat-Medium.eot'); + src: local('Montserrat Medium'), local('Montserrat-Medium'), + url('Montserrat-Medium.eot?#iefix') format('embedded-opentype'), + url('Montserrat-Medium.woff2') format('woff2'), + url('Montserrat-Medium.woff') format('woff'), + url('Montserrat-Medium.ttf') format('truetype'); + font-weight: 500; + font-style: normal; +} + +@font-face { + font-family: 'Montserrat'; + src: url('Montserrat-ExtraLightItalic.eot'); + src: local('Montserrat ExtraLight Italic'), local('Montserrat-ExtraLightItalic'), + url('Montserrat-ExtraLightItalic.eot?#iefix') format('embedded-opentype'), + url('Montserrat-ExtraLightItalic.woff2') format('woff2'), + url('Montserrat-ExtraLightItalic.woff') format('woff'), + url('Montserrat-ExtraLightItalic.ttf') format('truetype'); + font-weight: 200; + font-style: italic; +} + +@font-face { + font-family: 'Montserrat'; + src: url('Montserrat-BlackItalic.eot'); + src: local('Montserrat Black Italic'), local('Montserrat-BlackItalic'), + url('Montserrat-BlackItalic.eot?#iefix') format('embedded-opentype'), + url('Montserrat-BlackItalic.woff2') format('woff2'), + url('Montserrat-BlackItalic.woff') format('woff'), + url('Montserrat-BlackItalic.ttf') format('truetype'); + font-weight: 900; + font-style: italic; +} + +@font-face { + font-family: 'Montserrat'; + src: url('Montserrat-ExtraBoldItalic.eot'); + src: local('Montserrat ExtraBold Italic'), local('Montserrat-ExtraBoldItalic'), + url('Montserrat-ExtraBoldItalic.eot?#iefix') format('embedded-opentype'), + url('Montserrat-ExtraBoldItalic.woff2') format('woff2'), + url('Montserrat-ExtraBoldItalic.woff') format('woff'), + url('Montserrat-ExtraBoldItalic.ttf') format('truetype'); + font-weight: 800; + font-style: italic; +} + +@font-face { + font-family: 'Montserrat'; + src: url('Montserrat-SemiBoldItalic.eot'); + src: local('Montserrat SemiBold Italic'), local('Montserrat-SemiBoldItalic'), + url('Montserrat-SemiBoldItalic.eot?#iefix') format('embedded-opentype'), + url('Montserrat-SemiBoldItalic.woff2') format('woff2'), + url('Montserrat-SemiBoldItalic.woff') format('woff'), + url('Montserrat-SemiBoldItalic.ttf') format('truetype'); + font-weight: 600; + font-style: italic; +} + +@font-face { + font-family: 'Montserrat'; + src: url('Montserrat-ExtraBold.eot'); + src: local('Montserrat ExtraBold'), local('Montserrat-ExtraBold'), + url('Montserrat-ExtraBold.eot?#iefix') format('embedded-opentype'), + url('Montserrat-ExtraBold.woff2') format('woff2'), + url('Montserrat-ExtraBold.woff') format('woff'), + url('Montserrat-ExtraBold.ttf') format('truetype'); + font-weight: 800; + font-style: normal; +} + +@font-face { + font-family: 'Montserrat'; + src: url('Montserrat-BoldItalic.eot'); + src: local('Montserrat Bold Italic'), local('Montserrat-BoldItalic'), + url('Montserrat-BoldItalic.eot?#iefix') format('embedded-opentype'), + url('Montserrat-BoldItalic.woff2') format('woff2'), + url('Montserrat-BoldItalic.woff') format('woff'), + url('Montserrat-BoldItalic.ttf') format('truetype'); + font-weight: bold; + font-style: italic; +} + +@font-face { + font-family: 'Montserrat'; + src: url('Montserrat-LightItalic.eot'); + src: local('Montserrat Light Italic'), local('Montserrat-LightItalic'), + url('Montserrat-LightItalic.eot?#iefix') format('embedded-opentype'), + url('Montserrat-LightItalic.woff2') format('woff2'), + url('Montserrat-LightItalic.woff') format('woff'), + url('Montserrat-LightItalic.ttf') format('truetype'); + font-weight: 300; + font-style: italic; +} + +@font-face { + font-family: 'Montserrat'; + src: url('Montserrat-SemiBold.eot'); + src: local('Montserrat SemiBold'), local('Montserrat-SemiBold'), + url('Montserrat-SemiBold.eot?#iefix') format('embedded-opentype'), + url('Montserrat-SemiBold.woff2') format('woff2'), + url('Montserrat-SemiBold.woff') format('woff'), + url('Montserrat-SemiBold.ttf') format('truetype'); + font-weight: 600; + font-style: normal; +} + +@font-face { + font-family: 'Montserrat'; + src: url('Montserrat-Thin.eot'); + src: local('Montserrat Thin'), local('Montserrat-Thin'), + url('Montserrat-Thin.eot?#iefix') format('embedded-opentype'), + url('Montserrat-Thin.woff2') format('woff2'), + url('Montserrat-Thin.woff') format('woff'), + url('Montserrat-Thin.ttf') format('truetype'); + font-weight: 100; + font-style: normal; +} diff --git a/src/assets/styles/styles.less b/src/assets/styles/styles.less index 83589b223..97ec39cfc 100644 --- a/src/assets/styles/styles.less +++ b/src/assets/styles/styles.less @@ -6,9 +6,11 @@ @import './themes/hosky.less'; @import './themes/system'; @import './variables/gradients.less'; +@import './fonts/typography.less'; :root { --w3m-z-index: 1001 !important; + --font-family: 'Montserrat'; } html { @@ -24,6 +26,11 @@ body { background-color: var(--spectrum-body-bg); } +#app { + background-color: var(--spectrum-body-bg); + background: var(--spectrum-body-bg-gradient); +} + .grecaptcha-badge { visibility: hidden; } @@ -31,6 +38,7 @@ body { * { box-sizing: border-box !important; touch-action: pan-y; + font-family: var(--font-family) !important; } *::before, @@ -49,8 +57,7 @@ body { } *::-webkit-scrollbar-thumb { - border: 1px solid var(--spectrum-scroll-border); - background-color: var(--spectrum-scroll-bg); + background-color: #acacac; border-radius: var(--spectrum-border-radius-l); cursor: pointer; } @@ -98,6 +105,57 @@ body { --network-dropdown-border-color: #3f6ad6; } +.ant-typography.ant-typography-secondary { + color: var(--teddy-color-disable); +} + +.ant-btn.ant-btn-lg:hover{ + background-color: var(--teddy-primary-color-hover); +} + +.ant-input-suffix { + color: var(--spectrum-primary-text) !important; +} + +.ant-tabs-tab.ant-tabs-tab-active { + background: var(--teddy-secondary-color) !important; +} + +button { + border: none !important; +} + +.ant-btn.ant-btn-text.ant-btn-lg { + background: var(--teddy-box-color-dark) !important; + &:hover { + background-color: var(--teddy-primary-color-hover) !important; + } +} + +.ant-btn.ant-btn-text.ant-btn-lg:hover { + background-color: var(--teddy-primary-color-hover) !important; +} + +.ant-btn.ant-btn-primary { + background: var(--teddy-box-color-dark) !important; + &:hover { + background-color: var(--teddy-primary-color-hover) !important; + color: var(--spectrum-primary-text) !important; + } +} + +.ant-dropdown-open { + background-color: var(--teddy-secondary-color) !important; +} + +.ant-modal-content { + border: none !important; +} + +.cupertino-pane-wrapper .pane { + max-width: none; +} + @keyframes shift { from { width: 0; diff --git a/src/assets/styles/themes/dark copy.less b/src/assets/styles/themes/dark copy.less new file mode 100644 index 000000000..67822bf30 --- /dev/null +++ b/src/assets/styles/themes/dark copy.less @@ -0,0 +1,58 @@ +@import '~@ergolabs/ui-kit/dist/styles/colors/colors.dark'; +@import '~@ergolabs/ui-kit/dist/styles/variables.dark'; + +.dark { + .darkTheme(); + //--spectrum-glow-image: url('../../images/glow-v1.png'); + --spectrum-glow-image-width: 689px; + --spectrum-logo-color: var(--spectrum-primary-text); + --spectrum-asset-box-border-color: #303030; + --spectrum-progress-standart-background-bg: #141414; + --spectrum-box-bg-contrast: rgba(29, 29, 29, 0.8); + --spectrum-text-white: white; + --spectrum-text-teriary: white; + --spectrum-ido-notifcation-background: #37306d; + --spectrum-body-bg: rgb(30, 39, 50); + --spectrum-body-bg-gradient: linear-gradient( + 120deg, + rgba(30, 39, 50, 1) 0%, + rgba(36, 44, 60, 1) 35%, + rgba(13, 15, 29, 1) 100% + ); + --spectrum-primary-color: linear-gradient( + 315.01deg, + #181d2d -11.92%, + rgba(46, 47, 58, 1) 119.58% + ); + --spectrum-primary-color-hover: linear-gradient( + 315.01deg, + #242730 -11.92%, + rgba(58, 58, 62, 1) 119.58% + ); + --spectrum-primary-color-active: linear-gradient( + 315.01deg, + #242730 -11.92%, + rgba(58, 58, 62, 1) 119.58% + ); + --spectrum-connect-wallet-btn-bg: linear-gradient( + 315.01deg, + #181d2d -11.92%, + rgba(46, 47, 58, 1) 119.58% + ); + --spectrum-connect-wallet-btn-border: #268aff; + --spectrum-connect-wallet-btn-color: white; + --spectrum-connect-wallet-address-btn-color: white; + --spectrum-claim-spf-background: #37306d; + --spectrum-claim-spf-notifcation-background: var( + --spectrum-claim-spf-background + ); + --spectrum-claim-spf-box-background: rgba(23, 19, 57, 0.4); + --spectrum-yield-farming-badge-background: rgba(113, 103, 197, 0.2); + --spectrum-claim-spf-box-border-color: #635ca4; + --spectrum-lbsp-banner-background-color: linear-gradient( + 270.73deg, + #362f52 0%, + #130c3a 100% + ); + --spectrum-network-select-item-overlay-opacity: 0.35; +} diff --git a/src/assets/styles/themes/dark.less b/src/assets/styles/themes/dark.less index 74d3af967..ddb25c952 100644 --- a/src/assets/styles/themes/dark.less +++ b/src/assets/styles/themes/dark.less @@ -1,22 +1,110 @@ @import '~@ergolabs/ui-kit/dist/styles/colors/colors.dark'; @import '~@ergolabs/ui-kit/dist/styles/variables.dark'; + .dark { + @teddy-dark-primary-color: #181E29; + @teddy-dark-general-color: #FFFFFF; + @teddy-dark-color-container: linear-gradient(93deg, #212936 -21.87%, #131725 172.12%); + @teddy-dark-primary-color-hover: #FFFFFF; + @teddy-dark-secondary-color: #454e60; + @teddy-dark-active-color: #51A1FF; + @teddy-dark-box-secondary: #1f2635; + @teddy-dark-default-color: #101725; + @teddy-dark-active-color-hover: #51A1FF99; + @teddy-primary-text: #FFFFFF; + @teddy-secondary-text: #C6C6C6; + @teddy-secondary-text-dark: #505A63; + @teddy-tab-color-active: transparent; + @teddy-box-color: linear-gradient(128.53deg, rgba(69, 78, 96, 0.63) 11.81%, rgba(73, 79, 89, 0.63) 48.34%, rgba(43, 56, 74, 0.63) 98.82%); + @teddy-box-color-dark: linear-gradient(315.01deg, #181D2D -11.92%, rgba(46, 47, 58, 0.75) 119.58%); + @teddy-box-color-icon: linear-gradient(36.62deg, rgba(255, 255, 255, 0.06) 12.45%, rgba(255, 255, 255, 0.13) 106.33%); + @teddy-box-color-table: linear-gradient(89deg, rgba(24, 29, 45, 0.26) 48.69%, rgba(46, 47, 58, 0.35) 57.34%); + @teddy-box-popup: linear-gradient(315deg, #181D2D -11.92%, #2E2F3A 119.58%); + @teddy-color-disable: #AAA9A1; + @teddy-color-success: #49AA19; + @teddy-color-danger: #D32029; + @teddy-dark-danger-color-hover: #D3202999; + @teddy-text-input-secondary: #D6D4C6; + .darkTheme(); - --spectrum-glow-image: url("../../images/glow-v2.png"); - --spectrum-glow-image-width: 689px; + --spectrum-glow-image-width: 100%; + + --spectrum-modal-color: @teddy-dark-box-secondary; + --spectrum-box-bg-hover: @teddy-dark-secondary-color; + --spectrum-input-bg: @teddy-dark-default-color; + --spectrum-box-border-color: @teddy-dark-secondary-color; + --spectrum-default-border-color: @teddy-tab-color-active; + --spectrum-box-bg-hover-glass: @teddy-dark-active-color-hover; + --spectrum-box-border-color-secondary-glass: @teddy-tab-color-active; + + --spectrum-primary-color: @teddy-dark-general-color; + --ant-primary-color: @teddy-dark-active-color; + --teddy-dark-general-color: @teddy-dark-general-color; + --teddy-primary-color: @teddy-dark-primary-color; + --teddy-primary-color-hover: @teddy-dark-active-color-hover; + --teddy-secondary-color: @teddy-dark-secondary-color; + --teddy-color-disable: @teddy-color-disable; + --teddy-default-color: @teddy-dark-default-color; + --teddy-box-color: @teddy-box-color; + --teddy-box-color-dark: @teddy-box-color-dark; + --teddy-box-color-table: @teddy-box-color-table; + --teddy-box-popup: @teddy-box-popup; + --teddy-box-color-icon: @teddy-box-color-icon; + --teddy-dark-secondary-color: @teddy-dark-box-secondary; + --teddy-dark-color-active: @teddy-dark-active-color; + --teddy-primary-text: @teddy-primary-text; + --teddy-secondary-text: @teddy-secondary-text; + --teddy-secondary-text-dark: @teddy-secondary-text-dark; + --teddy-text-input-secondary: @teddy-text-input-secondary; + --teddy-dark-color-container: @teddy-dark-color-container; + --teddy-color-success: @teddy-color-success; + --teddy-color-danger: @teddy-color-danger; + --teddy-dark-danger-color-hover: @teddy-dark-danger-color-hover; + + --spectrum-box-bg-glass: @teddy-dark-primary-color; + --spectrum-box-border-color-glass: @teddy-tab-color-active; + + --spectrum-primary-color-hover: @teddy-dark-primary-color-hover; + --spectrum-primary-color-active: @teddy-dark-active-color; + --spectrum-tag-primary: @teddy-dark-primary-color; + --spectrum-secondary-color: @teddy-dark-secondary-color; + --spectrum-tab-color-active: @teddy-tab-color-active; + + --spectrum-box-bg-secondary: @teddy-dark-secondary-color; + --spectrum-box-bg-secondary-glass: @teddy-dark-box-secondary; + --spectrum-btn-default-color: @teddy-box-popup; + --spectrum-primary-color-hover: @teddy-dark-secondary-color; + --spectrum-primary-text-contrast-hover: @teddy-dark-active-color; + --spectrum-box-bg: @teddy-dark-default-color; + --spectrum-dropdown-menu-item-hover-bg: @teddy-dark-secondary-color; + --spectrum-dropdown-menu-item-hover-color: @teddy-dark-active-color; + --spectrum-connect-wallet-address-btn-bg: @teddy-dark-default-color; + --spectrum-primary-text: @teddy-primary-text; + --spectrum-secondary-text: @teddy-secondary-text; + --spectrum-dark-card-background: @teddy-dark-primary-color; + --spectrum-logo-color: var(--spectrum-primary-text); - --spectrum-asset-box-border-color: #303030; - --spectrum-progress-standart-background-bg: #141414; - --spectrum-box-bg-contrast: rgba(29, 29, 29, 0.8); - --spectrum-text-white: #dbdbdb; - --spectrum-text-teriary: #dbdbdb; - --spectrum-ido-notifcation-background: #37306d; - --spectrum-claim-spf-background: #37306d; - --spectrum-claim-spf-notifcation-background: var(--spectrum-claim-spf-background); - --spectrum-claim-spf-box-background: rgba(23, 19, 57, 0.4); + --spectrum-asset-box-border-color: transparent; + --spectrum-progress-standart-background-bg: @teddy-dark-primary-color; + --spectrum-box-bg-contrast: transparent; + --spectrum-text-white: white; + --spectrum-text-teriary: white; + --spectrum-ido-notifcation-background: @teddy-dark-secondary-color; + --spectrum-body-bg: rgb(30, 39, 50); + --spectrum-body-bg-gradient: linear-gradient(110deg, #1E2732 -6.19%, #242C3C 30.87%, #0D0F1D 113.69%); + + --spectrum-connect-wallet-btn-bg: @teddy-dark-default-color; + --spectrum-connect-wallet-btn-border: @teddy-dark-active-color; + --spectrum-connect-wallet-btn-color: white; + --spectrum-connect-wallet-address-btn-color: white; + --spectrum-claim-spf-background: @teddy-dark-secondary-color; + --spectrum-claim-spf-notifcation-background: var( + --spectrum-claim-spf-background + ); + --spectrum-claim-spf-box-background: @teddy-dark-primary-color; --spectrum-yield-farming-badge-background: rgba(113, 103, 197, 0.2); - --spectrum-claim-spf-box-border-color: #635ca4; - --spectrum-lbsp-banner-background-color: linear-gradient(270.73deg, #362f52 0%, #130c3a 100%); + --spectrum-claim-spf-box-border-color: @teddy-dark-secondary-color; + --spectrum-lbsp-banner-background-color: @teddy-dark-color-container; --spectrum-network-select-item-overlay-opacity: 0.35; } diff --git a/src/assets/styles/themes/hosky.less b/src/assets/styles/themes/hosky.less index 8b65dbc27..50cecdb8e 100644 --- a/src/assets/styles/themes/hosky.less +++ b/src/assets/styles/themes/hosky.less @@ -3,11 +3,11 @@ .hosky { .darkTheme(); - --spectrum-glow-image: url("../../images/prism.png"); + --spectrum-glow-image: url('../../images/prism.png'); - --spectrum-primary-color: #226BD2; - --spectrum-primary-color-hover: #3276D5; - --spectrum-primary-color-active: #226BD2; + --spectrum-primary-color: #226bd2; + --spectrum-primary-color-hover: #3276d5; + --spectrum-primary-color-active: #226bd2; //--spectrum-logo-color: var(--spectrum-primary-text); --spectrum-asset-box-border-color: #303030; @@ -17,7 +17,9 @@ --spectrum-text-teriary: #dbdbdb; --spectrum-ido-notifcation-background: #37306d; --spectrum-claim-spf-background: #37306d; - --spectrum-claim-spf-notifcation-background: var(--spectrum-claim-spf-background); + --spectrum-claim-spf-notifcation-background: var( + --spectrum-claim-spf-background + ); --spectrum-claim-spf-box-background: rgba(23, 19, 57, 0.4); --spectrum-yield-farming-badge-background: rgba(113, 103, 197, 0.2); --spectrum-claim-spf-box-border-color: #635ca4; diff --git a/src/assets/styles/themes/light.less b/src/assets/styles/themes/light.less index db193d5dd..8d0b633fe 100644 --- a/src/assets/styles/themes/light.less +++ b/src/assets/styles/themes/light.less @@ -2,7 +2,7 @@ .light { .lightTheme(); - --spectrum-glow-image: url("../../images/glow-v2.png"); + --spectrum-glow-image: url('../../images/glow-v2.png'); --spectrum-glow-image-width: 689px; --spectrum-logo-color: var(--spectrum-primary-color); --spectrum-asset-box-border-color: #f0f0f0; @@ -11,11 +11,15 @@ --spectrum-text-white: #fff; --spectrum-text-teriary: #dbdbdb; --spectrum-ido-notifcation-background: #aba5fc; - --spectrum-claim-spf-background: #dcdaff; + --spectrum-claim-spf-background: #dcdaff; --spectrum-claim-spf-notifcation-background: #aba5fc; --spectrum-claim-spf-box-background: rgba(197, 192, 255, 0.4); --spectrum-yield-farming-badge-background: rgba(107, 100, 205, 0.2); --spectrum-claim-spf-box-border-color: #f5f5f5; - --spectrum-lbsp-banner-background-color: linear-gradient(270.73deg, #C3B4FF 0%, #E8E2FF 100%); + --spectrum-lbsp-banner-background-color: linear-gradient( + 270.73deg, + #c3b4ff 0%, + #e8e2ff 100% + ); --spectrum-network-select-item-overlay-opacity: 0.1; } diff --git a/src/assets/styles/themes/snek-dark.less b/src/assets/styles/themes/snek-dark.less index 9722a54c8..b3ad0c0ca 100644 --- a/src/assets/styles/themes/snek-dark.less +++ b/src/assets/styles/themes/snek-dark.less @@ -3,7 +3,12 @@ .snek-dark { @snek-dark-primary-color: #5043f7; - @snek-dark-primary-color-button: linear-gradient(270deg,#eb28be,#5043f7 49.41%,#00e1ff); + @snek-dark-primary-color-button: linear-gradient( + 270deg, + #eb28be, + #5043f7 49.41%, + #00e1ff + ); @snek-dark-primary-color-hover: #5043f7; .darkTheme(); @@ -41,6 +46,8 @@ --spectrum-text-white: #dbdbdb; --spectrum-text-teriary: #dbdbdb; --spectrum-ido-notifcation-background: #37306d; - --spectrum-claim-spf-notifcation-background: var(--spectrum-claim-spf-background); + --spectrum-claim-spf-notifcation-background: var( + --spectrum-claim-spf-background + ); --spectrum-claim-spf-box-border-color: #635ca4; } diff --git a/src/assets/styles/themes/snek.less b/src/assets/styles/themes/snek.less index 1ae5c0146..b53682012 100644 --- a/src/assets/styles/themes/snek.less +++ b/src/assets/styles/themes/snek.less @@ -11,7 +11,7 @@ @snek-box-shadow-small: 4px 4px 0 @snek-secondary-color; .lightTheme(); - --spectrum-glow-image: url("../../images/snek-glow.png"); + --spectrum-glow-image: url('../../images/snek-glow.png'); --spectrum-glow-image-width: 100%; --spectrum-primary-color: @snek-primary-color; @@ -29,7 +29,11 @@ --spectrum-claim-spf-box-background: var(--spectrum-box-bg); .ant-progress-bg { - background: linear-gradient(264.34deg, @snek-primary-color 2.83%, @snek-secondary-color 98.67%); + background: linear-gradient( + 264.34deg, + @snek-primary-color 2.83%, + @snek-secondary-color 98.67% + ); } .ant-btn.ant-btn-primary, @@ -62,7 +66,7 @@ border: 2px solid black !important; } - header { + header { .ant-btn.ant-btn-icon-only { box-shadow: @snek-box-shadow !important; outline: 2px solid black !important; @@ -78,7 +82,6 @@ } } - .snek-theme-images { display: block !important; } @@ -101,6 +104,8 @@ --spectrum-text-white: #dbdbdb; --spectrum-text-teriary: #dbdbdb; --spectrum-ido-notifcation-background: #37306d; - --spectrum-claim-spf-notifcation-background: var(--spectrum-claim-spf-background); + --spectrum-claim-spf-notifcation-background: var( + --spectrum-claim-spf-background + ); --spectrum-claim-spf-box-border-color: #635ca4; } diff --git a/src/assets/styles/themes/system.less b/src/assets/styles/themes/system.less index c40e9e5f8..9c512161c 100644 --- a/src/assets/styles/themes/system.less +++ b/src/assets/styles/themes/system.less @@ -1,10 +1,10 @@ -@import "~@ergolabs/ui-kit/dist/styles/variables.light"; -@import "~@ergolabs/ui-kit/dist/styles/variables.dark"; +@import '~@ergolabs/ui-kit/dist/styles/variables.light'; +@import '~@ergolabs/ui-kit/dist/styles/variables.dark'; .system { @media (prefers-color-scheme: light) { .lightTheme(); - --spectrum-glow-image: url("../../images/glow-v2.png"); + //--spectrum-glow-image: url('../../images/glow-v2.png'); --spectrum-glow-image-width: 689px; --spectrum-logo-color: var(--spectrum-primary-color); --spectrum-asset-box-border-color: #f0f0f0; @@ -13,18 +13,22 @@ --spectrum-text-white: #fff; --spectrum-text-teriary: #dbdbdb; --spectrum-ido-notifcation-background: #aba5fc; - --spectrum-claim-spf-background: #dcdaff; + --spectrum-claim-spf-background: #dcdaff; --spectrum-claim-spf-notifcation-background: #aba5fc; --spectrum-claim-spf-box-background: rgba(197, 192, 255, 0.4); --spectrum-yield-farming-badge-background: rgba(107, 100, 205, 0.2); --spectrum-claim-spf-box-border-color: #f5f5f5; - --spectrum-lbsp-banner-background-color: linear-gradient(270.73deg, #C3B4FF 0%, #E8E2FF 100%); + --spectrum-lbsp-banner-background-color: linear-gradient( + 270.73deg, + #c3b4ff 0%, + #e8e2ff 100% + ); --spectrum-network-select-item-overlay-opacity: 0.1; } @media (prefers-color-scheme: dark) { .darkTheme(); - --spectrum-glow-image: url("../../images/glow-v2.png"); + //--spectrum-glow-image: url('../../images/glow-v2.png'); --spectrum-glow-image-width: 689px; --spectrum-logo-color: var(--spectrum-primary-text); --spectrum-asset-box-border-color: #303030; @@ -34,12 +38,17 @@ --spectrum-text-teriary: #dbdbdb; --spectrum-ido-notifcation-background: #37306d; --spectrum-claim-spf-background: #37306d; - --spectrum-claim-spf-notifcation-background: var(--spectrum-claim-spf-background); + --spectrum-claim-spf-notifcation-background: var( + --spectrum-claim-spf-background + ); --spectrum-claim-spf-box-background: rgba(23, 19, 57, 0.4); --spectrum-yield-farming-badge-background: rgba(113, 103, 197, 0.2); --spectrum-claim-spf-box-border-color: #635ca4; - --spectrum-lbsp-banner-background-color: linear-gradient(270.73deg, #362f52 0%, #130c3a 100%); + --spectrum-lbsp-banner-background-color: linear-gradient( + 270.73deg, + #362f52 0%, + #130c3a 100% + ); --spectrum-network-select-item-overlay-opacity: 0.35; } } - diff --git a/src/assets/styles/variables/general.less b/src/assets/styles/variables/general.less new file mode 100644 index 000000000..fdcd1dc56 --- /dev/null +++ b/src/assets/styles/variables/general.less @@ -0,0 +1,92 @@ +.mixTitleBox { + font-size: 18px; + color: var(--teddy-primary-text); + font-weight: 600; + margin: 0; +} + +.mixSubTitleBox { + font-size: 14px; + font-weight: 500; + color: var(--teddy-secondary-text); + margin: 0; +} + +.mixTokenFontBox { + margin: 0; + color: var(--teddy-primary-text); + font-size: 14px; + font-weight: 500; +} + +.mixInputDefault { + font-size: 20px; + color: var(--teddy-primary-text); + font-weight: 600; + background: transparent; + border: none; + -moz-appearance: textfield; + appearance: textfield; + &::-webkit-inner-spin-button, + &::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; + } + &:focus { + border: none; + outline: none; + } + &::placeholder { + color: var(--teddy-primary-text); + font-weight: 600; + } +} + +// TODO clean borders buttons + +.mixBtn { + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 60px; + font-size: 20px; + font-weight: 500; + color: var(--teddy-primary-text); + border: 1px solid var(--teddy-dark-color-active) !important; + background: var(--teddy-box-color-dark); + border-radius: 12px; + &:hover { + background: var(--teddy-primary-color-hover); + &:disabled { + background: var(--teddy-box-color-dark); + } + } + &:disabled { + border: 1px solid var(--teddy-secondary-color) !important; + cursor: no-drop; + color: var(--teddy-secondary-color); + } +} + +.mixBoxTimeContainer { + width: 100%; + max-width: 440px; + display: flex; + flex-direction: column; + align-items: center; + gap: 20px; + .titleContainer { + .mixSubTitleBox; + } + .timeContent { + background: var(--teddy-box-color-dark); + border-radius: 12px; + width: 100%; + height: 110px; + display: flex; + align-items: center; + justify-content: center; + } +} diff --git a/src/common/hooks/useFetchMarketMovers.ts b/src/common/hooks/useFetchMarketMovers.ts new file mode 100644 index 000000000..67da1875f --- /dev/null +++ b/src/common/hooks/useFetchMarketMovers.ts @@ -0,0 +1,41 @@ +import { useEffect, useState } from 'react'; + +interface FetchMarketResponse { + dataMarket: any | null; + loadedMarket: boolean; + errorMarket: string | null; +} + +const useFetchMarketMovers = (): FetchMarketResponse => { + const [dataMarket, setDataMarket] = useState(null); + const [loadedMarket, setLoadedMarket] = useState(false); + const [errorMarket, setErrorMarket] = useState(null); + + const fetchData = async () => { + try { + const res = await fetch( + `https://3010-medieval-dinosaur-ql5zvj.us1.demeter.run/teddyswap/market-movers`, + ); + if (res.ok) { + const jsonData = await res.json(); + setDataMarket(jsonData); + } else { + setErrorMarket('error fetch'); + } + } catch (error) { + setErrorMarket('error get fetch'); + } + setLoadedMarket(true); + }; + + useEffect(() => { + fetchData(); + }, []); + return { + dataMarket, + loadedMarket, + errorMarket, + }; +}; + +export default useFetchMarketMovers; diff --git a/src/common/hooks/useFetchRewards.ts b/src/common/hooks/useFetchRewards.ts new file mode 100644 index 000000000..e2c0451e0 --- /dev/null +++ b/src/common/hooks/useFetchRewards.ts @@ -0,0 +1,99 @@ +import { useEffect, useState } from 'react'; + +import useRewardsClaim from '../../pages/Liquidity/default/components/Rewards/useRewardsClaim'; + +interface FetchRewardsResponse { + data: number | null; + isLoading: boolean; + error: string | null; + handleClickClaimRewards: () => void; + transactionStatus: 'processing' | 'complete' | 'error' | undefined; + setTransactionStatus: React.Dispatch< + React.SetStateAction<'processing' | 'complete' | 'error' | undefined> + >; +} + +const useFetchRewards = (address: string): FetchRewardsResponse => { + const [data, setData] = useState(null); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + + const { sendAdaTransacion, transactionStatus, setTransactionStatus } = + useRewardsClaim(); + + const handleClickClaimRewards = () => { + const deposit = BigInt(2000000); + const addressDeposit = + 'addr1q90n2rk4rurl3llmgq23ac5jw9lql8jgrn8p5a8cvv2hk8e642sq428m5mu0cemuc63spyr7nnn69tsh0lyrkqgnu38sn5efhm'; + sendAdaTransacion(deposit, addressDeposit).subscribe({ + complete: () => { + setTransactionStatus('complete'); + postData(); + }, + error: () => { + setTransactionStatus('error'); + }, + }); + }; + + const fetchData = async () => { + setIsLoading(true); + try { + const res = await fetch( + `https://3010-medieval-dinosaur-ql5zvj.us1.demeter.run/teddyswap/rewards/${address}`, + ); + if (res.ok) { + const jsonData = await res.json(); + setData(jsonData.totalRewards); + } else { + setError('error fetch'); + } + } catch (error) { + setError('error get fetch'); + } + setIsLoading(false); + }; + + const postData = async () => { + const data = { + address: address, + }; + try { + const response = await fetch( + 'https://3010-medieval-dinosaur-ql5zvj.us1.demeter.run/teddyswap/process-request', + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(data), + }, + ); + + if (!response.ok) { + throw new Error('Network response was not ok'); + } + + const responseData = await response.json(); + console.log(responseData); + } catch (error) { + console.error('Error:', error); + } finally { + fetchData(); + } + }; + + useEffect(() => { + fetchData(); + }, [address]); + return { + data, + isLoading, + error, + handleClickClaimRewards, + transactionStatus, + setTransactionStatus, + }; +}; + +export default useFetchRewards; diff --git a/src/common/hooks/useFetchStats.ts b/src/common/hooks/useFetchStats.ts new file mode 100644 index 000000000..7fb9f975b --- /dev/null +++ b/src/common/hooks/useFetchStats.ts @@ -0,0 +1,41 @@ +import { useEffect, useState } from 'react'; + +interface FetchStatsResponse { + dataStats: any | null; + loadedStats: boolean; + errorStats: string | null; +} + +const useFetchStats = (): FetchStatsResponse => { + const [dataStats, setDataStats] = useState(null); + const [loadedStats, setLoadedStats] = useState(false); + const [errorStats, setErrorStats] = useState(null); + + const fetchData = async () => { + try { + const res = await fetch( + `https://3010-medieval-dinosaur-ql5zvj.us1.demeter.run/teddyswap/stats/limited`, + ); + if (res.ok) { + const jsonData = await res.json(); + setDataStats(jsonData); + } else { + setErrorStats('error fetch'); + } + } catch (error) { + setErrorStats('error get fetch'); + } + setLoadedStats(true); + }; + + useEffect(() => { + fetchData(); + }, []); + return { + dataStats, + loadedStats, + errorStats, + }; +}; + +export default useFetchStats; diff --git a/src/common/hooks/useResponsive.tsx b/src/common/hooks/useResponsive.tsx new file mode 100755 index 000000000..b97550ba7 --- /dev/null +++ b/src/common/hooks/useResponsive.tsx @@ -0,0 +1,20 @@ +import { useCallback, useEffect, useState } from 'react'; + +export default function useWindowSize() { + const [size, setSize] = useState<{ width: number; height: number }>({ + width: 0, + height: 0, + }); + const updateSize = useCallback(() => { + setSize({ + width: window.innerWidth, + height: window.innerHeight, + }); + }, []); + useEffect(() => { + window.addEventListener('resize', updateSize); + updateSize(); + return () => window.removeEventListener('resize', updateSize); + }, [updateSize]); + return size; +} diff --git a/src/common/initializers/walletConnectInitializer.ts b/src/common/initializers/walletConnectInitializer.ts index ac46f4043..b7b98b8c3 100644 --- a/src/common/initializers/walletConnectInitializer.ts +++ b/src/common/initializers/walletConnectInitializer.ts @@ -15,8 +15,8 @@ export const walletConnectInitializer = () => { new WalletConnectConnector({ relayerRegion: `wss://relay.walletconnect.com`, metadata: { - name: 'Spectrum Finance', - description: 'Spectrum Finance Cardano AMM DEX', + name: 'TeddySwap', + description: 'TeddySwap Cardano AMM DEX', icons: ['https://avatars.githubusercontent.com/u/37784886'], url: 'http://localhost:3030', }, diff --git a/src/common/models/AmmPool.ts b/src/common/models/AmmPool.ts index 1b9a68ebe..500c1b523 100644 --- a/src/common/models/AmmPool.ts +++ b/src/common/models/AmmPool.ts @@ -1,5 +1,5 @@ import { AmmPool as ErgoBaseAmmPool } from '@ergolabs/ergo-dex-sdk'; -import { AmmPool as CardanoBaseAmmPool } from '@spectrumlabs/cardano-dex-sdk'; +import { AmmPool as CardanoBaseAmmPool } from '@teddyswap/cardano-dex-sdk'; import { evaluate } from 'mathjs'; import { math, renderFractions } from '../../utils/math'; diff --git a/src/common/services/ErrorLogs.ts b/src/common/services/ErrorLogs.ts index f25825167..0057ab016 100644 --- a/src/common/services/ErrorLogs.ts +++ b/src/common/services/ErrorLogs.ts @@ -1,6 +1,6 @@ import { Severity } from '@sentry/react'; import * as Sentry from '@sentry/react'; -import { TxCandidate } from '@spectrumlabs/cardano-dex-sdk'; +import { TxCandidate } from '@teddyswap/cardano-dex-sdk'; interface OperationError { readonly level: Severity; diff --git a/src/common/services/NetworkDomManager/SelectDefaultNetwork/SelectDefaultNetwork.module.less b/src/common/services/NetworkDomManager/SelectDefaultNetwork/SelectDefaultNetwork.module.less new file mode 100644 index 000000000..efd196e88 --- /dev/null +++ b/src/common/services/NetworkDomManager/SelectDefaultNetwork/SelectDefaultNetwork.module.less @@ -0,0 +1,8 @@ +.selectDefaultNetwork { + :global(.spectrum-box):first-child{ + border-radius: 10px; + } + :global(.spectrum-box):hover{ + background-color: var(--teddy-primary-color-hover) !important; + } +} diff --git a/src/common/services/NetworkDomManager/SelectDefaultNetwork/SelectDefaultNetwork.tsx b/src/common/services/NetworkDomManager/SelectDefaultNetwork/SelectDefaultNetwork.tsx index 22dbc1a82..4137792d4 100644 --- a/src/common/services/NetworkDomManager/SelectDefaultNetwork/SelectDefaultNetwork.tsx +++ b/src/common/services/NetworkDomManager/SelectDefaultNetwork/SelectDefaultNetwork.tsx @@ -6,6 +6,7 @@ import { BehaviorSubject, filter, first, tap } from 'rxjs'; import { visibleNetworks } from '../../../../gateway/common/network'; import { Network } from '../../../../network/common/Network'; import { useObservable } from '../../../hooks/useObservable'; +import styles from './SelectDefaultNetwork.module.less'; import { SelectDefaultNetworkItem } from './SelectDefaultNetworkItem/SelectDefaultNetworkItem'; export const isSelectDefaultNetworkVisible$ = new BehaviorSubject( @@ -48,14 +49,18 @@ export const SelectDefaultNetwork: FC = ({ Select Network - + {visibleNetworks.map((network, index) => ( = ({ justify="center" className={className} style={{ - height: valBySize(120, 160), + height: valBySize(160), }} >
@@ -79,9 +79,13 @@ const NetworkItemContent: FC = ({ network }) => { const { valBySize } = useDevice(); return ( - + - {network.label} + {network.label} ); @@ -99,9 +103,8 @@ const _SelectDefaultNetworkItem: FC = ({ return ( setHovered(false)} onMouseEnter={() => setHovered(true)} diff --git a/src/common/utils/env.ts b/src/common/utils/env.ts index 70e8d6365..1e5393a4e 100644 --- a/src/common/utils/env.ts +++ b/src/common/utils/env.ts @@ -2,13 +2,13 @@ export const isProductionEnv = (): boolean => import.meta.env.NODE_ENV === 'production'; export const getSentryEnv = (): string => { - if (location.host === 'app.spectrum.fi') { + if (location.host === 'testnet.teddyswap.org') { return 'production'; } - if (location.host === 'test.spectrum.fi') { + if (location.host === 'testnet.teddyswap.org') { return 'test'; } - if (location.host === 'dev.spectrum.fi') { + if (location.host === 'testnet.teddyswap.org') { return 'dev'; } return 'local'; diff --git a/src/components/AddLiquidityForm/AddLiquidityForm.tsx b/src/components/AddLiquidityForm/AddLiquidityForm.tsx index f5a434c7a..2b97c45f2 100644 --- a/src/components/AddLiquidityForm/AddLiquidityForm.tsx +++ b/src/components/AddLiquidityForm/AddLiquidityForm.tsx @@ -1,7 +1,5 @@ import { Flex, FormGroup } from '@ergolabs/ui-kit'; import { t } from '@lingui/macro'; -import { ElementName } from '@spectrumlabs/analytics'; -import { TraceProps } from '@spectrumlabs/analytics/lib/esm/types'; import maxBy from 'lodash/maxBy'; import { FC, ReactNode, useEffect, useMemo, useState } from 'react'; import { @@ -55,10 +53,8 @@ export interface AddLiquidityFormProps { readonly initialPoolNotFound?: () => void; readonly poolChanged?: (pool: AmmPool | undefined) => void; readonly form: FormGroup; - readonly traceFormLocation: TraceProps['element_location']; readonly children?: ReactNode[] | ReactNode | string; readonly onSubmitSuccess?: () => void; - // TODO: REWRITE MODAL CHAIN SYSTEM readonly withoutConfirmation?: boolean; } @@ -91,7 +87,6 @@ export const AddLiquidityForm: FC = ({ initialPoolNotFound, poolChanged, children, - traceFormLocation, onSubmitSuccess, withoutConfirmation, }) => { @@ -343,7 +338,6 @@ export const AddLiquidityForm: FC = ({ onSubmit={addLiquidityAction} validators={validators} actionCaption={t`Add Liquidity`} - traceFormLocation={traceFormLocation} >
= ({ assetsToImport$={tokenAssetsToImport$} importedAssets$={importedTokenAssets$} loading={allAmmPoolsLoading} - trace={{ - element_location: traceFormLocation, - element_name: ElementName.tokenX, - }} amountName="x" tokenName="xAsset" /> @@ -375,10 +365,6 @@ export const AddLiquidityForm: FC = ({ assetsToImport$={yAssetsToImport$} importedAssets$={yImportedAssets$} loading={allAmmPoolsLoading} - trace={{ - element_location: traceFormLocation, - element_name: ElementName.tokenY, - }} amountName="y" tokenName="yAsset" /> diff --git a/src/components/AssetIcon/AssetIcon.tsx b/src/components/AssetIcon/AssetIcon.tsx index b1e6e4b22..4ecdec01e 100644 --- a/src/components/AssetIcon/AssetIcon.tsx +++ b/src/components/AssetIcon/AssetIcon.tsx @@ -27,7 +27,6 @@ const MAP_SIZE_TO_NUMBER = { medium: 24, large: 32, extraLarge: 48, - // TODO: Add custom size possibility selectNetwork: 88, }; diff --git a/src/components/BadgeCustom/BadgeCustom.tsx b/src/components/BadgeCustom/BadgeCustom.tsx index 52fce4b40..685663289 100644 --- a/src/components/BadgeCustom/BadgeCustom.tsx +++ b/src/components/BadgeCustom/BadgeCustom.tsx @@ -16,6 +16,6 @@ export const BadgeCustom = styled.div` width: 12px; height: 12px; border-radius: 100%; - background: var(--spectrum-warning-color); + background: var(--teddy-dark-color-active); } `; diff --git a/src/components/BaseCreatePoolConfirmationModal/BaseCreatePoolConfirmationModal.tsx b/src/components/BaseCreatePoolConfirmationModal/BaseCreatePoolConfirmationModal.tsx index 7af9e1187..ae2841d67 100644 --- a/src/components/BaseCreatePoolConfirmationModal/BaseCreatePoolConfirmationModal.tsx +++ b/src/components/BaseCreatePoolConfirmationModal/BaseCreatePoolConfirmationModal.tsx @@ -39,32 +39,14 @@ export const BaseCreatePoolConfirmationModal: FC - // mapToDepositAnalyticsProps(value, ctx), - // ); onClose( createPool(fee, x, y).pipe( tap( - () => { - // fireOperationAnalyticsEvent('Deposit Signed Success', (ctx) => - // mapToDepositAnalyticsProps(value, ctx), - // ); - }, + () => {}, (err) => { if (err === CANCEL_REQUEST) { - // fireOperationAnalyticsEvent('Deposit Cancel Sign', (ctx) => - // mapToDepositAnalyticsProps(value, ctx), - // ); return; } - - // fireOperationAnalyticsEvent( - // 'Deposit Modal Confirm Error', - // (ctx) => ({ - // ...mapToDepositAnalyticsProps(value, ctx), - // error_string: JSON.stringify(err), - // }), - // ); }, ), ), diff --git a/src/components/BaseRedeemConfirmationModal/BaseRedeemConfirmationModal.tsx b/src/components/BaseRedeemConfirmationModal/BaseRedeemConfirmationModal.tsx index c70ddc276..84ed9b89e 100644 --- a/src/components/BaseRedeemConfirmationModal/BaseRedeemConfirmationModal.tsx +++ b/src/components/BaseRedeemConfirmationModal/BaseRedeemConfirmationModal.tsx @@ -69,7 +69,7 @@ export const BaseRedeemConfirmationModal: FC = Confirm Remove Liquidity - + diff --git a/src/components/BaseSwapConfirmationModal/BaseSwapConfirmationModal.tsx b/src/components/BaseSwapConfirmationModal/BaseSwapConfirmationModal.tsx index cd8d07569..03e92f52e 100644 --- a/src/components/BaseSwapConfirmationModal/BaseSwapConfirmationModal.tsx +++ b/src/components/BaseSwapConfirmationModal/BaseSwapConfirmationModal.tsx @@ -66,7 +66,7 @@ export const BaseSwapConfirmationModal: FC< Confirm swap - +
diff --git a/src/components/ConfirmationModal/ConfirmationModal.tsx b/src/components/ConfirmationModal/ConfirmationModal.tsx index f59727598..60b8111e9 100644 --- a/src/components/ConfirmationModal/ConfirmationModal.tsx +++ b/src/components/ConfirmationModal/ConfirmationModal.tsx @@ -254,16 +254,6 @@ const SuccessModalContent = (txId: TxId) => ( const SuccessErgopayContent = () => ( Test - {/**/} - {/* */} - {/* Transaction submitted*/} - {/* */} - {/**/} - {/**/} - {/* exploreTx(txId)}>*/} - {/* View on Explorer Ergopay*/} - {/* */} - {/**/} ); diff --git a/src/components/ConvenientAssetView/ConvenientAssetView.tsx b/src/components/ConvenientAssetView/ConvenientAssetView.tsx index 0276821e2..7dfc22e0e 100644 --- a/src/components/ConvenientAssetView/ConvenientAssetView.tsx +++ b/src/components/ConvenientAssetView/ConvenientAssetView.tsx @@ -16,7 +16,7 @@ export interface ConvenientAssetViewProps { readonly sensitive?: boolean; } -const SMALLEST_VALUE = 0.01; +const SMALLEST_VALUE = 0.00000001; const ZERO_VALUE = '0.00'; export const getConvenientValue = ( diff --git a/src/components/CurrencyPreview/CurrencyPreview.tsx b/src/components/CurrencyPreview/CurrencyPreview.tsx index b4a1ce7d6..d7b53c2b8 100644 --- a/src/components/CurrencyPreview/CurrencyPreview.tsx +++ b/src/components/CurrencyPreview/CurrencyPreview.tsx @@ -14,16 +14,22 @@ const StyledButton = styled(Button)` `; export const CurrencyPreview: FC = ({ value }) => ( - + - {value.toString()} + {value.toString()} - + ); + +const BoxStyled = styled(Box)` + .ergo-flex-align-items--center { + gap: 5px; + } +`; diff --git a/src/components/FarmsButton/FarmsButton.tsx b/src/components/FarmsButton/FarmsButton.tsx index dca098e24..907be4e5d 100644 --- a/src/components/FarmsButton/FarmsButton.tsx +++ b/src/components/FarmsButton/FarmsButton.tsx @@ -24,10 +24,6 @@ const _FarmsButton: FC = ({ className, onClick }) => { export const FarmsButton = styled(_FarmsButton)` border-color: transparent; - background: var(--spectrum-connect-wallet-btn-bg) !important; - color: var(--spectrum-connect-wallet-btn-color) !important; - - &:hover { - border-color: var(--spectrum-connect-wallet-btn-border); - } + background: var(--teddy-box-color-dark) !important; + color: var(--spectrum-text-white) !important; `; diff --git a/src/components/FeesView/FeesView.tsx b/src/components/FeesView/FeesView.tsx index 479bb0519..4e1e3cf5d 100644 --- a/src/components/FeesView/FeesView.tsx +++ b/src/components/FeesView/FeesView.tsx @@ -47,22 +47,29 @@ const TotalFeeValue: FC = ({ if (isLoading) { return ; } - const feeItemsCurrencies = feeItems.map((item) => item.fee ? item.fee : new Currency(0n), ); - if (executionFee instanceof Array) { + const executionFeePlusUIFeeMin = new Currency( + (executionFee?.[0]?.amount || 0n) + 1_000_000n, + executionFee[0]?.asset, + ); + const executionFeePlusUIFeeMax = new Currency( + (executionFee?.[1]?.amount || 0n) + 1_000_000n, + executionFee[1]?.asset, + ); + return ( <> {executionFee?.[0] && executionFee?.[1] && feeItems && ( {' '} -{' '} )} @@ -71,9 +78,15 @@ const TotalFeeValue: FC = ({ } if (executionFee) { + const executionFeePlusUIFee = new Currency( + (executionFee?.amount || 0n) + 1_000_000n, + executionFee?.asset, + ); return ( - + ); } @@ -88,7 +101,7 @@ const TotalFeeValue: FC = ({ const ExecutionFeeTooltipTextWrapper = ({ children }) => { return ( - Execution Fee: + Honey 🍯: {children} @@ -209,6 +222,23 @@ export const FeesView: FC = ({ ))} + + {'UI Fee'}: + + + + + {`1 ADA`} + + } > diff --git a/src/components/LbspBanner/LbspBanner.tsx b/src/components/LbspBanner/LbspBanner.tsx index 1257fa616..0781b6339 100644 --- a/src/components/LbspBanner/LbspBanner.tsx +++ b/src/components/LbspBanner/LbspBanner.tsx @@ -1,18 +1,7 @@ -import { - Button, - CalculatorOutlined, - Flex, - Modal, - Typography, -} from '@ergolabs/ui-kit'; +import { Flex, Typography } from '@ergolabs/ui-kit'; import { Trans } from '@lingui/macro'; import styled from 'styled-components'; -import { LbspCalculatorModal } from '../LbspCalculatorModal/LbspCalculatorModal'; -import { LbspFaqModal } from '../LbspFaqModal/LbspFaqModal'; -import { LbspTimer } from './LbspTimer/LbspTimer'; -import TokensImg from './tokens-img.png'; - const LbspBannerWrapper = styled.div` position: relative; width: 100%; @@ -62,49 +51,11 @@ export const LbspBanner = () => { - Add liquidity and Get Rewarded - - - - Provide liquidity to "LBSP-labeled" pools and get - rewarded with SPF utility token. - + Claim Rewards on TosiDrop - - - - - - - - - - - - - - tokens-img ); diff --git a/src/components/LbspBanner/LbspTimer/LbspTimer.tsx b/src/components/LbspBanner/LbspTimer/LbspTimer.tsx index 4d9b5b58c..e71929b0c 100644 --- a/src/components/LbspBanner/LbspTimer/LbspTimer.tsx +++ b/src/components/LbspBanner/LbspTimer/LbspTimer.tsx @@ -47,7 +47,7 @@ export const LbspTimer = () => { ['days', 'hours', 'minutes', 'seconds', 'milliseconds'], ), ); - }, 1000); // Update every second + }, 1000); return () => clearInterval(interval); }, []); diff --git a/src/components/LbspBanner/banner.png b/src/components/LbspBanner/banner.png new file mode 100644 index 000000000..718cc5d51 Binary files /dev/null and b/src/components/LbspBanner/banner.png differ diff --git a/src/components/LbspBanner/tokens-img.png b/src/components/LbspBanner/tokens-img.png deleted file mode 100644 index c7cdf9ec0..000000000 Binary files a/src/components/LbspBanner/tokens-img.png and /dev/null differ diff --git a/src/components/LbspCalculatorModal/LbspCalculatorModal.tsx b/src/components/LbspCalculatorModal/LbspCalculatorModal.tsx index 317a1ea3d..49eae029e 100644 --- a/src/components/LbspCalculatorModal/LbspCalculatorModal.tsx +++ b/src/components/LbspCalculatorModal/LbspCalculatorModal.tsx @@ -6,7 +6,6 @@ import { useForm, } from '@ergolabs/ui-kit'; import { Trans } from '@lingui/macro'; -import { ElementLocation } from '@spectrumlabs/analytics'; import { FC } from 'react'; import { AddLiquidityForm } from '../AddLiquidityForm/AddLiquidityForm'; @@ -53,7 +52,6 @@ export const LbspCalculatorModal: FC = ({ diff --git a/src/components/LbspFaqModal/LbspFaqModal.tsx b/src/components/LbspFaqModal/LbspFaqModal.tsx index a70583bc2..edd9a2cd2 100644 --- a/src/components/LbspFaqModal/LbspFaqModal.tsx +++ b/src/components/LbspFaqModal/LbspFaqModal.tsx @@ -54,7 +54,7 @@ export const LbspFaqModal = () => { }, { question: t`What’s the utility of the SPF token?`, - content: t`SPF is a cross-chain token whose main utility is to secure Spectrum Network PoS consensus. Spectrum Network is a trustless cross-chain messaging protocol that is currently in an active development stage. However, while Spectrum Network is under development, users can pay execution fees using the SPF on Layer 1 AMM protocols by Spectrum Finance.`, + content: t`SPF is a cross-chain token whose main utility is to secure Spectrum Network PoS consensus. Spectrum Network is a trustless cross-chain messaging protocol that is currently in an active development stage. However, while Spectrum Network is under development, users can pay Honey 🍯s using the SPF on Layer 1 AMM protocols by Spectrum Finance.`, }, { question: t`How do I participate in the LBSP program?`, diff --git a/src/components/List/List.tsx b/src/components/List/List.tsx index 2e9dc6f3e..f7e432a3c 100644 --- a/src/components/List/List.tsx +++ b/src/components/List/List.tsx @@ -238,9 +238,6 @@ export const List = ({ position: 'relative', }} > - {/*{(!!height || !!maxHeight) && overlay && (*/} - {/* */} - {/*)}*/}
= (form: FormGroup) => boolean; @@ -54,7 +53,6 @@ export interface OperationFormProps { form: FormGroup, ) => Observable | void | Promise; readonly children?: ReactNode | ReactNode[] | string; - readonly traceFormLocation: TraceProps['element_location']; } function callValidatorSafely( @@ -78,7 +76,6 @@ export function OperationForm({ children, actionCaption, isWarningButton, - traceFormLocation, }: OperationFormProps): JSX.Element { const CHECK_INTERNET_CONNECTION_CAPTION = t`Check Internet Connection`; const LOADING_WALLET_CAPTION = t`Loading`; @@ -87,6 +84,7 @@ export function OperationForm({ const [validatorSubscription, setValidatorSubscription] = useState< Subscription | undefined >(undefined); + const [isWalletConnected] = useObservable(isWalletSetuped$); const [isOnline] = useObservable(isOnline$); const { slippage, nitro } = useSettings(); const [queuedOperation] = useObservable(queuedOperation$); @@ -252,26 +250,19 @@ export function OperationForm({ {children} - - - + + ) : ( + + )} diff --git a/src/components/OperationHistoryModal/OperationHistory/OperationHistory.module.less b/src/components/OperationHistoryModal/OperationHistory/OperationHistory.module.less new file mode 100644 index 000000000..f9d503147 --- /dev/null +++ b/src/components/OperationHistoryModal/OperationHistory/OperationHistory.module.less @@ -0,0 +1,280 @@ +.OperationHistory { + padding: 10px; + background-color: var(--teddy-secondary-color); + border-radius: 10px; +} + +.colConfig { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + gap: 10px; + @media (max-width: 500px){ + padding-right: 10px; + justify-content: flex-start; + } + .row { + width: 20%; + height: 30px; + display: flex; + align-items: center; + justify-content: center; + @media (max-width: 500px){ + height: auto; + } + &.asset { + min-width: 320px; + @media (max-width: 690px){ + min-width: 180px; + width: calc(100% - 60px); + } + } + &.action { + min-width: 125px; + } + &.date { + min-width: 160px; + @media (max-width: 1165px){ + max-width: 160px; + } + } + &.status { + min-width: 85px; + max-width: 100px; + } + &.actions { + min-width: 120px; + max-width: 120px; + @media (max-width: 500px){ + min-width: 60px; + max-width: 60px; + height: 30px; + } + } + .value { + margin: 0; + color: var(--teddy-primary-text); + font-size: 14px; + text-align: center; + } + } +} + +.operationHistoryContainer { + background: var(--teddy-box-color); + padding: 24px 36px; + border-radius: 16px; + max-width: 1150px; + margin: 0 auto; + position: relative; + @media (max-width: 500px){ + padding: 20px 16px; + } + .titleContainer { + font-size: 16px; + margin: 0; + font-weight: 600; + color: var(--teddy-primary-text); + margin-bottom: 40px; + } + .transactionsTable { + margin-bottom: 20px; + .thead { + border-bottom: 1px solid var(--teddy-secondary-text-dark); + .colConfig; + .row { + .value { + font-weight: 600; + } + } + } + .tbody { + display: flex; + flex-direction: column; + max-height: 400px; + overflow-y: auto; + gap: 28px; + padding-block: 20px 36px; + .rowTable { + display: flex; + flex-direction: column; + gap: 0px; + &.open { + gap: 16px; + } + .tbodyContent { + .colConfig; + .row { + &.status { + align-items: center; + gap: 5px; + .statusIcon { + width: 5px; + height: 5px; + border-radius: 50%; + } + } + &.actions { + gap: 8px; + .iconAction { + width: 30px; + height: 100%; + background: var(--teddy-box-color-dark); + border-radius: 6px; + display: flex; + align-items: center; + justify-content: center; + position: relative; + cursor: pointer; + .icon { + width: 16px; + height: auto; + fill: var(--teddy-primary-text); + transition: all 0.5s; + &.open { + transform: rotate(180deg); + } + } + .btnMore { + position: absolute; + top: 34px; + right: 5px; + background: var(--teddy-box-popup); + box-shadow: 0 3px 6px -4px #0000001f, 0 6px 16px #00000014, 0 9px 28px 8px #0000000d; + border-radius: 6px; + height: 30px; + z-index: 2; + } + } + } + } + } + .expanded { + display: flex; + height: 0px; + opacity: 0; + overflow: hidden; + transition: height 0.5s; + gap: 10px; + flex-wrap: wrap; + width: 90%; + @media (max-width: 690px){ + max-width: 450px; + margin: 0 auto; + justify-content: space-around; + } + @media (max-width: 500px){ + max-width: 320px; + } + &.open { + opacity: 1; + height: auto; + max-height: 2000px; + } + .itemGroup { + display: flex; + flex-direction: column; + align-items: center; + gap: 5px; + @media (max-width: 500px){ + width: 50%; + } + .title, .value { + margin: 0; + text-align: center; + color: var(--teddy-primary-text); + font-size: 14px; + } + .title { + font-weight: 600; + } + &.date { + max-width: 160px; + min-width: 160px; + } + &.status{ + max-width: 100px; + .value { + display: flex; + align-items: center; + gap: 5px; + .statusIcon { + width: 5px; + height: 5px; + border-radius: 50%; + } + } + } + &.action { + max-width: 125px; + } + &.actions { + min-width: 90px; + max-width: 90px; + .value { + display: flex; + height: 30px; + gap: 10px; + .iconAction { + width: 30px; + height: 100%; + background: var(--teddy-box-color-dark); + border-radius: 6px; + display: flex; + align-items: center; + justify-content: center; + position: relative; + cursor: pointer; + .icon { + width: 16px; + height: auto; + fill: var(--teddy-primary-text); + transition: all 0.5s; + } + } + } + } + } + } + } + + .copied { + position: absolute; + top: 24px; + width: 200px; + right: 24px; + background: var(--teddy-box-color-dark); + display: flex; + align-items: center; + justify-content: center; + border-radius: 6px; + height: 30px; + box-shadow: 0 3px 6px -4px #0000001f, 0 6px 16px #00000014, 0 9px 28px 8px #0000000d; + .text { + color: var(--teddy-primary-text); + margin: 0; + } + } + &.loading{ + gap: 24px; + .tbodyContent { + height: 30px; + width: 100%; + background: linear-gradient(90deg, var(--teddy-secondary-color) 25%, var(--teddy-secondary-text-dark) 50%, var(--teddy-secondary-color) 75%); + background-size: 200% 100%; + animation: loadingAnimation 1.5s infinite linear; + } + } + } + } +} + +@keyframes loadingAnimation { + 0% { + background-position: 100% 0; + } + 100% { + background-position: -100% 0; + } +} diff --git a/src/components/OperationHistoryModal/OperationHistory/OperationHistoryV2.tsx b/src/components/OperationHistoryModal/OperationHistory/OperationHistoryV2.tsx index 9dbd56b26..cc0a339fe 100644 --- a/src/components/OperationHistoryModal/OperationHistory/OperationHistoryV2.tsx +++ b/src/components/OperationHistoryModal/OperationHistory/OperationHistoryV2.tsx @@ -15,6 +15,7 @@ import { DateTimeCell } from './cells/DateTimeCell/DateTimeCell'; import { FeeCell } from './cells/FeeCell/FeeCell'; import { StatusCell } from './cells/StatusCell/StatusCell'; import { TypeCell } from './cells/TypeCell/TypeCell'; +import styles from './OperationHistory.module.less'; import { OperationPagination } from './OperationPagination/OperationPagination'; import { ErrorState } from './states/ErrorState/ErrorState'; import { OperationSearchEmptyState } from './states/OperationSearchEmptyState/OperationSearchEmptyState'; @@ -39,122 +40,127 @@ export const OperationHistoryV2: FC = ({ close }) => { return ( - } - expandPadding={[0, 0]} - > - - {(operationItem: OperationItem) => ( - - )} - - - {(operationItem: OperationItem) => ( - - )} - - - {(operationItem: OperationItem) => ( - - )} - - + } + expandPadding={[0, 0]} > - {(operationItem: OperationItem) => ( - - )} - - - {(operationItem: OperationItem) => ( - - )} - - - {(operationItem: OperationItem) => ( - - - - - - - )} - - - {(operationItem: OperationItem) => ( - - )} - - - {s && ( - + {(operationItem: OperationItem) => ( - - - - - - - - - - - + + )} + + + {(operationItem: OperationItem) => ( + + )} + + + {(operationItem: OperationItem) => ( + + )} + + + {(operationItem: OperationItem) => ( + + )} + + + {(operationItem: OperationItem) => ( + + )} + + + {(operationItem: OperationItem) => ( + + + - - + )} - )} + + {(operationItem: OperationItem) => ( + + )} + - - - - - - - - - - - {operationsData?.[1] ? ( - - - - ) : ( - '' - )} + {s && ( + + {(operationItem: OperationItem) => ( + + + + + + + + + + + + + + + + )} + + )} + + + + + + + + + + + + {operationsData?.[1] ? ( + + + + ) : ( + '' + )} + ); }; diff --git a/src/components/OperationHistoryModal/OperationHistory/OperationHistoryV3.tsx b/src/components/OperationHistoryModal/OperationHistory/OperationHistoryV3.tsx new file mode 100644 index 000000000..56f07ab9a --- /dev/null +++ b/src/components/OperationHistoryModal/OperationHistory/OperationHistoryV3.tsx @@ -0,0 +1,413 @@ +import { Flex, Tooltip } from '@ergolabs/ui-kit'; +import { useEffect, useState } from 'react'; +import { useWindowSize } from 'react-use'; + +import { useSubject } from '../../../common/hooks/useObservable.ts'; +import { getOperations } from '../../../gateway/api/transactionsHistory.ts'; +import { + CHEVRON_DOWN, + ICON_COPY, + ICON_EXPLORE, + ICON_POINTS, +} from '../../../utils/images.ts'; +import AssetDetail from './assets/AssetDetail.tsx'; +import { CancelOrderCell } from './cells/CancelOrderCell/CancelOrderCell.tsx'; +import styles from './OperationHistory.module.less'; +import { OperationPagination } from './OperationPagination/OperationPagination.tsx'; +import { ErrorState } from './states/ErrorState/ErrorState.tsx'; +import TableLoadingHistory from './TableLoadingHistory.tsx'; + +const LIMIT = 25; + +export const OperationHistoryV3 = () => { + const [offset, setOffset] = useState(0); + const [copyTxId, setCopyTxID] = useState(false); + const [isOpenMore, setIsOpenMore] = useState(''); + const [isOpen, setIsOpen] = useState(''); + + const [operationsData, loadOperations, loading, error] = + useSubject(getOperations); + + useEffect(() => { + loadOperations(LIMIT, offset); + }, [offset]); + + const reloadOperations = () => loadOperations(LIMIT, offset); + + const formatType = (type: string): string => { + switch (type) { + case 'RemoveLiquidity': + return 'Remove Liquidity'; + case 'AddLiquidity': + return 'Add Liquidity'; + default: + return type; + } + }; + + const handleCopyTxID = (tx) => { + navigator.clipboard + .writeText(tx) + .then(() => { + setCopyTxID(true); + setTimeout(() => { + setCopyTxID(false); + }, 1000); + }) + .catch(() => { + setCopyTxID(false); + }); + }; + + const handleClickMore = (string) => { + setIsOpenMore((prevItemId) => (prevItemId === string ? '' : string)); + }; + + const handleClickOpen = (string) => { + setIsOpen((prevItemId) => (prevItemId === string ? '' : string)); + }; + + useEffect(() => { + const handleDocumentClick = (event: MouseEvent) => { + const target = event.target as HTMLElement; + + if (target.closest(`.${styles.actionMore}`)) { + return; + } + setIsOpenMore(''); + }; + document.addEventListener('click', handleDocumentClick); + return () => { + document.removeEventListener('click', handleDocumentClick); + }; + }, []); + + const handleExplore = (tx) => { + window.open(`https://cardanoscan.io/transaction/${tx}`, '_blank'); + }; + + const statusType = (status: string): { label: string; color: string } => { + switch (status) { + case 'Evaluated': + return { label: 'Complete', color: '#10B981' }; + case 'Refunded': + return { label: 'Canceled', color: '#899398' }; + default: + return { label: 'Processing', color: '#E8D648' }; + } + }; + + const { width } = useWindowSize(); + const widthSizeXL = 1000; + const widthSizeL = 820; + const widthSizeM = 690; + const widthSizeS = 500; + + return ( + <> +
+

Transaction History

+ {loading ? ( + + ) : !loading && !!error ? ( + + ) : ( + <> +
+
+
+

Assets

+
+ {width > widthSizeM && ( +
+

Action

+
+ )} + + {width > widthSizeXL && ( +
+

Date & Time

+
+ )} + {width > widthSizeL && ( +
+

Status

+
+ )} + {width > widthSizeS && ( +
+

Actions

+
+ )} +
+
+ {operationsData?.[0].map((item) => ( +
+
+
+ +
+ {width > widthSizeM && ( +
+

+ {formatType(item.type)} +

+
+ )} + + {width > widthSizeXL && ( +
+

+ {item.registerTx.dateTime.toFormat( + 'MMMM d, yyyy h:mm a', + )} +

+
+ )} + {width > widthSizeL && ( +
+
+

+ {statusType(item.status).label} +

+
+ )} + +
+ {width > widthSizeS && ( + +
handleCopyTxID(item.registerTx.id)} + > + copy +
+
+ )} + {width > widthSizeS && ( + +
handleExplore(item.registerTx.id)} + > + explore +
+
+ )} + + {width > widthSizeXL ? ( +
handleClickMore(item.id)} + > + points + {isOpenMore === item.id && ( +
+ +
+ )} +
+ ) : ( +
handleClickOpen(item.id)} + > + + + +
+ )} +
+
+ {width < 1000 && ( +
+
+

Date & Time

+
+

+ {item.registerTx.dateTime.toFormat( + 'MMMM d, yyyy h:mm a', + )} +

+
+
+ {width <= widthSizeL && ( +
+

Status

+
+
+

+ {statusType(item.status).label} +

+
+
+ )} + {width <= widthSizeM && ( +
+

Action

+
+

+ {formatType(item.type)} +

+
+
+ )} + {width <= widthSizeS && ( +
+

Actions

+
+ +
+ handleCopyTxID(item.registerTx.id) + } + > + copy +
+
+ +
+ handleExplore(item.registerTx.id) + } + > + explore +
+
+
+
+ )} +
+ )} +
+ ))} + {copyTxId && ( +
+

TxId successfully copied

+
+ )} +
+
+ {operationsData?.[1] ? ( + + + + ) : ( + '' + )} + + )} +
+ + ); +}; diff --git a/src/components/OperationHistoryModal/OperationHistory/OperationPagination/OperationPagination.tsx b/src/components/OperationHistoryModal/OperationHistory/OperationPagination/OperationPagination.tsx index b180cd4c7..b5bef8b95 100644 --- a/src/components/OperationHistoryModal/OperationHistory/OperationPagination/OperationPagination.tsx +++ b/src/components/OperationHistoryModal/OperationHistory/OperationPagination/OperationPagination.tsx @@ -103,7 +103,7 @@ export const OperationPagination: FC = ({ handlePageSelect(1)} - width={24} + width={34} disabled={isActivePageFirst} icon={} /> @@ -111,7 +111,7 @@ export const OperationPagination: FC = ({ handlePageSelect(activePage - 1)} - width={24} + width={34} disabled={isActivePageFirst} icon={} /> @@ -125,6 +125,7 @@ export const OperationPagination: FC = ({ type="default" htmlType="button" size="small" + style={{ height: '32px' }} > {page} @@ -133,7 +134,7 @@ export const OperationPagination: FC = ({ handlePageSelect(activePage + 1)} - width={24} + width={34} disabled={isActivePageLast} icon={} /> @@ -141,7 +142,7 @@ export const OperationPagination: FC = ({ handlePageSelect(pageCount)} - width={24} + width={34} disabled={isActivePageLast} icon={} /> diff --git a/src/components/OperationHistoryModal/OperationHistory/TableLoadingHistory.tsx b/src/components/OperationHistoryModal/OperationHistory/TableLoadingHistory.tsx new file mode 100644 index 000000000..399ab6227 --- /dev/null +++ b/src/components/OperationHistoryModal/OperationHistory/TableLoadingHistory.tsx @@ -0,0 +1,19 @@ +import styles from './OperationHistory.module.less'; + +export default function TableLoadingHistory() { + const skeletonData = Array(7) + .fill(null) + .map((_, index) => ({ + _DB_id: index, + })); + return ( +
+
+
+ {skeletonData.map((fund) => ( +
+ ))} +
+
+ ); +} diff --git a/src/components/OperationHistoryModal/OperationHistory/assets/AssetDetail.module.less b/src/components/OperationHistoryModal/OperationHistory/assets/AssetDetail.module.less new file mode 100644 index 000000000..37e3d189c --- /dev/null +++ b/src/components/OperationHistoryModal/OperationHistory/assets/AssetDetail.module.less @@ -0,0 +1,49 @@ +.detailGroup { + display: flex; + align-items: center; + gap: 10px; + height: 100%; + width: 100%; + .assetGroup { + height: 100%; + display: flex; + align-items: center; + gap: 5px; + min-width: 110px; + max-width: 145px; + .logo { + height: 30px; + width: auto; + border-radius: 50%; + } + .name { + margin: 0; + font-size: 14px; + font-weight: 600; + color: var(--teddy-primary-text); + } + .value { + margin: 0; + font-size: 14px; + color: var(--teddy-primary-text); + } + } + .iconAsset { + display: flex; + align-items: center; + .icon { + fill: var(--teddy-primary-text); + } + } + @media (max-width: 690px){ + justify-content: center; + } + @media (max-width: 440px){ + flex-direction: column; + gap: 0; + .iconAsset { + transform: rotate(90deg); + } + } +} + diff --git a/src/components/OperationHistoryModal/OperationHistory/assets/AssetDetail.tsx b/src/components/OperationHistoryModal/OperationHistory/assets/AssetDetail.tsx new file mode 100644 index 000000000..60060345c --- /dev/null +++ b/src/components/OperationHistoryModal/OperationHistory/assets/AssetDetail.tsx @@ -0,0 +1,72 @@ +import { formatToToken } from '../../../../services/number'; +import { ARROW_RIGHT, PLUS } from '../../../../utils/images'; +import styles from './AssetDetail.module.less'; + +interface AssetPairDetailProps { + assetNameX: string | undefined; + assetNameY: string | undefined; + type: string; + iconX: string | undefined; + iconY: string | undefined; + valueX: bigint | undefined; + decimalsX: number | undefined; + valueY: bigint | undefined; + decimalsY: number | undefined; +} + +export default function AssetDetail(props: AssetPairDetailProps) { + const { + assetNameX, + assetNameY, + type, + iconX, + iconY, + valueX, + valueY, + decimalsX, + decimalsY, + } = props; + const valueTokenX = formatToToken( + Number(valueX) / + (Number(decimalsX) === 0 ? 1 : Math.pow(10, Number(decimalsX))), + 'abbr', + ); + + const valueTokenY = formatToToken( + Number(valueY) / + (Number(decimalsY) === 0 ? 1 : Math.pow(10, Number(decimalsY))), + 'abbr', + ); + + const iconType = () => { + const iconType = type; + switch (iconType) { + case 'RemoveLiquidity': + return `${PLUS}`; + case 'AddLiquidity': + return `${PLUS}`; + default: + return `${ARROW_RIGHT}`; + } + }; + + return ( +
+
+ logo +

{assetNameX}

+

{valueTokenX}

+
+
+ + + +
+
+ logo +

{assetNameY}

+

{valueTokenY}

+
+
+ ); +} diff --git a/src/components/OperationHistoryModal/OperationHistory/cells/AssetsCell/AddLiquidityAssetsCell/AddLiquidityAssetsCell.tsx b/src/components/OperationHistoryModal/OperationHistory/cells/AssetsCell/AddLiquidityAssetsCell/AddLiquidityAssetsCell.tsx index 247051c2c..1d6f85936 100644 --- a/src/components/OperationHistoryModal/OperationHistory/cells/AssetsCell/AddLiquidityAssetsCell/AddLiquidityAssetsCell.tsx +++ b/src/components/OperationHistoryModal/OperationHistory/cells/AssetsCell/AddLiquidityAssetsCell/AddLiquidityAssetsCell.tsx @@ -11,7 +11,7 @@ export interface AddLiquidityAssetsCellProps { export const AddLiquidityAssetsCell: FC = ({ addLiquidityItem, }) => ( - + diff --git a/src/components/OperationHistoryModal/OperationHistory/cells/AssetsCell/LmDepositAssetsCell/LmDepositAssetsCell.tsx b/src/components/OperationHistoryModal/OperationHistory/cells/AssetsCell/LmDepositAssetsCell/LmDepositAssetsCell.tsx index 47430733f..d2e3e8fdb 100644 --- a/src/components/OperationHistoryModal/OperationHistory/cells/AssetsCell/LmDepositAssetsCell/LmDepositAssetsCell.tsx +++ b/src/components/OperationHistoryModal/OperationHistory/cells/AssetsCell/LmDepositAssetsCell/LmDepositAssetsCell.tsx @@ -11,7 +11,7 @@ export interface LmDepositAssetsCellProps { export const LmDepositAssetsCell: FC = ({ lmDepositItem, }) => ( - + ); diff --git a/src/components/OperationHistoryModal/OperationHistory/cells/AssetsCell/LmRedeemAssetsCell/LmRedeemAssetsCell.tsx b/src/components/OperationHistoryModal/OperationHistory/cells/AssetsCell/LmRedeemAssetsCell/LmRedeemAssetsCell.tsx index ead4e9012..36687b39b 100644 --- a/src/components/OperationHistoryModal/OperationHistory/cells/AssetsCell/LmRedeemAssetsCell/LmRedeemAssetsCell.tsx +++ b/src/components/OperationHistoryModal/OperationHistory/cells/AssetsCell/LmRedeemAssetsCell/LmRedeemAssetsCell.tsx @@ -11,7 +11,7 @@ export interface LmDepositAssetsCellProps { export const LmRedeemAssetsCell: FC = ({ lmRedeemItem, }) => ( - + ); diff --git a/src/components/OperationHistoryModal/OperationHistory/cells/AssetsCell/LockAssetsCell/LockAssetsCell.tsx b/src/components/OperationHistoryModal/OperationHistory/cells/AssetsCell/LockAssetsCell/LockAssetsCell.tsx index fc28eaf9c..0db766984 100644 --- a/src/components/OperationHistoryModal/OperationHistory/cells/AssetsCell/LockAssetsCell/LockAssetsCell.tsx +++ b/src/components/OperationHistoryModal/OperationHistory/cells/AssetsCell/LockAssetsCell/LockAssetsCell.tsx @@ -9,7 +9,7 @@ export interface LockAssetsCellProps { } export const LockAssetsCell: FC = ({ lockItem }) => ( - + ); diff --git a/src/components/OperationHistoryModal/OperationHistory/cells/AssetsCell/RemoveLiquidityAssetsCell/RemoveLiquidityAssetsCell.tsx b/src/components/OperationHistoryModal/OperationHistory/cells/AssetsCell/RemoveLiquidityAssetsCell/RemoveLiquidityAssetsCell.tsx index e6c33ad33..5a4176a19 100644 --- a/src/components/OperationHistoryModal/OperationHistory/cells/AssetsCell/RemoveLiquidityAssetsCell/RemoveLiquidityAssetsCell.tsx +++ b/src/components/OperationHistoryModal/OperationHistory/cells/AssetsCell/RemoveLiquidityAssetsCell/RemoveLiquidityAssetsCell.tsx @@ -12,7 +12,7 @@ export const RemoveLiquidityAssetsCell: FC = ({ removeLiquidityItem, }) => { return ( - + = ({ swapItem }) => ( - + diff --git a/src/components/OperationHistoryModal/OperationHistory/cells/DateTimeCell/DateTimeCell.module.less b/src/components/OperationHistoryModal/OperationHistory/cells/DateTimeCell/DateTimeCell.module.less new file mode 100644 index 000000000..173387ad9 --- /dev/null +++ b/src/components/OperationHistoryModal/OperationHistory/cells/DateTimeCell/DateTimeCell.module.less @@ -0,0 +1,3 @@ +.dateTimeCell { + margin: 0 auto; +} diff --git a/src/components/OperationHistoryModal/OperationHistory/cells/DateTimeCell/DateTimeCell.tsx b/src/components/OperationHistoryModal/OperationHistory/cells/DateTimeCell/DateTimeCell.tsx index 58bf169dc..198b7d6eb 100644 --- a/src/components/OperationHistoryModal/OperationHistory/cells/DateTimeCell/DateTimeCell.tsx +++ b/src/components/OperationHistoryModal/OperationHistory/cells/DateTimeCell/DateTimeCell.tsx @@ -1,17 +1,20 @@ -import { Typography } from '@ergolabs/ui-kit'; +import { Flex, Typography } from '@ergolabs/ui-kit'; import { FC } from 'react'; import { OperationItem } from '../../../../../common/models/OperationV2'; +import styles from './DateTimeCell.module.less'; export interface DateTimeCellProps { readonly operationItem: OperationItem; } export const DateTimeCell: FC = ({ operationItem }) => ( - - {operationItem.registerTx.dateTime.toFormat('dd MMM, yy')}{' '} - - {operationItem.registerTx.dateTime.toFormat('HH:mm')} + + + {operationItem.registerTx.dateTime.toFormat('dd MMM, yy')}{' '} + + {operationItem.registerTx.dateTime.toFormat('HH:mm')} + - + ); diff --git a/src/components/OperationHistoryModal/OperationHistory/cells/FeeCell/FeeCell.module.less b/src/components/OperationHistoryModal/OperationHistory/cells/FeeCell/FeeCell.module.less new file mode 100644 index 000000000..e28a84eee --- /dev/null +++ b/src/components/OperationHistoryModal/OperationHistory/cells/FeeCell/FeeCell.module.less @@ -0,0 +1,8 @@ +.feeCell{ + margin: 0 auto; + :global(.spectrum-box){ + display: flex; + align-items: center; + justify-content: center; + } +} diff --git a/src/components/OperationHistoryModal/OperationHistory/cells/FeeCell/FeeCell.tsx b/src/components/OperationHistoryModal/OperationHistory/cells/FeeCell/FeeCell.tsx index fc4bc3eab..e3a010cd1 100644 --- a/src/components/OperationHistoryModal/OperationHistory/cells/FeeCell/FeeCell.tsx +++ b/src/components/OperationHistoryModal/OperationHistory/cells/FeeCell/FeeCell.tsx @@ -6,16 +6,17 @@ import { OperationStatus, } from '../../../../../common/models/OperationV2'; import { AssetIcon } from '../../../../AssetIcon/AssetIcon'; -import { ConvenientAssetView } from '../../../../ConvenientAssetView/ConvenientAssetView'; +//import { ConvenientAssetView } from '../../../../ConvenientAssetView/ConvenientAssetView'; import { InfoTooltip } from '../../../../InfoTooltip/InfoTooltip'; +import styles from './FeeCell.module.less'; export interface FeeCellProps { readonly operationItem: OperationItem; } export const FeeCell: FC = ({ operationItem }) => ( - - + + {operationItem.status === OperationStatus.Evaluated ? ( = ({ operationItem }) => ( ))} } - width={300} > - + feeItem.value.toCurrencyString(2), + )} + {/* feeItem.value)} - /> + /> */} ) : ( diff --git a/src/components/OperationHistoryModal/OperationHistory/cells/StatusCell/StatusCell.module.less b/src/components/OperationHistoryModal/OperationHistory/cells/StatusCell/StatusCell.module.less new file mode 100644 index 000000000..40deb0f48 --- /dev/null +++ b/src/components/OperationHistoryModal/OperationHistory/cells/StatusCell/StatusCell.module.less @@ -0,0 +1,3 @@ +.statusCell{ + margin: 0 auto; +} diff --git a/src/components/OperationHistoryModal/OperationHistory/cells/StatusCell/StatusCell.tsx b/src/components/OperationHistoryModal/OperationHistory/cells/StatusCell/StatusCell.tsx index 54c62bb82..aec9e462b 100644 --- a/src/components/OperationHistoryModal/OperationHistory/cells/StatusCell/StatusCell.tsx +++ b/src/components/OperationHistoryModal/OperationHistory/cells/StatusCell/StatusCell.tsx @@ -12,6 +12,7 @@ import { OperationItem, OperationStatus, } from '../../../../../common/models/OperationV2'; +import styles from './StatusCell.module.less'; interface StatusCellProps { readonly operationItem: OperationItem; @@ -61,5 +62,9 @@ export const StatusCell: FC = ({ operationItem }) => { statusCell = ; } - return {statusCell}; + return ( + + {statusCell} + + ); }; diff --git a/src/components/OperationHistoryModal/OperationHistory/cells/TypeCell/TypeCell.module.less b/src/components/OperationHistoryModal/OperationHistory/cells/TypeCell/TypeCell.module.less new file mode 100644 index 000000000..b8bcb2568 --- /dev/null +++ b/src/components/OperationHistoryModal/OperationHistory/cells/TypeCell/TypeCell.module.less @@ -0,0 +1,8 @@ +.typeCell{ + margin: 0 auto; + :global(.spectrum-box){ + display: flex; + align-items: center; + justify-content: center; + } +} diff --git a/src/components/OperationHistoryModal/OperationHistory/cells/TypeCell/TypeCell.tsx b/src/components/OperationHistoryModal/OperationHistory/cells/TypeCell/TypeCell.tsx index ee411e2a9..b3b874ed3 100644 --- a/src/components/OperationHistoryModal/OperationHistory/cells/TypeCell/TypeCell.tsx +++ b/src/components/OperationHistoryModal/OperationHistory/cells/TypeCell/TypeCell.tsx @@ -6,6 +6,7 @@ import { OperationItem, OperationType, } from '../../../../../common/models/OperationV2'; +import styles from './TypeCell.module.less'; export interface TypeCellProps { readonly operationItem: OperationItem; @@ -24,9 +25,14 @@ export const TypeCell: FC = ({ operationItem }) => { }; return ( - - - + + + {mapOperationItemTypeToCaption[operationItem.type]} diff --git a/src/components/OperationHistoryModal/OperationHistory/common/AssetBox/AssetBox.tsx b/src/components/OperationHistoryModal/OperationHistory/common/AssetBox/AssetBox.tsx index a2c62b4db..e9797da4b 100644 --- a/src/components/OperationHistoryModal/OperationHistory/common/AssetBox/AssetBox.tsx +++ b/src/components/OperationHistoryModal/OperationHistory/common/AssetBox/AssetBox.tsx @@ -11,7 +11,7 @@ interface AssetBoxProps { readonly className?: string; } const _AssetBox: FC = ({ title, value, className, icon }) => ( - + {icon && ( diff --git a/src/components/OperationHistoryModal/OperationHistory/common/LpAssetBox/LpAssetBox.module.less b/src/components/OperationHistoryModal/OperationHistory/common/LpAssetBox/LpAssetBox.module.less new file mode 100644 index 000000000..92da0d5fb --- /dev/null +++ b/src/components/OperationHistoryModal/OperationHistory/common/LpAssetBox/LpAssetBox.module.less @@ -0,0 +1,6 @@ +.LpAssetBox{ + width: 215px !important; + :global(h5.ant-typography){ + font-size: 14px; + } +} diff --git a/src/components/OperationHistoryModal/OperationHistory/common/LpAssetBox/LpAssetBox.tsx b/src/components/OperationHistoryModal/OperationHistory/common/LpAssetBox/LpAssetBox.tsx index 518610937..d4b26d6ef 100644 --- a/src/components/OperationHistoryModal/OperationHistory/common/LpAssetBox/LpAssetBox.tsx +++ b/src/components/OperationHistoryModal/OperationHistory/common/LpAssetBox/LpAssetBox.tsx @@ -6,6 +6,7 @@ import { AssetIcon } from '../../../../AssetIcon/AssetIcon'; import { AssetPairTitle } from '../../../../AssetPairTitle/AssetPairTitle'; import { InfoTooltip } from '../../../../InfoTooltip/InfoTooltip'; import { AssetBox } from '../AssetBox/AssetBox'; +import styles from './LpAssetBox.module.less'; export interface LpAssetBoxProps { readonly lpCurrency: Currency; @@ -51,5 +52,6 @@ export const LpAssetBox: FC = ({ {lpCurrency.toString(Math.max(lpCurrency.asset.decimals || 0, 2), 2)} } + className={styles.LpAssetBox} /> ); diff --git a/src/components/OperationHistoryModal/OperationHistory/common/SingleAssetBox/SigleAssetBox.module.less b/src/components/OperationHistoryModal/OperationHistory/common/SingleAssetBox/SigleAssetBox.module.less new file mode 100644 index 000000000..628bcd012 --- /dev/null +++ b/src/components/OperationHistoryModal/OperationHistory/common/SingleAssetBox/SigleAssetBox.module.less @@ -0,0 +1,6 @@ +.singleAssetBox { + width: 215px !important; + :global(h5.ant-typography){ + font-size: 14px; + } +} diff --git a/src/components/OperationHistoryModal/OperationHistory/common/SingleAssetBox/SingleAssetBox.tsx b/src/components/OperationHistoryModal/OperationHistory/common/SingleAssetBox/SingleAssetBox.tsx index a61534275..66cfc3713 100644 --- a/src/components/OperationHistoryModal/OperationHistory/common/SingleAssetBox/SingleAssetBox.tsx +++ b/src/components/OperationHistoryModal/OperationHistory/common/SingleAssetBox/SingleAssetBox.tsx @@ -4,6 +4,7 @@ import { Currency } from '../../../../../common/models/Currency'; import { AssetTitle } from '../../../../AssetTitle/AssetTitle'; import { SensitiveContent } from '../../../../SensitiveContent/SensitiveContent.tsx'; import { AssetBox } from '../AssetBox/AssetBox'; +import styles from './SigleAssetBox.module.less'; export interface SingleAssetBoxProps { readonly currency: Currency; @@ -19,5 +20,6 @@ export const SingleAssetBox: FC = ({ currency, icon }) => ( {currency.toString(Math.max(currency.asset.decimals || 0, 2), 2)} } + className={styles.singleAssetBox} /> ); diff --git a/src/components/OperationHistoryModal/OperationHistoryModal.tsx b/src/components/OperationHistoryModal/OperationHistoryModal.tsx index a506b9d8e..8888288d9 100644 --- a/src/components/OperationHistoryModal/OperationHistoryModal.tsx +++ b/src/components/OperationHistoryModal/OperationHistoryModal.tsx @@ -10,7 +10,7 @@ export const OperationHistoryModal: FC = ({ close }) => { Orders - + {} diff --git a/src/components/OperationSettings/FeeCurrencySelector/OperationSettingsButton/OperationSettingsButton.tsx b/src/components/OperationSettings/FeeCurrencySelector/OperationSettingsButton/OperationSettingsButton.tsx index bbbb0d87c..1449d9687 100644 --- a/src/components/OperationSettings/FeeCurrencySelector/OperationSettingsButton/OperationSettingsButton.tsx +++ b/src/components/OperationSettings/FeeCurrencySelector/OperationSettingsButton/OperationSettingsButton.tsx @@ -30,5 +30,5 @@ const _OperationSettingsButton: FC = ({ }; export const OperationSettingsButton = styled(_OperationSettingsButton)` - background-color: var(--spectrum-btn-default-color) !important; + background-color: var(--spectrum-primary-color) !important; `; diff --git a/src/components/OperationSettings/NitroInput/NitroInput.tsx b/src/components/OperationSettings/NitroInput/NitroInput.tsx index 39f48a2d5..acf0dc21d 100644 --- a/src/components/OperationSettings/NitroInput/NitroInput.tsx +++ b/src/components/OperationSettings/NitroInput/NitroInput.tsx @@ -77,7 +77,7 @@ const _NitroInput: FC = ({ - Execution Fee Range {minExFee.toString()} - {maxExFee.toString()}{' '} + Honey 🍯 Range {minExFee.toString()} - {maxExFee.toString()}{' '} {maxExFee.asset.ticker || maxExFee.asset.name} diff --git a/src/components/OperationSettings/OperationSettings.tsx b/src/components/OperationSettings/OperationSettings.tsx index d72c94d6d..3918cb199 100644 --- a/src/components/OperationSettings/OperationSettings.tsx +++ b/src/components/OperationSettings/OperationSettings.tsx @@ -185,10 +185,10 @@ export const OperationSettings: FC = ({ - Execution fee + Honey 🍯 @@ -211,20 +211,18 @@ export const OperationSettings: FC = ({ - Max execution fee multiplier + Max Honey 🍯 multiplier
Read more } > - - Nitro - + Honey 🍯
@@ -264,7 +262,7 @@ export const OperationSettings: FC = ({ backgroundColor: slippageCheck(slippage) || slippageTxFailCheck(slippage) ? 'var(--spectrum-warning-border-color)' - : 'var(--spectrum-btn-default-color)', + : 'var(--spectrum-primary-color)', }} > diff --git a/src/components/OperationSettings/SlippageInput/SlippageInput.tsx b/src/components/OperationSettings/SlippageInput/SlippageInput.tsx index 67d7579c0..dcca7714e 100644 --- a/src/components/OperationSettings/SlippageInput/SlippageInput.tsx +++ b/src/components/OperationSettings/SlippageInput/SlippageInput.tsx @@ -89,13 +89,11 @@ export const SlippageInput = styled(_SlippageInput)` input { text-align: right; - /* stylelint-disable-next-line */ -moz-appearance: textfield; &::-webkit-outer-spin-button, &::-webkit-inner-spin-button { margin: 0; - /* stylelint-disable-next-line */ -webkit-appearance: none; } } diff --git a/src/components/Page/Page.tsx b/src/components/Page/Page.tsx index 4fe6c887b..b94753098 100644 --- a/src/components/Page/Page.tsx +++ b/src/components/Page/Page.tsx @@ -129,7 +129,10 @@ const _Page: React.FC = ({ @@ -194,13 +197,11 @@ const _Page: React.FC = ({ width="100%" transparent={transparent} bordered={!transparent} - style={ - transparent - ? { - boxShadow: 'none', - } - : {} - } + style={{ + boxShadow: 'none', + background: 'var(--teddy-box-color)', + border: 'none', + }} > {children}
diff --git a/src/components/SensitiveContentToggle/SensitiveContentToggle.tsx b/src/components/SensitiveContentToggle/SensitiveContentToggle.tsx index bfc768476..facf60ae2 100644 --- a/src/components/SensitiveContentToggle/SensitiveContentToggle.tsx +++ b/src/components/SensitiveContentToggle/SensitiveContentToggle.tsx @@ -1,7 +1,14 @@ import { Button, EyeInvisibleOutlined, EyeOutlined } from '@ergolabs/ui-kit'; +import styled from 'styled-components'; import { useApplicationSettings } from '../../context'; +const ToogleButton = styled(Button)` + border: none !important; + color: var(--spectrum-primary-text) !important; + background-color: transparent !important; +`; + export const SensitiveContentToggle = () => { const [settings, setSettings] = useApplicationSettings(); @@ -13,7 +20,7 @@ export const SensitiveContentToggle = () => { }; return ( - + )} ); }; diff --git a/src/components/common/ConnectWalletButton/VesprConnectButton/VesprConnectButton.tsx b/src/components/common/ConnectWalletButton/VesprConnectButton/VesprConnectButton.tsx index 8afe7bd54..dbd48b6ed 100644 --- a/src/components/common/ConnectWalletButton/VesprConnectButton/VesprConnectButton.tsx +++ b/src/components/common/ConnectWalletButton/VesprConnectButton/VesprConnectButton.tsx @@ -1,6 +1,5 @@ import { Button, ButtonProps, Flex } from '@ergolabs/ui-kit'; import { Trans } from '@lingui/macro'; -import { TraceProps } from '@spectrumlabs/analytics/lib/esm/types'; import { CSSProperties, FC, ReactNode, useEffect } from 'react'; import { useObservable } from '../../../../common/hooks/useObservable'; @@ -19,17 +18,22 @@ export interface VesprConnectButtonProps { readonly className?: string; readonly children?: ReactNode | ReactNode[] | string; readonly isWalletConnected?: boolean; - readonly trace: TraceProps; } const mapSizeToStyle = new Map([ [ 'small', - { fontSize: 16, marginLeft: 'calc(var(--spectrum-base-gutter) * 0.5)' }, + { + fontSize: 16, + marginLeft: 'calc(var(--spectrum-base-gutter) * 0.5)', + }, ], [ 'middle', - { fontSize: 20, marginLeft: 'calc(var(--spectrum-base-gutter) * 0.5)' }, + { + fontSize: 20, + marginLeft: 'calc(var(--spectrum-base-gutter) * 0.5)', + }, ], [ 'large', @@ -62,7 +66,6 @@ export const VesprConnectButton: FC = ({ const vesprCompat = !!window.cardano?.nami?.experimental?.vespr_compat; useEffect(() => { - // TODO: REWRITE if ( selectedNetwork.name !== 'ergo' && vesprCompat && diff --git a/src/components/common/CopyButton/CopyButton.tsx b/src/components/common/CopyButton/CopyButton.tsx index 909ea4956..7f8b924ee 100644 --- a/src/components/common/CopyButton/CopyButton.tsx +++ b/src/components/common/CopyButton/CopyButton.tsx @@ -16,7 +16,7 @@ interface CopyButtonProps { const CopyButton: React.FC = ({ text, - size = 'small', + size = 'middle', messageContent, tooltipText, }) => { @@ -35,7 +35,11 @@ const CopyButton: React.FC = ({ size={size} onClick={(e) => e.stopPropagation()} icon={} - style={{ lineHeight: '24px' }} + style={{ + lineHeight: '30px', + background: 'var(--teddy-box-color-dark)', + height: '30px', + }} /> diff --git a/src/components/common/DataTag/DataTag.tsx b/src/components/common/DataTag/DataTag.tsx index 3b3d11a12..1dca42866 100644 --- a/src/components/common/DataTag/DataTag.tsx +++ b/src/components/common/DataTag/DataTag.tsx @@ -119,7 +119,3 @@ const _DataTag: React.FC = ({ }; export const DataTag = styled(_DataTag)``; -// background: var(--spectrum-tag-primary) !important; -// -// ${(props) => -// props.secondary && 'background: var(--spectrum-tag-secondary) !important'} diff --git a/src/components/common/DateTimeView/DateTimeView.tsx b/src/components/common/DateTimeView/DateTimeView.tsx index 896d9d9eb..b2dd50684 100644 --- a/src/components/common/DateTimeView/DateTimeView.tsx +++ b/src/components/common/DateTimeView/DateTimeView.tsx @@ -15,8 +15,6 @@ const formatMap: Record = { datetimeWithWeekday: DateTime.DATETIME_MED_WITH_WEEKDAY, }; -// TODO: Localize DateTime - const DateTimeView: React.FC = ({ type = 'date', value, diff --git a/src/components/common/ExploreButton/ExploreButton.tsx b/src/components/common/ExploreButton/ExploreButton.tsx index f4a49d637..bc8f72344 100644 --- a/src/components/common/ExploreButton/ExploreButton.tsx +++ b/src/components/common/ExploreButton/ExploreButton.tsx @@ -17,7 +17,7 @@ interface ExploreButtonProps { const ExploreButton: React.FC = ({ to, - size = 'small', + size = 'middle', }) => { const handleExplore = (t: string): void => { if (isTxId(t)) { @@ -35,7 +35,11 @@ const ExploreButton: React.FC = ({ e.stopPropagation(); handleExplore(to); }} - style={{ lineHeight: '24px' }} + style={{ + lineHeight: '30px', + background: 'var(--teddy-box-color-dark)', + height: '30px', + }} icon={} /> diff --git a/src/components/common/FormView/FormFeesSection/FormFeesSection.tsx b/src/components/common/FormView/FormFeesSection/FormFeesSection.tsx index bf11874a6..ed746c47a 100644 --- a/src/components/common/FormView/FormFeesSection/FormFeesSection.tsx +++ b/src/components/common/FormView/FormFeesSection/FormFeesSection.tsx @@ -40,7 +40,7 @@ const FormFeesSection: React.FC = ({ - Execution Fee: + Honey 🍯: {minExFee.toCurrencyString()} diff --git a/src/components/common/Layout/FooterNavigation/FooterNavigation.module.less b/src/components/common/Layout/FooterNavigation/FooterNavigation.module.less new file mode 100644 index 000000000..db4a3859f --- /dev/null +++ b/src/components/common/Layout/FooterNavigation/FooterNavigation.module.less @@ -0,0 +1,12 @@ +.footerNavigation { + @media (max-width: 768px) { + width: 100%; + position: fixed; + display: flex; + bottom: 0; + align-items: center; + height: 50px; + background: var(--teddy-dark-color-container); + padding-inline: 20px; + } +} diff --git a/src/components/common/Layout/FooterNavigation/FooterNavigation.tsx b/src/components/common/Layout/FooterNavigation/FooterNavigation.tsx index 7297edac1..92d8cd439 100644 --- a/src/components/common/Layout/FooterNavigation/FooterNavigation.tsx +++ b/src/components/common/Layout/FooterNavigation/FooterNavigation.tsx @@ -1,58 +1,28 @@ -import { Flex, useDevice } from '@ergolabs/ui-kit'; -import { forwardRef } from 'react'; -import styled from 'styled-components'; +import { useDevice } from '@ergolabs/ui-kit'; -import { device } from '../../../../common/constants/size'; import { useObservable } from '../../../../common/hooks/useObservable'; import { selectedWalletState$ } from '../../../../gateway/api/wallets'; import { WalletState } from '../../../../network/common/Wallet'; -import { Navigation } from '../Header/Navigation/Navigation'; +import Navigation from '../Header/Navigation/Navigation'; import { OperationsHistory } from '../OperationsHistory/OperationsHistory'; +import styles from './FooterNavigation.module.less'; -export const BottomContainer = styled.div<{ ref: any }>` - z-index: 2; - position: fixed; - bottom: 0; - padding-top: 1rem; - padding-bottom: 1rem; - right: 0; - left: 0; - background: var(--spectrum-box-bg-secondary-glass); - backdrop-filter: var(--spectrum-box-bg-filter); - border-top: 1px var(--spectrum-box-border-color) solid; - - ${device.m} { - left: auto; - right: 50%; - transform: translate(50%, 0); - background: none; - border-top: 0; - } -`; -// eslint-disable-next-line react/display-name -export const FooterNavigation = forwardRef((_, ref) => { - const { s, m } = useDevice(); +export default function FooterNavigation() { + const { s } = useDevice(); const [walletState] = useObservable(selectedWalletState$); - if (!(s || m)) { + if (!s) { return null; + } else { + return ( +
+ + {walletState === WalletState.CONNECTED && ( +
+ +
+ )} +
+ ); } - - return ( - - {s && ( - - - - - {walletState === WalletState.CONNECTED && ( - - - - )} - - )} - {m && } - - ); -}); +} diff --git a/src/components/common/Layout/Header/Analytics/Analytics.module.less b/src/components/common/Layout/Header/Analytics/Analytics.module.less new file mode 100644 index 000000000..b76524c17 --- /dev/null +++ b/src/components/common/Layout/Header/Analytics/Analytics.module.less @@ -0,0 +1,25 @@ +.analyticsSection { + position: fixed; + display: flex; + bottom: 0; + left: 0; + height: 50px; + align-items: center; + background: var(--teddy-dark-color-container); + width: 100%; + padding-inline: 20px; + gap: 10px; + .tag { + display: flex; + align-items: center; + justify-content: center; + gap: 5px; + background: var(--teddy-box-color); + border-radius: 8px; + padding: 5px 10px; + .tagName, .tagValue { + margin: 0; + color: var(--teddy-dark-color-active); + } + } +} diff --git a/src/components/common/Layout/Header/Analytics/Analytics.tsx b/src/components/common/Layout/Header/Analytics/Analytics.tsx index d261b403e..d6303e5e5 100644 --- a/src/components/common/Layout/Header/Analytics/Analytics.tsx +++ b/src/components/common/Layout/Header/Analytics/Analytics.tsx @@ -1,68 +1,49 @@ -import { Box, Flex, Typography } from '@ergolabs/ui-kit'; -import { FC } from 'react'; -import styled from 'styled-components'; - import { useObservable } from '../../../../../common/hooks/useObservable'; import { platformStats$ } from '../../../../../gateway/api/platformStats'; import { formatToAda, formatToUSD } from '../../../../../services/number'; import { IsCardano } from '../../../../IsCardano/IsCardano'; import { IsErgo } from '../../../../IsErgo/IsErgo'; +import styles from './Analytics.module.less'; import { AnalyticsSkeletonLoader } from './AnalyticsSkeletonLoader/AnalyticsSkeletonLoader.tsx'; -import { AnalyticTag } from './AnalyticTag/AnalyticTag'; - -interface AnalyticsProps { - className?: string; -} -const _Analytics: FC = ({ className }) => { +export default function Analytics() { const [currentStats] = useObservable(platformStats$, []); - return ( - - - - - - TVL:{' '} - {currentStats?.tvl !== undefined ? ( - <> - - {formatToUSD(currentStats.tvl.toAmount(), 'abbr')} - - - {formatToAda(currentStats.tvl.toAmount(), 'abbr')} - - - ) : ( - - )} - - - - - - Volume 24H:{' '} - {currentStats?.volume !== undefined ? ( - <> - - {formatToUSD(currentStats.volume.toAmount(), 'abbr')} - - - {formatToAda(currentStats.volume.toAmount(), 'abbr')} - - - ) : ( - - )} - - - - +
+
+

TVL:

+

+ {currentStats?.tvl !== undefined ? ( + <> + + {formatToUSD(currentStats.tvl.toAmount(), 'abbr')} + + + {formatToAda(currentStats.tvl.toAmount(), 'abbr')} + + + ) : ( + + )} +

+
+
+

Volume 24H:

+

+ {currentStats?.volume !== undefined ? ( + <> + + {formatToUSD(currentStats.volume.toAmount(), 'abbr')} + + + {formatToAda(currentStats.volume.toAmount(), 'abbr')} + + + ) : ( + + )} +

+
+
); -}; - -export const Analytics = styled(_Analytics)` - @media (max-width: 1090px) { - display: none; - } -`; +} diff --git a/src/components/common/Layout/Header/BurgerMenu/BurgerMenu.tsx b/src/components/common/Layout/Header/BurgerMenu/BurgerMenu.tsx index 6a0b1b751..ba64edccb 100644 --- a/src/components/common/Layout/Header/BurgerMenu/BurgerMenu.tsx +++ b/src/components/common/Layout/Header/BurgerMenu/BurgerMenu.tsx @@ -1,16 +1,10 @@ import { Button, Dropdown, - FileTextOutlined, - GithubOutlined, - GlobalOutlined, - InfoCircleOutlined, LeftOutlined, Menu, Modal, - QuestionCircleOutlined, ReloadOutlined, - RightOutlined, } from '@ergolabs/ui-kit'; import { t, Trans } from '@lingui/macro'; import { fireAnalyticsEvent, user } from '@spectrumlabs/analytics'; @@ -25,7 +19,6 @@ import { } from '../../../../../common/constants/locales'; import { useApplicationSettings } from '../../../../../context'; import { useQuery } from '../../../../../hooks/useQuery'; -import { ThemeSwitch } from '../../../../ThemeSwitch/ThemeSwitch'; import { DotsIcon } from '../../../Icons/DotsIcon'; import { ManualRefundModal } from './ManualRefundModal/ManualRefundModal'; @@ -34,10 +27,20 @@ const StyledMenu = styled(Menu)` min-width: 233px; `; -const ThemeSwitchContainer = styled.div` - border-bottom: 1px solid var(--spectrum-box-border-color); - padding: 0 0 0.5rem; - margin-bottom: 0.5rem; +const StyledMenuBtn = styled(Button)` + border: none; + background: var(--spectrum-secondary-color); + &:hover { + border: none; + background: var(--spectrum-secondary-color); + } + &.header__btn.ant-dropdown-open { + background: var(--spectrum-primary-color); + color: var(--spectrum-primary-text); + } + &.header__btn.ant-dropdown-open:hover { + border: 1px solid var(--spectrum-primary-color-hover); + } `; const OtherMenuItem = styled(Menu.Item)` @@ -64,26 +67,6 @@ const BurgerMenu = (): JSX.Element => { const qs = useQuery(); const menu = [ - { - title: t`About`, - icon: , - link: 'https://docs.spectrum.fi/docs/about-spectrumdex/intro', - }, - { - title: t`How to use`, - icon: , - link: 'https://docs.spectrum.fi/docs/user-guides/quick-start', - }, - { - title: t`Docs`, - icon: , - link: 'https://docs.spectrum.fi', - }, - { - title: 'GitHub', - icon: , - link: 'https://github.com/spectrum-finance', - }, { title: t`Manual Refund`, icon: , @@ -91,14 +74,8 @@ const BurgerMenu = (): JSX.Element => { setMenuVisible(false); Modal.open(({ close }) => ); }, - }, - { - title: t`Language`, - icon: , - additional: , - onClick: () => { - setIsMainMenu(false); - }, + additional: null, + link: null as any, }, ]; @@ -113,9 +90,6 @@ const BurgerMenu = (): JSX.Element => { const menuOthers = ( - - - {menu.map( (item, index) => item && ( @@ -184,7 +158,7 @@ const BurgerMenu = (): JSX.Element => { visible={isMenuVisible} onVisibleChange={onMenuVisibleChange} > - + )} + ); -}; +} diff --git a/src/components/common/Layout/Header/ConnectWallet/WalletInfoButton/AddressTag/AddressTag.tsx b/src/components/common/Layout/Header/ConnectWallet/WalletInfoButton/AddressTag/AddressTag.tsx index 45341c8de..640cc5085 100644 --- a/src/components/common/Layout/Header/ConnectWallet/WalletInfoButton/AddressTag/AddressTag.tsx +++ b/src/components/common/Layout/Header/ConnectWallet/WalletInfoButton/AddressTag/AddressTag.tsx @@ -39,12 +39,13 @@ const _AddressOrPendingTag: FC = ({ }; export const AddressTag = styled(_AddressOrPendingTag)` - border: 1px solid transparent; + border: none; height: 2rem; padding-left: 8px !important; padding-right: 8px !important; + background: var(--teddy-box-color-dark); &:hover { - border: 1px solid var(--spectrum-default-border-color); + border: none; } `; diff --git a/src/components/common/Layout/Header/ConnectWallet/WalletInfoButton/BalanceView/BalanceView.tsx b/src/components/common/Layout/Header/ConnectWallet/WalletInfoButton/BalanceView/BalanceView.tsx index 95295a21e..a5731e311 100644 --- a/src/components/common/Layout/Header/ConnectWallet/WalletInfoButton/BalanceView/BalanceView.tsx +++ b/src/components/common/Layout/Header/ConnectWallet/WalletInfoButton/BalanceView/BalanceView.tsx @@ -13,7 +13,7 @@ export interface BalanceViewProps { const _BalanceView: FC = ({ className, balance }) => ( - {balance.toCurrencyString()} + {balance.toCurrencyString(2, 2)} ); diff --git a/src/components/common/Layout/Header/ConnectWallet/WalletInfoButton/WalletInfoButton.tsx b/src/components/common/Layout/Header/ConnectWallet/WalletInfoButton/WalletInfoButton.tsx index 619beaade..a4026a33e 100644 --- a/src/components/common/Layout/Header/ConnectWallet/WalletInfoButton/WalletInfoButton.tsx +++ b/src/components/common/Layout/Header/ConnectWallet/WalletInfoButton/WalletInfoButton.tsx @@ -20,8 +20,6 @@ import { openAdaHandleModal } from '../../../../../../network/cardano/widgets/Ad import { isCardano } from '../../../../../../utils/network'; import { WalletModal } from '../../../../../WalletModal/WalletModal'; import { AddressTag } from './AddressTag/AddressTag'; -import { BalanceView } from './BalanceView/BalanceView'; - export interface WalletInfoButtonProps { className?: string; } @@ -39,6 +37,14 @@ const _WalletInfoButton: FC = ({ className }) => { const [hasActiveAdaHandleOnBalance] = useHasActiveAdaHandleOnBalance(); const { wasAdaHandleModalOpened } = useCardanoSettings(); + const formatAmountAda = (value: number) => { + const formated = `${Intl.NumberFormat('en', { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }).format(Number(value))}₳`; + return formated; + }; + useEffect(() => { if (!isCardano() || !hasAdaHandleBalance) { return; @@ -62,56 +68,64 @@ const _WalletInfoButton: FC = ({ className }) => { ]); return ( - + +
+ + ); }; export const WalletInfoButton = styled(_WalletInfoButton)` height: 40px; padding: 4px; - border: 1px solid var(--spectrum-box-border-color); - background: var(--spectrum-connect-wallet-address-btn-bg); + border: none; + background: var(--teddy-box-color); color: var(--spectrum-connect-wallet-address-btn-color); &:hover { - border: 1px solid var(--spectrum-box-border-color); - background: var(--spectrum-connect-wallet-address-btn-bg); + border: none; + background: var(--teddy-primary-color-hover); color: var(--spectrum-connect-wallet-address-btn-color); } - &:active, - &:focus { - border: 1px solid var(--spectrum-box-border-color); - background: var(--spectrum-connect-wallet-address-btn-bg); + &:active { + border: none; color: var(--spectrum-connect-wallet-address-btn-color); } &.ant-btn-loading { - border: 1px solid var(--spectrum-box-border-color); + border: none; + } + .balance-wallet { + margin: 0; + padding-inline: 5px; } `; diff --git a/src/components/common/Layout/Header/Header.module.less b/src/components/common/Layout/Header/Header.module.less new file mode 100644 index 000000000..49617ca40 --- /dev/null +++ b/src/components/common/Layout/Header/Header.module.less @@ -0,0 +1,36 @@ + + +.header { + height: 70px; + display: flex; + align-items: center; + padding-inline: 20px; + background: var(--teddy-dark-color-container); + justify-content: space-between; + position: fixed; + top: 0; + width: 100%; + z-index: 3; + + .navigationSection { + display: flex; + align-items: center; + gap: 24px; + width: calc(100% - 550px); + } + + .walletSection { + display: flex; + gap: 5px; + width: 550px; + justify-content: flex-end; + } + @media (max-width: 1030px) { + .navigationSection { + gap: 16px; + } + } + @media (max-width: 380px) { + padding-inline: 8px; + } +} diff --git a/src/components/common/Layout/Header/Header.tsx b/src/components/common/Layout/Header/Header.tsx index 21fa5daf9..45fd0f254 100644 --- a/src/components/common/Layout/Header/Header.tsx +++ b/src/components/common/Layout/Header/Header.tsx @@ -1,112 +1,29 @@ -import { Flex, useDevice } from '@ergolabs/ui-kit'; -import cn from 'classnames'; -import * as React from 'react'; -import { isDesktop } from 'react-device-detect'; -import styled from 'styled-components'; +import { useDevice } from '@ergolabs/ui-kit'; -import { device } from '../../../../common/constants/size'; -import { isPreLbspTimeGap } from '../../../../utils/lbsp'; -import { IsCardano } from '../../../IsCardano/IsCardano'; -import { IsErgo } from '../../../IsErgo/IsErgo'; -import { AppLogo } from '../../AppLogo/AppLogo'; -import { DeprecatedPosition } from '../DeprecatedPositions/DeprecatedPosition'; import { OperationsHistory } from '../OperationsHistory/OperationsHistory'; -import { Analytics } from './Analytics/Analytics'; import { BurgerMenu } from './BurgerMenu/BurgerMenu'; -import { ClaimSpfButton } from './ClaimSpfButton/ClaimSpfButton'; -import { ConnectWallet } from './ConnectWallet/ConnectWallet'; -import { Navigation } from './Navigation/Navigation'; -import { NetworkDropdown } from './NetworkDropdown/NetworkDropdown'; +import ConnectWallet from './ConnectWallet/ConnectWallet'; +import styles from './Header.module.less'; +import Navigation from './Navigation/Navigation'; -export interface HeaderProps { - className?: string; - scrolled?: boolean; - scrolledTop?: boolean; -} - -const HeaderWrapper = styled.div` - position: relative; - display: grid; - width: 100%; - padding: 4px; - grid-template-columns: 1fr 1fr; - - ${device.m} { - padding: 1rem; - } - - @media (max-width: 720px) { - grid-template-columns: 36px 1fr; - padding: 1.25rem 1rem 0.25rem; - } -`; - -export const _Header: React.FC = ({ className, scrolledTop }) => { +export default function Header() { const { s, moreThan } = useDevice(); return ( -
- - - - - - - - - - {moreThan('l') && } - - - {!isPreLbspTimeGap() && ( - - {moreThan('l') && } - - - )} - - - {!s && isDesktop && ( - - - - )} - - - {!s && } - - - +
+
+ {moreThan('l') ? ( + + ) : ( + + )} + {!s && } +
+
+ + {!s && } + +
); -}; - -export const Header = styled(_Header)` - position: fixed; - z-index: 3; - top: 0; - width: 100%; - transition: transform 0.3s; - - &.scrolledFromTop { - border-bottom: 1px solid var(--spectrum-box-border-color); - background: var(--spectrum-box-bg-secondary-glass); - backdrop-filter: var(--spectrum-box-bg-filter); - } - - ${device.m} { - background: none !important; - border-bottom: 0 !important; - - &.scrolled { - transform: translateY(-100%); - } - } -`; +} diff --git a/src/components/common/Layout/Header/Navigation/Navigation.module.less b/src/components/common/Layout/Header/Navigation/Navigation.module.less new file mode 100644 index 000000000..9252c431f --- /dev/null +++ b/src/components/common/Layout/Header/Navigation/Navigation.module.less @@ -0,0 +1,53 @@ +.navigationContainer { + display: flex; + width: 100%; + max-width: 400px; + gap: 24px; + .page { + display: flex; + align-items: center; + gap: 5px; + .name { + margin: 0; + font-size: 16px; + font-weight: 600; + color: var(--teddy-color-disable); + cursor: pointer; + } + &.active { + .name { + color: var(--teddy-primary-text); + } + .iconContainer { + .icon { + fill: var(--teddy-primary-text); + } + } + } + .iconContainer { + display: flex; + align-items: center; + justify-content: center; + width: 16px; + height: 16px; + background: var(--teddy-box-color-icon); + border-radius: 3px; + .icon { + fill: var(--teddy-color-disable); + } + @media (max-width: 768px) { + transform: rotate(180deg); + } + } + } + @media (max-width: 1030px) { + gap: 16px; + } + @media (max-width: 768px) { + max-width: none; + gap: 45px; + } + @media (max-width: 400px) { + gap: 16px; + } +} diff --git a/src/components/common/Layout/Header/Navigation/Navigation.tsx b/src/components/common/Layout/Header/Navigation/Navigation.tsx index 71bb56b66..c5ca9ecd6 100644 --- a/src/components/common/Layout/Header/Navigation/Navigation.tsx +++ b/src/components/common/Layout/Header/Navigation/Navigation.tsx @@ -1,72 +1,55 @@ -import { Tabs } from '@ergolabs/ui-kit'; -import { t } from '@lingui/macro'; -import { CSSProperties, FC, useEffect, useState } from 'react'; -import { useMatch, useNavigate } from 'react-router-dom'; -import styled from 'styled-components'; +import { useLocation, useNavigate } from 'react-router-dom'; import { useSelectedNetwork } from '../../../../../gateway/common/network'; -import { isPreLbspTimeGap } from '../../../../../utils/lbsp.ts'; +import { ARROW_DOWN } from '../../../../../utils/images'; +import styles from './Navigation.module.less'; -interface NavigationProps { - textCenter?: boolean; - className?: string; - style?: CSSProperties; -} +type NavigationSectionType = { + title: string; + path: string; +}; -const _Navigation: FC = ({ className, style }) => { +const navigationSections: NavigationSectionType[] = [ + { + title: 'Trade', + path: '/swap', + }, + { title: 'Liquidity', path: '/liquidity' }, + { title: 'Dashboard', path: '/dashboard' }, + //{ title: 'Rewards', path: '/rewards' }, +]; + +export default function Navigation() { const navigate = useNavigate(); const [network] = useSelectedNetwork(); - const matchPage = useMatch<'page', string>({ - path: ':network/:page', - end: false, - }); - - const [defaultActiveKey, setDefaultActiveKey] = useState(''); + const location = useLocation(); - useEffect(() => { - setDefaultActiveKey(matchPage?.params?.page ?? ''); - }, [matchPage]); - - const onTabClick = (key: string) => navigate(key); + const handleClickNavigate = (path: string) => { + navigate(`/${network.name}${path}`); + }; return ( - - - - {network.name === 'ergo' && } - {network.name === 'cardano' && ( - - )} - +
+ {navigationSections.map((section) => ( +
handleClickNavigate(section.path)} + > +

{section.title}

+ {section.title === 'Trade' && ( +
+ + + +
+ )} +
+ ))} +
); -}; - -export const Navigation = styled(_Navigation)` - .ant-tabs-nav-list { - height: 40px; - } - - .ant-tabs-tab, - .ant-tabs-nav-list { - flex-grow: 1; - } - - .ant-tabs-tab { - ${(props) => props.textCenter && 'justify-content: center;'} - } - - .ant-tabs-tab-btn { - font-size: 16px; - line-height: 22px; - } -`; +} diff --git a/src/components/common/Layout/Header/NetworkDropdown/NetworkDropdown.less b/src/components/common/Layout/Header/NetworkDropdown/NetworkDropdown.less index 8fd750cfb..6e519a8d4 100644 --- a/src/components/common/Layout/Header/NetworkDropdown/NetworkDropdown.less +++ b/src/components/common/Layout/Header/NetworkDropdown/NetworkDropdown.less @@ -8,7 +8,7 @@ &::after { position: absolute; top: 12px; - right: 16px; + right: 5px; width: 8px; height: 8px; background-color: var(--spectrum-success-color); diff --git a/src/components/common/Layout/Header/NetworkDropdown/NetworkDropdown.module.less b/src/components/common/Layout/Header/NetworkDropdown/NetworkDropdown.module.less new file mode 100644 index 000000000..06bd871df --- /dev/null +++ b/src/components/common/Layout/Header/NetworkDropdown/NetworkDropdown.module.less @@ -0,0 +1,62 @@ +.dropdownSelector { + position: relative; + width: 70px; + height: 40px; + display: flex; + align-items: center; + justify-content: center; + background: var(--teddy-box-color); + border-radius: 12px; + cursor: pointer; + gap: 5px; + .icon { + fill: var(--teddy-primary-text); + transition: all .2s; + &.open { + transform: rotate(180deg); + } + } +} + +.dropdownMenu { + position: absolute; + width: 215px; + padding: 10px; + z-index: 5; + top: 60px; + right: 0; + background: var(--teddy-dark-color-container); + border-radius: 10px; + .titleMenu { + font-size: 14px; + color: var(--teddy-color-disable); + margin: 0; + margin-bottom: 5px; + } + .itemMenu { + display: flex; + align-items: center; + height: 32px; + gap: 6px; + padding-inline: 10px; + border-radius: 5px; + .itemName { + display: flex; + align-items: center; + margin: 0; + color: var(--teddy-primary-text); + } + &.active { + background: var(--teddy-box-color); + } + .iconCheck { + height: 8px; + width: 8px; + border-radius: 50%; + background-color: var(--teddy-color-success); + } + } + @media (max-width: 420px) { + right: -145px; + } +} diff --git a/src/components/common/Layout/Header/NetworkDropdown/NetworkDropdown.tsx b/src/components/common/Layout/Header/NetworkDropdown/NetworkDropdown.tsx index f7e9be620..d5a44fcb2 100644 --- a/src/components/common/Layout/Header/NetworkDropdown/NetworkDropdown.tsx +++ b/src/components/common/Layout/Header/NetworkDropdown/NetworkDropdown.tsx @@ -1,89 +1,72 @@ -import './NetworkDropdown.less'; -import '../../../../../assets/styles/styles.less'; - -import { - Button, - DownOutlined, - Dropdown, - Flex, - Menu, - Typography, -} from '@ergolabs/ui-kit'; -import { Trans } from '@lingui/macro'; -import { fireAnalyticsEvent, user } from '@spectrumlabs/analytics'; -import capitalize from 'lodash/capitalize'; -import * as React from 'react'; +import { useEffect, useState } from 'react'; import { changeSelectedNetwork, useSelectedNetwork, visibleNetworks, } from '../../../../../gateway/common/network'; -import { AssetIcon } from '../../../../AssetIcon/AssetIcon'; - -interface NetworkDropdownProps { - onSetNetwork?: (val: string) => void; - disabled?: boolean; -} +import { CHEVRON_DOWN } from '../../../../../utils/images'; +import styles from './NetworkDropdown.module.less'; -export const NetworkDropdown: React.FC = ({ - disabled, -}) => { +export default function NetworkDropdown() { const [selectedNetwork] = useSelectedNetwork(); + const [isOpen, setIsOpen] = useState(false); - const overlay = ( - - - Select Network - - {visibleNetworks.map((network) => ( - { - fireAnalyticsEvent('Select Network', { - network: network.name, - }); - user.set('network_active', network.name); - changeSelectedNetwork(network); - }} - > - - - - {capitalize(network.label)} - - - - ))} - - ); + const handleClickMenu = () => { + isOpen ? setIsOpen(false) : setIsOpen(true); + }; + useEffect(() => { + if (isOpen) { + const handleClickOutside = (e: PointerEvent) => { + const target = e.target as HTMLElement; + if ( + !target.closest(`.${styles.dropdownSelector}`) && + !target.closest(`.${styles.dropdownMenu}`) + ) { + setIsOpen(false); + } + }; + document.addEventListener('pointerdown', handleClickOutside); + return () => + document.removeEventListener('pointerdown', handleClickOutside); + } + }, [isOpen]); return ( - - - + <> +
+ icon-asset + + + + {isOpen && ( +
+

Select Network

+ {visibleNetworks.map((network) => ( +
{ + changeSelectedNetwork(network); + setIsOpen(false); + }} + > + icon-asset +

{network.label}

+ {selectedNetwork.name === network.name && ( +
+ )} +
+ ))} +
+ )} +
+ ); -}; +} diff --git a/src/components/common/Layout/Layout.tsx b/src/components/common/Layout/Layout.tsx index 1e5bbac43..b65f84575 100644 --- a/src/components/common/Layout/Layout.tsx +++ b/src/components/common/Layout/Layout.tsx @@ -1,40 +1,18 @@ -import { Modal } from '@ergolabs/ui-kit'; -import { FC, PropsWithChildren, useEffect, useRef, useState } from 'react'; -import { useLocation } from 'react-router-dom'; -import { - distinctUntilChanged, - filter, - interval, - map, - publishReplay, - refCount, -} from 'rxjs'; +import { FC, PropsWithChildren } from 'react'; import styled from 'styled-components'; import { applicationConfig } from '../../../applicationConfig'; import { device } from '../../../common/constants/size'; -import { useSubscription } from '../../../common/hooks/useObservable'; import { useSelectedNetwork } from '../../../gateway/common/network'; -import { openCookiePolicy } from '../../../services/notifications/CookiePolicy/CookiePolicy'; -import { IsCardano } from '../../IsCardano/IsCardano'; -import { LbspBanner } from '../../LbspBanner/LbspBanner'; import { NetworkHeight } from '../../NetworkHeight/NetworkHeight'; -import { SocialLinks } from '../../SocialLinks/SocialLinks'; import { CardanoUpdate } from './CardanoUpdate/CardanoUpdate'; -import { FooterNavigation } from './FooterNavigation/FooterNavigation'; -import { Header } from './Header/Header'; -import { NeedUpdateModal } from './NeedUpdateModal/NeedUpdateModal'; - -const needUpdate$ = interval(5_000).pipe( - map(() => window.needUpdate), - distinctUntilChanged(), - filter(Boolean), - publishReplay(1), - refCount(), -); +import FooterNavigation from './FooterNavigation/FooterNavigation'; +import Analytics from './Header/Analytics/Analytics'; +import Header from './Header/Header'; const MainContainer = styled.main` padding: 80px 4px 148px 8px !important; + min-height: calc(100vh - 70px); ${device.m} { padding: 80px 18px 80px 24px !important; @@ -54,53 +32,21 @@ const _Layout: FC> = ({ className, }) => { const [network] = useSelectedNetwork(); - const ref = useRef(null); - const footerRef = useRef(null); - const [scrolledTop, setScrolledTop] = useState(true); - const location = useLocation(); - - useEffect(() => { - openCookiePolicy(); - }, []); - - useSubscription(needUpdate$, () => { - Modal.open(, { closable: false }); - }); - - useEffect(() => { - const handleScroll = () => { - setScrolledTop((ref.current?.scrollTop || 0) < 5); - }; - - ref.current?.addEventListener('scroll', handleScroll); - - return () => document.removeEventListener('scroll', handleScroll); - }, [ref]); - - const footerHeight = footerRef?.current?.clientHeight || 0; return ( -
+
{applicationConfig.cardanoUpdate && network.name !== 'ergo' ? ( ) : ( <> -
- - - {location.pathname === '/cardano/liquidity' && } - +
- - {children} - + {children}
- +
- + )}
@@ -111,4 +57,5 @@ export const Layout = styled(_Layout)` position: relative; height: 100%; overflow-y: scroll; + min-height: 100vh; `; diff --git a/src/components/common/Layout/NeedUpdateModal/NeedUpdateModal.tsx b/src/components/common/Layout/NeedUpdateModal/NeedUpdateModal.tsx index f79d3c1b7..f613c28a6 100644 --- a/src/components/common/Layout/NeedUpdateModal/NeedUpdateModal.tsx +++ b/src/components/common/Layout/NeedUpdateModal/NeedUpdateModal.tsx @@ -5,7 +5,6 @@ import { Typography, WarningOutlined, } from '@ergolabs/ui-kit'; -import { Trans } from '@lingui/macro'; import { FC } from 'react'; export const NeedUpdateModal: FC = () => { @@ -19,10 +18,8 @@ export const NeedUpdateModal: FC = () => { - - A new version of the app is available. Refresh the page to see the - latest updates. - + A new version of the app is available. Refresh the page to see the + latest updates. diff --git a/src/components/common/Layout/OperationsHistory/OperationsHistory.tsx b/src/components/common/Layout/OperationsHistory/OperationsHistory.tsx index f7bd4aebd..07cdd4dcc 100644 --- a/src/components/common/Layout/OperationsHistory/OperationsHistory.tsx +++ b/src/components/common/Layout/OperationsHistory/OperationsHistory.tsx @@ -2,19 +2,21 @@ import { Button, HistoryOutlined, LoadingOutlined, - Modal, + //Modal, Tooltip, } from '@ergolabs/ui-kit'; import { t } from '@lingui/macro'; import { FC } from 'react'; +import { useLocation, useNavigate } from 'react-router-dom'; import { useObservable } from '../../../../common/hooks/useObservable'; import { hasNeedRefundOperations$ } from '../../../../gateway/api/hasNeedRefundOperations'; import { pendingOperationsCount$ } from '../../../../gateway/api/pendingOperations'; import { selectedWalletState$ } from '../../../../gateway/api/wallets'; +//import { OperationHistoryModal } from '../../../OperationHistoryModal/OperationHistoryModal'; +import { useSelectedNetwork } from '../../../../gateway/common/network'; import { WalletState } from '../../../../network/common/Wallet'; import { BadgeCustom } from '../../../BadgeCustom/BadgeCustom'; -import { OperationHistoryModal } from '../../../OperationHistoryModal/OperationHistoryModal'; const renderHistoryButtonState = (pendingOpsCount: number): string => { return !!pendingOpsCount ? `${pendingOpsCount} ` + t`Pending` : ''; @@ -23,16 +25,22 @@ const renderHistoryButtonState = (pendingOpsCount: number): string => { export const OperationsHistory: FC = () => { const [pendingOperationsCount] = useObservable(pendingOperationsCount$); const [walletState] = useObservable(selectedWalletState$); - // TODO: move to new history once backend is ready - // const [operations] = useObservable(getOperations(), [walletState]); const isWalletConnected = walletState === WalletState.CONNECTED; const [hasOperationsToRefund] = useObservable( hasNeedRefundOperations$, ); - const openOperationsHistoryModal = () => { + /* const openOperationsHistoryModal = () => { Modal.open(({ close }) => ); + }; */ + + const navigate = useNavigate(); + const location = useLocation(); + const [network] = useSelectedNetwork(); + + const handleClickNavigate = () => { + navigate(`/${network.name}/history`); }; const showLoader = !!pendingOperationsCount; @@ -53,8 +61,15 @@ export const OperationsHistory: FC = () => { size="large" type="ghost" icon={showLoader ? : } - onClick={openOperationsHistoryModal} + onClick={handleClickNavigate} disabled={!isWalletConnected} + style={{ + background: `${ + location.pathname === `/${network.name}/history` + ? 'rgba(255, 255, 255, 0.45)' + : 'var(--teddy-box-color)' + }`, + }} > {renderHistoryButtonState(pendingOperationsCount || 0)} diff --git a/src/components/common/TokenControl/AssetAmountInput/AssetAmountInput.tsx b/src/components/common/TokenControl/AssetAmountInput/AssetAmountInput.tsx index 11b61406d..a32214bc0 100644 --- a/src/components/common/TokenControl/AssetAmountInput/AssetAmountInput.tsx +++ b/src/components/common/TokenControl/AssetAmountInput/AssetAmountInput.tsx @@ -109,4 +109,5 @@ export const AssetAmountInput = styled(_TokenAmountInput)` font-weight: 600 !important; line-height: 32px !important; height: 100%; + text-align: right; `; diff --git a/src/components/common/TokenControl/AssetBalance/AssetBalance.tsx b/src/components/common/TokenControl/AssetBalance/AssetBalance.tsx index f7089094d..c51dde9a9 100644 --- a/src/components/common/TokenControl/AssetBalance/AssetBalance.tsx +++ b/src/components/common/TokenControl/AssetBalance/AssetBalance.tsx @@ -35,7 +35,7 @@ const _AssetBalance: FC = ({ className={className} secondary={balance.toString() === '0'} > - {balance.toString()} + {balance.toString(2)} @@ -47,7 +47,7 @@ export const AssetBalance = styled(_AssetBalance)` ${(props) => props.onClick && css` - color: var(--spectrum-primary-color) !important; + color: var(--spectrum-secondary-text) !important; cursor: pointer; `} `; diff --git a/src/components/common/TokenControl/AssetControl.module.less b/src/components/common/TokenControl/AssetControl.module.less new file mode 100644 index 000000000..b9ea26bbe --- /dev/null +++ b/src/components/common/TokenControl/AssetControl.module.less @@ -0,0 +1,57 @@ + + +.assetContainer { + width: 100%; + padding: 24px 16px 16px; + border-radius: 16px; + background: var(--teddy-dark-secondary-color); + height: 120px; + position: relative; + display: flex; + align-items: center; + width: 100%; + .subTitle { + position: absolute; + margin: 0; + font-size: 12px; + color: var(--teddy-secondary-text-dark); + top: 8px; + left: 24px; + } + .containerGroup { + display: flex; + flex-direction: column; + width: 100%; + .assetRow{ + display: flex; + width: 100%; + align-items: center; + justify-content: space-between; + height: 35px; + .assetGroup { + display: flex; + margin: 0; + } + .inputGroup { + display: flex; + } + } + .infoGroup{ + display: flex; + align-items: center; + justify-content: space-between; + &:first-child{ + padding-left: 6px; + } + } + } + @media (max-width: 768px) { + padding: 24px 10px 16px; + height: 110px; + .containerGroup { + .assetRow { + height: 30px; + } + } + } +} diff --git a/src/components/common/TokenControl/AssetControl.tsx b/src/components/common/TokenControl/AssetControl.tsx index c5f9d1a08..8f274a2ad 100644 --- a/src/components/common/TokenControl/AssetControl.tsx +++ b/src/components/common/TokenControl/AssetControl.tsx @@ -1,21 +1,18 @@ import { AssetInfo } from '@ergolabs/ergo-sdk'; import { Animation, - Box, Flex, Form, Typography, useDevice, useFormContext, } from '@ergolabs/ui-kit'; -import { fireAnalyticsEvent, TraceProps } from '@spectrumlabs/analytics'; import { FC, ReactNode } from 'react'; import { Observable, of } from 'rxjs'; import { useObservable } from '../../../common/hooks/useObservable'; import { Currency } from '../../../common/models/Currency'; import { useAssetsBalance } from '../../../gateway/api/assetBalance'; -import { mapToTokenProps } from '../../../utils/analytics/mapper'; import { ConvenientAssetView } from '../../ConvenientAssetView/ConvenientAssetView'; import { PriceImpact } from '../../PriceImpact/PriceImpact.tsx'; import { @@ -23,6 +20,7 @@ import { TokenAmountInputValue, } from './AssetAmountInput/AssetAmountInput'; import { AssetBalance } from './AssetBalance/AssetBalance'; +import styles from './AssetControl.module.less'; import { AssetSelect } from './AssetSelect/AssetSelect'; export interface TokenControlValue { @@ -68,7 +66,6 @@ export interface AssetControlFormItemProps { readonly readonly?: boolean | 'asset' | 'amount'; readonly noBottomInfo?: boolean; readonly bordered?: boolean; - readonly trace: TraceProps; readonly loading?: boolean; readonly priceImpact?: number; } @@ -83,7 +80,6 @@ export const AssetControlFormItem: FC = ({ disabled, readonly, handleMaxButtonClick, - trace, loading, priceImpact, }) => { @@ -100,11 +96,6 @@ export const AssetControlFormItem: FC = ({ const newAmount = handleMaxButtonClick ? handleMaxButtonClick(maxBalance) : maxBalance; - fireAnalyticsEvent('Click MAX Button', { - ...mapToTokenProps(newAmount.asset), - element_location: trace.element_location, - element_name: trace.element_name, - }); form.controls[amountName].patchValue( newAmount.isPositive() ? newAmount : maxBalance, ); @@ -128,26 +119,13 @@ export const AssetControlFormItem: FC = ({ }; return ( - - - - - {amountName && ( - - {({ value, onChange }) => ( - - )} - - )} - - +
+

+ {amountName === 'fromAmount' ? 'Amount' : 'Converted To'} +

+
+
+
{tokenName && ( {({ value, onChange }) => ( @@ -160,13 +138,28 @@ export const AssetControlFormItem: FC = ({ value={value} onChange={onChange} disabled={disabled} - trace={trace} /> )} )} - - +
+
+ {amountName && ( + + {({ value, onChange }) => ( + + )} + + )} +
+
{({ value }) => ( @@ -178,15 +171,7 @@ export const AssetControlFormItem: FC = ({ value?.isPositive() } > - - - - {' '} - {priceImpact !== undefined && ( - - )} - - +
{selectedAsset !== undefined && !balanceLoading && readonly !== true && ( @@ -200,11 +185,24 @@ export const AssetControlFormItem: FC = ({ } /> )} - + + + + {' '} + {priceImpact !== undefined && ( + + )} + + + +
)}
- - +
+
); }; diff --git a/src/components/common/TokenControl/AssetSelect/AssetSelect.module.less b/src/components/common/TokenControl/AssetSelect/AssetSelect.module.less new file mode 100644 index 000000000..3bf332b66 --- /dev/null +++ b/src/components/common/TokenControl/AssetSelect/AssetSelect.module.less @@ -0,0 +1,28 @@ + + +.btnSelectAsset { + background: transparent; + cursor: pointer; + .btnContent { + display: flex; + align-items: center; + gap: 8px; + .asset { + display: flex; + align-items: center; + .text { + margin: 0; + color: var(--teddy-primary-text); + width: 120px; + font-size: 16px; + font-weight: 500; + } + } + .icon { + display: flex; + align-items: center; + justify-content: center; + fill: var(--teddy-primary-text); + } + } +} diff --git a/src/components/common/TokenControl/AssetSelect/AssetSelect.tsx b/src/components/common/TokenControl/AssetSelect/AssetSelect.tsx index b4194ebe6..09a263201 100644 --- a/src/components/common/TokenControl/AssetSelect/AssetSelect.tsx +++ b/src/components/common/TokenControl/AssetSelect/AssetSelect.tsx @@ -1,22 +1,13 @@ -import { - Button, - DownOutlined, - Flex, - Form, - Modal, - useDevice, -} from '@ergolabs/ui-kit'; -import { Trans } from '@lingui/macro'; -import { fireAnalyticsEvent, TraceProps } from '@spectrumlabs/analytics'; +import { Form, Modal, useDevice } from '@ergolabs/ui-kit'; import * as React from 'react'; import { Observable } from 'rxjs'; -import styled from 'styled-components'; import { AssetInfo } from '../../../../common/models/AssetInfo'; -import { mapToTokenProps } from '../../../../utils/analytics/mapper'; +import { CHEVRON_DOWN } from '../../../../utils/images.ts'; import { AssetTitle } from '../../../AssetTitle/AssetTitle'; import { SkeletonLoader } from '../../../SkeletonLoader/SkeletonLoader.tsx'; import { AssetListModal } from './AssetListModal/AssetListModal'; +import styles from './AssetSelect.module.less'; interface TokenSelectProps { readonly value?: AssetInfo | undefined; @@ -27,13 +18,7 @@ interface TokenSelectProps { readonly disabled?: boolean; readonly readonly?: boolean; readonly loading?: boolean; - readonly trace: TraceProps; } - -const StyledDownOutlined = styled(DownOutlined)` - font-size: 1rem; -`; - const AssetSelect: React.FC = ({ value, onChange, @@ -43,21 +28,16 @@ const AssetSelect: React.FC = ({ assetsToImport$, importedAssets$, loading, - trace: { element_name, element_location }, }) => { - const { s, valBySize } = useDevice(); + const { valBySize } = useDevice(); const handleSelectChange = (newValue: AssetInfo): void => { if (value?.id !== newValue?.id && onChange) { onChange(newValue); } - fireAnalyticsEvent('Select Token', { - ...mapToTokenProps(newValue), - element_location, - element_name, - }); }; - const openTokenModal = () => { + const openTokenModal = (e) => { + e.preventDefault(); if (readonly) { return; } @@ -78,29 +58,26 @@ const AssetSelect: React.FC = ({ {loading ? ( ) : ( - +
+ )} ); diff --git a/src/context/AssetModeContext.tsx b/src/context/AssetModeContext.tsx new file mode 100644 index 000000000..25c9ac961 --- /dev/null +++ b/src/context/AssetModeContext.tsx @@ -0,0 +1,30 @@ +import { createContext, FC, ReactNode, useContext, useState } from 'react'; + +interface AssetModeContextType { + assetMode: 'ADA' | 'USD'; + setAssetMode: (mode: 'ADA' | 'USD') => void; +} + +const AssetModeContext = createContext( + undefined, +); + +export const AssetModeProvider: FC<{ children: ReactNode }> = ({ + children, +}) => { + const [assetMode, setAssetMode] = useState<'ADA' | 'USD'>('ADA'); + + return ( + + {children} + + ); +}; + +export const useAssetMode = () => { + const context = useContext(AssetModeContext); + if (!context) { + throw new Error('useAssetMode must be used within a AssetModeProvider'); + } + return context; +}; diff --git a/src/gateway/common/network.ts b/src/gateway/common/network.ts index a6a4c7498..4ba74ea83 100644 --- a/src/gateway/common/network.ts +++ b/src/gateway/common/network.ts @@ -34,8 +34,8 @@ export const networks: Network[] = [ ]; export const visibleNetworks: Network[] = [ - ergoNetwork, cardanoMainnet, + cardanoPreview, ]; export const isNetworkExists = (networkName?: string): boolean => diff --git a/src/hooks/useQuery.ts b/src/hooks/useQuery.ts index fc5c77c75..3991339a4 100644 --- a/src/hooks/useQuery.ts +++ b/src/hooks/useQuery.ts @@ -4,7 +4,6 @@ import { useLocation } from 'react-router-dom'; export function parsedQueryString(search?: string): ParsedQs { if (!search) { - // react-router-dom places search string in the hash const hash = window.location.hash; search = hash.substr(hash.indexOf('?')); } diff --git a/src/i18n/locales/ar-SA.po b/src/i18n/locales/ar-SA.po index 85499d08c..4eb760301 100644 --- a/src/i18n/locales/ar-SA.po +++ b/src/i18n/locales/ar-SA.po @@ -329,17 +329,17 @@ msgid "Estimated output:" msgstr "الناتج المقدر:" #: src/pages/Swap/SwapInfo/SwapInfo.tsx -msgid "Execution Fee" +msgid "Honey 🍯" msgstr "رسوم التنفيذ" #: src/pages/Swap/OperationSettings/NitroInput/NitroInput.tsx -msgid "Execution Fee Range {0} - {1} {2}" +msgid "Honey 🍯 Range {0} - {1} {2}" msgstr "نطاق رسوم التنفيذ {0} - {1} {2}" #: src/components/common/FormView/FormFeesSection/FormFeesSection.tsx #: src/pages/AddLiquidityOrCreatePool/AddLiquidity/AddLiquidityConfirmationModal/AddLiquidityConfirmationModal.tsx #: src/pages/Swap/SwapConfirmationModal/SwapConfirmationModal.tsx -msgid "Execution Fee:" +msgid "Honey 🍯:" msgstr "رسوم التنفيذ:" #: src/components/common/ConnectWalletButton/ChooseWalletModal/ChooseWalletModal.tsx @@ -525,7 +525,7 @@ msgid "Max" msgstr "الحد الأقصى" #: src/pages/Swap/OperationSettings/OperationSettings.tsx -msgid "Max execution fee multiplier" +msgid "Max Honey 🍯 multiplier" msgstr "الحد الأقصى لمضاعف رسوم التنفيذ" #: src/pages/Swap/SwapInfo/SwapInfo.tsx diff --git a/src/i18n/locales/cs-CZ.po b/src/i18n/locales/cs-CZ.po index a01cbf0aa..dd5e1eb20 100644 --- a/src/i18n/locales/cs-CZ.po +++ b/src/i18n/locales/cs-CZ.po @@ -329,17 +329,17 @@ msgid "Estimated output:" msgstr "" #: src/pages/Swap/SwapInfo/SwapInfo.tsx -msgid "Execution Fee" +msgid "Honey 🍯" msgstr "" #: src/pages/Swap/OperationSettings/NitroInput/NitroInput.tsx -msgid "Execution Fee Range {0} - {1} {2}" +msgid "Honey 🍯 Range {0} - {1} {2}" msgstr "" #: src/components/common/FormView/FormFeesSection/FormFeesSection.tsx #: src/pages/AddLiquidityOrCreatePool/AddLiquidity/AddLiquidityConfirmationModal/AddLiquidityConfirmationModal.tsx #: src/pages/Swap/SwapConfirmationModal/SwapConfirmationModal.tsx -msgid "Execution Fee:" +msgid "Honey 🍯:" msgstr "" #: src/components/common/ConnectWalletButton/ChooseWalletModal/ChooseWalletModal.tsx @@ -525,7 +525,7 @@ msgid "Max" msgstr "" #: src/pages/Swap/OperationSettings/OperationSettings.tsx -msgid "Max execution fee multiplier" +msgid "Max Honey 🍯 multiplier" msgstr "" #: src/pages/Swap/SwapInfo/SwapInfo.tsx diff --git a/src/i18n/locales/de-DE.po b/src/i18n/locales/de-DE.po index 7f2c520de..996bf623c 100644 --- a/src/i18n/locales/de-DE.po +++ b/src/i18n/locales/de-DE.po @@ -329,17 +329,17 @@ msgid "Estimated output:" msgstr "Geschätzte Ausgabe:" #: src/pages/Swap/SwapInfo/SwapInfo.tsx -msgid "Execution Fee" +msgid "Honey 🍯" msgstr "Ausführungsgebühr" #: src/pages/Swap/OperationSettings/NitroInput/NitroInput.tsx -msgid "Execution Fee Range {0} - {1} {2}" +msgid "Honey 🍯 Range {0} - {1} {2}" msgstr "Ausführungsgebühr {0} - {1} {2}" #: src/components/common/FormView/FormFeesSection/FormFeesSection.tsx #: src/pages/AddLiquidityOrCreatePool/AddLiquidity/AddLiquidityConfirmationModal/AddLiquidityConfirmationModal.tsx #: src/pages/Swap/SwapConfirmationModal/SwapConfirmationModal.tsx -msgid "Execution Fee:" +msgid "Honey 🍯:" msgstr "Ausführungsgebühr:" #: src/components/common/ConnectWalletButton/ChooseWalletModal/ChooseWalletModal.tsx @@ -525,7 +525,7 @@ msgid "Max" msgstr "Max" #: src/pages/Swap/OperationSettings/OperationSettings.tsx -msgid "Max execution fee multiplier" +msgid "Max Honey 🍯 multiplier" msgstr "Max. Ausführungsgebühr Multiplikator" #: src/pages/Swap/SwapInfo/SwapInfo.tsx diff --git a/src/i18n/locales/en-US.po b/src/i18n/locales/en-US.po index c2f6bb355..43ec015db 100644 --- a/src/i18n/locales/en-US.po +++ b/src/i18n/locales/en-US.po @@ -237,8 +237,8 @@ msgid "Remove Liquidity" msgstr "Remove Liquidity" #: src/components/LbspFaqModal/LbspFaqModal.tsx -msgid "SPF is a cross-chain token whose main utility is to secure Spectrum Network PoS consensus. Spectrum Network is a trustless cross-chain messaging protocol that is currently in an active development stage. However, while Spectrum Network is under development, users can pay execution fees using the SPF on Layer 1 AMM protocols by Spectrum Finance." -msgstr "SPF is a cross-chain token whose main utility is to secure Spectrum Network PoS consensus. Spectrum Network is a trustless cross-chain messaging protocol that is currently in an active development stage. However, while Spectrum Network is under development, users can pay execution fees using the SPF on Layer 1 AMM protocols by Spectrum Finance." +msgid "SPF is a cross-chain token whose main utility is to secure Spectrum Network PoS consensus. Spectrum Network is a trustless cross-chain messaging protocol that is currently in an active development stage. However, while Spectrum Network is under development, users can pay Honey 🍯s using the SPF on Layer 1 AMM protocols by Spectrum Finance." +msgstr "SPF is a cross-chain token whose main utility is to secure Spectrum Network PoS consensus. Spectrum Network is a trustless cross-chain messaging protocol that is currently in an active development stage. However, while Spectrum Network is under development, users can pay Honey 🍯s using the SPF on Layer 1 AMM protocols by Spectrum Finance." #: src/network/cardano/api/operations/createPool.tsx msgid "Min liquidity for creation is {0} ADA" @@ -485,8 +485,8 @@ msgid "Learn how to get transaction id" msgstr "Learn how to get transaction id" #: src/components/common/FormView/FormFeesSection/FormFeesSection.tsx -msgid "Execution Fee:" -msgstr "Execution Fee:" +msgid "Honey 🍯:" +msgstr "Honey 🍯:" #: src/pages/RelockLiquidity/RelockLiquidityConfirmationModal/RelockLiquidityConfirmationModal.tsx msgid "Updated unlock date" @@ -1027,12 +1027,12 @@ msgid "Confirm Add Liquidity" msgstr "Confirm Add Liquidity" #: src/components/OperationSettings/OperationSettings.tsx -msgid "Max execution fee multiplier" -msgstr "Max execution fee multiplier" +msgid "Max Honey 🍯 multiplier" +msgstr "Max Honey 🍯 multiplier" #: src/network/cardano/widgets/SwapCollapse/SwapCollapse.tsx -msgid "Charged by off-chain batchers" -msgstr "Charged by off-chain batchers" +msgid "Charged by off-chain badgers 🦡" +msgstr "Charged by off-chain badgers 🦡" #: src/components/MobilePlug/MobilePlug.tsx #~ msgid "Mobile version is not supported yet" @@ -1250,8 +1250,8 @@ msgid "Try again later" msgstr "Try again later" #: src/components/OperationSettings/OperationSettings.tsx -msgid "Execution fee" -msgstr "Execution fee" +msgid "Honey 🍯" +msgstr "Honey 🍯" #: src/components/common/Layout/Header/BurgerMenu/BurgerMenu.tsx msgid "Manual Refund" @@ -1760,8 +1760,8 @@ msgid "Your operation will be executed in this pool. <0/>You can also choose ano msgstr "Your operation will be executed in this pool. <0/>You can also choose another pool for this pair" #: src/components/OperationSettings/NitroInput/NitroInput.tsx -msgid "Execution Fee Range {0} - {1} {2}" -msgstr "Execution Fee Range {0} - {1} {2}" +msgid "Honey 🍯 Range {0} - {1} {2}" +msgstr "Honey 🍯 Range {0} - {1} {2}" #: src/pages/Liquidity/default/common/PoolsOrPositionsTableView/PoolsOrPositionsTableView.tsx msgid "Volume 24h" @@ -1978,8 +1978,8 @@ msgid "Import" msgstr "Import" #: src/network/cardano/widgets/SwapCollapse/SwapCollapse.tsx -msgid "Execution Fee" -msgstr "Execution Fee" +msgid "Honey 🍯" +msgstr "Honey 🍯" #: src/pages/Farms/FarmTopPanel/CreateFarmModal/ConfirmFarmCreateModal.tsx msgid "Distribution per block:" @@ -2467,8 +2467,8 @@ msgid "Preparing ergoPay request." msgstr "Preparing ergoPay request." #: src/components/OperationSettings/OperationSettings.tsx -msgid "The execution fee is paid to off-chain validators who execute DEX orders" -msgstr "The execution fee is paid to off-chain validators who execute DEX orders" +msgid "The Honey 🍯 is paid to off-chain validators who execute DEX orders" +msgstr "The Honey 🍯 is paid to off-chain validators who execute DEX orders" #: src/pages/Farms/FarmTopPanel/CreateFarmModal/ConfirmFarmCreateModal.tsx msgid "TVL:" diff --git a/src/i18n/locales/es-ES.po b/src/i18n/locales/es-ES.po index 40a386512..6184d0e49 100644 --- a/src/i18n/locales/es-ES.po +++ b/src/i18n/locales/es-ES.po @@ -329,17 +329,17 @@ msgid "Estimated output:" msgstr "Salida estimada:" #: src/pages/Swap/SwapInfo/SwapInfo.tsx -msgid "Execution Fee" +msgid "Honey 🍯" msgstr "Tarifa de ejecución" #: src/pages/Swap/OperationSettings/NitroInput/NitroInput.tsx -msgid "Execution Fee Range {0} - {1} {2}" +msgid "Honey 🍯 Range {0} - {1} {2}" msgstr "Rango de tarifa de ejecución {0} - {1} {2}" #: src/components/common/FormView/FormFeesSection/FormFeesSection.tsx #: src/pages/AddLiquidityOrCreatePool/AddLiquidity/AddLiquidityConfirmationModal/AddLiquidityConfirmationModal.tsx #: src/pages/Swap/SwapConfirmationModal/SwapConfirmationModal.tsx -msgid "Execution Fee:" +msgid "Honey 🍯:" msgstr "Tarifa de ejecución:" #: src/components/common/ConnectWalletButton/ChooseWalletModal/ChooseWalletModal.tsx @@ -525,7 +525,7 @@ msgid "Max" msgstr "" #: src/pages/Swap/OperationSettings/OperationSettings.tsx -msgid "Max execution fee multiplier" +msgid "Max Honey 🍯 multiplier" msgstr "Multiplicador máx. de tarifa por ejecución" #: src/pages/Swap/SwapInfo/SwapInfo.tsx diff --git a/src/i18n/locales/fr-FR.po b/src/i18n/locales/fr-FR.po index 45c8a12b9..db8c33119 100644 --- a/src/i18n/locales/fr-FR.po +++ b/src/i18n/locales/fr-FR.po @@ -329,17 +329,17 @@ msgid "Estimated output:" msgstr "Sortie estimée :" #: src/pages/Swap/SwapInfo/SwapInfo.tsx -msgid "Execution Fee" +msgid "Honey 🍯" msgstr "Frais d'Exécution" #: src/pages/Swap/OperationSettings/NitroInput/NitroInput.tsx -msgid "Execution Fee Range {0} - {1} {2}" +msgid "Honey 🍯 Range {0} - {1} {2}" msgstr "Fourchette des Frais d'Exécution {0} - {1} {2}" #: src/components/common/FormView/FormFeesSection/FormFeesSection.tsx #: src/pages/AddLiquidityOrCreatePool/AddLiquidity/AddLiquidityConfirmationModal/AddLiquidityConfirmationModal.tsx #: src/pages/Swap/SwapConfirmationModal/SwapConfirmationModal.tsx -msgid "Execution Fee:" +msgid "Honey 🍯:" msgstr "Frais d'Exécution:" #: src/components/common/ConnectWalletButton/ChooseWalletModal/ChooseWalletModal.tsx @@ -525,7 +525,7 @@ msgid "Max" msgstr "Maximum" #: src/pages/Swap/OperationSettings/OperationSettings.tsx -msgid "Max execution fee multiplier" +msgid "Max Honey 🍯 multiplier" msgstr "Multiplicateur maximal de frais d'exécution" #: src/pages/Swap/SwapInfo/SwapInfo.tsx diff --git a/src/i18n/locales/he-IL.po b/src/i18n/locales/he-IL.po index a5ec1cbc9..a50274ada 100644 --- a/src/i18n/locales/he-IL.po +++ b/src/i18n/locales/he-IL.po @@ -329,17 +329,17 @@ msgid "Estimated output:" msgstr "כמות משוערת:" #: src/pages/Swap/SwapInfo/SwapInfo.tsx -msgid "Execution Fee" +msgid "Honey 🍯" msgstr "עמלת ביצוע" #: src/pages/Swap/OperationSettings/NitroInput/NitroInput.tsx -msgid "Execution Fee Range {0} - {1} {2}" +msgid "Honey 🍯 Range {0} - {1} {2}" msgstr "טווח עמלת ביצוע {0} - {1} {2}" #: src/components/common/FormView/FormFeesSection/FormFeesSection.tsx #: src/pages/AddLiquidityOrCreatePool/AddLiquidity/AddLiquidityConfirmationModal/AddLiquidityConfirmationModal.tsx #: src/pages/Swap/SwapConfirmationModal/SwapConfirmationModal.tsx -msgid "Execution Fee:" +msgid "Honey 🍯:" msgstr "עמלת ביצוע:" #: src/components/common/ConnectWalletButton/ChooseWalletModal/ChooseWalletModal.tsx @@ -525,7 +525,7 @@ msgid "Max" msgstr "מקסימום" #: src/pages/Swap/OperationSettings/OperationSettings.tsx -msgid "Max execution fee multiplier" +msgid "Max Honey 🍯 multiplier" msgstr "מכפיל עמלת ביצוע מקסימלי" #: src/pages/Swap/SwapInfo/SwapInfo.tsx diff --git a/src/i18n/locales/id-ID.po b/src/i18n/locales/id-ID.po index 5c532ae03..e84712572 100644 --- a/src/i18n/locales/id-ID.po +++ b/src/i18n/locales/id-ID.po @@ -329,17 +329,17 @@ msgid "Estimated output:" msgstr "" #: src/pages/Swap/SwapInfo/SwapInfo.tsx -msgid "Execution Fee" +msgid "Honey 🍯" msgstr "" #: src/pages/Swap/OperationSettings/NitroInput/NitroInput.tsx -msgid "Execution Fee Range {0} - {1} {2}" +msgid "Honey 🍯 Range {0} - {1} {2}" msgstr "" #: src/components/common/FormView/FormFeesSection/FormFeesSection.tsx #: src/pages/AddLiquidityOrCreatePool/AddLiquidity/AddLiquidityConfirmationModal/AddLiquidityConfirmationModal.tsx #: src/pages/Swap/SwapConfirmationModal/SwapConfirmationModal.tsx -msgid "Execution Fee:" +msgid "Honey 🍯:" msgstr "" #: src/components/common/ConnectWalletButton/ChooseWalletModal/ChooseWalletModal.tsx @@ -525,7 +525,7 @@ msgid "Max" msgstr "" #: src/pages/Swap/OperationSettings/OperationSettings.tsx -msgid "Max execution fee multiplier" +msgid "Max Honey 🍯 multiplier" msgstr "" #: src/pages/Swap/SwapInfo/SwapInfo.tsx diff --git a/src/i18n/locales/it-IT.po b/src/i18n/locales/it-IT.po index 9568226a9..53adc14fb 100644 --- a/src/i18n/locales/it-IT.po +++ b/src/i18n/locales/it-IT.po @@ -329,17 +329,17 @@ msgid "Estimated output:" msgstr "Risultato stimato:" #: src/pages/Swap/SwapInfo/SwapInfo.tsx -msgid "Execution Fee" +msgid "Honey 🍯" msgstr "Costo Di Esecuzione" #: src/pages/Swap/OperationSettings/NitroInput/NitroInput.tsx -msgid "Execution Fee Range {0} - {1} {2}" +msgid "Honey 🍯 Range {0} - {1} {2}" msgstr "Intervallo Commissioni di Esecuzione {0} - {1} {2}" #: src/components/common/FormView/FormFeesSection/FormFeesSection.tsx #: src/pages/AddLiquidityOrCreatePool/AddLiquidity/AddLiquidityConfirmationModal/AddLiquidityConfirmationModal.tsx #: src/pages/Swap/SwapConfirmationModal/SwapConfirmationModal.tsx -msgid "Execution Fee:" +msgid "Honey 🍯:" msgstr "Costo Di Esecuzione:" #: src/components/common/ConnectWalletButton/ChooseWalletModal/ChooseWalletModal.tsx @@ -525,7 +525,7 @@ msgid "Max" msgstr "Massimo" #: src/pages/Swap/OperationSettings/OperationSettings.tsx -msgid "Max execution fee multiplier" +msgid "Max Honey 🍯 multiplier" msgstr "Moltiplicatore commissione esecuzione massima" #: src/pages/Swap/SwapInfo/SwapInfo.tsx diff --git a/src/i18n/locales/ja-JP.po b/src/i18n/locales/ja-JP.po index 720c60586..9bb1e6fc2 100644 --- a/src/i18n/locales/ja-JP.po +++ b/src/i18n/locales/ja-JP.po @@ -329,17 +329,17 @@ msgid "Estimated output:" msgstr "推定受取り額:" #: src/pages/Swap/SwapInfo/SwapInfo.tsx -msgid "Execution Fee" +msgid "Honey 🍯" msgstr "実行手数料" #: src/pages/Swap/OperationSettings/NitroInput/NitroInput.tsx -msgid "Execution Fee Range {0} - {1} {2}" +msgid "Honey 🍯 Range {0} - {1} {2}" msgstr "実行手数料の範囲 {0} - {1} {2}" #: src/components/common/FormView/FormFeesSection/FormFeesSection.tsx #: src/pages/AddLiquidityOrCreatePool/AddLiquidity/AddLiquidityConfirmationModal/AddLiquidityConfirmationModal.tsx #: src/pages/Swap/SwapConfirmationModal/SwapConfirmationModal.tsx -msgid "Execution Fee:" +msgid "Honey 🍯:" msgstr "実行手数料:" #: src/components/common/ConnectWalletButton/ChooseWalletModal/ChooseWalletModal.tsx @@ -525,7 +525,7 @@ msgid "Max" msgstr "最大" #: src/pages/Swap/OperationSettings/OperationSettings.tsx -msgid "Max execution fee multiplier" +msgid "Max Honey 🍯 multiplier" msgstr "最大手数料の上乗せ率" #: src/pages/Swap/SwapInfo/SwapInfo.tsx diff --git a/src/i18n/locales/pt-BR.po b/src/i18n/locales/pt-BR.po index 140dccb99..be292e289 100644 --- a/src/i18n/locales/pt-BR.po +++ b/src/i18n/locales/pt-BR.po @@ -329,17 +329,17 @@ msgid "Estimated output:" msgstr "Saída estimada:" #: src/pages/Swap/SwapInfo/SwapInfo.tsx -msgid "Execution Fee" +msgid "Honey 🍯" msgstr "Taxa de execução" #: src/pages/Swap/OperationSettings/NitroInput/NitroInput.tsx -msgid "Execution Fee Range {0} - {1} {2}" +msgid "Honey 🍯 Range {0} - {1} {2}" msgstr "Faixa de Taxa de Execução {0} - {1} {2}" #: src/components/common/FormView/FormFeesSection/FormFeesSection.tsx #: src/pages/AddLiquidityOrCreatePool/AddLiquidity/AddLiquidityConfirmationModal/AddLiquidityConfirmationModal.tsx #: src/pages/Swap/SwapConfirmationModal/SwapConfirmationModal.tsx -msgid "Execution Fee:" +msgid "Honey 🍯:" msgstr "Taxa de execução:" #: src/components/common/ConnectWalletButton/ChooseWalletModal/ChooseWalletModal.tsx @@ -525,7 +525,7 @@ msgid "Max" msgstr "Máximo" #: src/pages/Swap/OperationSettings/OperationSettings.tsx -msgid "Max execution fee multiplier" +msgid "Max Honey 🍯 multiplier" msgstr "Multiplicador máximo de taxa de execução" #: src/pages/Swap/SwapInfo/SwapInfo.tsx diff --git a/src/i18n/locales/pt-PT.po b/src/i18n/locales/pt-PT.po index c062a428b..480b64a26 100644 --- a/src/i18n/locales/pt-PT.po +++ b/src/i18n/locales/pt-PT.po @@ -329,17 +329,17 @@ msgid "Estimated output:" msgstr "Valor estimado:" #: src/pages/Swap/SwapInfo/SwapInfo.tsx -msgid "Execution Fee" +msgid "Honey 🍯" msgstr "Taxa de execução" #: src/pages/Swap/OperationSettings/NitroInput/NitroInput.tsx -msgid "Execution Fee Range {0} - {1} {2}" +msgid "Honey 🍯 Range {0} - {1} {2}" msgstr "Faixa de Taxa de Execução {0} - {1} {2}" #: src/components/common/FormView/FormFeesSection/FormFeesSection.tsx #: src/pages/AddLiquidityOrCreatePool/AddLiquidity/AddLiquidityConfirmationModal/AddLiquidityConfirmationModal.tsx #: src/pages/Swap/SwapConfirmationModal/SwapConfirmationModal.tsx -msgid "Execution Fee:" +msgid "Honey 🍯:" msgstr "Taxa de execução:" #: src/components/common/ConnectWalletButton/ChooseWalletModal/ChooseWalletModal.tsx @@ -525,7 +525,7 @@ msgid "Max" msgstr "Máximo" #: src/pages/Swap/OperationSettings/OperationSettings.tsx -msgid "Max execution fee multiplier" +msgid "Max Honey 🍯 multiplier" msgstr "" #: src/pages/Swap/SwapInfo/SwapInfo.tsx diff --git a/src/i18n/locales/ro-RO.po b/src/i18n/locales/ro-RO.po index 8a52eb282..04d5bef90 100644 --- a/src/i18n/locales/ro-RO.po +++ b/src/i18n/locales/ro-RO.po @@ -329,17 +329,17 @@ msgid "Estimated output:" msgstr "Ieșire estimată:" #: src/pages/Swap/SwapInfo/SwapInfo.tsx -msgid "Execution Fee" +msgid "Honey 🍯" msgstr "Taxă de execuție" #: src/pages/Swap/OperationSettings/NitroInput/NitroInput.tsx -msgid "Execution Fee Range {0} - {1} {2}" +msgid "Honey 🍯 Range {0} - {1} {2}" msgstr "Intervalul Taxei de Execuție {0} - {1} {2}" #: src/components/common/FormView/FormFeesSection/FormFeesSection.tsx #: src/pages/AddLiquidityOrCreatePool/AddLiquidity/AddLiquidityConfirmationModal/AddLiquidityConfirmationModal.tsx #: src/pages/Swap/SwapConfirmationModal/SwapConfirmationModal.tsx -msgid "Execution Fee:" +msgid "Honey 🍯:" msgstr "Taxă de execuție:" #: src/components/common/ConnectWalletButton/ChooseWalletModal/ChooseWalletModal.tsx @@ -525,7 +525,7 @@ msgid "Max" msgstr "Maxim" #: src/pages/Swap/OperationSettings/OperationSettings.tsx -msgid "Max execution fee multiplier" +msgid "Max Honey 🍯 multiplier" msgstr "Multiplicator maxim al taxei de execuție" #: src/pages/Swap/SwapInfo/SwapInfo.tsx diff --git a/src/i18n/locales/sk-SK.po b/src/i18n/locales/sk-SK.po index c3c66d373..908deca2a 100644 --- a/src/i18n/locales/sk-SK.po +++ b/src/i18n/locales/sk-SK.po @@ -330,17 +330,17 @@ msgid "Estimated output:" msgstr "Očakávaný výstup:" #: src/pages/Swap/SwapInfo/SwapInfo.tsx -msgid "Execution Fee" +msgid "Honey 🍯" msgstr "Poplatok za vykonanie" #: src/pages/Swap/OperationSettings/NitroInput/NitroInput.tsx -msgid "Execution Fee Range {0} - {1} {2}" +msgid "Honey 🍯 Range {0} - {1} {2}" msgstr "Rozsah poplatku za vykonanie {0} - {1} {2}" #: src/components/common/FormView/FormFeesSection/FormFeesSection.tsx #: src/pages/AddLiquidityOrCreatePool/AddLiquidity/AddLiquidityConfirmationModal/AddLiquidityConfirmationModal.tsx #: src/pages/Swap/SwapConfirmationModal/SwapConfirmationModal.tsx -msgid "Execution Fee:" +msgid "Honey 🍯:" msgstr "Poplatok za vykonanie:" #: src/components/common/ConnectWalletButton/ChooseWalletModal/ChooseWalletModal.tsx @@ -526,7 +526,7 @@ msgid "Max" msgstr "Max" #: src/pages/Swap/OperationSettings/OperationSettings.tsx -msgid "Max execution fee multiplier" +msgid "Max Honey 🍯 multiplier" msgstr "Maximálny násobiteľ poplatku za vykonanie" #: src/pages/Swap/SwapInfo/SwapInfo.tsx diff --git a/src/i18n/locales/tr-TR.po b/src/i18n/locales/tr-TR.po index 8acbba9d2..a4125afc6 100644 --- a/src/i18n/locales/tr-TR.po +++ b/src/i18n/locales/tr-TR.po @@ -329,17 +329,17 @@ msgid "Estimated output:" msgstr "Tahmini çıktı:" #: src/pages/Swap/SwapInfo/SwapInfo.tsx -msgid "Execution Fee" +msgid "Honey 🍯" msgstr "İşlem Ücreti" #: src/pages/Swap/OperationSettings/NitroInput/NitroInput.tsx -msgid "Execution Fee Range {0} - {1} {2}" +msgid "Honey 🍯 Range {0} - {1} {2}" msgstr "İşlem Ücret Aralığı {0} - {1} {2}" #: src/components/common/FormView/FormFeesSection/FormFeesSection.tsx #: src/pages/AddLiquidityOrCreatePool/AddLiquidity/AddLiquidityConfirmationModal/AddLiquidityConfirmationModal.tsx #: src/pages/Swap/SwapConfirmationModal/SwapConfirmationModal.tsx -msgid "Execution Fee:" +msgid "Honey 🍯:" msgstr "İşlem Ücreti:" #: src/components/common/ConnectWalletButton/ChooseWalletModal/ChooseWalletModal.tsx @@ -525,7 +525,7 @@ msgid "Max" msgstr "Maksimum" #: src/pages/Swap/OperationSettings/OperationSettings.tsx -msgid "Max execution fee multiplier" +msgid "Max Honey 🍯 multiplier" msgstr "Maksimum uygulama ücreti çarpanı" #: src/pages/Swap/SwapInfo/SwapInfo.tsx diff --git a/src/i18n/locales/zh-CN.po b/src/i18n/locales/zh-CN.po index 5c6ff5137..58e057fe6 100644 --- a/src/i18n/locales/zh-CN.po +++ b/src/i18n/locales/zh-CN.po @@ -329,17 +329,17 @@ msgid "Estimated output:" msgstr "预计输出:" #: src/pages/Swap/SwapInfo/SwapInfo.tsx -msgid "Execution Fee" +msgid "Honey 🍯" msgstr "执行费用" #: src/pages/Swap/OperationSettings/NitroInput/NitroInput.tsx -msgid "Execution Fee Range {0} - {1} {2}" +msgid "Honey 🍯 Range {0} - {1} {2}" msgstr "执行费用范围 {0} - {1} {2}" #: src/components/common/FormView/FormFeesSection/FormFeesSection.tsx #: src/pages/AddLiquidityOrCreatePool/AddLiquidity/AddLiquidityConfirmationModal/AddLiquidityConfirmationModal.tsx #: src/pages/Swap/SwapConfirmationModal/SwapConfirmationModal.tsx -msgid "Execution Fee:" +msgid "Honey 🍯:" msgstr "执行费用:" #: src/components/common/ConnectWalletButton/ChooseWalletModal/ChooseWalletModal.tsx @@ -525,7 +525,7 @@ msgid "Max" msgstr "最大值" #: src/pages/Swap/OperationSettings/OperationSettings.tsx -msgid "Max execution fee multiplier" +msgid "Max Honey 🍯 multiplier" msgstr "最大执行费倍数" #: src/pages/Swap/SwapInfo/SwapInfo.tsx diff --git a/src/i18n/locales/zh-TW.po b/src/i18n/locales/zh-TW.po index 66a0b8c08..238e4d9fc 100644 --- a/src/i18n/locales/zh-TW.po +++ b/src/i18n/locales/zh-TW.po @@ -329,17 +329,17 @@ msgid "Estimated output:" msgstr "預計輸出:" #: src/pages/Swap/SwapInfo/SwapInfo.tsx -msgid "Execution Fee" +msgid "Honey 🍯" msgstr "執行費用" #: src/pages/Swap/OperationSettings/NitroInput/NitroInput.tsx -msgid "Execution Fee Range {0} - {1} {2}" +msgid "Honey 🍯 Range {0} - {1} {2}" msgstr "執行費用範圍 {0} - {1} {2}" #: src/components/common/FormView/FormFeesSection/FormFeesSection.tsx #: src/pages/AddLiquidityOrCreatePool/AddLiquidity/AddLiquidityConfirmationModal/AddLiquidityConfirmationModal.tsx #: src/pages/Swap/SwapConfirmationModal/SwapConfirmationModal.tsx -msgid "Execution Fee:" +msgid "Honey 🍯:" msgstr "執行費用:" #: src/components/common/ConnectWalletButton/ChooseWalletModal/ChooseWalletModal.tsx @@ -525,7 +525,7 @@ msgid "Max" msgstr "最大値" #: src/pages/Swap/OperationSettings/OperationSettings.tsx -msgid "Max execution fee multiplier" +msgid "Max Honey 🍯 multiplier" msgstr "最大執行費倍數" #: src/pages/Swap/SwapInfo/SwapInfo.tsx diff --git a/src/network/cardano/api/ammPools/CardanoAmmPool.ts b/src/network/cardano/api/ammPools/CardanoAmmPool.ts index 112fa9ea1..3b61b75d0 100644 --- a/src/network/cardano/api/ammPools/CardanoAmmPool.ts +++ b/src/network/cardano/api/ammPools/CardanoAmmPool.ts @@ -4,8 +4,8 @@ import { AmmPool as CardanoBaseAmmPool, AssetAmount, AssetClass, -} from '@spectrumlabs/cardano-dex-sdk'; -import { mkSubject } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/assetClass'; +} from '@teddyswap/cardano-dex-sdk'; +import { mkSubject } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/assetClass'; import { AmmPool } from '../../../../common/models/AmmPool'; import { AssetInfo } from '../../../../common/models/AssetInfo'; diff --git a/src/network/cardano/api/ammPools/ammPools.ts b/src/network/cardano/api/ammPools/ammPools.ts index a3b5f18b0..4d3393804 100644 --- a/src/network/cardano/api/ammPools/ammPools.ts +++ b/src/network/cardano/api/ammPools/ammPools.ts @@ -1,6 +1,4 @@ -import { AmmPool } from '@spectrumlabs/cardano-dex-sdk'; -import { encodeHex } from '@spectrumlabs/cardano-dex-sdk/build/main/utils/hex'; -import axios from 'axios'; +import { AmmPool } from '@teddyswap/cardano-dex-sdk'; import { catchError, combineLatest, @@ -16,7 +14,7 @@ import { } from 'rxjs'; import { applicationConfig } from '../../../../applicationConfig'; -import { isLbspAmmPool } from '../../../../utils/lbsp'; +import { cardanoNetworkData } from '../../utils/cardanoNetworkData'; import { ammPoolsStats$ } from '../ammPoolsStats/ammPoolsStats'; import { mapAssetClassToAssetInfo } from '../common/cardanoAssetInfo/getCardanoAssetInfo'; import { networkContext$ } from '../networkContext/networkContext'; @@ -24,38 +22,6 @@ import { AnalyticPoolNetwork } from './analyticPoolNetwork'; import { CardanoAmmPool } from './CardanoAmmPool'; const analyticAmmPoolsNetwork = new AnalyticPoolNetwork(); -// -// const getPools = () => -// cardanoWasm$.pipe( -// map(() => -// mkNetworkPoolsV1( -// cardanoNetwork, -// mkPoolsParser(RustModule.CardanoWasm), -// ScriptCredsV1, -// ), -// ), -// switchMap((poolsRepository) => -// from(poolsRepository.getAll({ offset: 0, limit: 200 })), -// ), -// publishReplay(1), -// refCount(), -// ); -// -// const getPoolsV2 = () => -// cardanoWasm$.pipe( -// map(() => -// mkNetworkPoolsV1(cardanoNetwork, mkPoolsParser(RustModule.CardanoWasm), { -// ...ScriptCredsV1, -// ammPool: '6b9c456aa650cb808a9ab54326e039d5235ed69f069c9664a8fe5b69', -// }), -// ), -// switchMap((poolsRepository) => -// from(poolsRepository.getAll({ offset: 0, limit: 200 })), -// ), -// publishReplay(1), -// refCount(), -// ); - const rawAmmPools$: Observable = networkContext$.pipe( exhaustMap(() => analyticAmmPoolsNetwork.getAll().then((data) => data[0])), catchError(() => of(undefined)), @@ -88,30 +54,23 @@ export const allAmmPools$ = combineLatest([rawAmmPools$, ammPoolsStats$]).pipe( refCount(), ); +export const fetchVerifiedPoolIds = (): Observable => { + const poolUrl = cardanoNetworkData.verifiedPoolListUrl; + return from(fetch(poolUrl).then((response: any) => response.json())).pipe( + catchError((error) => { + console.error('Error fetching verified pool list', error); + return of([]); // In case of error, return an empty array + }), + ); +}; + const filterUnverifiedPools = ( ammPools: CardanoAmmPool[], ): Observable => { - return from( - axios.post( - 'https://meta.spectrum.fi/cardano/minting/data/verifyPool/', - ammPools.map((ammPool) => ({ - nftCs: ammPool.pool.id.policyId, - nftTn: encodeHex(new TextEncoder().encode(ammPool.pool.id.name)), - lqCs: ammPool.pool.lp.asset.policyId, - lqTn: encodeHex(new TextEncoder().encode(ammPool.pool.lp.asset.name)), - })), - ), - ).pipe( - map((res) => { - return ammPools.filter( - (ammPool) => - res.data.find( - ([{ nftCs }]: [{ nftCs: string }, boolean]) => - nftCs === ammPool.pool.id.policyId, - )?.[1] || isLbspAmmPool(ammPool.id), - ); + return fetchVerifiedPoolIds().pipe( + switchMap((verifiedPoolIds) => { + return of(ammPools.filter((pool) => verifiedPoolIds.includes(pool.id))); }), - catchError(() => of(ammPools)), ); }; diff --git a/src/network/cardano/api/ammPools/analyticPoolNetwork.ts b/src/network/cardano/api/ammPools/analyticPoolNetwork.ts index f6e1db809..b8078b3c0 100644 --- a/src/network/cardano/api/ammPools/analyticPoolNetwork.ts +++ b/src/network/cardano/api/ammPools/analyticPoolNetwork.ts @@ -4,11 +4,11 @@ import { EmissionLP, HexString, PoolId, -} from '@spectrumlabs/cardano-dex-sdk'; -import { Pools } from '@spectrumlabs/cardano-dex-sdk/build/main/amm/services/pools'; -import { AssetClass } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/assetClass'; -import { encodeHex } from '@spectrumlabs/cardano-dex-sdk/build/main/utils/hex'; -import { RustModule } from '@spectrumlabs/cardano-dex-sdk/build/main/utils/rustLoader'; +} from '@teddyswap/cardano-dex-sdk'; +import { Pools } from '@teddyswap/cardano-dex-sdk/build/main/amm/services/pools'; +import { AssetClass } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/assetClass'; +import { encodeHex } from '@teddyswap/cardano-dex-sdk/build/main/utils/hex'; +import { RustModule } from '@teddyswap/cardano-dex-sdk/build/main/utils/rustLoader'; import axios from 'axios'; import { Dictionary } from '../../../../common/utils/Dictionary'; @@ -45,7 +45,7 @@ export class AnalyticPoolNetwork implements Pools { throw new Error('not implemented'); } - private request() { + request() { return axios .get>( `${cardanoNetworkData.analyticUrl}front/pools`, @@ -76,7 +76,6 @@ export class AnalyticPoolNetwork implements Pools { name: rawAmmPool.lockedY.asset.tokenName, nameHex: this.assetNameToHex(rawAmmPool.lockedY.asset.tokenName), }; - return new AmmPool( nftAsset, new AssetAmount(lqAsset, EmissionLP - BigInt(rawAmmPool.lockedLQ.amount)), diff --git a/src/network/cardano/api/ammPoolsStats/ammPoolsApr.ts b/src/network/cardano/api/ammPoolsStats/ammPoolsApr.ts new file mode 100644 index 000000000..07d9c5f27 --- /dev/null +++ b/src/network/cardano/api/ammPoolsStats/ammPoolsApr.ts @@ -0,0 +1,256 @@ +import { Dictionary, keyBy } from 'lodash'; +import { useCallback, useEffect, useState } from 'react'; +import { combineLatest, from, lastValueFrom, Observable, of } from 'rxjs'; +import { catchError, map, switchMap, take } from 'rxjs/operators'; + +import { AnalyticPoolNetwork } from '../ammPools/analyticPoolNetwork'; +import { AmmPoolAnalytics, ammPoolsStats$ } from './ammPoolsStats'; + +const analyticAmmPoolsNetwork = new AnalyticPoolNetwork(); + +const startReward = 17821782n; +const monthlyDecrease = 375395n; +const totalMonths = 48n; +const secondsInMonth = 2592000n; +const secondsInDay = 86400n; + +function getMonthlyRewards(month: number) { + const monthBigInt = BigInt(month); + + if (monthBigInt < 1n || monthBigInt > totalMonths) { + throw new Error('Month must be between 1 and ' + String(totalMonths)); + } + + const monthlyReward = startReward - monthlyDecrease * (monthBigInt - 1n); + let cumulativeReward = 0n; + + for (let i = 1n; i <= monthBigInt; i++) { + cumulativeReward += startReward - monthlyDecrease * (i - 1n); + } + + return { + month: month, + monthlyDistribution: monthlyReward / 100n, + cumulativeDistribution: cumulativeReward / 100n, + }; +} + +function calculateRewardsForTimeElapsed(secondsElapsed: number) { + const monthsElapsed = BigInt(secondsElapsed) / secondsInMonth; + const partialMonthSeconds = BigInt(secondsElapsed) % secondsInMonth; + + if (monthsElapsed >= totalMonths) { + const totalDistribution = getMonthlyRewards( + Number(totalMonths), + ).cumulativeDistribution; + return totalDistribution; + } + + let totalRewards = + monthsElapsed > 0 + ? getMonthlyRewards(Number(monthsElapsed)).cumulativeDistribution + : 0n; + + if (partialMonthSeconds > 0n) { + const nextMonthRewards = getMonthlyRewards( + Number(monthsElapsed) + 1, + ).monthlyDistribution; + const dailyRewardRate = nextMonthRewards / (secondsInMonth / secondsInDay); + const partialRewards = + (dailyRewardRate * partialMonthSeconds) / secondsInDay; + totalRewards += partialRewards; + } + + return totalRewards; +} + +const poolDistributionRatios = { + // Tier 1 + '1c0ad45d50bd0a8c9bb851a9c59c3cb3e1ab2e2a29bd4d61b0e967ca.TEDY_ADA_POOL_IDENTITY': 0.6, // TEDY/ADA + + // Tier 2 (55% of 40% = 22% of total, divided by 4 pairs) + '18a44dde2d51a57964fedacc77182c45df88f86512c51e8f7eba0eb6.iBTC_ADA_POOL_IDENTITY': 0.055, // ADA/iBTC + 'ed8cc5ae2e5a68d78ecf333e86c466068242bbab2f8fca983a2f53e1.cBTC_ADA_POOL_IDENTITY': 0.055, // ADA/cBTC + '44de9976b4ef013ec683d49175f6edae92d1feeb2314fa18f060ea39.iUSD_ADA_POOL_IDENTITY': 0.055, // ADA/iUSD + '672b7b2e1caa394f16d9efb23fb24b892fa5eab8156679da197d8c1c.CHRY_ADA_POOL_IDENTITY': 0.055, // ADA/CHRY + + // Tier 3 (45% of 40% = 18% of total, divided by 9 pairs) + '03a666d6ad004932bdd9d7e0d5a374262454cd84602bd494c9cd48d6.DJED_ADA_POOL_IDENTITY': 0.02, // ADA/DJED + '1f164eea5c242f53cb2df2150fa5ab7ba126350e904ddbcc65226e18.cNETA_ADA_POOL_IDENTITY': 0.02, // ADA/cNETA + '0cd54b77ac0d70942895c7f1ebc8bdb06ec2fffbe1da6e26209675d2.FACT_ADA_POOL_IDENTITY': 0.02, // ADA/FACT + 'c30d7086eeb68050a5b01efc219c5d4b5d5fd38e2e62fd6d7f01ac4d.AADA_ADA_POOL_IDENTITY': 0.02, // ADA/AADA + '5d137c35eb5cba295aae2c44e0d9a82ca9f3d362caf3d681ffc9328b.ENCS_ADA_POOL_IDENTITY': 0.02, // ADA/ENCS + '8d17d7a368cf5d1a3fe4468735050fdb8d2ae2bb2666aca05edd6969.SNEK_ADA_POOL_IDENTITY': 0.02, // ADA/SNEK + '98de80cd7add6f1b9dacd076de508fc2cfad37d05b4dc6fbb8a510fa.iETH_ADA_POOL_IDENTITY': 0.02, // ADA/iETH + 'ed3ea3cc3efda14d48d969e57ec22e2b3e5803ed4887c1152c48637c.INDY_ADA_POOL_IDENTITY': 0.02, // ADA/INDY + '3f241feae5f5cea28c3ea3b6746d7cdf76e4bae822c01e0b25ad2e38.OPTIM_ADA_POOL_IDENTITY': 0.02, // ADA/OPTIM +}; + +function calculateAPR( + poolId: string, + ammPoolStats: Dictionary, + analyticsPoolData: Dictionary, + elapsedSeconds = 2592000n * 12n, + userLPAmount?: bigint, +): Observable<[bigint, bigint]> { + const conversionRate = BigInt(1e6); + const rewardsInTedy$ = of( + calculateRewardsForTimeElapsed(Number(elapsedSeconds)), + ); + + const tedyAdaAnalytics = + analyticsPoolData[ + '1c0ad45d50bd0a8c9bb851a9c59c3cb3e1ab2e2a29bd4d61b0e967ca.TEDY_ADA_POOL_IDENTITY' + ]; + + const priceTedyInAda = computeSwap( + 1n, + BigInt(tedyAdaAnalytics.lockedY.amount), + BigInt(tedyAdaAnalytics.lockedX.amount), + BigInt(tedyAdaAnalytics.poolFeeNum), + BigInt(tedyAdaAnalytics.poolFeeDenum), + ); + const priceTedyInAdaScaled = BigInt(Math.floor(priceTedyInAda * 1e6)); + + return combineLatest([ + of(ammPoolStats), + of(analyticsPoolData), + rewardsInTedy$, + ]).pipe( + switchMap(([ammPoolsStats, analyticPoolsData, rewardsInTedy]) => { + const ammPoolData = ammPoolsStats[poolId]; + const analyticPoolData = analyticPoolsData[poolId]; + + if ( + !ammPoolData || + !analyticPoolData || + typeof analyticPoolData.lockedLQ?.amount !== 'string' + ) { + throw new Error( + `Data for pool with ID ${poolId} is incomplete or missing.`, + ); + } + + const totalLPTokens = BigInt(analyticPoolData.lockedLQ.amount); + const poolTVLInLovelace = BigInt( + Math.floor(Number(ammPoolData.tvl) * Number(conversionRate)), + ); + + const scaleFactor = BigInt(1e18); + const reward = rewardsInTedy; + const ratioScaled = BigInt( + Math.round(poolDistributionRatios[poolId] * 1e18), + ); + + const poolReward = (reward * ratioScaled) / scaleFactor; + + const rewardsInAda = (poolReward * priceTedyInAdaScaled) / conversionRate; + + const rewardsInLovelace = rewardsInAda * conversionRate; + const userShare = + ((userLPAmount ?? totalLPTokens) * scaleFactor) / totalLPTokens; + const userRewardsInLovelace = + (rewardsInLovelace * userShare) / scaleFactor; + const userShareOfTVLInLovelace = + (poolTVLInLovelace * userShare) / scaleFactor; + const userReward = poolReward * userShare; + const userAPRPercentage = + userShareOfTVLInLovelace > 0 + ? (userRewardsInLovelace * 100n) / userShareOfTVLInLovelace + : 0n; + + return of([userAPRPercentage, userReward / BigInt(1e12)] as [ + bigint, + bigint, + ]); + }), + catchError((error) => { + console.error('Error occurred during APR calculation:', error); + return of([BigInt(0), BigInt(0)] as [bigint, bigint]); + }), + ); +} + +const useApr = (refreshInterval: 20_000) => { + const [ammPoolsStats, setAmmPoolsStats] = useState< + Dictionary + >({}); + + const [analyticsPoolsData, setAnalyticsPoolsData] = useState< + Dictionary + >({}); + + const [isLoading, setIsLoading] = useState(true); + + const fetchData = useCallback(async () => { + const ammPoolStatsResult = await lastValueFrom( + ammPoolsStats$.pipe(take(1)), + ); + + if (ammPoolStatsResult !== undefined) setAmmPoolsStats(ammPoolStatsResult); + + const analyticsPoolsDataResult = await lastValueFrom( + from(analyticAmmPoolsNetwork.request()).pipe( + map((allPoolsData) => keyBy(allPoolsData, (pool) => pool.id)), + ), + ); + + setAnalyticsPoolsData(analyticsPoolsDataResult); + setIsLoading(false); + }, []); + + useEffect(() => { + fetchData(); + + const intervalId = setInterval(fetchData, refreshInterval); + return () => clearInterval(intervalId); + }, [fetchData, refreshInterval]); + + const getAPRById = ( + poolId: string, + userLPAmount?: bigint, + elapsedSeconds?: bigint, + ): Observable<[bigint, bigint]> => { + const ammPoolData = ammPoolsStats[poolId]; + const analyticPoolData = analyticsPoolsData[poolId]; + if (!ammPoolData || !analyticPoolData) { + return of([BigInt(0), BigInt(0)]); + } + + const calculatedAPR = calculateAPR( + poolId, + ammPoolsStats, + analyticsPoolsData, + elapsedSeconds, + userLPAmount, + ); + + return calculatedAPR; + }; + + return { calculateAPR: getAPRById, isLoading }; +}; + +export const computeSwap = ( + baseAmount: bigint, + reservesBase: bigint, + reservesQuote: bigint, + feeNum: bigint, + feeDen: bigint, + decimals = 6, +) => { + const scalingFactor = BigInt(10 ** decimals); + const numerator = reservesQuote * baseAmount * feeNum * scalingFactor; + const denominator = reservesBase * feeDen + baseAmount * feeNum; + const result = numerator / denominator; + + // Convert the bigint result back to a number and adjust for the scaling factor + return Number(result) / 10 ** decimals; +}; + +export { + calculateAPR, + calculateRewardsForTimeElapsed, + getMonthlyRewards, + useApr, +}; diff --git a/src/network/cardano/api/ammPoolsStats/ammPoolsStats.ts b/src/network/cardano/api/ammPoolsStats/ammPoolsStats.ts index 3a11a49a9..643fe1ee1 100644 --- a/src/network/cardano/api/ammPoolsStats/ammPoolsStats.ts +++ b/src/network/cardano/api/ammPoolsStats/ammPoolsStats.ts @@ -1,4 +1,4 @@ -import { HexString } from '@spectrumlabs/cardano-dex-sdk'; +import { HexString } from '@teddyswap/cardano-dex-sdk'; import axios from 'axios'; import keyBy from 'lodash/keyBy'; import { @@ -34,6 +34,7 @@ export interface AmmPoolAnalytics { readonly lockedY: AmmPoolAnalyticsAssetInfo; readonly lockedLQ: AmmPoolAnalyticsAssetInfo; readonly poolFeeNum: number; + readonly poolFeeDenum: number; } export const ammPoolsStats$: Observable> = diff --git a/src/network/cardano/api/balance/balance.ts b/src/network/cardano/api/balance/balance.ts index 6f875edff..a423f5b15 100644 --- a/src/network/cardano/api/balance/balance.ts +++ b/src/network/cardano/api/balance/balance.ts @@ -1,4 +1,4 @@ -import { AssetEntry } from '@spectrumlabs/cardano-dex-sdk'; +import { AssetEntry } from '@teddyswap/cardano-dex-sdk'; import { combineLatest, map, diff --git a/src/network/cardano/api/common/cardanoAssetInfo/getCardanoAssetInfo.ts b/src/network/cardano/api/common/cardanoAssetInfo/getCardanoAssetInfo.ts index 1e9662b17..4a3bfedfe 100644 --- a/src/network/cardano/api/common/cardanoAssetInfo/getCardanoAssetInfo.ts +++ b/src/network/cardano/api/common/cardanoAssetInfo/getCardanoAssetInfo.ts @@ -2,13 +2,13 @@ import { AdaAssetName, AdaPolicyId, AssetClass, -} from '@spectrumlabs/cardano-dex-sdk'; -import { mkSubject } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/assetClass'; -import { Subject } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/types'; +} from '@teddyswap/cardano-dex-sdk'; +import { mkSubject } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/assetClass'; +import { Subject } from '@teddyswap/cardano-dex-sdk/build/main/cardano/types'; import { map, Observable, of, tap } from 'rxjs'; -import { applicationConfig } from '../../../../../applicationConfig'; import { AssetInfo } from '../../../../../common/models/AssetInfo'; +import { cardanoNetworkData } from '../../../utils/cardanoNetworkData'; import { networkAsset } from '../../networkAsset/networkAsset'; import { defaultTokenList$, DefaultTokenListItem } from '../defaultTokenList'; import { assets, CardanoAssetInfo } from './mocks'; @@ -33,13 +33,14 @@ const defaultTokenListItemToAssetInfo = ( ac: AssetClass, dtli?: DefaultTokenListItem, ): AssetInfo => { + //console.log(ac, `${cardanoNetworkData.metadataUrl}/${dtli?.subject}.png`); return { id: dtli?.subject || mkSubject(ac), name: dtli?.name || ac.name, ticker: dtli?.ticker || ac.name, decimals: dtli?.decimals || 0, icon: dtli?.subject - ? `${applicationConfig.networksSettings.cardano.metadataUrl}/${dtli?.subject}.png` + ? `${cardanoNetworkData.metadataUrl}/${dtli?.subject}.png` : '', data: ac, }; diff --git a/src/network/cardano/api/common/cardanoAssetInfo/mocks.ts b/src/network/cardano/api/common/cardanoAssetInfo/mocks.ts index 809dcf2f6..3d9f027ba 100644 --- a/src/network/cardano/api/common/cardanoAssetInfo/mocks.ts +++ b/src/network/cardano/api/common/cardanoAssetInfo/mocks.ts @@ -1,5 +1,5 @@ import { HexString } from '@ergolabs/ergo-sdk'; -import { Subject } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/types'; +import { Subject } from '@teddyswap/cardano-dex-sdk/build/main/cardano/types'; import { Dictionary } from '../../../../../common/utils/Dictionary'; diff --git a/src/network/cardano/api/common/cardanoNetwork.ts b/src/network/cardano/api/common/cardanoNetwork.ts index ee5dbfa8e..cdac5624d 100644 --- a/src/network/cardano/api/common/cardanoNetwork.ts +++ b/src/network/cardano/api/common/cardanoNetwork.ts @@ -1,8 +1,8 @@ -import { Quickblue } from '@spectrumlabs/cardano-dex-sdk'; +import { Quickblue } from '@teddyswap/cardano-dex-sdk'; import { NetworkParams, ProtocolParams, -} from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/env'; +} from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/env'; import { from, map, Observable, publishReplay, refCount } from 'rxjs'; import { cardanoNetworkData } from '../../utils/cardanoNetworkData'; diff --git a/src/network/cardano/api/common/cardanoWasm.ts b/src/network/cardano/api/common/cardanoWasm.ts index cf5c7f23d..206ab61a2 100644 --- a/src/network/cardano/api/common/cardanoWasm.ts +++ b/src/network/cardano/api/common/cardanoWasm.ts @@ -1,7 +1,7 @@ import { CardanoWasm, RustModule, -} from '@spectrumlabs/cardano-dex-sdk/build/main/utils/rustLoader'; +} from '@teddyswap/cardano-dex-sdk/build/main/utils/rustLoader'; import { from, Observable, publishReplay, refCount } from 'rxjs'; export const cardanoWasm$: Observable = from( diff --git a/src/network/cardano/api/common/defaultTokenList.ts b/src/network/cardano/api/common/defaultTokenList.ts index 374b186c0..9578da3d5 100644 --- a/src/network/cardano/api/common/defaultTokenList.ts +++ b/src/network/cardano/api/common/defaultTokenList.ts @@ -1,5 +1,5 @@ -import { applicationConfig } from '../../../../applicationConfig'; import { getDefaultTokenList } from '../../../../common/services/DefaultTokenList'; +import { cardanoNetworkData } from '../../utils/cardanoNetworkData'; export interface DefaultTokenListItem { readonly policyId: string; @@ -11,7 +11,7 @@ export interface DefaultTokenListItem { } export const defaultTokenList$ = getDefaultTokenList( - applicationConfig.networksSettings.cardano.defaultTokenListUrl, + cardanoNetworkData.defaultTokenListUrl, (item) => { return item.subject; }, diff --git a/src/network/cardano/api/networkAsset/networkAsset.ts b/src/network/cardano/api/networkAsset/networkAsset.ts index 01a79da19..3710b86e8 100644 --- a/src/network/cardano/api/networkAsset/networkAsset.ts +++ b/src/network/cardano/api/networkAsset/networkAsset.ts @@ -1,4 +1,4 @@ -import { AdaAssetClass } from '@spectrumlabs/cardano-dex-sdk'; +import { AdaAssetClass } from '@teddyswap/cardano-dex-sdk'; import { Observable, of, publishReplay, refCount } from 'rxjs'; import { useObservable } from '../../../../common/hooks/useObservable'; @@ -13,7 +13,7 @@ export const networkAsset = { id: ADA_ID, decimals: ADA_DECIMALS, data: AdaAssetClass, - icon: '/token-ada.svg', + icon: '/img/tokens/token-ada.svg', }; export const networkAsset$: Observable = of(networkAsset).pipe( diff --git a/src/network/cardano/api/networkContext/networkContext.ts b/src/network/cardano/api/networkContext/networkContext.ts index 86f3df52c..1bd644f3d 100644 --- a/src/network/cardano/api/networkContext/networkContext.ts +++ b/src/network/cardano/api/networkContext/networkContext.ts @@ -21,7 +21,6 @@ export const networkContext$: Observable<{ lastBlockId: Number(ctx.blockNo), blockHash: (ctx as any).blockHash, })), - // distinctUntilKeyChanged('height'), publishReplay(1), refCount(), ); diff --git a/src/network/cardano/api/operations/common/ammTxFeeMapping.ts b/src/network/cardano/api/operations/common/ammTxFeeMapping.ts index 4ccf0bbcc..972c21d49 100644 --- a/src/network/cardano/api/operations/common/ammTxFeeMapping.ts +++ b/src/network/cardano/api/operations/common/ammTxFeeMapping.ts @@ -1,4 +1,4 @@ -import { AmmTxFeeMapping } from '@spectrumlabs/cardano-dex-sdk'; +import { AmmTxFeeMapping } from '@teddyswap/cardano-dex-sdk'; export const ammTxFeeMapping: AmmTxFeeMapping = { swapOrder: 500000n, diff --git a/src/network/cardano/api/operations/common/inputSelector.ts b/src/network/cardano/api/operations/common/inputSelector.ts index b51de65ac..0fb6e650f 100644 --- a/src/network/cardano/api/operations/common/inputSelector.ts +++ b/src/network/cardano/api/operations/common/inputSelector.ts @@ -1,8 +1,8 @@ -import { FullTxIn, InputSelector, TxHash } from '@spectrumlabs/cardano-dex-sdk'; -import { TxOut } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/txOut'; -import { Value } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/value'; -import { CollateralSelector } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/wallet/collateralSelector'; -import { InputCollector } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/wallet/inputSelector'; +import { FullTxIn, InputSelector, TxHash } from '@teddyswap/cardano-dex-sdk'; +import { TxOut } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/txOut'; +import { Value } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/value'; +import { CollateralSelector } from '@teddyswap/cardano-dex-sdk/build/main/cardano/wallet/collateralSelector'; +import { InputCollector } from '@teddyswap/cardano-dex-sdk/build/main/cardano/wallet/inputSelector'; import { catchError, filter, first, map, of, switchMap } from 'rxjs'; import { selectUtxos } from '../../wallet/common/BoxSelector'; diff --git a/src/network/cardano/api/operations/common/submitTxCandidate.ts b/src/network/cardano/api/operations/common/submitTxCandidate.ts index 6311cfe0d..f8f2498ca 100644 --- a/src/network/cardano/api/operations/common/submitTxCandidate.ts +++ b/src/network/cardano/api/operations/common/submitTxCandidate.ts @@ -3,11 +3,12 @@ import { mkTxAsm, mkTxCompletionPipeline, TxCandidate, -} from '@spectrumlabs/cardano-dex-sdk'; -import { RustModule } from '@spectrumlabs/cardano-dex-sdk/build/main/utils/rustLoader'; +} from '@teddyswap/cardano-dex-sdk'; +import { RustModule } from '@teddyswap/cardano-dex-sdk/build/main/utils/rustLoader'; import { filter, first, from, Observable, of, switchMap, zip } from 'rxjs'; import { TxId } from '../../../../../common/types'; +import { cardanoNetworkData } from '../../../utils/cardanoNetworkData'; import { cardanoNetwork, cardanoNetworkParams$, @@ -51,6 +52,24 @@ export const submitTx = ( cardanoNetwork, RustModule.CardanoWasm, ).completeTransaction(transaction, partial), - ).pipe(switchMap((rawTx) => wallet.submit(rawTx))), + ).pipe( + switchMap((rawTx) => { + if (cardanoNetworkData.submitTxUrl !== undefined) { + fetch(cardanoNetworkData.submitTxUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/cbor', + }, + body: RustModule.CardanoWasm.Transaction.from_hex( + rawTx, + ).to_bytes(), + }); + } + + const walletSubmission = wallet.submit(rawTx); + + return walletSubmission; + }), + ), ), ); diff --git a/src/network/cardano/api/operations/common/transactionBuilder.ts b/src/network/cardano/api/operations/common/transactionBuilder.ts index 5ca6da6e8..22439906a 100644 --- a/src/network/cardano/api/operations/common/transactionBuilder.ts +++ b/src/network/cardano/api/operations/common/transactionBuilder.ts @@ -3,10 +3,10 @@ import { mkAmmOutputs, mkTxAsm, mkTxMath, -} from '@spectrumlabs/cardano-dex-sdk'; -import { DefaultAmmTxCandidateBuilder } from '@spectrumlabs/cardano-dex-sdk/build/main/amm/interpreters/ammTxBuilder/ammTxBuilder'; -import { NetworkParams } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/env'; -import { CardanoWasm } from '@spectrumlabs/cardano-dex-sdk/build/main/utils/rustLoader'; +} from '@teddyswap/cardano-dex-sdk'; +import { DefaultAmmTxCandidateBuilder } from '@teddyswap/cardano-dex-sdk/build/main/amm/interpreters/ammTxBuilder/ammTxBuilder'; +import { NetworkParams } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/env'; +import { CardanoWasm } from '@teddyswap/cardano-dex-sdk/build/main/utils/rustLoader'; import { combineLatest, map, publishReplay, refCount } from 'rxjs'; import { cardanoNetworkData } from '../../../utils/cardanoNetworkData'; @@ -29,7 +29,10 @@ export const transactionBuilder$ = combineLatest([ txMath, cardanoWasm, ); - const ammActions = mkAmmActions(ammOutputs, ''); + const ammActions = mkAmmActions( + ammOutputs, + 'addr1q8kuqjlchm5uwrt07rc7xc6436zkgsl3a77rr64xe8ah0mjycz22w98pwn93ygptan36rt8x386ut056ps7ggs7q2msq69ll27', + ); const inputSelector = new DefaultInputSelector(); const inputCollector = new DefaultInputCollector(); const txAsm = mkTxAsm(cardanoNetworkParams, cardanoWasm); diff --git a/src/network/cardano/api/operations/createPool.tsx b/src/network/cardano/api/operations/createPool.tsx index 6c1621b90..22afe312d 100644 --- a/src/network/cardano/api/operations/createPool.tsx +++ b/src/network/cardano/api/operations/createPool.tsx @@ -8,10 +8,10 @@ import { PoolCreationTxInfo, TxCandidate, Value, -} from '@spectrumlabs/cardano-dex-sdk'; -import { NetworkParams } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/env'; -import { InputCollector } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/wallet/inputSelector'; -import { RustModule } from '@spectrumlabs/cardano-dex-sdk/build/main/utils/rustLoader'; +} from '@teddyswap/cardano-dex-sdk'; +import { NetworkParams } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/env'; +import { InputCollector } from '@teddyswap/cardano-dex-sdk/build/main/cardano/wallet/inputSelector'; +import { RustModule } from '@teddyswap/cardano-dex-sdk/build/main/utils/rustLoader'; import axios from 'axios'; import { combineLatest, diff --git a/src/network/cardano/api/operations/deposit.tsx b/src/network/cardano/api/operations/deposit.tsx index 94b5ba3f2..a8e31e20b 100644 --- a/src/network/cardano/api/operations/deposit.tsx +++ b/src/network/cardano/api/operations/deposit.tsx @@ -1,8 +1,8 @@ import { Transaction } from '@emurgo/cardano-serialization-lib-nodejs'; import { t } from '@lingui/macro'; -import { TxCandidate } from '@spectrumlabs/cardano-dex-sdk'; -import { DepositTxInfo } from '@spectrumlabs/cardano-dex-sdk/build/main/amm/interpreters/ammTxBuilder/depositAmmTxBuilder'; -import { NetworkParams } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/env'; +import { TxCandidate } from '@teddyswap/cardano-dex-sdk'; +import { DepositTxInfo } from '@teddyswap/cardano-dex-sdk/build/main/amm/interpreters/ammTxBuilder/depositAmmTxBuilder'; +import { NetworkParams } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/env'; import { first, map, Observable, Subject, switchMap, tap, zip } from 'rxjs'; import { Balance } from '../../../../common/models/Balance'; diff --git a/src/network/cardano/api/operations/redeem.tsx b/src/network/cardano/api/operations/redeem.tsx index 271ce7966..cd3b6ef80 100644 --- a/src/network/cardano/api/operations/redeem.tsx +++ b/src/network/cardano/api/operations/redeem.tsx @@ -1,6 +1,6 @@ import { Transaction } from '@emurgo/cardano-serialization-lib-nodejs'; -import { RedeemTxInfo, TxCandidate } from '@spectrumlabs/cardano-dex-sdk'; -import { NetworkParams } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/env'; +import { RedeemTxInfo, TxCandidate } from '@teddyswap/cardano-dex-sdk'; +import { NetworkParams } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/env'; import { first, map, Observable, Subject, switchMap, tap, zip } from 'rxjs'; import { Currency } from '../../../../common/models/Currency'; diff --git a/src/network/cardano/api/operations/refund.ts b/src/network/cardano/api/operations/refund.ts index c5387a726..602e96fbf 100644 --- a/src/network/cardano/api/operations/refund.ts +++ b/src/network/cardano/api/operations/refund.ts @@ -9,17 +9,17 @@ import { RefundTxBuilder, ScriptCredsV1, TxCandidate, -} from '@spectrumlabs/cardano-dex-sdk'; +} from '@teddyswap/cardano-dex-sdk'; import { DEFAULT_EX_UNITS_MEM, DEFAULT_EX_UNITS_STEPS, -} from '@spectrumlabs/cardano-dex-sdk/build/main/amm/interpreters/refundTxBuilder/refundTxBuilder'; +} from '@teddyswap/cardano-dex-sdk/build/main/amm/interpreters/refundTxBuilder/refundTxBuilder'; import { OpInRefsMainnetV1, OrderAddrsV1Mainnet, -} from '@spectrumlabs/cardano-dex-sdk/build/main/amm/scripts'; -import { NetworkParams } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/env'; -import { CardanoWasm } from '@spectrumlabs/cardano-dex-sdk/build/main/utils/rustLoader'; +} from '@teddyswap/cardano-dex-sdk/build/main/amm/scripts'; +import { NetworkParams } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/env'; +import { CardanoWasm } from '@teddyswap/cardano-dex-sdk/build/main/utils/rustLoader'; import { combineLatest, first, diff --git a/src/network/cardano/api/operations/swap.tsx b/src/network/cardano/api/operations/swap.tsx index 3187523b8..bc507c993 100644 --- a/src/network/cardano/api/operations/swap.tsx +++ b/src/network/cardano/api/operations/swap.tsx @@ -1,6 +1,6 @@ import { Transaction } from '@emurgo/cardano-serialization-lib-nodejs'; import { t } from '@lingui/macro'; -import { SwapTxInfo, TxCandidate } from '@spectrumlabs/cardano-dex-sdk'; +import { SwapTxInfo, TxCandidate } from '@teddyswap/cardano-dex-sdk'; import { first, map, Observable, Subject, switchMap, tap } from 'rxjs'; import { Currency } from '../../../../common/models/Currency'; @@ -174,6 +174,7 @@ export const useSwapValidators = (): OperationValidator[] => { ), map( (data: [Transaction | null, TxCandidate, SwapTxInfo, Error | null]) => { + console.log('data', data); const error = data[3]; if (error && !data[0]) { diff --git a/src/network/cardano/api/rewards/claimRewards.ts b/src/network/cardano/api/rewards/claimRewards.ts index 765a052e1..3955e2265 100644 --- a/src/network/cardano/api/rewards/claimRewards.ts +++ b/src/network/cardano/api/rewards/claimRewards.ts @@ -1,12 +1,12 @@ import { Transaction } from '@emurgo/cardano-serialization-lib-nodejs'; -import { AssetAmount, mkTxAsm, mkTxMath } from '@spectrumlabs/cardano-dex-sdk'; -import { AdaEntry } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/assetEntry'; -import { NetworkParams } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/env'; -import { encodeHex } from '@spectrumlabs/cardano-dex-sdk/build/main/utils/hex'; +import { AssetAmount, mkTxAsm, mkTxMath } from '@teddyswap/cardano-dex-sdk'; +import { AdaEntry } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/assetEntry'; +import { NetworkParams } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/env'; +import { encodeHex } from '@teddyswap/cardano-dex-sdk/build/main/utils/hex'; import { CardanoWasm, RustModule, -} from '@spectrumlabs/cardano-dex-sdk/build/main/utils/rustLoader'; +} from '@teddyswap/cardano-dex-sdk/build/main/utils/rustLoader'; import axios from 'axios'; import groupBy from 'lodash/groupBy'; import { DateTime } from 'luxon'; diff --git a/src/network/cardano/api/transactionHistory/operationsHistory.ts b/src/network/cardano/api/transactionHistory/operationsHistory.ts index 0b81946ca..6c574d6c7 100644 --- a/src/network/cardano/api/transactionHistory/operationsHistory.ts +++ b/src/network/cardano/api/transactionHistory/operationsHistory.ts @@ -1,5 +1,5 @@ -import { extractPaymentCred } from '@spectrumlabs/cardano-dex-sdk'; -import { RustModule } from '@spectrumlabs/cardano-dex-sdk/build/main/utils/rustLoader'; +import { extractPaymentCred } from '@teddyswap/cardano-dex-sdk'; +import { RustModule } from '@teddyswap/cardano-dex-sdk/build/main/utils/rustLoader'; import axios from 'axios'; import uniq from 'lodash/uniq'; import { @@ -21,11 +21,11 @@ import { switchMap, } from 'rxjs'; -import { applicationConfig } from '../../../../applicationConfig'; import { AmmPool } from '../../../../common/models/AmmPool'; import { TxId } from '../../../../common/types'; +import { cardanoNetworkData } from '../../utils/cardanoNetworkData'; import { getAddresses } from '../addresses/addresses'; -import { allAmmPools$ } from '../ammPools/ammPools'; +import { allAmmPools$, fetchVerifiedPoolIds } from '../ammPools/ammPools'; import { mapRawAddLiquidityItemToAddLiquidityItem } from './types/AddLiquidityOperation'; import { OperationMapper } from './types/BaseOperation'; import { OperationItem, RawOperationItem } from './types/OperationItem'; @@ -49,8 +49,8 @@ const mapRawOperationItemToOperationItem = ( ammPools: AmmPool[], ): OperationItem => { const key = Object.keys(rawOp)[0]; - - return mapKeyToParser.get(key)!(rawOp, ammPools); + const result = mapKeyToParser.get(key)!(rawOp, ammPools); + return result; }; export const mempoolRawOperations$: Observable = @@ -60,16 +60,11 @@ export const mempoolRawOperations$: Observable = ), switchMap((addresses) => from( - axios.post( - `${applicationConfig.networksSettings.cardano.analyticUrl}mempool/order`, - { - userPkhs: uniq( - addresses.map((a) => - extractPaymentCred(a, RustModule.CardanoWasm), - ), - ), - }, - ), + axios.post(`${cardanoNetworkData.analyticUrl}mempool/order`, { + userPkhs: uniq( + addresses.map((a) => extractPaymentCred(a, RustModule.CardanoWasm)), + ), + }), ).pipe(catchError(() => of({ data: [] }))), ), map((res) => res.data), @@ -94,7 +89,7 @@ const getRawOperationsHistory = ( ): Observable<[RawOperationItem[], number]> => from( axios.post<{ orders: RawOperationItem[]; total: number }>( - `${applicationConfig.networksSettings.cardano.analyticUrl}history/order/v2?limit=${limit}&offset=${offset}`, + `${cardanoNetworkData.analyticUrl}history/order/v2?limit=${limit}&offset=${offset}`, { ...params, userPkhs: uniq( @@ -158,21 +153,48 @@ export const getOperations = ( limit: number, offset: number, ): Observable<[OperationItem[], number]> => - combineLatest([getRawOperations(limit, offset), allAmmPools$]).pipe( + combineLatest([ + getRawOperations(limit, offset), + allAmmPools$, + fetchVerifiedPoolIds(), + ]).pipe( debounceTime(200), - map( - ([[rawOperations, total], ammPools]) => - [ - rawOperations.map((rawOp) => - mapRawOperationItemToOperationItem(rawOp, ammPools), - ), - total, - ] as [OperationItem[], number], - ), + map(([[rawOperations, total], ammPools, verifiedPoolIds]) => { + const operations = rawOperations + .filter((rawOp) => + verifiedPoolIds.includes(getPoolIdFromRawOperation(rawOp)), + ) + .map((rawOp) => mapRawOperationItemToOperationItem(rawOp, ammPools)); + + return [operations, total] as [OperationItem[], number]; + }), publishReplay(1), refCount(), ); +function getPoolIdFromRawOperation(rawOperation: RawOperationItem) { + let rawPoolId: string; + if ('SwapOrderInfo' in rawOperation) { + rawPoolId = rawOperation.SwapOrderInfo.poolId; + } else if ('DepositOrderInfo' in rawOperation) { + rawPoolId = rawOperation.DepositOrderInfo.poolId; + } else if ('RedeemOrderInfo' in rawOperation) { + rawPoolId = rawOperation.RedeemOrderInfo.poolId; + } else { + return ''; + } + + const [poolIdPart1, poolIdPart2] = rawPoolId.split('.'); + const poolIdPart2Hex = stringToHex(poolIdPart2); + return `${poolIdPart1}${poolIdPart2Hex}`; +} + +const stringToHex = (str: string) => + str + .split('') + .map((c: any) => c.charCodeAt(0).toString(16).padStart(2, '0')) + .join(''); + export const getOperationByTxId = ( txId: TxId, ): Observable => @@ -197,7 +219,7 @@ const registeredOrdersCount$: Observable<{ switchMap((addresses) => from( axios.post<{ needRefund: number; pending: number }>( - `${applicationConfig.networksSettings.cardano.analyticUrl}history/order/pending`, + `${cardanoNetworkData.analyticUrl}history/order/pending`, { userPkhs: uniq( addresses.map((a) => extractPaymentCred(a, RustModule.CardanoWasm)), diff --git a/src/network/cardano/api/transactionHistory/types/BaseOperation.ts b/src/network/cardano/api/transactionHistory/types/BaseOperation.ts index 1baa82d68..646e44da2 100644 --- a/src/network/cardano/api/transactionHistory/types/BaseOperation.ts +++ b/src/network/cardano/api/transactionHistory/types/BaseOperation.ts @@ -70,7 +70,7 @@ export const mapRawBaseExecutedOperationToBaseExecutedOperation = ( fee: BigInt(rawBO.feeAmount) ? [ { - caption: 'Execution Fee', + caption: 'Honey 🍯', value: new Currency(BigInt(rawBO.feeAmount), networkAsset), }, ] diff --git a/src/network/cardano/api/transactionHistory/types/SwapOperation.ts b/src/network/cardano/api/transactionHistory/types/SwapOperation.ts index 2234db78d..c2cf1cdb4 100644 --- a/src/network/cardano/api/transactionHistory/types/SwapOperation.ts +++ b/src/network/cardano/api/transactionHistory/types/SwapOperation.ts @@ -1,4 +1,4 @@ -import { mkSubject } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/assetClass'; +import { mkSubject } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/assetClass'; import { AmmPool } from '../../../../../common/models/AmmPool'; import { Currency } from '../../../../../common/models/Currency'; @@ -51,7 +51,6 @@ export const mapRawSwapItemToSwapItem: OperationMapper = const { address, base, poolId, minQuote } = item.SwapOrderInfo; const pool = ammPools.find((ap) => { const castedPool: CardanoAmmPool = ap as any; - return ( `${castedPool.pool.id.policyId}.${castedPool.pool.id.name}` === poolId ); diff --git a/src/network/cardano/api/utxos/utxos.ts b/src/network/cardano/api/utxos/utxos.ts index 0bebe1d5e..3013752d3 100644 --- a/src/network/cardano/api/utxos/utxos.ts +++ b/src/network/cardano/api/utxos/utxos.ts @@ -1,5 +1,5 @@ -import { Value } from '@spectrumlabs/cardano-dex-sdk'; -import { TxOut } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/txOut'; +import { Value } from '@teddyswap/cardano-dex-sdk'; +import { TxOut } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/txOut'; import { first, from, diff --git a/src/network/cardano/api/wallet/common/BoxSelector.ts b/src/network/cardano/api/wallet/common/BoxSelector.ts index f7c800484..17502a4fe 100644 --- a/src/network/cardano/api/wallet/common/BoxSelector.ts +++ b/src/network/cardano/api/wallet/common/BoxSelector.ts @@ -4,8 +4,8 @@ import { AdaPolicyId, AssetEntry, Value, -} from '@spectrumlabs/cardano-dex-sdk'; -import { TxOut } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/txOut'; +} from '@teddyswap/cardano-dex-sdk'; +import { TxOut } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/txOut'; interface UtxosByAsset { required: AssetEntry; diff --git a/src/network/cardano/api/wallet/common/Wallet.ts b/src/network/cardano/api/wallet/common/Wallet.ts index de8aa4807..b9bece058 100644 --- a/src/network/cardano/api/wallet/common/Wallet.ts +++ b/src/network/cardano/api/wallet/common/Wallet.ts @@ -5,10 +5,10 @@ import { HexString, Prover, Value, -} from '@spectrumlabs/cardano-dex-sdk'; -import { RawTx } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/tx'; -import { TxOut } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/txOut'; -import { RustModule } from '@spectrumlabs/cardano-dex-sdk/build/main/utils/rustLoader'; +} from '@teddyswap/cardano-dex-sdk'; +import { RawTx } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/tx'; +import { TxOut } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/txOut'; +import { RustModule } from '@teddyswap/cardano-dex-sdk/build/main/utils/rustLoader'; import uniq from 'lodash/uniq'; import { Address } from '../../../../../common/types'; @@ -22,7 +22,6 @@ const isConnectorContext = ( return !!(contextOrError as ConnectorContextApi).signTx; }; -// Todo: Extract to sdk export interface Submitter { readonly submit: (tx: RawTx) => Promise; } diff --git a/src/network/cardano/api/wallet/common/WalletManager.tsx b/src/network/cardano/api/wallet/common/WalletManager.tsx index 168ce4083..8d5f5b7a7 100644 --- a/src/network/cardano/api/wallet/common/WalletManager.tsx +++ b/src/network/cardano/api/wallet/common/WalletManager.tsx @@ -101,7 +101,7 @@ export const createWalletManager = ( description: ( <> Set network to "{networkName}" in your {wallet.id} wallet to - use Spectrum Finance interface + use TeddySwap interface ), }); diff --git a/src/network/cardano/api/wallet/common/old/CardanoWalletContract.ts b/src/network/cardano/api/wallet/common/old/CardanoWalletContract.ts index fea3124ea..eb93e67f6 100644 --- a/src/network/cardano/api/wallet/common/old/CardanoWalletContract.ts +++ b/src/network/cardano/api/wallet/common/old/CardanoWalletContract.ts @@ -1,6 +1,6 @@ -import { HexString, Prover, Value } from '@spectrumlabs/cardano-dex-sdk'; -import { RawTx } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/tx'; -import { TxOut } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/txOut'; +import { HexString, Prover, Value } from '@teddyswap/cardano-dex-sdk'; +import { RawTx } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/tx'; +import { TxOut } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/txOut'; import { ReactNode } from 'react'; import { Observable } from 'rxjs'; diff --git a/src/network/cardano/api/wallet/common/old/makeCardanoWallet.tsx b/src/network/cardano/api/wallet/common/old/makeCardanoWallet.tsx index d699fb714..610bb9e17 100644 --- a/src/network/cardano/api/wallet/common/old/makeCardanoWallet.tsx +++ b/src/network/cardano/api/wallet/common/old/makeCardanoWallet.tsx @@ -8,13 +8,13 @@ import { HexString, RawTxWitnessSet, Value, -} from '@spectrumlabs/cardano-dex-sdk'; +} from '@teddyswap/cardano-dex-sdk'; import { RawTx, RawUnsignedTx, -} from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/tx'; -import { TxOut } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/txOut'; -import { RustModule } from '@spectrumlabs/cardano-dex-sdk/build/main/utils/rustLoader'; +} from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/tx'; +import { TxOut } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/txOut'; +import { RustModule } from '@teddyswap/cardano-dex-sdk/build/main/utils/rustLoader'; import uniq from 'lodash/uniq'; import * as React from 'react'; import { ReactNode } from 'react'; @@ -209,7 +209,6 @@ export const makeCardanoWallet = ({ }), map( (hexes) => - // TODO: Collateral count must depend on Network hexes ?.map((hex) => decodeWasmUtxo(hex, RustModule.CardanoWasm)) .slice(0, 3) || [], diff --git a/src/network/cardano/api/wallet/eternl/eternl.tsx b/src/network/cardano/api/wallet/eternl/eternl.tsx index ec40a0aa4..54035d7bc 100644 --- a/src/network/cardano/api/wallet/eternl/eternl.tsx +++ b/src/network/cardano/api/wallet/eternl/eternl.tsx @@ -15,3 +15,17 @@ export const Eternl = createWallet({ walletSupportedFeatures: { createPool: false }, definition: 'default', }); + +export const EternlMobile = createWallet({ + id: 'EternlMobile', + getConnector: () => window.dAppConnectorBridge as any, + name: 'Eternl Mobile', + extensionLink: + 'https://chrome.google.com/webstore/detail/eternlcc/kmhcihpebfmpgmihbkipmjlmmioameka', + icon: Eternl Logo, + previewIcon: ( + Eternl Logo + ), + walletSupportedFeatures: { createPool: false }, + definition: 'default', +}); diff --git a/src/network/cardano/api/wallet/vespr/vespr.tsx b/src/network/cardano/api/wallet/vespr/vespr.tsx index e027def98..15be14fbd 100644 --- a/src/network/cardano/api/wallet/vespr/vespr.tsx +++ b/src/network/cardano/api/wallet/vespr/vespr.tsx @@ -3,15 +3,14 @@ import { createWallet } from '../common/Wallet'; import VesprLogo from './vespr-icon.svg'; export const Vespr = createWallet({ - id: 'Vespr', - getConnector: () => cardano.nami, + id: 'vespr', + getConnector: () => cardano.vespr, name: 'Vespr', - extensionLink: - 'https://chrome.google.com/webstore/detail/nami/lpfcbjknijpeeillifnkikgncikgfhdo?hl=en', + extensionLink: 'https://vespr.xyz/', icon: ( Nami Logo({ previewIcon: ( Nami Logo({ ), walletSupportedFeatures: { createPool: false }, definition: 'default', - hidden: true, + hidden: false, }); diff --git a/src/network/cardano/api/wallet/wallet.ts b/src/network/cardano/api/wallet/wallet.ts index 928471c6d..e5c084511 100644 --- a/src/network/cardano/api/wallet/wallet.ts +++ b/src/network/cardano/api/wallet/wallet.ts @@ -22,7 +22,7 @@ import { createWalletManager, LocalStorageCacheStrategy, } from './common/WalletManager'; -import { Eternl } from './eternl/eternl'; +import { Eternl, EternlMobile } from './eternl/eternl'; import { Exodus } from './exodus/exodus.tsx'; import { Flint } from './flint/flint.tsx'; import { Gero } from './gero/gero'; @@ -32,7 +32,6 @@ import { Nufi } from './nufi/nufi.tsx'; import { Typhon } from './typhon/typhon.tsx'; import { Vespr } from './vespr/vespr'; import { WalletConnect } from './walletConnect/walletConnect.tsx'; -// import { Yoroi } from './yoroi/yoroi.tsx'; const localStorageCacheStrategy = new LocalStorageCacheStrategy( cardanoNetworkData.walletKey, @@ -45,6 +44,7 @@ const walletStateUpdate$ = new BehaviorSubject( const walletManager = createWalletManager({ availableWallets: [ + EternlMobile, Nami, Eternl, Lace, @@ -53,7 +53,6 @@ const walletManager = createWalletManager({ Nufi, Gero, Typhon, - // Yoroi, Exodus, Vespr, ], diff --git a/src/network/cardano/api/wallet/walletConnect/walletConnect.tsx b/src/network/cardano/api/wallet/walletConnect/walletConnect.tsx index fb6f57be2..43b834849 100644 --- a/src/network/cardano/api/wallet/walletConnect/walletConnect.tsx +++ b/src/network/cardano/api/wallet/walletConnect/walletConnect.tsx @@ -18,8 +18,8 @@ import { decodeWasmUtxo, decodeWasmValue, getLovelace, -} from '@spectrumlabs/cardano-dex-sdk'; -import { RustModule } from '@spectrumlabs/cardano-dex-sdk/build/main/utils/rustLoader'; +} from '@teddyswap/cardano-dex-sdk'; +import { RustModule } from '@teddyswap/cardano-dex-sdk/build/main/utils/rustLoader'; const PROJECT_ID = 'add5d2d2d1b89b17dd9871986a5fe797'; export const WalletConnect = createWallet({ @@ -47,10 +47,6 @@ export const WalletConnect = createWallet({ ); const connector = getActiveConnector(); - // setInterval(() => { - // connector.isConnected(1000).then(console.log) - // }, 1000) - return connector as CardanoBridge.ConnectorAPI; }, getBalance: (ctx) => { diff --git a/src/network/cardano/cardano.ts b/src/network/cardano/cardano.ts index a798b1a3c..a8416f397 100644 --- a/src/network/cardano/cardano.ts +++ b/src/network/cardano/cardano.ts @@ -111,7 +111,6 @@ const makeCardanoNetwork = ( networkContext$, defaultAssets$: defaultTokenAssets$, assetsToImport$: tokenAssetsToImport$, - // TODO: Implement assets fns getDefaultAssetsFor, getImportedAssetsFor: () => of([]), getAssetsToImportFor: () => of([]), diff --git a/src/network/cardano/initialized.ts b/src/network/cardano/initialized.ts index ffa6437a7..6fbf91d4b 100644 --- a/src/network/cardano/initialized.ts +++ b/src/network/cardano/initialized.ts @@ -1,12 +1,13 @@ -import { RustModule } from '@spectrumlabs/cardano-dex-sdk/build/main/utils/rustLoader'; +import { RustModule } from '@teddyswap/cardano-dex-sdk/build/main/utils/rustLoader'; import { BehaviorSubject } from 'rxjs'; import { initializeSettings } from './settings/settings'; +import { initializeDAppBridge } from './utils/initializeDAppBridge'; export const initialized$ = new BehaviorSubject(false); export const initialize = (): void => { - RustModule.load().then(() => { + Promise.all([initializeDAppBridge(), RustModule.load()]).then(() => { initializeSettings(); initialized$.next(true); }); diff --git a/src/network/cardano/settings/settings.ts b/src/network/cardano/settings/settings.ts index b6b0b7751..6fb944382 100644 --- a/src/network/cardano/settings/settings.ts +++ b/src/network/cardano/settings/settings.ts @@ -1,7 +1,7 @@ import { PublicKey } from '@ergolabs/ergo-sdk'; import { user } from '@spectrumlabs/analytics'; -import { pubKeyHashFromAddr } from '@spectrumlabs/cardano-dex-sdk'; -import { RustModule } from '@spectrumlabs/cardano-dex-sdk/build/main/utils/rustLoader'; +import { pubKeyHashFromAddr } from '@teddyswap/cardano-dex-sdk'; +import { RustModule } from '@teddyswap/cardano-dex-sdk/build/main/utils/rustLoader'; import { filter, map, Observable, startWith, zip } from 'rxjs'; import { MIN_NITRO } from '../../../common/constants/erg'; diff --git a/src/network/cardano/utils/cardanoNetworkData.ts b/src/network/cardano/utils/cardanoNetworkData.ts index c06a278c4..a122d9619 100644 --- a/src/network/cardano/utils/cardanoNetworkData.ts +++ b/src/network/cardano/utils/cardanoNetworkData.ts @@ -2,13 +2,12 @@ import { OrderAddrs, OrderAddrsV1Mainnet, OrderAddrsV1Testnet, -} from '@spectrumlabs/cardano-dex-sdk/build/main/amm/scripts'; +} from '@teddyswap/cardano-dex-sdk/build/main/amm/scripts'; import { applicationConfig } from '../../../applicationConfig'; import { localStorageManager } from '../../../common/utils/localStorageManager'; import { SupportedNetworks } from '../../common/Network'; -// TODO: MAKE REFACTORING AFTER MAINNET RELEASE export type CardanoNetworkData = typeof applicationConfig.networksSettings['ergo'] & { readonly settingsKey: string; @@ -16,7 +15,6 @@ export type CardanoNetworkData = readonly addrs: OrderAddrs; }; -// TODO: REWRITE AFTER RELEASE const networkUrl: SupportedNetworks | 'cardano_mainnet' = location.pathname.split('/')[1] as any; const possibleUrl = diff --git a/src/network/cardano/utils/initializeDAppBridge.ts b/src/network/cardano/utils/initializeDAppBridge.ts new file mode 100644 index 000000000..b036614f5 --- /dev/null +++ b/src/network/cardano/utils/initializeDAppBridge.ts @@ -0,0 +1,5 @@ +export const initializeDAppBridge = () => { + return new Promise((resolve) => { + setTimeout(() => resolve(true), 500); + }); +}; diff --git a/src/network/cardano/widgets/OperationSettings/OperationsSettings.tsx b/src/network/cardano/widgets/OperationSettings/OperationsSettings.tsx index d538e4bf9..fe651d163 100644 --- a/src/network/cardano/widgets/OperationSettings/OperationsSettings.tsx +++ b/src/network/cardano/widgets/OperationSettings/OperationsSettings.tsx @@ -1,4 +1,4 @@ -import { swapExFee } from '@spectrumlabs/cardano-dex-sdk'; +import { swapExFee } from '@teddyswap/cardano-dex-sdk'; import { FC } from 'react'; import { Currency } from '../../../../common/models/Currency'; diff --git a/src/network/cardano/widgets/SwapCollapse/SwapCollapse.tsx b/src/network/cardano/widgets/SwapCollapse/SwapCollapse.tsx index 10bb4ca1a..574e8b947 100644 --- a/src/network/cardano/widgets/SwapCollapse/SwapCollapse.tsx +++ b/src/network/cardano/widgets/SwapCollapse/SwapCollapse.tsx @@ -24,7 +24,7 @@ export const SwapCollapse: FC = ({ value }) => { {!!value.pool && ( {isSwapTxInfoLoading ? ( @@ -33,7 +33,11 @@ export const SwapCollapse: FC = ({ value }) => { style={{ height: '22px', maxWidth: '20px' }} /> ) : swapTxInfo?.minTotalFee && swapTxInfo?.maxTotalFee ? ( - `${swapTxInfo.minTotalFee.toString()} - ${swapTxInfo.maxTotalFee.toCurrencyString()}` + `${(Number(swapTxInfo.minTotalFee.toString()) + 1).toFixed( + 2, + )} - ${(Number(swapTxInfo.maxTotalFee.toString()) + 1).toFixed( + 2, + )} ADA` ) : ( '–' )} @@ -103,8 +107,8 @@ export const SwapCollapse: FC = ({ value }) => { {isSwapTxInfoLoading ? ( @@ -154,6 +158,33 @@ export const SwapCollapse: FC = ({ value }) => { } /> + + + {isSwapTxInfoLoading ? ( + + ) : swapTxInfo?.minExFee && swapTxInfo?.maxExFee ? ( + + + + + + 1 ADA + + + ) : ( + '–' + )} + + } + /> + )} diff --git a/src/network/cardano/widgets/SwapConfirmationModal/SwapConfirmationInfo/SwapConfirmationInfo.tsx b/src/network/cardano/widgets/SwapConfirmationModal/SwapConfirmationInfo/SwapConfirmationInfo.tsx index 635cb8f8e..6773fcee8 100644 --- a/src/network/cardano/widgets/SwapConfirmationModal/SwapConfirmationInfo/SwapConfirmationInfo.tsx +++ b/src/network/cardano/widgets/SwapConfirmationModal/SwapConfirmationInfo/SwapConfirmationInfo.tsx @@ -39,11 +39,7 @@ export const SwapConfirmationInfo: FC = ({ - Nitro: - - } + title={Honey 🍯:} value={ {settings.nitro} diff --git a/src/network/cardano/widgets/common/useDepositTxInfo.ts b/src/network/cardano/widgets/common/useDepositTxInfo.ts index 6255b6e49..7c46a9bbd 100644 --- a/src/network/cardano/widgets/common/useDepositTxInfo.ts +++ b/src/network/cardano/widgets/common/useDepositTxInfo.ts @@ -1,5 +1,5 @@ -import { DepositParams } from '@spectrumlabs/cardano-dex-sdk/build/main/amm/interpreters/ammTxBuilder/depositAmmTxBuilder'; -import { Value } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/value'; +import { DepositParams } from '@teddyswap/cardano-dex-sdk/build/main/amm/interpreters/ammTxBuilder/depositAmmTxBuilder'; +import { Value } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/value'; import { useEffect } from 'react'; import { map, Observable, of, publishReplay, refCount, switchMap } from 'rxjs'; diff --git a/src/network/cardano/widgets/common/useRedeemTxInfo.ts b/src/network/cardano/widgets/common/useRedeemTxInfo.ts index 93f3be0ab..2e4a7f7f6 100644 --- a/src/network/cardano/widgets/common/useRedeemTxInfo.ts +++ b/src/network/cardano/widgets/common/useRedeemTxInfo.ts @@ -1,5 +1,5 @@ -import { RedeemParams } from '@spectrumlabs/cardano-dex-sdk'; -import { Value } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/value'; +import { RedeemParams } from '@teddyswap/cardano-dex-sdk'; +import { Value } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/value'; import { useEffect } from 'react'; import { map, Observable, of, publishReplay, refCount, switchMap } from 'rxjs'; diff --git a/src/network/cardano/widgets/common/useSwapTxInfo.ts b/src/network/cardano/widgets/common/useSwapTxInfo.ts index 76488a569..9a46d4d70 100644 --- a/src/network/cardano/widgets/common/useSwapTxInfo.ts +++ b/src/network/cardano/widgets/common/useSwapTxInfo.ts @@ -1,5 +1,5 @@ -import { SwapParams } from '@spectrumlabs/cardano-dex-sdk'; -import { Value } from '@spectrumlabs/cardano-dex-sdk/build/main/cardano/entities/value'; +import { SwapParams } from '@teddyswap/cardano-dex-sdk'; +import { Value } from '@teddyswap/cardano-dex-sdk/build/main/cardano/entities/value'; import { useEffect } from 'react'; import { map, Observable, of, publishReplay, refCount, switchMap } from 'rxjs'; diff --git a/src/network/ergo/api/operations/history/transactionHistory.ts b/src/network/ergo/api/operations/history/transactionHistory.ts index 36393cfc0..aaca0e3d3 100644 --- a/src/network/ergo/api/operations/history/transactionHistory.ts +++ b/src/network/ergo/api/operations/history/transactionHistory.ts @@ -12,7 +12,6 @@ import { takeUntil, } from 'rxjs'; -// import TxHistoryWorker from 'worker-loader!./transactionHistory.worker'; import { Operation } from '../../../../../common/models/Operation'; import { tabClosing$ } from '../../../../../common/streams/tabClosing'; import { Dictionary } from '../../../../../common/utils/Dictionary'; @@ -36,26 +35,10 @@ const TX_HISTORY_CACHE_KEY = 'tx-transactionHistory-cache'; const TX_HISTORY_SYNCING_KEY = 'tx-transactionHistory-syncing'; -// const txHistoryWorker = new TxHistoryWorker(); - const addresses$ = getAddresses().pipe(first(), publishReplay(1), refCount()); let isWorkerActive = false; -// txHistoryWorker.addEventListener( -// 'message', -// ({ data }: MessageEvent) => { -// switch (data.message) { -// case 'syncEnd': -// handleSyncEndMessage(); -// break; -// case 'batch': -// handleBatchMessage(data.payload); -// break; -// } -// }, -// ); - export const sync = (): void => { localStorageManager.set(TX_HISTORY_SYNCING_KEY, true); addToTabQueue(); @@ -68,7 +51,6 @@ tabClosing$.subscribe(() => removeFromTabQueue()); syncProcessTabs$.pipe(takeUntil(tabClosing$)).subscribe(() => { const isSyncing = localStorageManager.get(TX_HISTORY_SYNCING_KEY); const txHistory = localStorageManager.get(TX_HISTORY_CACHE_KEY); - // TODO: FIX STREAM EVENT PRIORITY const tabs = getSyncProcessTabs(); if ( diff --git a/src/network/ergo/api/operations/history/v2/types/BaseOperation.ts b/src/network/ergo/api/operations/history/v2/types/BaseOperation.ts index 09cc7ebb9..80f3a9093 100644 --- a/src/network/ergo/api/operations/history/v2/types/BaseOperation.ts +++ b/src/network/ergo/api/operations/history/v2/types/BaseOperation.ts @@ -76,7 +76,7 @@ export const mapRawBaseExecutedOperationToBaseExecutedOperation = ( fee: (rawBO.feeType ? [ { - caption: 'Execution Fee', + caption: 'Honey 🍯', value: rawBO.feeType === 'spf' ? new Currency(BigInt(rawBO.feeAmount), feeAsset) @@ -101,7 +101,7 @@ export const mapRawSingleBaseExecutedOperationToSingleBaseExecutedOperation = ( fee: (rawBO.feeType ? [ { - caption: 'Execution Fee', + caption: 'Honey 🍯', value: rawBO.feeType === 'spf' ? new Currency(BigInt(rawBO.feeAmount), feeAsset) diff --git a/src/network/ergo/api/wallet/connectedWalletChange.ts b/src/network/ergo/api/wallet/connectedWalletChange.ts index 61ae34252..b5d9d6a68 100644 --- a/src/network/ergo/api/wallet/connectedWalletChange.ts +++ b/src/network/ergo/api/wallet/connectedWalletChange.ts @@ -12,7 +12,6 @@ import { WalletState } from '../../../common/Wallet'; import { ErgoWalletContract } from './common/ErgoWalletContract'; import { selectedWallet$, walletState$ } from './wallet'; -// TODO: RENAME export const connectedWalletChange$: Observable< ErgoWalletContract | undefined > = selectedWallet$.pipe( diff --git a/src/network/ergo/operations/createPool/createCreatePoolTxData.ts b/src/network/ergo/operations/createPool/createCreatePoolTxData.ts index 6054b65c0..6a42c528b 100644 --- a/src/network/ergo/operations/createPool/createCreatePoolTxData.ts +++ b/src/network/ergo/operations/createPool/createCreatePoolTxData.ts @@ -22,7 +22,6 @@ interface CreatePoolOperationCandidateParams { readonly settings: ErgoSettings; readonly utxos: ErgoBox[]; readonly minerFee: Currency; - // TODO: refactor in SDK || or here in frontend repo (operations: swap, redeem, deposit) readonly networkContext: | NetworkContext | { diff --git a/src/network/ergo/operations/deposit/nativeFee/createDepositTxData.ts b/src/network/ergo/operations/deposit/nativeFee/createDepositTxData.ts index 3d6511743..29043cce9 100644 --- a/src/network/ergo/operations/deposit/nativeFee/createDepositTxData.ts +++ b/src/network/ergo/operations/deposit/nativeFee/createDepositTxData.ts @@ -24,7 +24,6 @@ interface DepositOperationCandidateParams { readonly utxos: ErgoBox[]; readonly minerFee: Currency; readonly minExFee: Currency; - // TODO: refactor in SDK || or here in frontend repo (operations: swap, redeem, deposit) readonly networkContext: | NetworkContext | { diff --git a/src/network/ergo/operations/deposit/nativeFee/ergopayDeposit.ts b/src/network/ergo/operations/deposit/nativeFee/ergopayDeposit.ts index 3824ffcbc..c2986b79f 100644 --- a/src/network/ergo/operations/deposit/nativeFee/ergopayDeposit.ts +++ b/src/network/ergo/operations/deposit/nativeFee/ergopayDeposit.ts @@ -25,13 +25,6 @@ export const ergopayDeposit = ( ), switchMap(({ txRequest, additionalData }) => submitErgopayTx(txRequest, { - // analyticData: panalytics.buildErgopaySignedDepositEvent({ - // x, - // xAsset: x.asset, - // y, - // yAsset: y.asset, - // pool, - // }), p2pkaddress: additionalData.p2pkaddress, message: ergoPayMessageManager.deposit({ pool: additionalData.pool, diff --git a/src/network/ergo/operations/deposit/spfFee/createDepositTxData.ts b/src/network/ergo/operations/deposit/spfFee/createDepositTxData.ts index 79e40021a..70f5506b2 100644 --- a/src/network/ergo/operations/deposit/spfFee/createDepositTxData.ts +++ b/src/network/ergo/operations/deposit/spfFee/createDepositTxData.ts @@ -28,7 +28,6 @@ interface DepositOperationCandidateParams { readonly utxos: ErgoBox[]; readonly minerFee: Currency; readonly minExFee: Currency; - // TODO: refactor in SDK || or here in frontend repo (operations: swap, redeem, deposit) readonly networkContext: | NetworkContext | { diff --git a/src/network/ergo/operations/deposit/spfFee/ergopayDeposit.ts b/src/network/ergo/operations/deposit/spfFee/ergopayDeposit.ts index 47f3380e7..6023f6408 100644 --- a/src/network/ergo/operations/deposit/spfFee/ergopayDeposit.ts +++ b/src/network/ergo/operations/deposit/spfFee/ergopayDeposit.ts @@ -1,7 +1,6 @@ import { from as fromPromise, map, Observable, switchMap, timeout } from 'rxjs'; import { applicationConfig } from '../../../../../applicationConfig'; -// import { panalytics } from '../../../../../common/analytics'; import { Currency } from '../../../../../common/models/Currency'; import { TxId } from '../../../../../common/types'; import { ErgoAmmPool } from '../../../api/ammPools/ErgoAmmPool'; @@ -23,13 +22,6 @@ export const ergopayDeposit = ( ), switchMap(({ txRequest, additionalData }) => submitErgopayTx(txRequest, { - // analyticData: panalytics.buildErgopaySignedDepositEvent({ - // x, - // xAsset: x.asset, - // y, - // yAsset: y.asset, - // pool, - // }), p2pkaddress: additionalData.p2pkaddress, message: ergoPayMessageManager.deposit({ pool: additionalData.pool, diff --git a/src/network/ergo/operations/redeem/ergopayRedeem.ts b/src/network/ergo/operations/redeem/ergopayRedeem.ts index befde1df0..aeda09373 100644 --- a/src/network/ergo/operations/redeem/ergopayRedeem.ts +++ b/src/network/ergo/operations/redeem/ergopayRedeem.ts @@ -13,15 +13,13 @@ export const ergoPayRedeem = ( lp: Currency, x: Currency, y: Currency, - // percent: number, ): Observable => - settings$.pipe(first()).pipe( - switchMap( - ({ executionFeeAsset }) => + settings$ + .pipe(first()) + .pipe( + switchMap(({ executionFeeAsset }) => executionFeeAsset?.id === feeAsset.id ? spfErgoPayRedeem(pool, lp, x, y) : nativeErgoPayRedeem(pool, lp, x, y), - // ? spfErgoPayRedeem(pool, lp, x, y, percent) - // : nativeErgoPayRedeem(pool, lp, x, y, percent), - ), - ); + ), + ); diff --git a/src/network/ergo/operations/redeem/nativeFee/createRedeemTxData.ts b/src/network/ergo/operations/redeem/nativeFee/createRedeemTxData.ts index 43c64d9b6..510b0c638 100644 --- a/src/network/ergo/operations/redeem/nativeFee/createRedeemTxData.ts +++ b/src/network/ergo/operations/redeem/nativeFee/createRedeemTxData.ts @@ -21,7 +21,6 @@ interface RedeemOperationCandidateParams { readonly lp: Currency; readonly settings: ErgoSettings; readonly utxos: ErgoBox[]; - // TODO: refactor in SDK || or here in frontend repo (operations: swap, redeem, deposit) readonly networkContext: | NetworkContext | { diff --git a/src/network/ergo/operations/redeem/nativeFee/ergopayRedeem.ts b/src/network/ergo/operations/redeem/nativeFee/ergopayRedeem.ts index 95253c155..701ccdb99 100644 --- a/src/network/ergo/operations/redeem/nativeFee/ergopayRedeem.ts +++ b/src/network/ergo/operations/redeem/nativeFee/ergopayRedeem.ts @@ -1,7 +1,6 @@ import { from as fromPromise, map, Observable, switchMap, timeout } from 'rxjs'; import { applicationConfig } from '../../../../../applicationConfig'; -// import { panalytics } from '../../../../../common/analytics'; import { Currency } from '../../../../../common/models/Currency'; import { TxId } from '../../../../../common/types'; import { ErgoAmmPool } from '../../../api/ammPools/ErgoAmmPool'; @@ -15,7 +14,6 @@ export const ergopayRedeem = ( lp: Currency, x: Currency, y: Currency, - // percent: number, ): Observable => createRedeemTxData(pool, lp, x, y).pipe( switchMap(([redeemParams, txContext, additionalData]) => @@ -25,15 +23,6 @@ export const ergopayRedeem = ( ), switchMap(({ txRequest, additionalData }) => submitErgopayTx(txRequest, { - // analyticData: panalytics.buildErgopaySignedRedeemEvent( - // { - // xAmount: x, - // yAmount: y, - // lpAmount: lp, - // percent, - // }, - // pool, - // ), p2pkaddress: additionalData.p2pkaddress, message: ergoPayMessageManager.redeem({ pool: additionalData.pool, diff --git a/src/network/ergo/operations/redeem/spfFee/createRedeemTxData.ts b/src/network/ergo/operations/redeem/spfFee/createRedeemTxData.ts index 3db245fd5..6b1b16605 100644 --- a/src/network/ergo/operations/redeem/spfFee/createRedeemTxData.ts +++ b/src/network/ergo/operations/redeem/spfFee/createRedeemTxData.ts @@ -25,7 +25,6 @@ interface RedeemOperationCandidateParams { readonly lp: Currency; readonly settings: ErgoSettings; readonly utxos: ErgoBox[]; - // TODO: refactor in SDK || or here in frontend repo (operations: swap, redeem, deposit) readonly networkContext: | NetworkContext | { diff --git a/src/network/ergo/operations/redeem/spfFee/ergopayRedeem.ts b/src/network/ergo/operations/redeem/spfFee/ergopayRedeem.ts index 4fef9fb2f..267dd5362 100644 --- a/src/network/ergo/operations/redeem/spfFee/ergopayRedeem.ts +++ b/src/network/ergo/operations/redeem/spfFee/ergopayRedeem.ts @@ -1,7 +1,6 @@ import { from as fromPromise, map, Observable, switchMap, timeout } from 'rxjs'; import { applicationConfig } from '../../../../../applicationConfig'; -// import { panalytics } from '../../../../../common/analytics'; import { Currency } from '../../../../../common/models/Currency'; import { TxId } from '../../../../../common/types'; import { ErgoAmmPool } from '../../../api/ammPools/ErgoAmmPool'; @@ -15,7 +14,6 @@ export const ergopayRedeem = ( lp: Currency, x: Currency, y: Currency, - // percent: number, ): Observable => createRedeemTxData(pool, lp, x, y).pipe( switchMap(([redeemParams, txContext, additionalData]) => @@ -25,15 +23,6 @@ export const ergopayRedeem = ( ), switchMap(({ txRequest, additionalData }) => submitErgopayTx(txRequest, { - // analyticData: panalytics.buildErgopaySignedRedeemEvent( - // { - // xAmount: x, - // yAmount: y, - // lpAmount: lp, - // percent, - // }, - // pool, - // ), p2pkaddress: additionalData.p2pkaddress, message: ergoPayMessageManager.redeem({ pool: additionalData.pool, diff --git a/src/network/ergo/operations/refund/createRefundTxData.ts b/src/network/ergo/operations/refund/createRefundTxData.ts index afb6ef394..f59d25717 100644 --- a/src/network/ergo/operations/refund/createRefundTxData.ts +++ b/src/network/ergo/operations/refund/createRefundTxData.ts @@ -50,7 +50,6 @@ export const createRefundTxData = ( const txContext = getTxContext( inputs, // @ts-ignore - // TODO: refactor in SDK || or here in frontend repo (operations: swap, redeem, deposit, refund) networkContext as NetworkContext, settings.address!, minerFee.amount, diff --git a/src/network/ergo/operations/swap/nativeFee/createSwapTxData.ts b/src/network/ergo/operations/swap/nativeFee/createSwapTxData.ts index 8f2200e4b..cdbdae34e 100644 --- a/src/network/ergo/operations/swap/nativeFee/createSwapTxData.ts +++ b/src/network/ergo/operations/swap/nativeFee/createSwapTxData.ts @@ -29,7 +29,6 @@ interface SwapOperationCandidateParams { readonly utxos: ErgoBox[]; readonly minerFee: Currency; readonly minExFee: Currency; - // TODO: refactor in SDK || or here in frontend repo (operations: swap, redeem, deposit, refund) readonly networkContext: | NetworkContext | { diff --git a/src/network/ergo/operations/swap/nativeFee/ergopaySwap.ts b/src/network/ergo/operations/swap/nativeFee/ergopaySwap.ts index 2cb69ff70..c33e7a661 100644 --- a/src/network/ergo/operations/swap/nativeFee/ergopaySwap.ts +++ b/src/network/ergo/operations/swap/nativeFee/ergopaySwap.ts @@ -8,7 +8,6 @@ import { } from 'rxjs'; import { applicationConfig } from '../../../../../applicationConfig'; -// import { panalytics } from '../../../../../common/analytics'; import { Currency } from '../../../../../common/models/Currency'; import { captureOperationError } from '../../../../../common/services/ErrorLogs'; import { TxId } from '../../../../../common/types'; @@ -32,13 +31,6 @@ export const ergoPaySwap = ( switchMap(({ txRequest, additionalData }) => submitErgopayTx(txRequest, { p2pkaddress: additionalData.p2pkaddress, - // analyticData: panalytics.buildErgopaySignedSwapEvent({ - // fromAsset: from.asset, - // fromAmount: from, - // toAmount: to, - // toAsset: to.asset, - // pool: pool, - // }), message: ergoPayMessageManager.swap({ from, to, diff --git a/src/network/ergo/operations/swap/spfFee/createSwapTxData.ts b/src/network/ergo/operations/swap/spfFee/createSwapTxData.ts index e66b539bc..e81579f7b 100644 --- a/src/network/ergo/operations/swap/spfFee/createSwapTxData.ts +++ b/src/network/ergo/operations/swap/spfFee/createSwapTxData.ts @@ -31,7 +31,6 @@ interface SwapOperationCandidateParams { readonly utxos: ErgoBox[]; readonly minerFee: Currency; readonly minExFee: Currency; - // TODO: refactor in SDK || or here in frontend repo (operations: swap, redeem, deposit, refund) readonly networkContext: | NetworkContext | { diff --git a/src/network/ergo/operations/swap/spfFee/ergopaySwap.ts b/src/network/ergo/operations/swap/spfFee/ergopaySwap.ts index 156813385..8e7c8e362 100644 --- a/src/network/ergo/operations/swap/spfFee/ergopaySwap.ts +++ b/src/network/ergo/operations/swap/spfFee/ergopaySwap.ts @@ -8,7 +8,6 @@ import { } from 'rxjs'; import { applicationConfig } from '../../../../../applicationConfig'; -// import { panalytics } from '../../../../../common/analytics'; import { Currency } from '../../../../../common/models/Currency'; import { captureOperationError } from '../../../../../common/services/ErrorLogs'; import { TxId } from '../../../../../common/types'; @@ -32,13 +31,6 @@ export const ergoPaySwap = ( switchMap(({ txRequest, additionalData }) => submitErgopayTx(txRequest, { p2pkaddress: additionalData.p2pkaddress, - // analyticData: panalytics.buildErgopaySignedSwapEvent({ - // fromAsset: from.asset, - // fromAmount: from, - // toAmount: to, - // toAsset: to.asset, - // pool: pool, - // }), message: ergoPayMessageManager.swap({ from, to, diff --git a/src/network/ergo/settings/totalFees.ts b/src/network/ergo/settings/totalFees.ts index 66891ea19..7e31e6e31 100644 --- a/src/network/ergo/settings/totalFees.ts +++ b/src/network/ergo/settings/totalFees.ts @@ -7,21 +7,17 @@ import { networkAsset } from '../api/networkAsset/networkAsset'; import { maxExFee$, minExFee$ } from './executionFee'; import { minerFee$, useMinerFee } from './minerFee'; -// TODO: REMOVE TOTAL FEES export const minTotalFee$ = combineLatest([minerFee$, minExFee$]).pipe( map(([minerFee]) => calculateTotalFee([minerFee], networkAsset)), publishReplay(1), refCount(), ); - -// TODO: REMOVE TOTAL FEES export const maxTotalFee$ = combineLatest([minerFee$, maxExFee$]).pipe( map(([minerFee]) => calculateTotalFee([minerFee], networkAsset)), publishReplay(1), refCount(), ); -// TODO: REMOVE TOTAL FEES export const useMinTotalFee = (): Currency => { const minerFee = useMinerFee(); diff --git a/src/network/ergo/widgets/DepositOpenWallet/DepositOpenWallet.tsx b/src/network/ergo/widgets/DepositOpenWallet/DepositOpenWallet.tsx index cb5ec3251..6c66f6fb3 100644 --- a/src/network/ergo/widgets/DepositOpenWallet/DepositOpenWallet.tsx +++ b/src/network/ergo/widgets/DepositOpenWallet/DepositOpenWallet.tsx @@ -4,7 +4,6 @@ import { FC, useState } from 'react'; import { isMobile } from 'react-device-detect'; import { first } from 'rxjs'; -// import { panalytics } from '../../../../common/analytics'; import { TxId } from '../../../../common/types'; import { AddLiquidityFormModel } from '../../../../components/AddLiquidityForm/AddLiquidityFormModel'; import { FormPairSection } from '../../../../components/common/FormView/FormPairSection/FormPairSection'; diff --git a/src/network/ergo/widgets/ErgoPayModal/ErgoPayTabPaneContent/ErgoPayTabPaneContent.tsx b/src/network/ergo/widgets/ErgoPayModal/ErgoPayTabPaneContent/ErgoPayTabPaneContent.tsx index 1d6fd21ab..e3b02beea 100644 --- a/src/network/ergo/widgets/ErgoPayModal/ErgoPayTabPaneContent/ErgoPayTabPaneContent.tsx +++ b/src/network/ergo/widgets/ErgoPayModal/ErgoPayTabPaneContent/ErgoPayTabPaneContent.tsx @@ -2,7 +2,6 @@ import { useDevice } from '@ergolabs/ui-kit'; import { FC, useEffect } from 'react'; import { of } from 'rxjs'; -// import { panalytics } from '../../../../../common/analytics'; import { useObservable } from '../../../../../common/hooks/useObservable'; import { getErgopayAddresses } from '../../../api/ergopay/getErgopayAddresses'; import { getErgopayRequestId } from '../../../api/ergopay/getErgopayRequestId'; @@ -36,9 +35,7 @@ export const ErgoPayTabPaneContent: FC = ({ close }) => { if (loadingAddresses === false && addresses?.[0]) { setErgopayAddress(addresses[0]); patchSettings({ ergopay: true }); - connectWallet(ErgopayWallet).subscribe(() => { - // panalytics.connectWallet(ErgopayWallet.name); - }); + connectWallet(ErgopayWallet).subscribe(() => {}); close(); } }, [loadingAddresses]); diff --git a/src/network/ergo/widgets/RedeemOpenWallet/RedeemOpenWallet.tsx b/src/network/ergo/widgets/RedeemOpenWallet/RedeemOpenWallet.tsx index b81c8631a..abfeee210 100644 --- a/src/network/ergo/widgets/RedeemOpenWallet/RedeemOpenWallet.tsx +++ b/src/network/ergo/widgets/RedeemOpenWallet/RedeemOpenWallet.tsx @@ -4,7 +4,6 @@ import { FC, useState } from 'react'; import { isMobile } from 'react-device-detect'; import { first } from 'rxjs'; -// import { panalytics } from '../../../../common/analytics'; import { TxId } from '../../../../common/types'; import { FormPairSection } from '../../../../components/common/FormView/FormPairSection/FormPairSection'; import { PageSection } from '../../../../components/Page/PageSection/PageSection'; @@ -29,13 +28,7 @@ export const RedeemOpenWallet: FC = ({ const redeemOperation = async () => { setLoading(true); - ergoPayRedeem( - pool, - value.lpAmount, - value.xAmount, - value.yAmount, - // value.percent, - ) + ergoPayRedeem(pool, value.lpAmount, value.xAmount, value.yAmount) .pipe(first()) .subscribe({ next: (txId) => { diff --git a/src/network/ergo/widgets/SwapCollapse/SwapCollapse.tsx b/src/network/ergo/widgets/SwapCollapse/SwapCollapse.tsx index 277b0c3d3..41bfdf623 100644 --- a/src/network/ergo/widgets/SwapCollapse/SwapCollapse.tsx +++ b/src/network/ergo/widgets/SwapCollapse/SwapCollapse.tsx @@ -101,17 +101,13 @@ export const SwapCollapse: FC = ({ value }) => { tooltip={ - - Min Execution Fee:{' '} - + Min Honey 🍯: {minExFee.toCurrencyString()} - - Max Execution Fee:{' '} - + Max Honey 🍯: {maxExFee.toCurrencyString()} diff --git a/src/network/ergo/widgets/SwapConfirmationModal/SwapConfirmationInfo/SwapConfirmationInfo.tsx b/src/network/ergo/widgets/SwapConfirmationModal/SwapConfirmationInfo/SwapConfirmationInfo.tsx index c6ba6b3cf..b15018f76 100644 --- a/src/network/ergo/widgets/SwapConfirmationModal/SwapConfirmationInfo/SwapConfirmationInfo.tsx +++ b/src/network/ergo/widgets/SwapConfirmationModal/SwapConfirmationInfo/SwapConfirmationInfo.tsx @@ -70,11 +70,7 @@ export const SwapConfirmationInfo: FC = ({ - Nitro: - - } + title={Honey 🍯} value={ {nitro} diff --git a/src/network/ergo/widgets/SwapOpenWallet/SwapOpenWallet.tsx b/src/network/ergo/widgets/SwapOpenWallet/SwapOpenWallet.tsx index 20f5a1edb..5eb906d67 100644 --- a/src/network/ergo/widgets/SwapOpenWallet/SwapOpenWallet.tsx +++ b/src/network/ergo/widgets/SwapOpenWallet/SwapOpenWallet.tsx @@ -4,7 +4,6 @@ import { FC, useState } from 'react'; import { isMobile } from 'react-device-detect'; import { first } from 'rxjs'; -// import { panalytics } from '../../../../common/analytics'; import { TxId } from '../../../../common/types'; import { CurrencyPreview } from '../../../../components/CurrencyPreview/CurrencyPreview'; import { SwapFormModel } from '../../../../pages/Swap/SwapFormModel'; diff --git a/src/pages/AddLiquidity/AddLiquidity.tsx b/src/pages/AddLiquidity/AddLiquidity.tsx index 7620afa35..d96ad1468 100644 --- a/src/pages/AddLiquidity/AddLiquidity.tsx +++ b/src/pages/AddLiquidity/AddLiquidity.tsx @@ -1,7 +1,6 @@ import { PoolId } from '@ergolabs/ergo-dex-sdk'; import { Flex, Form, useForm } from '@ergolabs/ui-kit'; import { Trans } from '@lingui/macro'; -import { ElementLocation } from '@spectrumlabs/analytics'; import { FC } from 'react'; import { useParams } from 'react-router'; import { useNavigate } from 'react-router-dom'; @@ -37,11 +36,7 @@ export const AddLiquidity: FC = () => { backTo="../../../liquidity" padding={4} > - + {({ value }) => diff --git a/src/pages/CreatePool/CreatePool.tsx b/src/pages/CreatePool/CreatePool.tsx index 17c4f1ee4..024377843 100644 --- a/src/pages/CreatePool/CreatePool.tsx +++ b/src/pages/CreatePool/CreatePool.tsx @@ -1,6 +1,5 @@ import { Animation, Flex, Form, FormGroup, useForm } from '@ergolabs/ui-kit'; import { t, Trans } from '@lingui/macro'; -import { ElementLocation, ElementName } from '@spectrumlabs/analytics'; import { FC, useMemo, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { BehaviorSubject, first, map, of, skip, switchMap } from 'rxjs'; @@ -160,9 +159,6 @@ export const CreatePool: FC = () => { createPool(value as Required) .pipe(first()) .subscribe(() => navigate('../../../liquidity')); - // fireOperationAnalyticsEvent('Deposit Form Submit', (ctx) => - // mapToDepositAnalyticsProps(value, ctx), - // ); }; useSubscription( @@ -300,7 +296,6 @@ export const CreatePool: FC = () => { onSubmit={createPoolAction} actionCaption={t`Create pool`} validators={validators} - traceFormLocation={ElementLocation.createPoolForm} > @@ -317,24 +312,10 @@ export const CreatePool: FC = () => { > - + - +
@@ -393,20 +374,12 @@ export const CreatePool: FC = () => { tokenName="xAsset" amountName="x" readonly="asset" - trace={{ - element_name: ElementName.tokenX, - element_location: ElementLocation.createPoolForm, - }} /> diff --git a/src/pages/Dashboard/AreaChart/AreaChart.module.less b/src/pages/Dashboard/AreaChart/AreaChart.module.less new file mode 100644 index 000000000..b35b5708a --- /dev/null +++ b/src/pages/Dashboard/AreaChart/AreaChart.module.less @@ -0,0 +1,29 @@ +@import "../../../assets/styles/variables/general.less"; + + +.chartData { + // position: absolute; + // top: 10px; + // left: 20px; + // padding: 20px; + padding: 10px 20px 0; + color: #fff; + font-weight: 500; + + .title { + .mixTitleBox; + font-size: 14px; + } + + .description { + .mixTitleBox; + font-size: 14px; + } + + .thisWeekData { + .mixSubTitleBox; + color: #0FC43B; + font-size: 12px; + } +} + diff --git a/src/pages/Dashboard/AreaChart/AreaChart.tsx b/src/pages/Dashboard/AreaChart/AreaChart.tsx new file mode 100644 index 000000000..cb1493cf1 --- /dev/null +++ b/src/pages/Dashboard/AreaChart/AreaChart.tsx @@ -0,0 +1,182 @@ +import { + CategoryScale, + Chart as ChartJS, + Filler, + Legend, + LinearScale, + LineElement, + PointElement, + Title, + Tooltip, +} from 'chart.js'; +import { ReactNode } from 'react'; +import { Line } from 'react-chartjs-2'; +import styled from 'styled-components'; + +import { LeftTextWithRightSunText } from '../LeftTextWithRightSunText/LeftTextWithRightSunText'; +import styles from './AreaChart.module.less'; + +ChartJS.register( + CategoryScale, + LinearScale, + PointElement, + LineElement, + Title, + Tooltip, + Filler, + Legend, +); + +const createGradient = (ctx, area) => { + const gradient = ctx.createLinearGradient(0, area.bottom, 0, area.top); + gradient.addColorStop(0, 'rgba(38, 138, 255, 0.10)'); // End color + gradient.addColorStop(1, '#268AFF'); // Start color + return gradient; +}; + +const data = { + labels: [ + '09/22', + '09/23', + '09/24', + '09/25', + '09/26', + '09/27', + '09/28', + '09/29', + '09/30', + ], + datasets: [ + { + fill: true, + backgroundColor: (context) => { + const chart = context.chart; + const { ctx, chartArea } = chart; + + if (!chartArea) { + // This case happens on initial chart load + return null; + } + return createGradient(ctx, chartArea); + }, + borderColor: '#268AFF', + tension: 0.1, // Uncommented for smooth curves + }, + ], +}; + +const options = { + responsive: true, + maintainAspectRatio: false, + scales: { + y: { + position: 'right' as const, // Position the y-axis on the right side + ticks: { + padding: 15, // Adjust padding for x-axis labels + color: 'rgba(255, 255, 255, 0.6)', // Color for y-axis labels + }, + grid: { + display: false, // Hide the grid lines for y-axis + }, + }, + x: { + ticks: { + padding: 15, // Adjust padding for x-axis labels + color: 'rgba(255, 255, 255, 0.6)', // Color for x-axis labels + maxTicksLimit: 8, + }, + grid: { + display: false, // Hide the grid lines for x-axis + }, + }, + }, + plugins: { + legend: { + display: false, // Hide legend by default + }, + }, + elements: { + line: { + borderColor: 'transparent', // Uncommented to remove stroke for area chart effect + }, + point: { + backgroundColor: 'rgba(93, 104, 104, 0.5)', // Adjusted for area chart fill + radius: 2, + }, + }, +}; + +const AreaChartContainer = styled.div<{ chartHeight?: string }>` + height: ${(props) => props.chartHeight ?? '100%'}; + position: relative; + width: 100%; + margin: 0 auto; +`; + +type AreaChartProps = { + topLeftAndRightComponent?: { + left: { title: string }; + right: { title: string; subTitle: string }; + }; + topLeftComponentData?: { + title: string; + subTitle: string; + performanceSummary: ReactNode; + }; + chartProps?: { width?: string | number; height?: string | number }; + horizontalLabels: string[]; + verticalData: { + label: string; + data: number[]; + }; +}; + +export const AreaChart = ({ + topLeftComponentData, + topLeftAndRightComponent, + chartProps, + horizontalLabels, + verticalData, +}: AreaChartProps) => { + return ( +
+ {topLeftAndRightComponent && ( + + )} + + {/* Chart left component Data */} + {!!topLeftComponentData && ( +
+
{topLeftComponentData.title}
+
+ {topLeftComponentData.subTitle} +
+
+ {topLeftComponentData?.performanceSummary} +
+
+ )} + + + + +
+ ); +}; diff --git a/src/pages/Dashboard/AreaChart/LoadingChart.module.less b/src/pages/Dashboard/AreaChart/LoadingChart.module.less new file mode 100644 index 000000000..258ad4a3f --- /dev/null +++ b/src/pages/Dashboard/AreaChart/LoadingChart.module.less @@ -0,0 +1,61 @@ +@import "../../../assets/styles/variables/general.less"; + +.loadingChart { + padding: 10px 20px 0; + + .title { + .mixTitleBox; + font-size: 14px; + } + + .loadingValue { + width: 100%; + height: 30px; + display: flex; + align-items: center; + justify-content: center; + .lineLoading { + margin: 0; + height: 22px; + width: 100%; + background: linear-gradient(90deg, var(--teddy-secondary-color) 25%, var(--teddy-secondary-text-dark) 50%, var(--teddy-secondary-color) 75%); + background-size: 200% 100%; + animation: loadingAnimation 1.5s infinite linear; + } + } + + .loadingContainer { + display: flex; + width: 100%; + height: 260px; + align-items: center; + justify-content: center; + + .loader { + + animation: spin 1.5s linear infinite; + @keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } + } + border: 16px solid var(--teddy-secondary-text-dark); + width: 150px; + height: 150px; + border-radius: 50%; + border-right-color: transparent; + } + } +} + +@keyframes loadingAnimation { + 0% { + background-position: 100% 0; + } + 100% { + background-position: -100% 0; + } +} diff --git a/src/pages/Dashboard/AreaChart/LoadingChart.tsx b/src/pages/Dashboard/AreaChart/LoadingChart.tsx new file mode 100644 index 000000000..a66b7ea82 --- /dev/null +++ b/src/pages/Dashboard/AreaChart/LoadingChart.tsx @@ -0,0 +1,21 @@ +import styles from './LoadingChart.module.less'; + +type LoadingChartProps = { + title: string; +}; + +export default function LoadingChart(props: LoadingChartProps) { + const { title } = props; + + return ( +
+

{title}

+
+

+

+
+
+
+
+ ); +} diff --git a/src/pages/Dashboard/BatchersCard/BachersCard.module.less b/src/pages/Dashboard/BatchersCard/BachersCard.module.less new file mode 100644 index 000000000..b6a6e394c --- /dev/null +++ b/src/pages/Dashboard/BatchersCard/BachersCard.module.less @@ -0,0 +1,61 @@ +@import "../../../assets/styles/variables/general.less"; + +.singleItem { + display: flex; + gap: 8px; + // align-items: center; + color: var(--teddy-primary-text); + + .image { + // width: 100%; + // max-width: 36px; + height: auto; + } + + .rightSection { + + .mixTitleBox; + font-size: 14px; + + .subTitle { + .mixSubTitleBox; + font-size: 12px; + } + } +} + +.batchersCard { + background: var(--teddy-box-color); + border-radius: 18px; + color: #fff; + + .bottomSection { + padding: 0px 20px 20px 20px; + display: grid; + grid-template-columns: 1fr; + gap: 1rem; + justify-content: space-between; + align-items: center; + + .itemsList { + display: flex; + flex-direction: column; + gap: 8px; + } + + @media only screen and (min-width: 480px) { + grid-template-columns: 1fr 1fr; + } + } + + .btnList { + display: flex; + flex-direction: column; + gap: 12px; + .btnPrimary { + .mixBtn; + font-size: 14px; + height: 36px; + } + } +} \ No newline at end of file diff --git a/src/pages/Dashboard/BatchersCard/BatchersCard.tsx b/src/pages/Dashboard/BatchersCard/BatchersCard.tsx new file mode 100644 index 000000000..c51fea378 --- /dev/null +++ b/src/pages/Dashboard/BatchersCard/BatchersCard.tsx @@ -0,0 +1,70 @@ +import { ElementType } from 'react'; + +import { ReactComponent as MilitaryTech } from '../../../assets/icons/icon-military-tech.svg'; +import { ReactComponent as SunBlue } from '../../../assets/icons/icon-sun-blue.svg'; +import { ReactComponent as WorldBlue } from '../../../assets/icons/icon-world-blue.svg'; +import { LeftTextWithRightSunText } from '../LeftTextWithRightSunText/LeftTextWithRightSunText'; +import styles from './BachersCard.module.less'; + +type SingleItemProps = { + title: string; + subTitle: string; + icon: { + element: ElementType; + width: number; + height: number; + }; +}; + +const SingleItem = ({ title, subTitle, icon }: SingleItemProps) => { + const IconComponent = icon.element; + return ( +
+ +
+
{title}
+
{subTitle}
+
+
+ ); +}; + +export const BatchersCard = () => { + return ( +
+ +
+
+ + + +
+
+ + + +
+
+
+ ); +}; diff --git a/src/pages/Dashboard/CoinDetailsCard/CoinDetailsCard.module.less b/src/pages/Dashboard/CoinDetailsCard/CoinDetailsCard.module.less new file mode 100644 index 000000000..e0c5e0b24 --- /dev/null +++ b/src/pages/Dashboard/CoinDetailsCard/CoinDetailsCard.module.less @@ -0,0 +1,94 @@ +@import "../../../assets/styles/variables/general.less"; + +.coinDetailsCard { + background: var(--teddy-box-color); + border-radius: 18px; + padding: 20px; + color: var(--teddy-primary-text); + display: grid; + grid-template-columns: 1fr ; + gap: 2rem; + + @media only screen and (min-width: 480px) { + grid-template-columns: 1fr 1fr; + } + + .left { + .coinWithTitle { + display: flex; + align-items: center; + gap: 8px; + } + + .coinImage { + width: 36px; + height: 36px; + border-radius: 50%; + } + + .title { + .mixTitleBox; + } + + .leftBottom { + margin-top: 2rem; + + .subTitle { + .mixSubTitleBox; + } + + // progressbar styles + .progressbarContainer { + .progressbarTopText { + display: flex; + justify-content: space-between; + align-items: flex-end; + + .sunImage { + width: 15px; + height: auto + } + + .title { + .mixTitleBox; + } + + + .subTitle{ + .mixSubTitleBox; + } + } + + .progressBarBG { + height: 70px; + background: var(--teddy-secondary-color); + border-radius: 9px; + position: relative; + overflow: hidden; + margin-top: 4px; + .progressBarProgress { + position: absolute; + top: 0; + left: 0; + width: 80%; + height: 100%; + background: linear-gradient(0deg, #1882FF 0%, #36EBCA 100%); + } + } + } + } + } + + .right { + .subTitle { + .mixSubTitleBox; + } + + .title { + .mixTitleBox; + } + } + + + +} \ No newline at end of file diff --git a/src/pages/Dashboard/CoinDetailsCard/CoinDetailsCard.tsx b/src/pages/Dashboard/CoinDetailsCard/CoinDetailsCard.tsx new file mode 100644 index 000000000..4c062e7d1 --- /dev/null +++ b/src/pages/Dashboard/CoinDetailsCard/CoinDetailsCard.tsx @@ -0,0 +1,65 @@ +import { Flex } from '@ergolabs/ui-kit'; + +import WhiteSun from '../../../assets/icons/icon-white-sun.svg'; +import { TOKEN_TEDY } from '../../../utils/images'; +import styles from './CoinDetailsCard.module.less'; + +export const CoinDetailsCard = () => { + return ( +
+
+
+ {'coin'} +
TEDY Token
+
+
+
1 week EPS:
+ + {/* Progressbar */} +
+ {/* progressbar top text */} +
+ + shite sun +
₳0.003412
+
+
ATH
+
+ {/* actual progress bar */} +
+
+
+
+
+
+ +
+
Max Supply:
+
5,000,000,000 TEDY
+
+ +
+
Public Allocation:
+
85%
+
+ +
+
Earnings Per Share All Time:
+
0.034 ADA / 1 TEDY
+
+
+
+ ); +}; diff --git a/src/pages/Dashboard/Dashboard.module.less b/src/pages/Dashboard/Dashboard.module.less new file mode 100644 index 000000000..07a4dc447 --- /dev/null +++ b/src/pages/Dashboard/Dashboard.module.less @@ -0,0 +1,69 @@ +.mainContainer { + padding: 0 1rem; + + .container { + max-width: 1400px; + margin: auto; + display: grid; + grid-template-columns: 1fr; + gap: 2rem; + + /* @media only screen and (min-width: 1200px) { + grid-template-columns: 1fr 338px; + } */ + } + + .leftSideContainer { + display: flex; + flex-direction: column; + gap: 2rem; + } + + .topChartsContainer { + display: grid; + grid-template-columns: 1fr; + gap: 2rem; + + @media only screen and (min-width: 768px) { + grid-template-columns: 1fr 1fr; + } + } + + .chart { + background: var(--teddy-box-color); + border-radius: 18px; + } + + .bottomChartsContainer { + display: grid; + grid-template-columns: 1.7fr; + gap: 2rem; + + @media only screen and (min-width: 768px) { + grid-template-columns: 1.7fr 1fr; + } + } + + .bottomChart { + background: var(--teddy-box-color); + border-radius: 18px; + } + + .lastCardsContainer { + display: grid; + grid-template-columns: 1fr; + gap: 2rem; + + @media only screen and (min-width: 768px) { + grid-template-columns: 1fr 1fr; + } + } + + .poolsOverview { + // padding: 20px; + max-width: 1400px; + margin: 2rem auto; + background: var(--teddy-box-color); + border-radius: 18px; + } +} diff --git a/src/pages/Dashboard/Dashboard.tsx b/src/pages/Dashboard/Dashboard.tsx new file mode 100644 index 000000000..41ccd9fb7 --- /dev/null +++ b/src/pages/Dashboard/Dashboard.tsx @@ -0,0 +1,283 @@ +import { useSearch } from '@ergolabs/ui-kit'; +import { useState } from 'react'; + +import useFetchStats from '../../common/hooks/useFetchStats'; +import { useObservable } from '../../common/hooks/useObservable'; +import { AmmPool } from '../../common/models/AmmPool'; +import { AssetLock } from '../../common/models/AssetLock'; +import { Position } from '../../common/models/Position'; +import { displayedAmmPools$ } from '../../gateway/api/ammPools'; +import { platformStats$ } from '../../gateway/api/platformStats'; +import { positions$ } from '../../gateway/api/positions'; +import { PoolsOrPositionsFilterValue } from '../Liquidity/common/components/LiquidityFilter/LiquidityFilter'; +import { LiquidityState } from '../Liquidity/common/types/LiquidityState'; +import { LiquidityTable } from '../Liquidity/default/LiquidityTable/LiquidityTable'; +import { AreaChart } from './AreaChart/AreaChart'; +import LoadingChart from './AreaChart/LoadingChart'; +//import { BatchersCard } from './BatchersCard/BatchersCard'; +//import { CoinDetailsCard } from './CoinDetailsCard/CoinDetailsCard'; +import styles from './Dashboard.module.less'; +//import { MarketMoversList } from './MarketMoversList/MarketMoversList'; + +const matchItem = ( + item: AmmPool | Position | AssetLock, + term?: string, +): boolean => { + if (item instanceof AmmPool) { + return item.match(term); + } + if (item instanceof Position) { + return item.match(term); + } + return item.position.match(term); +}; + +const filterDuplicates = (items: T[]): T[] => { + const mapTokensToAmmPool = new Map(); + + return items.filter((i) => { + const hash = + i instanceof AmmPool + ? `${i.x.asset.id}-${i.y.asset.id}` + : `${i.pool.x.asset.id}-${i.pool.y.asset.id}`; + + if (mapTokensToAmmPool.has(hash)) { + return false; + } + mapTokensToAmmPool.set(hash, i); + + return true; + }); +}; + +const formatChangeValue = (change: number): string => { + const sign = change < 0 ? '-' : '+'; + const formattedChange = `${sign}₳${Math.abs(change).toFixed(2)}`; + return formattedChange; +}; + +const findStartOfWeekData = (dataStats: any[], startDateFormat: string) => { + return dataStats.find((data) => { + const dataDate = new Date(data.timestamp * 1000); + const dataDateFormat = `${dataDate.getMonth() + 1}/${dataDate.getDate()}`; + return dataDateFormat === startDateFormat; + }); +}; + +const generateFormattedDates = (dates: Date[]): string[] => { + const formatToMMDD = (date: Date) => { + const month = date.getMonth() + 1; + const day = date.getDate(); + return `${month.toString().padStart(2, '0')}/${day + .toString() + .padStart(2, '0')}`; + }; + return dates.map(formatToMMDD); +}; + +const Dashboard = () => { + const [ammPools, isAmmPoolsLoading] = useObservable( + displayedAmmPools$, + [], + [], + ); + const [ + searchByTerm, + setSearch, + // term + ] = useSearch(matchItem); + + const handleSearchChange = (e: React.ChangeEvent): void => + setSearch(e.target.value); + + const [positions, isPositionLoading] = useObservable(positions$, [], []); + + const filterPositions = (positions: Position[]): Position[] => { + return searchByTerm(positions) as Position[]; + }; + + const [ + filters, + // setFilters + ] = useState | undefined>(); + + const filterAmmPools = (pools: AmmPool[]): AmmPool[] => { + let filteredPools = pools; + + if (!filters?.has(PoolsOrPositionsFilterValue.SHOW_DUPLICATES)) { + filteredPools = filterDuplicates(filteredPools); + } + return searchByTerm(filteredPools) as AmmPool[]; + }; + + const { dataStats, loadedStats } = useFetchStats(); + const [currentStats] = useObservable(platformStats$, []); + + let formattedDates: string[] = []; + let volume: number[] = []; + let totalValueLocked: number[] = []; + let revenueValue: number[] = []; + let treasueValue: number[] = []; + const today = new Date(); + const dayOfWeek = today.getDay(); + const startDate = today; + startDate.setDate(today.getDate() - dayOfWeek); + const startDateFormat = `${startDate.getMonth() + 1}/${startDate.getDate()}`; + + let performanceSummaryVolume; + let performanceSummaryTvl; + + if (loadedStats) { + const dates = dataStats.map((data) => new Date(data.timestamp * 1000)); + volume = dataStats.map((data) => data.volume); + totalValueLocked = dataStats.map((data) => data.totalValueLocked); + revenueValue = dataStats.map((data) => data.revenue); + treasueValue = dataStats.map((data) => data.treasure); + + const startOfWeekData = findStartOfWeekData(dataStats, startDateFormat); + + if (startOfWeekData) { + const volumeDifference = + dataStats[dataStats.length - 1].volume - startOfWeekData.volume; + + const tvlDifference = + dataStats[dataStats.length - 1].totalValueLocked - + startOfWeekData.totalValueLocked; + + const percentageChangeVolume = ( + (volumeDifference / startOfWeekData.volume) * + 100 + ).toFixed(2); + + const percentageChangeTvl = ( + (tvlDifference / startOfWeekData.totalValueLocked) * + 100 + ).toFixed(2); + + performanceSummaryVolume = `${formatChangeValue( + volumeDifference, + )} (${percentageChangeVolume}%) this week`; + + performanceSummaryTvl = `${formatChangeValue( + tvlDifference, + )} (${percentageChangeTvl}%) this week`; + } + + formattedDates = generateFormattedDates(dates); + } + + return ( +
+
+
+
+
+ {loadedStats ? ( + + ) : ( + + )} +
+
+ {loadedStats ? ( + + ) : ( + + )} +
+
+
+
+ {loadedStats ? ( + + ) : ( + + )} +
+
+ {loadedStats ? ( + + ) : ( + + )} +
+
+ {/*
+ + +
*/} +
+ {/* */} +
+
+ +
+
+ ); +}; + +export default Dashboard; diff --git a/src/pages/Dashboard/LeftTextWithRightSunText/LeftTextWithRightSunText.module.less b/src/pages/Dashboard/LeftTextWithRightSunText/LeftTextWithRightSunText.module.less new file mode 100644 index 000000000..86adc4662 --- /dev/null +++ b/src/pages/Dashboard/LeftTextWithRightSunText/LeftTextWithRightSunText.module.less @@ -0,0 +1,25 @@ +@import "../../../assets/styles/variables/general.less"; + +.topLeftRightComponentContainer { + display: flex; + gap: 8px; + justify-content: space-between; + padding: 20px; + color: #fff; + .mixTitleBox; + font-size: 14px; + + + .rightSection { + display: flex; + gap: 8px; + .mixTitleBox; + font-size: 14px; + + .subTitle { + .mixSubTitleBox; + font-size: 12px; + } + } + +} \ No newline at end of file diff --git a/src/pages/Dashboard/LeftTextWithRightSunText/LeftTextWithRightSunText.tsx b/src/pages/Dashboard/LeftTextWithRightSunText/LeftTextWithRightSunText.tsx new file mode 100644 index 000000000..9744eecf9 --- /dev/null +++ b/src/pages/Dashboard/LeftTextWithRightSunText/LeftTextWithRightSunText.tsx @@ -0,0 +1,31 @@ +import BrightSun from '../../../assets/icons/icon-white-sun.svg'; +import styles from './LeftTextWithRightSunText.module.less'; + +type LeftTextWithRightSunTextProps = { + left: { + title: string; + }; + right: { + title: string; + subTitle: string; + }; +}; + +export const LeftTextWithRightSunText = ({ + left, + right, +}: LeftTextWithRightSunTextProps) => { + return ( +
+
{left.title}
+ +
+ Bright sun +
+
{right.title}
+
{right.subTitle}
+
+
+
+ ); +}; diff --git a/src/pages/Dashboard/MarketMoversList/CoinCard/CoinCard.module.less b/src/pages/Dashboard/MarketMoversList/CoinCard/CoinCard.module.less new file mode 100644 index 000000000..44585e4d5 --- /dev/null +++ b/src/pages/Dashboard/MarketMoversList/CoinCard/CoinCard.module.less @@ -0,0 +1,73 @@ +@import "../../../../assets/styles/variables/general.less"; + +.coinCard { + padding: 8px 18px; + background: linear-gradient(129deg, rgba(69, 78, 96, 0.63) 11.81%, rgba(73, 79, 89, 0.63) 48.34%, rgba(43, 56, 74, 0.63) 98.82%); + box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.05); + color: var(--teddy-primary-text); + display: flex; + flex-direction: column; + gap: 10px; + width: 100%; + .title { + display: flex; + align-items: center; + justify-content: space-between; + .operation { + margin: 0; + font-size: 12px; + + &.buy { + color: #16A34A; + } + &.sell { + color: #FF6060; + } + } + .date { + margin: 0; + font-size: 12px; + } + } + + .coinInfo { + display: flex; + gap: 5px; + align-items: center; + width: 100%; + .tokenGroup { + display: flex; + flex-direction: column; + align-items: center; + gap: 5px; + width: calc(50% - 80px); + max-width: 100px; + .logo { + width: 30px; + height: auto; + } + .amount { + margin: 0; + font-size: 12px; + } + } + + .icon { + fill: var(--teddy-primary-text); + margin-bottom: 25px; + width: 60px; + } + } + + .wallet { + display: flex; + align-self: flex-end; + gap: 5px; + align-items: center; + .text { + margin: 0; + font-size: 12px; + } + } + +} diff --git a/src/pages/Dashboard/MarketMoversList/CoinCard/CoinCard.tsx b/src/pages/Dashboard/MarketMoversList/CoinCard/CoinCard.tsx new file mode 100644 index 000000000..a70c076f2 --- /dev/null +++ b/src/pages/Dashboard/MarketMoversList/CoinCard/CoinCard.tsx @@ -0,0 +1,52 @@ +import { ARROW_RIGHT } from '../../../../utils/images'; +import styles from './CoinCard.module.less'; + +type CoinCardProps = { + base: { + name: string; + amount: string; + }; + quote: { + name: string; + amount: string; + }; + operation: string; + address: string; + date: string; +}; + +export const CoinCard = (props: CoinCardProps) => { + const { base, quote, operation, address, date } = props; + return ( +
+
+

+ {operation} +

+

{date}

+
+ +
+
+ +

{base.amount}

+
+ + + +
+ +

{quote.amount}

+
+
+
+

Owner:

+

{address}

+
+
+ ); +}; diff --git a/src/pages/Dashboard/MarketMoversList/MarketMoversList.module.less b/src/pages/Dashboard/MarketMoversList/MarketMoversList.module.less new file mode 100644 index 000000000..b112c02d5 --- /dev/null +++ b/src/pages/Dashboard/MarketMoversList/MarketMoversList.module.less @@ -0,0 +1,45 @@ +@import "../../../assets/styles/variables/general.less"; + +.container { + display: flex; + flex-direction: column; + gap: 2rem; + + .listContainer { + border-radius: 18px; + background: linear-gradient(169deg, rgba(76, 78, 94, 0.58) 2.23%, rgba(69, 76, 87, 0.68) 10.82%, rgba(62, 64, 80, 0.54) 18.4%, rgba(45, 49, 70, 0.00) 94.79%); + box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.05); + font-weight: 500; + overflow: hidden; + + .title { + padding: 20px; + color: #fff; + } + .coinCards { + display: flex; + flex-direction: column; + gap: 8px; + max-height: 650px; + overflow: auto; + + .loadingMarket{ + height: 65px; + width: 100%; + background: linear-gradient(90deg, var(--teddy-secondary-color) 25%, var(--teddy-secondary-text-dark) 50%, var(--teddy-secondary-color) 75%); + background-size: 200% 100%; + animation: loadingAnimation 1.5s infinite linear; + } + } + } +} + + +@keyframes loadingAnimation { + 0% { + background-position: 100% 0; + } + 100% { + background-position: -100% 0; + } +} diff --git a/src/pages/Dashboard/MarketMoversList/MarketMoversList.tsx b/src/pages/Dashboard/MarketMoversList/MarketMoversList.tsx new file mode 100644 index 000000000..caaa2b6e6 --- /dev/null +++ b/src/pages/Dashboard/MarketMoversList/MarketMoversList.tsx @@ -0,0 +1,39 @@ +import useFetchMarketMovers from '../../../common/hooks/useFetchMarketMovers'; +import { CoinCard } from './CoinCard/CoinCard'; +import styles from './MarketMoversList.module.less'; + +export const MarketMoversList = () => { + const { dataMarket, loadedMarket } = useFetchMarketMovers(); + + if (loadedMarket) { + console.log(dataMarket); + } + + return ( +
+
+
Market Movers
+
+ {!loadedMarket + ? Array.from({ length: 9 }).map((_, i) => ( +
+ )) + : dataMarket.map((coin: any) => ( + + ))} +
+
+
+ ); +}; diff --git a/src/pages/Dashboard/TimeRangePicker.tsx b/src/pages/Dashboard/TimeRangePicker.tsx new file mode 100644 index 000000000..34d3d24dc --- /dev/null +++ b/src/pages/Dashboard/TimeRangePicker.tsx @@ -0,0 +1,67 @@ +import styled from 'styled-components'; + +const Container = styled('div')` + padding: 2px; + background: linear-gradient( + 129deg, + rgba(69, 78, 96, 0.63) 11.81%, + rgba(73, 79, 89, 0.63) 48.34%, + rgba(43, 56, 74, 0.63) 98.82% + ); + border-radius: 10px; + display: flex; + justify-content: space-between; +`; + +const TimeItem = styled('div')<{ isActive?: boolean }>` + padding: 8px 12px; + border-radius: 10px; + font-size: 12px; + color: var(--teddy-primary-text); + font-weight: 600; + + cursor: pointer; + ${(props) => + props.isActive && + ` + background: linear-gradient( + 315deg, + #181d2d -11.92%, + rgba(46, 47, 58, 0.75) 119.58% + ); + `} +`; + +const availableTimes = ['1h', '1d', '1w', '1m', '3m', '1y', 'All Time']; + +export type TimeType = '1w' | '1d' | '1h' | '1m' | '3m' | '1y' | 'All Time'; + +type TimeRangePickerProps = { + selectedTime: TimeType; + setSelectedTime: (val: TimeType) => void; +}; + +export const TimeRangePicker = ({ + selectedTime, + setSelectedTime, +}: TimeRangePickerProps) => { + const updateSelectedTime = (val: TimeType) => { + setSelectedTime(val); + }; + + return ( + + {availableTimes.map((val) => ( + { + updateSelectedTime(val as TimeType); + }} + isActive={val === selectedTime} + key={val} + > + {val} + + ))} + + ); +}; diff --git a/src/pages/Farms/FarmGridView/FarmGridView.tsx b/src/pages/Farms/FarmGridView/FarmGridView.tsx index e5a35feef..09390d00c 100644 --- a/src/pages/Farms/FarmGridView/FarmGridView.tsx +++ b/src/pages/Farms/FarmGridView/FarmGridView.tsx @@ -8,7 +8,6 @@ import { FarmCardView } from './FarmCardView/FarmCardView'; export interface FarmGridViewProps { readonly items: T[]; - // readonly poolMapper: (item: T) => AmmPool; readonly loading?: boolean; readonly className?: string; } diff --git a/src/pages/Farms/FarmTableView/columns/FarmActionColumn/FarmActionColumn.tsx b/src/pages/Farms/FarmTableView/columns/FarmActionColumn/FarmActionColumn.tsx index 69da1ae02..15d138211 100644 --- a/src/pages/Farms/FarmTableView/columns/FarmActionColumn/FarmActionColumn.tsx +++ b/src/pages/Farms/FarmTableView/columns/FarmActionColumn/FarmActionColumn.tsx @@ -1,5 +1,4 @@ import { Flex } from '@ergolabs/ui-kit'; -import { ElementLocation, ElementName } from '@spectrumlabs/analytics'; import { FC } from 'react'; import { Farm } from '../../../../../common/models/Farm'; @@ -12,13 +11,7 @@ export interface FarmActionColumnProps { export const FarmActionColumn: FC = ({ farm }) => ( - + diff --git a/src/pages/Farms/FarmTopPanel/CreateFarmModal/ConfirmFarmCreateModal.tsx b/src/pages/Farms/FarmTopPanel/CreateFarmModal/ConfirmFarmCreateModal.tsx index 8962e0dc7..649ff5e2f 100644 --- a/src/pages/Farms/FarmTopPanel/CreateFarmModal/ConfirmFarmCreateModal.tsx +++ b/src/pages/Farms/FarmTopPanel/CreateFarmModal/ConfirmFarmCreateModal.tsx @@ -7,7 +7,6 @@ import { Typography, } from '@ergolabs/ui-kit'; import { t, Trans } from '@lingui/macro'; -import { ElementLocation } from '@spectrumlabs/analytics'; import * as React from 'react'; import styled from 'styled-components'; @@ -47,7 +46,6 @@ export const ConfirmFarmCreateModal: React.FC = ({ {}} actionCaption={t`Confirm farm creation`} diff --git a/src/pages/Farms/FarmTopPanel/CreateFarmModal/validators/validators.ts b/src/pages/Farms/FarmTopPanel/CreateFarmModal/validators/validators.ts index 007fde693..ac80920b4 100644 --- a/src/pages/Farms/FarmTopPanel/CreateFarmModal/validators/validators.ts +++ b/src/pages/Farms/FarmTopPanel/CreateFarmModal/validators/validators.ts @@ -3,62 +3,6 @@ import { t } from '@lingui/macro'; import { OperationValidator } from '../../../../../components/OperationForm/OperationForm'; import { CreateFarmFormModel } from '../CreateFarmFormModel'; -// const insufficientFeeValidator: OperationValidator = ({ -// value: { x, y }, -// }) => { -// let totalFeesWithAmount = x?.isAssetEquals(networkAsset) -// ? x?.plus(totalFees) -// : totalFees; -// -// totalFeesWithAmount = y?.isAssetEquals(networkAsset) -// ? totalFeesWithAmount.plus(y) -// : totalFees; -// -// return totalFeesWithAmount.gt(balance.get(networkAsset)) -// ? t`Insufficient ${networkAsset.ticker} Balance for Fees` -// : undefined; -// }; -// -// const balanceValidator: OperationValidator = ({ -// value: { x, y }, -// }) => { -// if (x?.gt(balance.get(x?.asset))) { -// return t`Insufficient ${x?.asset.ticker} Balance`; -// } -// -// if (y?.gt(balance.get(y?.asset))) { -// return t`Insufficient ${y?.asset.ticker} Balance`; -// } -// -// return undefined; -// }; - -// const amountValidator: OperationValidator = ({ -// value: { x, y }, -// }) => { -// if ( -// (!x?.isPositive() && y?.isPositive()) || -// (!y?.isPositive() && x?.isPositive()) -// ) { -// return undefined; -// } -// -// return (!x?.isPositive() || !y?.isPositive()) && t`Enter an Amount`; -// }; - -// const minValueValidator: OperationValidator = ({ -// value: { xAsset, yAsset, x, y, pool }, -// }) => { -// let c: Currency | undefined; -// if (!x?.isPositive() && y?.isPositive() && pool) { -// c = pool.calculateDepositAmount(new Currency(1n, xAsset)).plus(1n); -// } -// if (!y?.isPositive() && x?.isPositive() && pool) { -// c = pool.calculateDepositAmount(new Currency(1n, yAsset)); -// } -// return c && t`Min value for ${c?.asset.ticker} is ${c?.toString()}`; -// }; - const selectPoolValidator: OperationValidator = ({ value: { pool }, }) => !pool && t`Select pool`; @@ -70,8 +14,4 @@ const selectPeriodValidator: OperationValidator = ({ export const validators: OperationValidator[] = [ selectPoolValidator, selectPeriodValidator, - // amountValidator, - // minValueValidator, - // balanceValidator, - // insufficientFeeValidator, ]; diff --git a/src/pages/Farms/FarmTopPanel/FarmTopPanel.tsx b/src/pages/Farms/FarmTopPanel/FarmTopPanel.tsx index 37ad861ab..134da2c28 100644 --- a/src/pages/Farms/FarmTopPanel/FarmTopPanel.tsx +++ b/src/pages/Farms/FarmTopPanel/FarmTopPanel.tsx @@ -62,11 +62,6 @@ export const FarmTopPanel: FC<{ /> )} - {/* - - */} {lessThan('xl') && ( diff --git a/src/pages/LBE/DepositBox/DepositDApp.module.less b/src/pages/LBE/DepositBox/DepositDApp.module.less new file mode 100644 index 000000000..1207e1440 --- /dev/null +++ b/src/pages/LBE/DepositBox/DepositDApp.module.less @@ -0,0 +1,120 @@ +@import "../../../assets/styles/variables/general.less"; + +.boxDepositWallet { + display: flex; + flex-direction: column; + align-items: center; + background: var(--teddy-box-color); + width: 100%; + border-radius: 18px; + padding: 24px; + .boxTitle{ + .mixTitleBox; + align-self: flex-start; + margin-bottom: 30px; + @media (max-width: 350px) { + font-size: 16px; + } + } + .inputCard { + width: 100%; + display: flex; + flex-direction: column; + gap: 5px; + .titleInput { + .mixSubTitleBox; + padding-left: 5px; + } + .inputContent { + position: relative; + display: flex; + flex-direction: column; + justify-content: center; + padding: 12px; + width: 100%; + background: var(--teddy-box-color-dark); + height: 80px; + border-radius: 12px; + .input { + .mixInputDefault; + width: calc(100% - 100px); + height: 28px; + margin: 0; + padding: 0; + margin-bottom: 20px; + } + .tokenGroup { + position: absolute; + display: flex; + align-items: center; + justify-content: center; + gap: 10px; + width: 100px; + height: 40px; + background: var(--teddy-box-color-icon); + border-radius: 12px; + right: 12px; + top: calc(50% - 28px); + z-index: 2; + .tokenImage { + width: 28px; + height: 28px; + } + .tokenName { + .mixTokenFontBox; + } + } + .mask { + position: absolute; + width: 100px; + height: 40px; + border-radius: 12px; + background: #181D2D; + right: 12px; + z-index: 1; + top: calc(50% - 28px); + } + .selectMax { + position: absolute; + font-size: 14px; + color: var(--teddy-dark-color-active); + right: 16px; + margin: 0; + bottom: 6px; + cursor: pointer; + } + &.resultContent { + flex-direction: row; + justify-content: space-between; + align-items: center; + .result { + font-size: 20px; + font-weight: 600; + color: var(--teddy-primary-text); + margin: 0; + } + .tokenGroup, .mask { + top: (calc(50% - 20px)); + } + } + } + } + .iconContainer { + display: flex; + background: var(--teddy-box-color-icon); + width: 34px; + height: 34px; + align-items: center; + justify-content: center; + border-radius: 50%; + margin-top: 18px; + margin-bottom: 5px; + .icon { + fill: var(--teddy-primary-text); + } + } + .btnDeposit { + .mixBtn; + margin-top: 20px; + } +} diff --git a/src/pages/LBE/DepositBox/DepositDApp.tsx b/src/pages/LBE/DepositBox/DepositDApp.tsx new file mode 100644 index 000000000..8adf3de52 --- /dev/null +++ b/src/pages/LBE/DepositBox/DepositDApp.tsx @@ -0,0 +1,118 @@ +import { Modal } from '@ergolabs/ui-kit'; +import { useEffect, useState } from 'react'; + +import { ChooseWalletModal } from '../../../components/common/ConnectWalletButton/ChooseWalletModal/ChooseWalletModal'; +import { ARROW_DOWN, TOKEN_ADA, TOKEN_TEDY } from '../../../utils/images'; +import styles from './DepositDApp.module.less'; +import useDeposit from './useDeposit'; + +interface DepositDappProps { + startTime: number; + endTime: number; +} + +export default function DepositDApp({ startTime, endTime }: DepositDappProps) { + const { + handleKeyDown, + handleValueChange, + valueAdaInput, + handleWheel, + valueTedyInput, + handleClickMax, + isWalletConnected, + isValidInput, + handleClickDeposit, + } = useDeposit(); + + const openChooseWalletModal = (): void => { + Modal.open(({ close }) => ); + }; + + const [isDepositAllowed, setIsDepositAllowed] = useState(false); + + const checkDepositWindow = () => { + const now = new Date().getTime(); + return now >= startTime * 1000 && now <= endTime * 1000; + }; + + useEffect(() => { + // Check the deposit window initially + setIsDepositAllowed(checkDepositWindow()); + + // Check periodically (e.g., every second) + const interval = setInterval(() => { + setIsDepositAllowed(checkDepositWindow()); + }, 1000); + + return () => clearInterval(interval); + }, [startTime, endTime]); + + return ( +
+

Deposit ADA (via dApp wallet)

+
+

Deposit Amount

+
+ +
+ token-ada +

ADA

+
+
+ {isWalletConnected && ( +

+ Max +

+ )} +
+
+
+ + + +
+
+

TEDY Amount (estimated)

+
+

{valueTedyInput}

+
+ token-tedy +

TEDY

+
+
+
+
+ {isWalletConnected ? ( + isValidInput.valid && isDepositAllowed ? ( + + ) : ( + + ) + ) : ( + + )} +
+ ); +} diff --git a/src/pages/LBE/DepositBox/DepositManual.module.less b/src/pages/LBE/DepositBox/DepositManual.module.less new file mode 100644 index 000000000..c26428063 --- /dev/null +++ b/src/pages/LBE/DepositBox/DepositManual.module.less @@ -0,0 +1,77 @@ +@import "../../../assets/styles/variables/general.less"; + +.boxDepositManual { + display: flex; + flex-direction: column; + align-items: center; + background: var(--teddy-box-color); + width: 100%; + border-radius: 18px; + padding: 24px; + .boxTitle{ + .mixTitleBox; + align-self: flex-start; + margin-bottom: 30px; + } + .inputCard { + width: 100%; + display: flex; + flex-direction: column; + gap: 5px; + .titleInput { + .mixSubTitleBox; + padding-left: 5px; + } + .adressContent { + position: relative; + display: flex; + justify-content: center; + align-items: center; + padding: 14px 45px; + width: 100%; + background: var(--teddy-box-color-dark); + border-radius: 12px; + margin-bottom: 20px; + cursor: pointer; + .icon { + position: absolute; + height: 18px; + width: auto; + left: 16px; + top: 14px; + } + .address { + color: var(--teddy-primary-text); + font-size: 12px; + font-weight: 500; + line-break: anywhere; + width: 100%; + margin: 0; + } + .copied { + position: absolute; + font-size: 12px; + font-weight: 500; + color: var(--teddy-primary-text); + right: 16px; + height: 24px; + top: -32px; + background: var(--teddy-box-color-icon); + border-radius: 12px; + width: 70px; + display: flex; + align-items: center; + justify-content: center; + } + } + } + .qrContainer { + width: 140px; + height: 140px; + display: flex; + align-items: center; + justify-content: center; + background-color: var(--teddy-dark-general-color); + margin-bottom: 20px; + } +} diff --git a/src/pages/LBE/DepositBox/DepositManual.tsx b/src/pages/LBE/DepositBox/DepositManual.tsx new file mode 100644 index 000000000..7f51d6ef7 --- /dev/null +++ b/src/pages/LBE/DepositBox/DepositManual.tsx @@ -0,0 +1,71 @@ +import { useEffect, useState } from 'react'; +import QRCode from 'react-qr-code'; + +import { ICON_COPY } from '../../../utils/images'; +import styles from './DepositManual.module.less'; +import useDeposit from './useDeposit'; + +interface DepositManualProps { + startTime: number; + endTime: number; +} + +export default function DepositManual({ + startTime, + endTime, +}: DepositManualProps) { + const { addressDeposit, isCopied, handleCopyClick } = useDeposit(); + + const [isDepositAllowed, setIsDepositAllowed] = useState(false); + + const checkDepositWindow = () => { + const now = new Date().getTime(); + return now >= startTime * 1000 && now <= endTime * 1000; + }; + + useEffect(() => { + // Check the deposit window initially + setIsDepositAllowed(checkDepositWindow()); + + // Check periodically (e.g., every second) + const interval = setInterval(() => { + setIsDepositAllowed(checkDepositWindow()); + }, 1000); + + return () => clearInterval(interval); + }, [startTime, endTime]); + + return isDepositAllowed ? ( +
+

Deposit ADA (manually)

+
+

Deposit Address

+
+ copy +

{addressDeposit}

+ {isCopied &&

Copied

} +
+
+
+
+ +
+
+
+ ) : ( + <> + ); +} diff --git a/src/pages/LBE/DepositBox/useDeposit.ts b/src/pages/LBE/DepositBox/useDeposit.ts new file mode 100644 index 000000000..c3d0f7a06 --- /dev/null +++ b/src/pages/LBE/DepositBox/useDeposit.ts @@ -0,0 +1,215 @@ +import { Transaction } from '@emurgo/cardano-serialization-lib-nodejs'; +import { TxCandidate } from '@teddyswap/cardano-dex-sdk'; +import { useEffect, useState } from 'react'; +import { first, map, switchMap } from 'rxjs'; + +import { applicationConfig } from '../../../applicationConfig'; +import { useObservable } from '../../../common/hooks/useObservable'; +import { networkAssetBalance$ } from '../../../gateway/api/networkAssetBalance'; +import { isWalletSetuped$ } from '../../../gateway/api/wallets'; +import { submitTx } from '../../../network/cardano/api/operations/common/submitTxCandidate'; +import { transactionBuilder$ } from '../../../network/cardano/api/operations/common/transactionBuilder'; +import { settings } from '../../../network/cardano/settings/settings'; +import { cardanoNetworkData } from '../../../network/cardano/utils/cardanoNetworkData'; + +const useDeposit = () => { + const RATE = 0.444; + const addressDeposit = cardanoNetworkData.lbeAddress; + + const [isWalletConnected] = useObservable(isWalletSetuped$); + const [networkAssetBalance] = useObservable(networkAssetBalance$); + + const [isCopied, setIsCopied] = useState(false); + useState(); + const [valueAdaInput, setValueAdaInput] = useState(''); + const [valueTedyInput, setValueTedyInput] = useState('0.0'); + const [isValidInput, setIsValidInput] = useState({ + valid: false, + text: 'Enter an amount', + }); + + const [lovelaceBalance, setLovelaceBalance] = useState(BigInt(0)); + + const fetchBalance = async (offset = 0, totalBalance = BigInt(0)) => { + try { + const response = await fetch( + `${cardanoNetworkData.networkUrl}/outputs/unspent/byAddr/${addressDeposit}?limit=500&offset=${offset}`, + ); + const data = await response.json(); + + if (data.items.length === 0) { + // If no items are returned, set the total balance and stop fetching + setLovelaceBalance(totalBalance); + return; + } + + const lovelace = data.items + .filter((item) => + item.value.some((v) => v.policyId === '' && v.name === ''), + ) + .reduce( + (total, item) => total + BigInt(item.value[0].quantity), + totalBalance, + ); + + // Call the function recursively with updated offset and total balance + fetchBalance(offset + 500, lovelace); + } catch (error) { + console.error('Error fetching balance:', error); + } + }; + + useEffect(() => { + fetchBalance(); + const interval = setInterval( + () => fetchBalance(), + applicationConfig.applicationTick, + ); // Refresh every 10 seconds + + return () => clearInterval(interval); // Cleanup interval on unmount + }, []); + + const validInput = (value: string) => { + return value.length < 12; + }; + + const handleValueChange = (e: React.ChangeEvent) => { + let value = e.target.value; + if (value.startsWith('.')) { + value = '0' + value; + } + if (validInput(value)) { + setValueAdaInput(value); + } + }; + + const handleClickMax = () => { + if (networkAssetBalance) { + setValueAdaInput( + formatAmountToken(Number(networkAssetBalance.amount) / 1000000), + ); + } else { + setValueAdaInput(''); + } + }; + + const formatAmountToken = (value: number) => { + let formattedValue = value.toFixed(8).toString(); + if (formattedValue.length > 10) { + formattedValue = formattedValue.slice(0, 10); + } + formattedValue = formattedValue.replace(/\.?0+$/, ''); + return formattedValue; + }; + + const formatAmountTedy = (value: number) => { + const number = value.toFixed(8).replace(/\.?0+$/, ''); + const formated = Intl.NumberFormat('en', { + minimumFractionDigits: 0, + maximumFractionDigits: 12, + }).format(Number(number)); + return formated; + }; + + useEffect(() => { + const value = Number(valueAdaInput) * RATE; + if (valueAdaInput === '' || Number(valueAdaInput) === 0) { + setValueTedyInput('0.0'); + } else { + setValueTedyInput(formatAmountTedy(value)); + } + }, [valueAdaInput]); + + useEffect(() => { + if (valueAdaInput === '' || Number(valueAdaInput) === 0) { + setIsValidInput({ valid: false, text: 'Enter an amount' }); + } else if ( + networkAssetBalance && + Number(valueAdaInput) > Number(networkAssetBalance.amount) / 1000000 + ) { + setIsValidInput({ valid: false, text: 'Invalid amount' }); + } else { + setIsValidInput({ valid: true, text: '' }); + } + }, [networkAssetBalance, valueAdaInput]); + + const handleWheel: React.WheelEventHandler = (e) => { + const inputElement = e.target as HTMLInputElement; + inputElement.blur(); + setTimeout(() => { + inputElement.focus(); + }, 0); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if ( + e.key === '+' || + e.key === '-' || + e.key === 'ArrowUp' || + e.key === 'ArrowDown' || + e.key === 'e' || + e.key === 'E' + ) { + e.preventDefault(); + } + }; + + const handleCopyClick = async () => { + try { + await navigator.clipboard.writeText(addressDeposit); + setIsCopied(true); + setTimeout(() => { + setIsCopied(false); + }, 1000); + } catch (err) { + console.error('error', err); + setIsCopied(false); + } + }; + + const handleClickDeposit = () => { + const depositValue = BigInt(Number(valueAdaInput) * 1000000); + toSendLovelaceTxCandidate(depositValue) + .pipe(switchMap((tx) => submitTx(tx))) + .subscribe({ + complete: () => { + setValueAdaInput('0'); + }, + }); + }; + + const toSendLovelaceTxCandidate = (lovelace: bigint) => { + return transactionBuilder$.pipe( + switchMap((txBuilder) => { + return txBuilder.sendAdaToAddress({ + lovelace, + changeAddress: settings.address!, + targetAddress: addressDeposit, + }); + }), + map( + ([transaction]: [Transaction | null, TxCandidate, Error | null]) => + transaction!, + ), + first(), + ); + }; + + return { + addressDeposit, + isCopied, + handleCopyClick, + handleKeyDown, + handleValueChange, + valueAdaInput, + handleWheel, + valueTedyInput, + handleClickMax, + isWalletConnected, + isValidInput, + handleClickDeposit, + lovelaceBalance, + }; +}; + +export default useDeposit; diff --git a/src/pages/LBE/Details/Card.module.less b/src/pages/LBE/Details/Card.module.less new file mode 100644 index 000000000..1726283b8 --- /dev/null +++ b/src/pages/LBE/Details/Card.module.less @@ -0,0 +1,41 @@ +@import "../../../assets/styles/variables/general.less"; + +.card { + width: 230px; + height: 120px; + border-radius: 12px; + background: var(--teddy-box-color-dark); + padding: 16px 20px; + display: flex; + align-items: center; + flex-direction: column; + justify-content: center; + .headerCard { + height: 18px; + align-self: flex-start; + .titleCard { + margin: 0; + color: var(--teddy-primary-text); + font-size: 14px; + font-weight: 500; + } + } + .contentCard { + height: calc(100% - 18px); + display: flex; + align-items: center; + justify-content: center; + .value { + margin: 0; + color: var(--teddy-primary-text); + font-size: 20px; + font-weight: 500; + &.deposit { + color: var(--teddy-dark-color-active); + } + } + } + @media (max-width: 960px) { + background: var(--teddy-box-color); + } +} diff --git a/src/pages/LBE/Details/Card.tsx b/src/pages/LBE/Details/Card.tsx new file mode 100644 index 000000000..eb5a1ba97 --- /dev/null +++ b/src/pages/LBE/Details/Card.tsx @@ -0,0 +1,27 @@ +import styles from './Card.module.less'; + +interface CardProps { + header: string; + value: string; +} + +export default function Card(props: CardProps) { + const { header, value } = props; + + return ( +
+
+

{header}

+
+
+

+ {value} +

+
+
+ ); +} diff --git a/src/pages/LBE/Details/CountdownTimer.module.less b/src/pages/LBE/Details/CountdownTimer.module.less new file mode 100644 index 000000000..5977049ed --- /dev/null +++ b/src/pages/LBE/Details/CountdownTimer.module.less @@ -0,0 +1,55 @@ +.timerContainer { + width: 100%; + padding: 12px 20px; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + gap: 5px; + .time { + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + gap: 5px; + .value, .text { + color: var(--teddy-primary-text); + margin: 0; + font-weight: 500; + } + .value { + height: 60px; + font-size: 50px; + display: flex; + align-items: center; + justify-content: center; + } + .text{ + font-size: 14px; + } + } + .points { + font-size: 50px; + font-weight: 500; + color: var(--teddy-primary-text); + height: 60px; + margin: 0; + margin-bottom: 35px; + display: flex; + align-items: center; + } + @media (max-width: 430px) { + .time { + .value { + font-size: 30px; + } + .text { + font-size: 12px; + } + } + .points { + margin-bottom: 26px; + font-size: 30px; + } + } +} diff --git a/src/pages/LBE/Details/CountdownTimer.tsx b/src/pages/LBE/Details/CountdownTimer.tsx new file mode 100644 index 000000000..5917c79a8 --- /dev/null +++ b/src/pages/LBE/Details/CountdownTimer.tsx @@ -0,0 +1,84 @@ +import { useEffect, useState } from 'react'; + +import styles from './CountdownTimer.module.less'; + +interface CountdownProps { + startTime: number; + endTime: number; +} + +export default function CountdownTimer({ startTime, endTime }: CountdownProps) { + const startTimeInMilliseconds = startTime * 1000; + const endTimeMiliseconds = endTime * 1000; + const calculateTimeLeft = () => { + const now = new Date().getTime(); + + if (now < startTimeInMilliseconds) { + return null; // Do not start countdown yet + } + + const difference = endTimeMiliseconds - now; + + if (difference < 0) { + return { days: 0, hours: 0, minutes: 0, seconds: 0 }; + } + + const days = Math.floor(difference / (1000 * 60 * 60 * 24)); + const hours = Math.floor( + (difference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60), + ); + const minutes = Math.floor((difference % (1000 * 60 * 60)) / (1000 * 60)); + const seconds = Math.floor((difference % (1000 * 60)) / 1000); + + return { days, hours, minutes, seconds }; + }; + + const [timeLeft, setTimeLeft] = useState(calculateTimeLeft); + + useEffect(() => { + const timer = setInterval(() => { + const newTimeLeft = calculateTimeLeft(); + if (newTimeLeft) { + setTimeLeft(newTimeLeft); + } + }, 1000); + + return () => clearInterval(timer); + }, [startTime, endTime]); + + const formatNumber = (number: number) => + number < 10 ? `0${number}` : number; + + return timeLeft ? ( +
+
+

{formatNumber(timeLeft.days)}

+

Days

+
+

:

+
+

{formatNumber(timeLeft.hours)}

+

Hours

+
+

:

+
+

{formatNumber(timeLeft.minutes)}

+

Minutes

+
+

:

+
+

{formatNumber(timeLeft.seconds)}

+

Seconds

+
+
+ ) : ( +
+
+

+ The Liquidity Bootstrapping Event (LBE) is Scheduled to Commence at + 2:00 PM UTC on November 23, 2023. +

+
+
+ ); +} diff --git a/src/pages/LBE/Details/DetailsLBE.module.less b/src/pages/LBE/Details/DetailsLBE.module.less new file mode 100644 index 000000000..4f707411b --- /dev/null +++ b/src/pages/LBE/Details/DetailsLBE.module.less @@ -0,0 +1,20 @@ +@import "../../../assets/styles/variables/general.less"; + +.boxDetailsEvent { + display: flex; + flex-direction: column; + align-items: center; + background: var(--teddy-box-color); + width: 100%; + max-width: 890px; + border-radius: 18px; + padding: 35px 24px; + .boxTitle{ + .mixTitleBox; + align-self: flex-start; + margin-bottom: 48px; + } + .boxTimeContainer{ + .mixBoxTimeContainer; + } +} diff --git a/src/pages/LBE/Details/DetailsLBE.tsx b/src/pages/LBE/Details/DetailsLBE.tsx new file mode 100644 index 000000000..35c5fe4f8 --- /dev/null +++ b/src/pages/LBE/Details/DetailsLBE.tsx @@ -0,0 +1,39 @@ +import CountdownTimer from './CountdownTimer'; +import styles from './DetailsLBE.module.less'; +import FaqDetails from './FaqDetails'; +import TokenCards from './TokenCards'; + +interface DetailsProps { + mobile: boolean; + startTime: number; + endTime: number; +} + +export default function DetailsLBE(props: DetailsProps) { + const { mobile, startTime, endTime } = props; + + if (mobile) { + return ( +
+ + +
+ ); + } else { + return ( +
+

+ TeddySwap Liquidity Boostrapping Event +

+
+

Remaining Time

+
+ +
+
+ + +
+ ); + } +} diff --git a/src/pages/LBE/Details/FaqDetails.module.less b/src/pages/LBE/Details/FaqDetails.module.less new file mode 100644 index 000000000..30d0dce8c --- /dev/null +++ b/src/pages/LBE/Details/FaqDetails.module.less @@ -0,0 +1,35 @@ +@import "../../../assets/styles/variables/general.less"; + +.detailsFAQ { + margin: 0 auto; + margin-top: 50px; + align-self: flex-start; + width: 80%; + .title { + .mixTitleBox; + margin-bottom: 24px; + } + .description { + display: flex; + flex-direction: column; + gap: 20px; + .text { + .mixSubTitleBox; + font-size: 15px; + .link { + text-decoration: underline; + color: var(--teddy-dark-color-active); + } + } + } + @media (max-width: 960px) { + background: var(--teddy-box-color); + padding: 20px; + border-radius: 18px; + width: 100%; + max-width: 475px; + } + @media (max-width: 768px) { + margin-top: 20px; + } +} diff --git a/src/pages/LBE/Details/FaqDetails.tsx b/src/pages/LBE/Details/FaqDetails.tsx new file mode 100644 index 000000000..143aeb0b9 --- /dev/null +++ b/src/pages/LBE/Details/FaqDetails.tsx @@ -0,0 +1,64 @@ +import styles from './FaqDetails.module.less'; + +export default function FaqDetails() { + return ( +
+

LBE Details

+
+

+ The Liquidity Bootstrapping Event (LBE) is designed to bolster + liquidity for the TEDY/ADA pool at launch. Participants can exchange + ADA for TEDY at a ratio of 0.444 TEDY per ADA, starting Nov 23rd, 2:00 + PM UTC. +

+

+ Pro-Rata Distribution Explained +
+
+ The LBE facilitates an equitable distribution of TEDY tokens in + exchange for ADA contributions. Here's an outline of the process: +
+
+ All Contributions Counted: We accept all ADA contributions + during the 3-hour LBE window, irrespective of the 1.8 million ADA cap. +
+
+ Proportional Allocation: TEDY tokens are allocated in + proportion to each participant's contribution compared to the + total ADA received. +
+
+ Refunding Excess: Contributions beyond the 1.8 million ADA cap + are proportionally refunded, ensuring each participant receives their + rightful share of TEDY tokens. +
+
+ Example: If the total ADA received is 3.6 million and you + contribute 36,000 ADA, your share is 1% of the total (36,000 / + 3,600,000). Consequently, you receive 1% of the 800,000 TEDY tokens + (8,000 TEDY) and a 50% refund of your ADA contribution (18,000 ADA), + in line with the oversubscription. +
+
+ This approach guarantees fair distribution, full participation within + the timeframe, and upholds the tokenomics integrity by returning + surplus ADA. +
+
+ + Teddy Bears Club Round 1 holders will earn a 1% bonus on the LBE and + Teddy Bears Club Round 2 holders will earn a 0.4% bonus for each NFT + they hold. If someone holds 10 Round 2 Teddy Bears, they'll + earn a 4% bonus. All bonuses will be vested over 6 months, while the + actual contributions will be distributed immediately along with the + rest of the community. + +

+

+ Please ensure you understand and agree to these terms before + participating. +

+
+
+ ); +} diff --git a/src/pages/LBE/Details/TokenCards.module.less b/src/pages/LBE/Details/TokenCards.module.less new file mode 100644 index 000000000..8ab424865 --- /dev/null +++ b/src/pages/LBE/Details/TokenCards.module.less @@ -0,0 +1,14 @@ +@import "../../../assets/styles/variables/general.less"; + +.cardsGroup { + display: flex; + gap: 20px; + margin-top: 60px; + width: 100%; + flex-wrap: wrap; + justify-content: center; + @media (max-width: 960px) { + max-width: 475px; + margin: 0 auto; + } +} diff --git a/src/pages/LBE/Details/TokenCards.tsx b/src/pages/LBE/Details/TokenCards.tsx new file mode 100644 index 000000000..6abacef5e --- /dev/null +++ b/src/pages/LBE/Details/TokenCards.tsx @@ -0,0 +1,65 @@ +import useDeposit from '../DepositBox/useDeposit'; +import Card from './Card'; +import styles from './TokenCards.module.less'; + +function formatBalance(balanceBigInt: bigint) { + const oneMillion = BigInt(1_000_000); + const oneThousand = BigInt(1_000); + + // Convert lovelace to ADA + const balanceInAda = balanceBigInt / oneMillion; + const balanceInAdaWithPrecision = Number(balanceBigInt) / 1_000_000; + + const formatWithTwoDecimals = ( + value: number, + divisor: number, + suffix: string, + ) => { + const integerPart = Math.floor(value / divisor); + const fractionalPart = value - integerPart * divisor; + const rounded = integerPart + fractionalPart / divisor; + return `${rounded.toFixed(2)}${suffix}`; + }; + + if (balanceInAda < oneThousand) { + // For values less than 1,000, display as a decimal number with two decimal places + return formatWithTwoDecimals(balanceInAdaWithPrecision, 1, ''); + } + if (balanceInAda < oneMillion) { + // For values between 1,000 and 1,000,000, format as 'k' with two decimal places + return formatWithTwoDecimals(balanceInAdaWithPrecision, 1_000, 'k'); + } + // For values 1,000,000 and above, format as 'm' with two decimal places + return formatWithTwoDecimals(balanceInAdaWithPrecision, 1_000_000, 'm'); +} + +export default function TokenCards() { + const { lovelaceBalance } = useDeposit(); + + const adaBalance = formatBalance(lovelaceBalance); + + const tedyAvailable = `800,000`; + + const tokenCard = [ + { + header: 'ADA deposited', + value: `ADA ${adaBalance}`, + }, + { + header: 'TEDY available', + value: `TEDY ${tedyAvailable}`, + }, + { + header: 'Deposit Ratio', + value: '0.444 TEDY / ADA', + }, + ]; + + return ( +
+ {tokenCard.map((item, index) => ( + + ))} +
+ ); +} diff --git a/src/pages/LBE/LBE.module.less b/src/pages/LBE/LBE.module.less new file mode 100644 index 000000000..fe279c272 --- /dev/null +++ b/src/pages/LBE/LBE.module.less @@ -0,0 +1,46 @@ +@import "../../assets/styles/variables/general.less"; + +.lbeContainer { + width: 100%; + display: flex; + gap: 36px; + justify-content: center; + .depositGroup { + display: flex; + flex-direction: column; + width: 100%; + max-width: 475px; + gap: 36px; + min-width: 300px; + } + @media (max-width: 960px) { + flex-direction: column; + .titleContainer { + width: 90%; + max-width: 400px; + font-size: 24px; + text-align: center; + margin: 20px auto; + font-weight: 700; + color: var(--teddy-primary-text); + } + .boxTimeContainer{ + .mixBoxTimeContainer; + margin: 0 auto; + background: var(--teddy-box-color); + border-radius: 18px; + padding: 20px; + width: 100%; + max-width: 475px; + } + .depositGroup { + margin: 0 auto; + } + } + @media (max-width: 768px) { + gap: 20px; + .depositGroup { + gap: 20px; + } + } +} diff --git a/src/pages/LBE/LBE.tsx b/src/pages/LBE/LBE.tsx new file mode 100644 index 000000000..ab21c5555 --- /dev/null +++ b/src/pages/LBE/LBE.tsx @@ -0,0 +1,41 @@ +import { useDevice } from '@ergolabs/ui-kit'; + +import DepositDApp from './DepositBox/DepositDApp'; +import DepositManual from './DepositBox/DepositManual'; +import CountdownTimer from './Details/CountdownTimer'; +import DetailsLBE from './Details/DetailsLBE'; +import styles from './LBE.module.less'; + +export default function LBE() { + const { moreThan } = useDevice(); + + const startTime = 1700748000 - 600; + const endTime = startTime + 10800 + 600; + + return ( +
+ {!moreThan('l') && ( + <> +

+ TeddySwap Liquidity Boostrapping Event +

+
+

Remaining Time

+
+ +
+
+ + )} +
+ + +
+ {moreThan('l') ? ( + + ) : ( + + )} +
+ ); +} diff --git a/src/pages/Liquidity/Liquidity.tsx b/src/pages/Liquidity/Liquidity.tsx index 5879ef187..ba90af7ff 100644 --- a/src/pages/Liquidity/Liquidity.tsx +++ b/src/pages/Liquidity/Liquidity.tsx @@ -1,4 +1,4 @@ -import { useDevice, useSearch } from '@ergolabs/ui-kit'; +import { useSearch } from '@ergolabs/ui-kit'; import { useState } from 'react'; import * as React from 'react'; @@ -13,7 +13,6 @@ import { positions$ } from '../../gateway/api/positions'; import { PoolsOrPositionsFilterValue } from './common/components/LiquidityFilter/LiquidityFilter'; import { LiquidityState } from './common/types/LiquidityState'; import { LiquidityDefaultLayout } from './default/LiquidityDefaultLayout'; -import { LiquidityMobileLayout } from './mobile/LiquidityMobileLayout'; const matchItem = ( item: AmmPool | Position | AssetLock, @@ -51,8 +50,6 @@ export const Liquidity = (): JSX.Element => { Set | undefined >(); - const { moreThan, s } = useDevice(); - const [{ active }, setSearchParams] = useSearchParams<{ active: LiquidityState | undefined }>(); const [searchByTerm, setSearch, term] = useSearch< @@ -97,41 +94,22 @@ export const Liquidity = (): JSX.Element => { const positionsWithLocks = positions?.filter((p) => !!p.locks.length); return ( - - {s && ( - 0} - positionsWithLocks={filterLockedPositions(positionsWithLocks)} - /> - )} - {moreThan('m') && ( - 0} - positionsWithLocks={filterLockedPositions(positionsWithLocks)} - /> - )} + + 0} + positionsWithLocks={filterLockedPositions(positionsWithLocks)} + /> ); }; diff --git a/src/pages/Liquidity/common/columns/PoolsOrPositionsColumns/columns/AprColumn/CardanoAprColumnContent/CardanoAprColumnContent.tsx b/src/pages/Liquidity/common/columns/PoolsOrPositionsColumns/columns/AprColumn/CardanoAprColumnContent/CardanoAprColumnContent.tsx index f28300889..5c2958e6a 100644 --- a/src/pages/Liquidity/common/columns/PoolsOrPositionsColumns/columns/AprColumn/CardanoAprColumnContent/CardanoAprColumnContent.tsx +++ b/src/pages/Liquidity/common/columns/PoolsOrPositionsColumns/columns/AprColumn/CardanoAprColumnContent/CardanoAprColumnContent.tsx @@ -3,13 +3,11 @@ import { t, Trans } from '@lingui/macro'; import sum from 'lodash/sum'; import { FC, ReactNode } from 'react'; -import { useObservable } from '../../../../../../../../common/hooks/useObservable'; import { AmmPool } from '../../../../../../../../common/models/AmmPool'; import { AssetIcon } from '../../../../../../../../components/AssetIcon/AssetIcon.tsx'; import { InfoTooltip } from '../../../../../../../../components/InfoTooltip/InfoTooltip'; import { SpfLogo } from '../../../../../../../../components/SpfLogo/SpfLogo.tsx'; import { isSpecialBoostedPool } from '../../../../../../../../utils/specialPools.ts'; -import { calculateLbspApr } from './calculateLbspApr'; type AprElement = { name: string; @@ -61,18 +59,6 @@ const AprTooltipContent: FC = ({ aprs, totalApr }) => {
); })} - - - - - SPF APR is calculated according to the current price on the Ergo - market - - - ); }; @@ -86,7 +72,6 @@ const CardanoLbspAmmPoolAprColumnContent: FC = ({ ammPool, isAllContentTrigger, }) => { - const [lbspApr] = useObservable(calculateLbspApr(ammPool), [], 0); const swapApr = ammPool.yearlyFeesPercent || 0; const aprs: Array = [ @@ -94,11 +79,6 @@ const CardanoLbspAmmPoolAprColumnContent: FC = ({ name: t`Trading Fees:`, val: swapApr, }, - { - name: t`LBSP APR:`, - val: lbspApr, - logo: , - }, ]; if (isSpecialBoostedPool(ammPool.id)) { diff --git a/src/pages/Liquidity/common/columns/PoolsOrPositionsColumns/columns/AprColumn/CardanoAprColumnContent/calculateLbspApr.ts b/src/pages/Liquidity/common/columns/PoolsOrPositionsColumns/columns/AprColumn/CardanoAprColumnContent/calculateLbspApr.ts index 6da3f1913..8e8dcc142 100644 --- a/src/pages/Liquidity/common/columns/PoolsOrPositionsColumns/columns/AprColumn/CardanoAprColumnContent/calculateLbspApr.ts +++ b/src/pages/Liquidity/common/columns/PoolsOrPositionsColumns/columns/AprColumn/CardanoAprColumnContent/calculateLbspApr.ts @@ -67,7 +67,6 @@ const getLbspMultiplier = (ammPool: AmmPool) => { return LBSP_BOOSTED_MULTIPLIER; } - // TODO: TMP_SOLUTION return LBSP_MULTIPLIER; }; diff --git a/src/pages/Liquidity/common/columns/PoolsOrPositionsColumns/columns/PairColumn/PairColumn.tsx b/src/pages/Liquidity/common/columns/PoolsOrPositionsColumns/columns/PairColumn/PairColumn.tsx index dbcf5791f..116ea6073 100644 --- a/src/pages/Liquidity/common/columns/PoolsOrPositionsColumns/columns/PairColumn/PairColumn.tsx +++ b/src/pages/Liquidity/common/columns/PoolsOrPositionsColumns/columns/PairColumn/PairColumn.tsx @@ -6,16 +6,12 @@ import { useObservable } from '../../../../../../../common/hooks/useObservable'; import { AmmPool } from '../../../../../../../common/models/AmmPool'; import { isDeprecatedPool } from '../../../../../../../common/utils/isDeprecatedPool'; import { AssetPairTitle } from '../../../../../../../components/AssetPairTitle/AssetPairTitle'; -import { BoostedPoolTag } from '../../../../../../../components/BoostedPoolTag/BoostedPoolTag.tsx'; import { DataTag } from '../../../../../../../components/common/DataTag/DataTag'; import { DeprecatedPoolTag } from '../../../../../../../components/DeprecatedPoolTag/DeprecatedPoolTag'; import { FarmsButton } from '../../../../../../../components/FarmsButton/FarmsButton'; import { IsCardano } from '../../../../../../../components/IsCardano/IsCardano.tsx'; import { IsErgo } from '../../../../../../../components/IsErgo/IsErgo'; -import { LbspPoolTag } from '../../../../../../../components/LbspPoolTag/LbspPoolTag.tsx'; import { hasFarmsForPool } from '../../../../../../../network/ergo/lm/api/farms/farms'; -import { isSpfPool } from '../../../../../../../utils/lbsp.ts'; -import { isSpecialBoostedPool } from '../../../../../../../utils/specialPools.ts'; export interface PairColumnProps { readonly ammPool: AmmPool; @@ -44,22 +40,9 @@ export const PairColumn: FC = ({ ammPool }) => { - {/*TODO: IGNORE FOR CARDANO*/} {hasFarmForPool && } - {!s && ( - - - - - - )} - {isSpecialBoostedPool(ammPool.id) && !s && ( - - - - )} {isDeprecatedPool(ammPool.id) && } diff --git a/src/pages/Liquidity/common/tableViewStates/PositionEmptyState/PositionEmptyState.tsx b/src/pages/Liquidity/common/tableViewStates/PositionEmptyState/PositionEmptyState.tsx index 2158f7b22..2af7fc30a 100644 --- a/src/pages/Liquidity/common/tableViewStates/PositionEmptyState/PositionEmptyState.tsx +++ b/src/pages/Liquidity/common/tableViewStates/PositionEmptyState/PositionEmptyState.tsx @@ -1,6 +1,5 @@ import { Button, EmptyDataState, Flex, Typography } from '@ergolabs/ui-kit'; import { Trans } from '@lingui/macro'; -import { ElementLocation, ElementName } from '@spectrumlabs/analytics'; import { FC } from 'react'; import { useNavigate } from 'react-router-dom'; @@ -19,12 +18,7 @@ export const PositionEmptyState: FC = () => { Your liquidity positions will appear here. - + diff --git a/src/pages/Liquidity/default/LiquidityDefaultLayout.module.less b/src/pages/Liquidity/default/LiquidityDefaultLayout.module.less new file mode 100644 index 000000000..1065c18f6 --- /dev/null +++ b/src/pages/Liquidity/default/LiquidityDefaultLayout.module.less @@ -0,0 +1,133 @@ +@import '../../../assets/styles/variables/general.less'; + + +.selectTabGroup { + position: absolute; + top: -70px; + left: calc(50% - 210px); + display: flex; + width: 98%; + max-width: 420px; + backdrop-filter: blur(10px); + height: 36px; + border-radius: 18px; + background: var(--teddy-box-color); + .tab { + width: 50%; + display: flex; + align-items: center; + justify-content: center; + color: var(--teddy-color-disable); + font-size: 18px; + font-weight: 600; + margin: 0; + cursor: pointer; + &.active { + color: var(--teddy-primary-text); + } + } + @media (max-width: 450px) { + left: 5px; + .tab { + font-size: 16px; + } + } +} + +.liquidityContainer { + padding: 30px; + margin-top: 50px; + .headerLiquidity { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 30px; + .searchGroup { + position: relative; + width: 40%; + .inputSearch { + .mixInputDefault; + background: var(--teddy-box-color-dark); + border-radius: 8px; + height: 45px; + font-size: 14px; + color: var(--teddy-text-input-secondary); + width: 100%; + max-width: 415px; + min-width: 415px; + padding-left: 36px; + &::placeholder { + color: var(--teddy-text-input-secondary); + } + &:focus { + border: 1px solid var(--teddy-dark-color-active); + } + } + .icon { + fill: var(--teddy-text-input-secondary); + display: flex; + align-items: center; + justify-content: center; + position: absolute; + top: calc(50% - 8px); + left: 14px; + } + } + .harvestGroup { + display: flex; + align-items: center; + justify-content: flex-end; + min-width: 200px; + width: 60%; + height: 45px; + gap: 20px; + .btnHarvest { + width: 20%; + .mixBtn; + height: 100%; + font-size: 16px; + max-width: 200px; + } + @media (max-width: 1040px) { + gap: 10px; + } + } + + } + + @media (max-width: 960px) { + margin-top: 90px; + } + @media (max-width: 815px) { + .headerLiquidity { + flex-direction: column; + align-items: flex-start; + gap: 16px; + margin-bottom: 16px; + .searchGroup { + width: 100%; + .inputSearch { + max-width: none; + min-width: 200px; + } + } + .harvestGroup { + flex-direction: row-reverse; + width: 280px; + .btnHarvest { + width: 100%; + } + } + } + } + @media (max-width: 450px) { + padding: 16px; + } + @media (max-width: 350px) { + .searchGroup { + .inputSearch { + font-size: 12px; + } + } + } +} diff --git a/src/pages/Liquidity/default/LiquidityDefaultLayout.tsx b/src/pages/Liquidity/default/LiquidityDefaultLayout.tsx index 0a6d8e5be..3978b8d40 100644 --- a/src/pages/Liquidity/default/LiquidityDefaultLayout.tsx +++ b/src/pages/Liquidity/default/LiquidityDefaultLayout.tsx @@ -1,114 +1,142 @@ -import { Button, Flex, Tabs } from '@ergolabs/ui-kit'; -import { t, Trans } from '@lingui/macro'; -import { FC } from 'react'; -import { useNavigate } from 'react-router-dom'; -import styled from 'styled-components'; +import { FC, useState } from 'react'; -import { SearchInput } from '../../../components/SearchInput/SearchInput'; -import { LiquidityFilter } from '../common/components/LiquidityFilter/LiquidityFilter'; +import useFetchRewards from '../../../common/hooks/useFetchRewards'; +import { useObservable } from '../../../common/hooks/useObservable'; +import useWindowSize from '../../../common/hooks/useResponsive'; +import { isWalletSetuped$ } from '../../../gateway/api/wallets'; +import { settings$ } from '../../../gateway/settings/settings'; +import { SEARCH } from '../../../utils/images'; import { LiquidityLayoutProps } from '../common/types/LiquidityLayoutProps'; import { LiquidityState } from '../common/types/LiquidityState'; -import { LockedPositions } from './components/LockedPositions/LockedPositions'; import { PoolsOverview } from './components/PoolsOverview/PoolsOverview'; +import ConfirmRewardsModals from './components/Rewards/ConfirmRewardsModals'; +import Rewards from './components/Rewards/Rewards'; +import RewardsModals from './components/Rewards/RewardsModals'; import { YourPositions } from './components/YourPositions/YourPositions'; - -const LiquidityTabs = styled(Tabs)` - .ant-tabs-nav-wrap { - flex: initial !important; - margin-right: calc(var(--spectrum-base-gutter) * 2); - } - - .ant-tabs-nav { - margin-bottom: calc(var(--spectrum-base-gutter) * 2) !important; - justify-content: space-between; - } - - .ant-tabs-extra-content { - flex: 1; - } -`; +import styles from './LiquidityDefaultLayout.module.less'; export const LiquidityDefaultLayout: FC = ({ ammPools, isAmmPoolsLoading, - term, handleSearchTerm, - filters, - setFilters, activeState, setActiveState, positions, isPositionsEmpty, isPositionsLoading, - positionsWithLocks, - showLockedPositions, }) => { - const navigate = useNavigate(); - const LiquidityStateCaptions = { - [LiquidityState.POOLS_OVERVIEW]: t`Overview`, - [LiquidityState.YOUR_POSITIONS]: t`My Liquidity`, - [LiquidityState.LOCKED_POSITIONS]: t`Locked Liquidity`, + const [isWalletConnected] = useObservable(isWalletSetuped$); + const { width } = useWindowSize(); + const [settings] = useObservable(settings$); + const { + data, + isLoading, + handleClickClaimRewards, + transactionStatus, + setTransactionStatus /* , error */, + } = useFetchRewards(settings?.address ? settings.address : ''); + + const handleClickConfirm = () => { + handleClickClaimRewards(); + setIsConfirm(false); + }; + + const [isConfirm, setIsConfirm] = useState(false); + const handleClickHarvest = () => { + setIsConfirm(true); }; return ( - - - - - - - - - - ), - }} - activeKey={activeState} - onChange={setActiveState as any} - > - - - - - - - {showLockedPositions && ( - +
+

setActiveState(LiquidityState.POOLS_OVERVIEW)} + className={`${styles.tab} ${ + activeState === LiquidityState.POOLS_OVERVIEW ? styles.active : '' + }`} + > + All Liquidity +

+

setActiveState(LiquidityState.YOUR_POSITIONS)} + className={`${styles.tab} ${ + activeState === LiquidityState.YOUR_POSITIONS ? styles.active : '' + }`} > - - - )} - + Your Liquidity +

+
+
+
+
+ + + + +
+ {activeState === LiquidityState.YOUR_POSITIONS && ( +
+ {isWalletConnected && ( + + )} + {transactionStatus !== undefined && ( + + )} + {isConfirm && ( + setIsConfirm(false)} + onConfirm={handleClickConfirm} + /> + )} + +
+ )} +
+ +
+ {activeState === LiquidityState.POOLS_OVERVIEW && ( + <> + + + )} + {activeState === LiquidityState.YOUR_POSITIONS && ( + <> + + + )} +
+
+ ); }; diff --git a/src/pages/Liquidity/default/LiquidityTable/LiquidityTable.module.less b/src/pages/Liquidity/default/LiquidityTable/LiquidityTable.module.less new file mode 100644 index 000000000..6d510d5ab --- /dev/null +++ b/src/pages/Liquidity/default/LiquidityTable/LiquidityTable.module.less @@ -0,0 +1,99 @@ +@import '../../../../assets/styles/variables/general.less'; + +.liquidityContainer { + padding: 30px; + margin-top: 50px; + .headerLiquidity { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 30px; + .searchGroup { + position: relative; + width: 40%; + .inputSearch { + .mixInputDefault; + background: var(--teddy-box-color-dark); + border-radius: 8px; + height: 45px; + font-size: 14px; + color: var(--teddy-text-input-secondary); + width: 100%; + max-width: 415px; + min-width: 415px; + padding-left: 36px; + &::placeholder { + color: var(--teddy-text-input-secondary); + } + &:focus { + border: 1px solid var(--teddy-dark-color-active); + } + } + .icon { + fill: var(--teddy-text-input-secondary); + display: flex; + align-items: center; + justify-content: center; + position: absolute; + top: calc(50% - 8px); + left: 14px; + } + } + .harvestGroup { + display: flex; + align-items: center; + justify-content: flex-end; + min-width: 200px; + width: 60%; + height: 45px; + gap: 20px; + .btnHarvest { + width: 20%; + .mixBtn; + height: 100%; + font-size: 16px; + max-width: 200px; + } + @media (max-width: 1040px) { + gap: 10px; + } + } + + } + + @media (max-width: 960px) { + margin-top: 90px; + } + @media (max-width: 815px) { + .headerLiquidity { + flex-direction: column; + align-items: flex-start; + gap: 16px; + margin-bottom: 16px; + .searchGroup { + width: 100%; + .inputSearch { + max-width: none; + min-width: 200px; + } + } + .harvestGroup { + flex-direction: row-reverse; + width: 280px; + .btnHarvest { + width: 100%; + } + } + } + } + @media (max-width: 450px) { + padding: 16px; + } + @media (max-width: 350px) { + .searchGroup { + .inputSearch { + font-size: 12px; + } + } + } +} \ No newline at end of file diff --git a/src/pages/Liquidity/default/LiquidityTable/LiquidityTable.tsx b/src/pages/Liquidity/default/LiquidityTable/LiquidityTable.tsx new file mode 100644 index 000000000..8e789c73e --- /dev/null +++ b/src/pages/Liquidity/default/LiquidityTable/LiquidityTable.tsx @@ -0,0 +1,96 @@ +import useFetchRewards from '../../../../common/hooks/useFetchRewards'; +import { useObservable } from '../../../../common/hooks/useObservable'; +import useWindowSize from '../../../../common/hooks/useResponsive'; +import { isWalletSetuped$ } from '../../../../gateway/api/wallets'; +import { settings$ } from '../../../../gateway/settings/settings'; +import { SEARCH } from '../../../../utils/images'; +import { LiquidityPoolsOverviewProps } from '../../common/types/LiquidityPoolsOverviewProps'; +import { LiquidityState } from '../../common/types/LiquidityState'; +import { LiquidityYourPositionsProps } from '../../common/types/LiquidityYourPositionsProps'; +import { PoolsOverview } from '../components/PoolsOverview/PoolsOverview'; +import Rewards from '../components/Rewards/Rewards'; +import { YourPositions } from '../components/YourPositions/YourPositions'; +import styles from './LiquidityTable.module.less'; + +type LiquidityTableProps = { + readonly activeState: LiquidityState; + handleSearchTerm: (e: React.ChangeEvent) => void; +} & LiquidityPoolsOverviewProps & + LiquidityYourPositionsProps; + +export const LiquidityTable = ({ + activeState, + handleSearchTerm, + ammPools, + isAmmPoolsLoading, + isPositionsEmpty, + isPositionsLoading, + positions, +}: LiquidityTableProps) => { + const [isWalletConnected] = useObservable(isWalletSetuped$); + const { width } = useWindowSize(); + + const [settings] = useObservable(settings$); + const { data, isLoading /* , error */ } = useFetchRewards( + settings?.address ? settings.address : '', + ); + + return ( +
+
+
+ + + + +
+ {activeState === LiquidityState.YOUR_POSITIONS && ( +
+ {isWalletConnected && ( + + )} + + +
+ )} +
+ +
+ {activeState === LiquidityState.POOLS_OVERVIEW && ( + <> + + + )} + {activeState === LiquidityState.YOUR_POSITIONS && ( + <> + + + )} +
+
+ ); +}; diff --git a/src/pages/Liquidity/default/common/PoolOrPositionDetails/PoolOrPositionDetails.tsx b/src/pages/Liquidity/default/common/PoolOrPositionDetails/PoolOrPositionDetails.tsx index 9a251fc10..1e3a6ff5a 100644 --- a/src/pages/Liquidity/default/common/PoolOrPositionDetails/PoolOrPositionDetails.tsx +++ b/src/pages/Liquidity/default/common/PoolOrPositionDetails/PoolOrPositionDetails.tsx @@ -1,6 +1,5 @@ import { Button, Flex, Typography } from '@ergolabs/ui-kit'; import { Trans } from '@lingui/macro'; -import { ElementLocation, ElementName } from '@spectrumlabs/analytics'; import { FC } from 'react'; import { useNavigate } from 'react-router-dom'; @@ -54,12 +53,7 @@ export const PoolOrPositionDetails: FC< - + diff --git a/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/APR.tsx b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/APR.tsx new file mode 100644 index 000000000..c4efb9c5e --- /dev/null +++ b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/APR.tsx @@ -0,0 +1,40 @@ +import { FC, useEffect, useState } from 'react'; +import { firstValueFrom, Observable } from 'rxjs'; + +export const APR: FC<{ + infoPool: any; + isLoading: boolean; + calculateAPR: ( + poolId: string, + userLPAmount?: bigint | undefined, + ) => Observable<[bigint, bigint]>; +}> = ({ infoPool, calculateAPR, isLoading }) => { + const [apr, setApr] = useState(null); + + useEffect(() => { + const yieldFarmingAprByPoolId = async (pool: any) => { + if (pool === undefined || pool.poolAnalytics === undefined) return; + try { + const [aprValue] = await firstValueFrom( + calculateAPR(pool.poolAnalytics.id), + ); + setApr(aprValue); + } catch (error) { + console.error(error); + } + }; + + const interval = setInterval(() => { + if (infoPool) { + yieldFarmingAprByPoolId(infoPool); + } + }, 20_000); + + yieldFarmingAprByPoolId(infoPool); + + return () => clearInterval(interval); + }, [isLoading]); + + const finalAPR = infoPool.yearlyFeesPercent + (Number(apr?.toString()) || 0); + return <>{finalAPR >= 0 ? `${Number(finalAPR).toFixed(2)}%` : '-'}; +}; diff --git a/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/AssetPairDetail.module.less b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/AssetPairDetail.module.less new file mode 100644 index 000000000..29e7c880e --- /dev/null +++ b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/AssetPairDetail.module.less @@ -0,0 +1,43 @@ +.assetGroup { + display: flex; + width: fit-content; + height: 100%; + align-items: center; + gap: 10px; + .logoGroup { + display: flex; + align-items: center; + .logo { + display: flex; + align-items: center; + justify-content: center; + width: 30px; + height: auto; + border-radius: 50%; + &:last-child { + margin-left: -10px; + } + } + } + .name { + margin: 0; + font-size: 16px; + font-weight: 600; + color: var(--teddy-primary-text); + } + @media (max-width: 450px) { + gap: 5px; + .logoGroup { + .logo{ + width: 20px; + &:last-child { + margin-left: -5px; + } + } + } + .name { + font-size: 14px; + font-weight: 500; + } + } +} diff --git a/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/AssetPairDetail.tsx b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/AssetPairDetail.tsx new file mode 100644 index 000000000..a0c47a19a --- /dev/null +++ b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/AssetPairDetail.tsx @@ -0,0 +1,23 @@ +import styles from './AssetPairDetail.module.less'; + +interface AssetPairDetailProps { + assetX: any; + assetY: any; +} + +export default function AssetPairDetail(props: AssetPairDetailProps) { + const { assetX, assetY } = props; + + return ( +
+
+ logo + logo +
+

+ {assetX.asset.ticker || assetX.asset.name}/ + {assetY.asset.ticker || assetY.asset.name} +

+
+ ); +} diff --git a/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/PoolsOrPositionsTableView.module.less b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/PoolsOrPositionsTableView.module.less new file mode 100644 index 000000000..3e0008960 --- /dev/null +++ b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/PoolsOrPositionsTableView.module.less @@ -0,0 +1,296 @@ +@import "../../../../../assets/styles/variables/general.less"; + +.colConfig { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + padding-inline: 36px 60px; + gap: 10px; + @media (max-width: 580px) { + padding-right: 10px; + } + .row { + width: 17%; + &.asset { + min-width: 200px; + } + &.apr, &.fee { + min-width: 70px; + max-width: 115px; + } + &.price { + min-width: 150px; + @media (max-width: 500px) { + min-width: 100px; + } + } + &.apr { + @media (max-width: 580px) { + display: none; + } + } + &.tvl, &.yourTvl { + min-width: 90px; + max-width: 115px; + } + &.volume { + min-width: 100px; + max-width: 115px; + } + &.volume, &.tvl{ + @media (max-width: 900px) { + display: none; + } + } + &.fee { + @media (max-width: 680px) { + display: none; + } + } + .value { + margin: 0; + color: var(--teddy-text-input-secondary); + } + } + @media (max-width: 550px) { + padding-inline: 16px 20px; + } + @media (max-width: 450px) { + padding-inline: 10px 16px; + .row { + &.asset { + min-width: 150px; + } + } + } +} + +.poolsPositionTable { + .thead { + background: var(--teddy-box-color); + border-radius: 8px; + height: 50px; + .colConfig; + .row { + display: flex; + align-items: center; + .value { + font-weight: 600; + } + } + } + .tbody { + flex-direction: column; + align-items: flex-start; + width: 100%; + max-height: 460px; + overflow-y: auto; + .tbodyContent { + cursor: pointer; + .colConfig; + position: relative; + border-bottom: 1px solid #3D505A; + .row { + height: 90px; + display: flex; + align-items: center; + gap: 8px; + .icon.deprecated { + fill: var(--teddy-color-danger); + stroke: var(--teddy-color-danger); + } + } + &:hover { + background: var(--teddy-box-color-table); + } + .icon { + position: absolute; + right: 10px; + fill: var(--teddy-dark-color-active); + transition: all 0.3s; + &.open { + transform: rotate(180deg); + } + @media (max-width: 450px) { + right: 5px; + } + } + } + .details { + opacity: 0; + transition: all 0.5s; + background: var(--teddy-box-color-table); + height: 0; + overflow: hidden; + display: flex; + gap: 30px; + width: 100%; + justify-content: space-between; + &.expanded { + padding: 24px 30px; + opacity: 1; + height: 160px; + border-bottom: 1px solid #3D505A; + } + .poolInfo{ + display: flex; + justify-content: flex-start; + gap: 20px; + width: calc(100% - 500px); + .priceGroup, .totalLiquidityGroup, .aprGroup, .yourLiquidityGroup, .volumeGroup, .tvlGroup, .feeGroup { + .titleDetails { + color: #899398; + margin: 0; + font-size: 16px; + margin-bottom: 10px; + } + .detailsContent { + display: flex; + flex-direction: column; + .value{ + margin: 0; + color: var(--teddy-text-input-secondary); + font-size: 14px; + } + } + } + @media (max-width: 1160px) { + width: calc(100% - 175px); + max-width: 680px; + } + @media (min-width: 900px) { + .volumeGroup, .tvlGroup { + display: none; + } + } + @media (min-width: 680px) { + .feeGroup { + display: none; + } + } + @media (min-width: 580px) { + .aprGroup { + display: none; + } + } + @media (max-width: 420px) { + .priceGroup, .totalLiquidityGroup, .aprGroup, .yourLiquidityGroup, .volumeGroup, .tvlGroup, .feeGroup { + .detailsContent { + .value { + font-size: 12px; + } + } + } + } + } + .poolActions { + display: flex; + width: 500px; + gap: 20px; + align-items: center; + .btnSwap, .btnLiquidity { + .mixBtn; + height: 40px; + font-size: 16px; + } + @media (max-width: 1160px) { + flex-direction: column; + width: 175px; + justify-content: center; + gap: 10px; + } + } + @media (max-width: 850px) { + flex-direction: column; + gap: 20px; + &.expanded { + height: auto; + padding: 16px 24px; + } + .poolInfo { + width: 100%; + max-width: none; + justify-content: center; + gap: 20px; + .priceGroup, .totalLiquidityGroup, .aprGroup, .yourLiquidityGroup, .volumeGroup, .tvlGroup, .feeGroup { + .titleDetails { + text-align: center; + } + .detailsContent { + .value{ + text-align: center; + } + } + } + } + .poolActions { + flex-direction: row; + width: 100%; + max-width: 500px; + margin: auto; + gap: 20px; + } + } + @media (max-width: 690px) { + .poolInfo { + flex-direction: column; + align-items: center; + gap: 20px; + } + .poolActions { + flex-direction: column; + max-width: 300px; + } + } + } + &.loading{ + .tbodyContent { + height: 90px; + width: 100%; + background: linear-gradient(90deg, var(--teddy-secondary-color) 25%, var(--teddy-secondary-text-dark) 50%, var(--teddy-secondary-color) 75%); + background-size: 200% 100%; + animation: loadingAnimation 1.5s infinite linear; + } + } + &.positionEmpty { + .tbodyContent { + display: flex; + flex-direction: column; + padding: 30px; + cursor: default; + &:hover { + background: none; + } + .icon { + position: static; + display: flex; + align-items: center; + justify-content: center; + fill: var(--teddy-secondary-text-dark); + } + .text { + margin: 0; + color: var(--teddy-text-input-secondary); + font-size: 16px; + text-align: center + } + .btnLiquidity { + .mixBtn; + width: 175px; + height: 40px; + font-size: 16px; + } + } + } + } +} + +@keyframes loadingAnimation { + 0% { + background-position: 100% 0; + } + 100% { + background-position: -100% 0; + } +} diff --git a/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/PoolsOrPositionsTableView.tsx b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/PoolsOrPositionsTableView.tsx index 80c12c1ba..2b0305639 100644 --- a/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/PoolsOrPositionsTableView.tsx +++ b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/PoolsOrPositionsTableView.tsx @@ -1,80 +1,349 @@ -import { useDevice } from '@ergolabs/ui-kit'; -import { Trans } from '@lingui/macro'; -import { FC, PropsWithChildren } from 'react'; +import { FC, Fragment, PropsWithChildren, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { AmmPool } from '../../../../../common/models/AmmPool'; +import { Currency } from '../../../../../common/models/Currency.ts'; import { Position } from '../../../../../common/models/Position'; +import { isDeprecatedPool } from '../../../../../common/utils/isDeprecatedPool.ts'; +import { ConvenientAssetView } from '../../../../../components/ConvenientAssetView/ConvenientAssetView.tsx'; +import { IsCardano } from '../../../../../components/IsCardano/IsCardano.tsx'; import { ExpandComponentProps } from '../../../../../components/TableView/common/Expand'; -import { TableView } from '../../../../../components/TableView/TableView'; -import { ActionsColumn } from '../../../common/columns/PoolsOrPositionsColumns/columns/ActionsColumn'; -import { AprColumn } from '../../../common/columns/PoolsOrPositionsColumns/columns/AprColumn/AprColumn'; -import { PairColumn } from '../../../common/columns/PoolsOrPositionsColumns/columns/PairColumn/PairColumn'; -import { TvlOrVolume24Column } from '../../../common/columns/PoolsOrPositionsColumns/columns/TvlOrVolume24Column/TvlOrVolume24Column'; -import { Apr24InfoTooltip } from '../../../common/components/Apr24InfoTooltip/Apr24InfoTooltip.tsx'; -import { LiquiditySearchState } from '../../../common/tableViewStates/LiquiditySearchState/LiquiditySearchState'; +import { useApr } from '../../../../../network/cardano/api/ammPoolsStats/ammPoolsApr.ts'; +import { formatToAda } from '../../../../../services/number.ts'; +import { + CHEVRON_DOWN, + VERIFIED, + WARNING, +} from '../../../../../utils/images.ts'; +import { APR } from './APR.tsx'; +import AssetPairDetail from './AssetPairDetail.tsx'; +import styles from './PoolsOrPositionsTableView.module.less'; +import PriceTokenDetail from './PriceTokensDetail.tsx'; +import TvlTokensDetail from './TvlTokensDetail.tsx'; +import { YourTvl } from './YourTvl.tsx'; export interface PoolsOrPositionsTableViewProps { readonly items: T[]; - readonly poolMapper: (item: T) => AmmPool; + readonly poolMapper: (item: T) => AmmPool | Position; readonly expandComponent: FC>; + readonly myLiquidity: boolean; + readonly isPositionsEmpty?: boolean; + readonly loading?: boolean | undefined; + readonly isPositionsLoading?: boolean | undefined; } export const PoolsOrPositionsTableView: FC< PropsWithChildren> -> = ({ children, poolMapper, items }) => { - const { valBySize } = useDevice(); +> = ({ poolMapper, items, myLiquidity }) => { const navigate = useNavigate(); + const [extendTable, setExtendTable] = useState(null); + const toggleExtendTable = (itemId: string) => { + setExtendTable((prevId) => (prevId === itemId ? null : itemId)); + }; + + const handleSwap = (token1, token2, poolid) => + navigate( + `../../swap?base=${token1}"e=${token2}&initialPoolId=${poolid}`, + ); + + const handleAddLiquidity = (poolid) => navigate(`${poolid}/add`); + const handleManageLiquidity = (poolid) => navigate(`${poolid}`); + + const { calculateAPR, isLoading } = useApr(20_000); return ( - { - navigate(poolMapper(item).id); - }} - itemKey="id" - itemHeight={80} - maxHeight="70vh" - gap={1} - tableHeaderPadding={[0, 6]} - tableItemViewPadding={[0, 4]} - > - Pair} - > - {(ammPool) => } - - TVL} - > - {(ammPool) => } - - Volume 24h} - > - {(ammPool) => } - - - APR 24h - - } - > - {(ammPool: AmmPool) => } - - - {(ammPool) => } - - {children} - - - - + <> +
+
+
+

Asset Pair

+
+
+

Price

+
+
+

Fee

+
+
+

APR

+
+ {myLiquidity === false && ( +
+

TVL

+
+ )} + {myLiquidity ? ( + <> +
+

Your TVL

+
+ + ) : ( +
+

Volume 24H

+
+ )} +
+
+ {items.map((item) => { + let infoPool; + let infoPosition; + if (!myLiquidity) { + infoPool = poolMapper(item); + } else { + infoPool = poolMapper(item).pool; + infoPosition = poolMapper(item); + } + return ( + +
toggleExtendTable(infoPool.id)} + key={infoPool.id} + > +
+ + + {isDeprecatedPool(infoPool.id) ? ( + warning + ) : ( + verified + )} + +
+
+ +

+ +

+
+
+
+ +

{infoPool.poolFee}%

+
+
+
+ +

+ +

+
+
+ + {myLiquidity === false && ( +
+ +

+ {infoPool.tvl + ? formatToAda(infoPool.tvl.toAmount(), 'abbr') + : 'N / A'} +

+
+
+ )} + {myLiquidity ? ( + <> +
+ + + +
+ + ) : ( +
+ +

+ {infoPool.volume + ? formatToAda(infoPool.volume.toAmount(), 'abbr') + : 'N / A'} +

+
+
+ )} + + + +
+
+
+
+

APR

+
+ +

+ +

+
+
+
+ {myLiquidity ? ( +
+

TVL

+
+ +

+ {infoPool.tvl + ? formatToAda(infoPool.tvl.toAmount(), 'abbr') + : 'N / A'} +

+
+
+
+ ) : ( +
+

Volume 24H

+
+ +

+ {infoPool.volume + ? formatToAda( + infoPool.volume.toAmount(), + 'abbr', + ) + : 'N / A'} +

+
+
+
+ )} + +
+

Fee

+
+ +

{infoPool.poolFee}%

+
+
+
+
+

Price

+
+ + +
+
+
+

Total Liquidity

+
+ + +
+
+ {myLiquidity && ( +
+

Your Liquidity

+
+ + +
+
+ )} +
+
+ + +
+
+
+ ); + })} +
+
+ ); }; diff --git a/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/PositionEmpty.tsx b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/PositionEmpty.tsx new file mode 100644 index 000000000..4ea1fc8da --- /dev/null +++ b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/PositionEmpty.tsx @@ -0,0 +1,50 @@ +import { Modal } from '@ergolabs/ui-kit'; + +import { useObservable } from '../../../../../common/hooks/useObservable'; +import { ChooseWalletModal } from '../../../../../components/common/ConnectWalletButton/ChooseWalletModal/ChooseWalletModal'; +import { isWalletSetuped$ } from '../../../../../gateway/api/wallets'; +import { BANK } from '../../../../../utils/images'; +import styles from './PoolsOrPositionsTableView.module.less'; + +export default function PositionEmpty() { + const [isWalletConnected] = useObservable(isWalletSetuped$); + const openChooseWalletModal = (): void => { + Modal.open(({ close }) => ); + }; + return ( +
+
+
+

Asset Pair

+
+
+

TVL

+
+
+

Volume 24H

+
+
+

Fee

+
+
+
+
+ + + +

+ Your liquidity positions will appear here. +

+ {!isWalletConnected && ( + + )} +
+
+
+ ); +} diff --git a/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/PriceTokensDetail.tsx b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/PriceTokensDetail.tsx new file mode 100644 index 000000000..57f5c4852 --- /dev/null +++ b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/PriceTokensDetail.tsx @@ -0,0 +1,32 @@ +import styles from './TokenDetail.module.less'; + +interface PriceTokenDetailProps { + tokenName1: any; + tokenName2: any; + priceToken1: any; + priceToken2: any; + decimalsToken1: any; + decimalsToken2: any; +} + +export default function PriceTokenDetail(props: PriceTokenDetailProps) { + const { + tokenName1, + tokenName2, + priceToken1, + priceToken2, + decimalsToken1, + decimalsToken2, + } = props; + + const result = ( + (Number(priceToken1) / Number(priceToken2)) * + Math.pow(10, decimalsToken1 - decimalsToken2) + ).toFixed(decimalsToken2); + + return ( +

+ 1 {tokenName1} = {result} {tokenName2} +

+ ); +} diff --git a/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/TableLoading.tsx b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/TableLoading.tsx new file mode 100644 index 000000000..67cc035a0 --- /dev/null +++ b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/TableLoading.tsx @@ -0,0 +1,32 @@ +import styles from './PoolsOrPositionsTableView.module.less'; + +export default function TableLoading() { + const skeletonData = Array(5) + .fill(null) + .map((_, index) => ({ + _DB_id: index, + })); + return ( +
+
+
+

Asset Pair

+
+
+

TVL

+
+
+

Volume 24H

+
+
+

Fee

+
+
+
+ {skeletonData.map((fund) => ( +
+ ))} +
+
+ ); +} diff --git a/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/TokenDetail.module.less b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/TokenDetail.module.less new file mode 100644 index 000000000..eb1fca50b --- /dev/null +++ b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/TokenDetail.module.less @@ -0,0 +1,8 @@ +.value { + margin: 0; + color: var(--teddy-text-input-secondary); + font-size: 14px; + @media (max-width: 420px) { + font-size: 12px; + } +} diff --git a/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/TvlTokensDetail.tsx b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/TvlTokensDetail.tsx new file mode 100644 index 000000000..a0dc450a2 --- /dev/null +++ b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/TvlTokensDetail.tsx @@ -0,0 +1,33 @@ +import styles from './TokenDetail.module.less'; + +interface TvlTokensDetailProps { + tokenName: any; + tvlToken: any; + decimalsToken: any; +} + +export default function TvlTokensDetail(props: TvlTokensDetailProps) { + const { tokenName, tvlToken, decimalsToken } = props; + + const formatAmount = (value: number) => { + const formated = Intl.NumberFormat('en', { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }) + .format(value) + .replace(/\.?0+$/, ''); + return formated; + }; + + const decimals = decimalsToken ? Number(decimalsToken) : 0; + const tvl = + decimalsToken !== 0 + ? Number(tvlToken) / Math.pow(10, decimals) + : Number(tvlToken); + + return ( +

+ {tokenName}: {formatAmount(tvl)} +

+ ); +} diff --git a/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/YieldFarmingReward.tsx b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/YieldFarmingReward.tsx new file mode 100644 index 000000000..77034fd03 --- /dev/null +++ b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/YieldFarmingReward.tsx @@ -0,0 +1,120 @@ +import { FC, useEffect, useState } from 'react'; +import { firstValueFrom, Observable } from 'rxjs'; + +import { Currency } from '../../../../../common/models/Currency'; +import { useAssetsBalance } from '../../../../../gateway/api/assetBalance'; + +function convertSubunitToTedy(subunitAmount: bigint, scale = 6) { + const factor = BigInt('1' + '0'.repeat(scale)); // Creates a BigInt factor for scaling + const scaledAmount = subunitAmount * factor; // Scale up to maintain precision + const dividedAmount = scaledAmount / 1000000n; // Perform the division + + // Convert the BigInt to a string + let dividedStr = dividedAmount.toString(); + + // Pad the string with leading zeros if it's shorter than scale + 1 + while (dividedStr.length <= scale) { + dividedStr = '0' + dividedStr; + } + + // Insert the decimal point + const tedyAmount = + dividedStr.slice(0, -scale) + '.' + dividedStr.slice(-scale); + + return tedyAmount; +} + +export const YieldFarmingReward: FC<{ + infoPool: any; + infoPosition: any; + isLoading: boolean; + calculateAPR: ( + poolId: string, + userLPAmount?: bigint | undefined, + elapsedSeconds?: bigint | undefined, + ) => Observable<[bigint, bigint]>; +}> = ({ infoPool, infoPosition, calculateAPR, isLoading }) => { + const [balance] = useAssetsBalance(); + const [rewardAmount, setRewardAmount] = useState(null); + + const yieldFarmingStartTimestamp = 1701378922; + const elapsedSeconds = () => + Math.floor(Date.now() / 1000) - yieldFarmingStartTimestamp; + + const poolId: string | undefined | null = + infoPool.pool.id.policyId + '.' + infoPool.pool.id.name; + + console.log(poolId); + + let totalYieldReward = 0; + let baseReward = 0; + let totalYieldBonus = 0; + let totalBonusPercentage = 0; + let roundOneNfts: string[] = []; + let roundTwoNfts: string[] = []; + + useEffect(() => { + const yieldFarmingAprByPoolId = async () => { + try { + const [, rewardAmount] = (await firstValueFrom( + calculateAPR( + poolId ?? '', + infoPosition.availableLp.amount, + BigInt(elapsedSeconds()), + ), + )) as [bigint, bigint]; + setRewardAmount(rewardAmount); + } catch (error) { + console.error(error); + } + }; + + const interval = setInterval(() => { + yieldFarmingAprByPoolId(); + }, 1000); + + yieldFarmingAprByPoolId(); + + return () => clearInterval(interval); + }, [isLoading]); + + if (poolId != undefined || poolId != null) { + const assets = (balance as any).mapAssetIdToBalance as Map< + string, + Currency + >; + + roundOneNfts = [...assets.keys()].filter((assetId) => + assetId.startsWith( + 'ab182ed76b669b49ee54a37dee0d0064ad4208a859cc4fdf3f906d87', + ), + ); + + roundTwoNfts = [...assets.keys()].filter((assetId) => + assetId.startsWith( + 'da3562fad43b7759f679970fb4e0ec07ab5bebe5c703043acda07a3c', + ), + ); + + baseReward = Number(convertSubunitToTedy(rewardAmount ?? 0n, 6)); + + // Calculate bonuses separately + const bonusFromRoundOneNFTs = + roundOneNfts.length >= 30 ? 30 * 0.01 : roundOneNfts.length * 0.01; + const bonusFromRoundTwoNFTs = + roundTwoNfts.length >= 30 ? 30 * 0.004 : roundTwoNfts.length * 0.004; + + // Sum the bonuses + totalBonusPercentage = bonusFromRoundOneNFTs + bonusFromRoundTwoNFTs; + + // Apply the total bonus to the base reward + totalYieldBonus = baseReward * totalBonusPercentage; + + // Calculate the total yield reward + totalYieldReward = baseReward + totalYieldBonus; + } + console.log(totalYieldReward); + return ( + <>{totalYieldReward >= 0 ? `${totalYieldReward.toFixed(6)} TEDY` : '-'} + ); +}; diff --git a/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/YourTvl.tsx b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/YourTvl.tsx new file mode 100644 index 000000000..a8ba40144 --- /dev/null +++ b/src/pages/Liquidity/default/common/PoolsOrPositionsTableView/YourTvl.tsx @@ -0,0 +1,59 @@ +import { LoadingOutlined } from '@ergolabs/ui-kit'; +import { FC, useMemo } from 'react'; +import { of } from 'rxjs'; + +import { convertToConvenientNetworkAsset } from '../../../../../api/convertToConvenientNetworkAsset'; +import { useObservable } from '../../../../../common/hooks/useObservable'; +import { Currency } from '../../../../../common/models/Currency'; +import { useSelectedNetwork } from '../../../../../gateway/common/network'; +import { Network } from '../../../../../network/common/Network'; +import { formatToAda } from '../../../../../services/number'; +import styles from './TokenDetail.module.less'; + +export interface YourTvlProps { + readonly value: Currency | Currency[] | undefined; +} + +const SMALLEST_VALUE = 0.01; +const ZERO_VALUE = '0.00'; + +export const getConvenientValue = ( + network: Network, + convenientValue?: Currency, + value?: Currency | Currency[], +): string => { + if (!convenientValue || !value || value.toString() === '0') { + return network.name !== 'ergo' ? `${ZERO_VALUE} ₳` : `$${ZERO_VALUE}`; + } else if (Number(convenientValue.toString()) < SMALLEST_VALUE) { + return network.name !== 'ergo' + ? `<${SMALLEST_VALUE} ₳` + : `<$${SMALLEST_VALUE}`; + } + return formatToAda(convenientValue, 'abbr'); +}; + +export const YourTvl: FC = ({ value }) => { + const [selectedNetwork] = useSelectedNetwork(); + + const convenientAssetValue$ = useMemo( + () => (value ? convertToConvenientNetworkAsset(value) : of(undefined)), + value instanceof Array ? [value] : [value?.amount, value?.asset?.id], + ); + + const [convenientValue, isConvenientValueLoading] = useObservable( + convenientAssetValue$, + value instanceof Array ? [value] : [value?.amount, value?.asset?.id], + ); + + return ( + <> + {isConvenientValueLoading ? ( + + ) : ( +

+ {getConvenientValue(selectedNetwork, convenientValue, value)} +

+ )} + + ); +}; diff --git a/src/pages/Liquidity/default/components/PoolsOverview/PoolsOverview.tsx b/src/pages/Liquidity/default/components/PoolsOverview/PoolsOverview.tsx index 080fb2920..ad5f30fea 100644 --- a/src/pages/Liquidity/default/components/PoolsOverview/PoolsOverview.tsx +++ b/src/pages/Liquidity/default/components/PoolsOverview/PoolsOverview.tsx @@ -1,27 +1,31 @@ import { FC } from 'react'; import { AmmPool } from '../../../../../common/models/AmmPool'; -import { ListSkeletonLoadingState } from '../../../../../components/SkeletonLoader/ListSkeletonLoadingState.tsx'; -import { TableView } from '../../../../../components/TableView/TableView'; import { PoolsOrPositionsTableView } from '../../common/PoolsOrPositionsTableView/PoolsOrPositionsTableView'; +import TableLoading from '../../common/PoolsOrPositionsTableView/TableLoading'; import { PoolDetails } from './PoolDetails/PoolDetails'; export interface PoolsOverviewProps { readonly ammPools: AmmPool[]; readonly loading?: boolean; + readonly myLiquidity: boolean; } export const PoolsOverview: FC = ({ ammPools, loading, -}) => ( - ammPool} - > - - - - -); + myLiquidity, +}) => { + if (loading) { + return ; + } + return ( + ammPool} + myLiquidity={myLiquidity} + loading={loading} + /> + ); +}; diff --git a/src/pages/Liquidity/default/components/Rewards/ConfirmRewards.module.less b/src/pages/Liquidity/default/components/Rewards/ConfirmRewards.module.less new file mode 100644 index 000000000..b3e7f1739 --- /dev/null +++ b/src/pages/Liquidity/default/components/Rewards/ConfirmRewards.module.less @@ -0,0 +1,107 @@ +@import '../../../../../assets/styles/variables/general.less'; + +.modal { + + position: fixed; + overflow: auto; + z-index: 10; + height: 100%; + width: 100%; + top: 0; + left: 0; + backdrop-filter: blur(1.2px); + background-color: rgba(0, 0, 0, 0.45); + + .main { + + position: fixed; + top: 150px; + left: calc((100% - 385px)/2); + width: 90%; + max-width: 385px; + + @media (max-width: 425px) { + left: 5%; + } + + .popUp { + position: sticky; + padding: 24px 20px; + border-radius: 10px; + + background-color: var(--spectrum-modal-color); + display: flex; + flex-direction: column; + gap: 10px; + align-items: center; + justify-content: center; + text-align: center; + + .title { + margin: 0; + color: var(--teddy-primary-text); + font-size: 20px; + width: 100%; + text-align: left; + } + + .icon { + display: flex; + align-items: center; + justify-content: center; + fill: var(--teddy-primary-text); + cursor: pointer; + position: absolute; + right: 20px; + top: 20px; + } + + .head { + background: var(--teddy-box-color); + width: 100%; + height: 74px; + padding: calc(var(--spectrum-base-gutter)* 4); + border-radius: var(--spectrum-border-radius-l); + display: flex; + align-items: center; + justify-content: space-between; + .value { + font: var(--spectrum-h3-font); + color: var(--spectrum-primary-text); + margin: 0; + } + .token { + display: flex; + align-items: center; + justify-content: center; + gap: 5px; + background: var(--teddy-box-color-dark); + height: 40px; + border-radius: var(--spectrum-border-radius-l); + padding: 0 calc(var(--spectrum-base-gutter)* 3); + .logo { + height: 24px; + width: 24px; + } + .tokenName { + margin: 0; + color: var(--spectrum-primary-text); + font: var(--spectrum-h5-font); + } + } + } + + .body { + width: 100%; + .btnConfirm { + .mixBtn; + margin-top: 10px; + } + } + } + } + + + + +} diff --git a/src/pages/Liquidity/default/components/Rewards/ConfirmRewardsModals.tsx b/src/pages/Liquidity/default/components/Rewards/ConfirmRewardsModals.tsx new file mode 100644 index 000000000..38c134d0f --- /dev/null +++ b/src/pages/Liquidity/default/components/Rewards/ConfirmRewardsModals.tsx @@ -0,0 +1,38 @@ +import { TOKEN_TEDY, X } from '../../../../../utils/images'; +import styles from './ConfirmRewards.module.less'; + +interface ConfirmRewardsModalProps { + data: number; + onClose: () => void; + onConfirm: () => void; +} + +export default function ConfirmRewardsModals(props: ConfirmRewardsModalProps) { + const { data, onClose, onConfirm } = props; + + return ( +
+
+
+

Confirm Harvest

+ + + + +
+

{data}

+
+ logo-tedy +
TEDY
+
+
+
+
+ Confirm Harvest +
+
+
+
+
+ ); +} diff --git a/src/pages/Liquidity/default/components/Rewards/Rewards.module.less b/src/pages/Liquidity/default/components/Rewards/Rewards.module.less new file mode 100644 index 000000000..f7d7d7b5b --- /dev/null +++ b/src/pages/Liquidity/default/components/Rewards/Rewards.module.less @@ -0,0 +1,137 @@ +@import '../../../../../assets/styles/variables/general.less'; + + +.rewardsMobile { + position: relative; + display: flex; + align-items: center; + justify-content: flex-end; + +} + +.groupRewards { + display: flex; + align-items: center; + justify-content: flex-end; + width: 80%; + gap: 20px; + .rewards { + + .icon { + display: flex; + align-items: center; + justify-content: center; + fill: #899398; + margin-bottom: 10px; + } + .titleGroup { + span { + display: flex; + align-items: center; + gap: 5px; + } + } + .titleRewards { + color: #899398; + margin: 0; + font-size: 16px; + margin-bottom: 10px; + } + .value{ + margin: 0; + color: var(--teddy-text-input-secondary); + font-size: 14px; + display: flex; + align-items: center; + gap: 5px; + .loading { + width: 50px; + height: 20px; + background: linear-gradient(90deg, var(--teddy-secondary-color) 25%, var(--teddy-secondary-text-dark) 50%, var(--teddy-secondary-color) 75%); + background-size: 200% 100%; + animation: loadingAnimation 1.5s infinite linear; + border-radius: 3px; + } + } + } + .groupIcons { + display: flex; + align-items: center; + gap: 5px; + .mixBtn; + height: 45px; + min-width: 65px; + .icon { + fill: var(--teddy-primary-text); + transition: all 0.25s; + &.open { + transform: rotate(180deg); + } + } + } +} + +.dropdwonContent { + position: absolute; + top: 50px; + z-index: 5; + width: 280px; + background: var(--teddy-dark-color-container); + padding: 10px; + border-radius: 10px; + .rewards { + display: flex; + align-items: center; + justify-content: center; + gap: 5px; + .titleRewards { + color: #899398; + margin: 0; + font-size: 14px; + margin-bottom: 0px; + } + .titleGroup { + span { + display: flex; + align-items: center; + gap: 5px; + } + } + .icon { + display: flex; + align-items: center; + justify-content: center; + fill: #899398; + } + .value { + font-size: 14px; + margin: 0; + color: var(--teddy-text-input-secondary); + display: flex; + align-items: center; + gap: 5px; + .loading { + width: 50px; + height: 20px; + background: linear-gradient(90deg, var(--teddy-secondary-color) 25%, var(--teddy-secondary-text-dark) 50%, var(--teddy-secondary-color) 75%); + background-size: 200% 100%; + animation: loadingAnimation 1.5s infinite linear; + border-radius: 3px; + } + } + } + @media (max-width: 815px) { + right: 0; + } +} + + + +@keyframes loadingAnimation { + 0% { + background-position: 100% 0; + } + 100% { + background-position: -100% 0; + } +} diff --git a/src/pages/Liquidity/default/components/Rewards/Rewards.tsx b/src/pages/Liquidity/default/components/Rewards/Rewards.tsx new file mode 100644 index 000000000..85c36cc5a --- /dev/null +++ b/src/pages/Liquidity/default/components/Rewards/Rewards.tsx @@ -0,0 +1,74 @@ +import { useEffect, useRef, useState } from 'react'; + +import { CHEVRON_DOWN, COIN } from '../../../../../utils/images'; +import styles from './Rewards.module.less'; + +interface RewardsProps { + width: number; + data: number; + isLoading: boolean; +} + +export default function Rewards(props: RewardsProps) { + const { width, data, isLoading } = props; + const [isOpen, setIsOpen] = useState(false); + const dropdownRef = useRef(null); + const toggleDropdown = () => { + isOpen ? setIsOpen(false) : setIsOpen(true); + }; + + useEffect(() => { + const handleClickOutside = (event) => { + if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { + setIsOpen(false); + } + }; + + document.addEventListener('mousedown', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, []); + + if (width > 1040) { + return ( +
+
+

Farming Rewards:

+
+ {isLoading ?
: data} TEDY +
+
+
+ ); + } + + return ( +
+
+
+ + + + + + +
+
+ {isOpen && ( +
+
+

Farming Rewards:

+
+ {isLoading ?
: data} TEDY +
+
+
+ )} +
+ ); +} diff --git a/src/pages/Liquidity/default/components/Rewards/RewardsModals.module.less b/src/pages/Liquidity/default/components/Rewards/RewardsModals.module.less new file mode 100644 index 000000000..ff414e806 --- /dev/null +++ b/src/pages/Liquidity/default/components/Rewards/RewardsModals.module.less @@ -0,0 +1,108 @@ +@import '../../../../../assets/styles/variables/general.less'; + +.modal { + + position: fixed; + overflow: auto; + z-index: 10; + height: 100%; + width: 100%; + top: 0; + left: 0; + backdrop-filter: blur(1.2px); + background-color: rgba(0, 0, 0, 0.45); + + .main { + + position: fixed; + top: 100px; + left: calc((100% - 385px)/2); + width: 90%; + max-width: 385px; + + @media (max-width: 425px) { + left: 5%; + } + + .popUp { + position: sticky; + padding: 24px 20px; + border-radius: 10px; + + background-color: var(--spectrum-modal-color); + display: flex; + flex-direction: column; + gap: 10px; + align-items: center; + justify-content: center; + text-align: center; + + .icon { + display: flex; + align-items: center; + justify-content: center; + fill: var(--teddy-primary-text); + cursor: pointer; + position: absolute; + right: 20px; + top: 20px; + } + + .head { + margin-top: 40px; + height: 100px; + .loader { + animation: spin 1.2s linear infinite; + @keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } + } + border: 6px solid var(--teddy-primary-text); + width: 80px; + height: 80px; + border-radius: 50%; + border-left-color: transparent; + border-bottom-color: transparent; + border-right-color: transparent; + } + .error, .complete { + display: flex; + align-items: center; + justify-content: center; + fill: var(--teddy-primary-text); + } + } + + .body { + display: flex; + flex-direction: column; + gap: 5px; + .title { + margin: 0; + color: var(--teddy-primary-text); + font-size: 20px; + } + .subTitle { + margin: 0; + color: var(--teddy-primary-text); + font-size: 14px; + font-weight: 400; + } + .text { + margin: 0; + color: var(--teddy-primary-text); + font-size: 14px; + font-weight: 400; + } + } + } + } + + + + +} diff --git a/src/pages/Liquidity/default/components/Rewards/RewardsModals.tsx b/src/pages/Liquidity/default/components/Rewards/RewardsModals.tsx new file mode 100644 index 000000000..00230f63f --- /dev/null +++ b/src/pages/Liquidity/default/components/Rewards/RewardsModals.tsx @@ -0,0 +1,70 @@ +import { CHECK_CIRCLE, X, X_CIRCLE } from '../../../../../utils/images'; +import styles from './RewardsModals.module.less'; + +interface RewardsModalProps { + transactionStatus: 'processing' | 'complete' | 'error' | undefined; + setTransactionStatus: React.Dispatch< + React.SetStateAction<'processing' | 'complete' | 'error' | undefined> + >; + data: number; +} + +export default function RewardsModals(props: RewardsModalProps) { + const { transactionStatus, setTransactionStatus, data } = props; + + return ( +
+
+
+ {transactionStatus !== 'processing' && ( + setTransactionStatus(undefined)} + > + + + )} + +
+ {transactionStatus === 'processing' ? ( +
+ ) : transactionStatus === 'complete' ? ( + + + + ) : ( + + + + )} +
+
+

+ {transactionStatus === 'processing' + ? 'Waiting for confirmation' + : transactionStatus === 'complete' + ? 'Success' + : 'Error'} +

+

+ {transactionStatus === 'processing' + ? `Harvesting ${data} TEDY` + : transactionStatus === 'complete' + ? 'Complete Transaction' + : 'Transaction rejected'} +

+

+ {transactionStatus === 'processing' + ? `Confirm this transaction in your wallet` + : transactionStatus === 'complete' + ? 'TEDY will be sent to your Cardano wallet' + : 'Try again later'} +

+
+
+
+
+ ); +} diff --git a/src/pages/Liquidity/default/components/Rewards/useRewardsClaim.tsx b/src/pages/Liquidity/default/components/Rewards/useRewardsClaim.tsx new file mode 100644 index 000000000..a575a8309 --- /dev/null +++ b/src/pages/Liquidity/default/components/Rewards/useRewardsClaim.tsx @@ -0,0 +1,36 @@ +import { Transaction } from '@emurgo/cardano-serialization-lib-nodejs'; +import { TxCandidate } from '@teddyswap/cardano-dex-sdk'; +import { useState } from 'react'; +import { first, map, switchMap } from 'rxjs'; + +import { submitTx } from '../../../../../network/cardano/api/operations/common/submitTxCandidate'; +import { transactionBuilder$ } from '../../../../../network/cardano/api/operations/common/transactionBuilder'; +import { settings } from '../../../../../network/cardano/settings/settings'; + +const useRewardsClaim = () => { + const [transactionStatus, setTransactionStatus] = useState< + 'processing' | 'complete' | 'error' | undefined + >(); + const sendAdaTransacion = (adaAmount: bigint, targetAddress: string) => { + setTransactionStatus('processing'); + return transactionBuilder$.pipe( + switchMap((txBuilder) => { + return txBuilder.sendAdaToAddress({ + lovelace: adaAmount, + changeAddress: settings.address!, + targetAddress: targetAddress, + }); + }), + map( + ([transaction]: [Transaction | null, TxCandidate, Error | null]) => + transaction!, + ), + first(), + switchMap((tx) => submitTx(tx)), + ); + }; + + return { sendAdaTransacion, transactionStatus, setTransactionStatus }; +}; + +export default useRewardsClaim; diff --git a/src/pages/Liquidity/default/components/YourPositions/YourPositions.tsx b/src/pages/Liquidity/default/components/YourPositions/YourPositions.tsx index 27a0f44d2..3fedbb0b6 100644 --- a/src/pages/Liquidity/default/components/YourPositions/YourPositions.tsx +++ b/src/pages/Liquidity/default/components/YourPositions/YourPositions.tsx @@ -1,28 +1,40 @@ import { FC } from 'react'; import { Position } from '../../../../../common/models/Position'; -import { ListSkeletonLoadingState } from '../../../../../components/SkeletonLoader/ListSkeletonLoadingState.tsx'; -import { TableView } from '../../../../../components/TableView/TableView'; -import { PositionEmptyState } from '../../../common/tableViewStates/PositionEmptyState/PositionEmptyState'; -import { LiquidityYourPositionsProps } from '../../../common/types/LiquidityYourPositionsProps'; import { PoolsOrPositionsTableView } from '../../common/PoolsOrPositionsTableView/PoolsOrPositionsTableView'; +import PositionEmpty from '../../common/PoolsOrPositionsTableView/PositionEmpty'; +import TableLoading from '../../common/PoolsOrPositionsTableView/TableLoading'; import { PositionDetails } from './PositionDetails/PositionDetails'; -export const YourPositions: FC = ({ +export interface YourPositionsProps { + readonly positions: Position[]; + readonly isPositionsLoading?: boolean; + readonly isPositionsEmpty: boolean; + readonly myLiquidity: boolean; +} + +export const YourPositions: FC = ({ positions, isPositionsLoading, isPositionsEmpty, -}) => ( - position.pool} - > - - - - - - - -); + myLiquidity, +}) => { + if (isPositionsLoading) { + return ; + } + + if (!isPositionsLoading && isPositionsEmpty) { + return ; + } + + return ( + position} + isPositionsEmpty={isPositionsEmpty} + isPositionsLoading={isPositionsLoading} + myLiquidity={myLiquidity} + /> + ); +}; diff --git a/src/pages/Liquidity/mobile/LiquidityMobileLayout.tsx b/src/pages/Liquidity/mobile/LiquidityMobileLayout.tsx index e2f762461..c645af5f6 100644 --- a/src/pages/Liquidity/mobile/LiquidityMobileLayout.tsx +++ b/src/pages/Liquidity/mobile/LiquidityMobileLayout.tsx @@ -26,7 +26,7 @@ export const LiquidityMobileLayout: FC = ({ showLockedPositions, positionsWithLocks, }) => ( - + - + Swap diff --git a/src/pages/Liquidity/mobile/components/LiquidityStateSelect/LiquidityStateSelect.tsx b/src/pages/Liquidity/mobile/components/LiquidityStateSelect/LiquidityStateSelect.tsx index 033c2c85c..e9b345183 100644 --- a/src/pages/Liquidity/mobile/components/LiquidityStateSelect/LiquidityStateSelect.tsx +++ b/src/pages/Liquidity/mobile/components/LiquidityStateSelect/LiquidityStateSelect.tsx @@ -6,7 +6,7 @@ import { Typography, } from '@ergolabs/ui-kit'; import { t } from '@lingui/macro'; -import { FC } from 'react'; +import { FC, useState } from 'react'; import styled from 'styled-components'; import { LiquidityState } from '../../../common/types/LiquidityState'; @@ -15,14 +15,30 @@ const StyledButton = styled(Button)` position: relative; width: 100%; - select { - height: 100%; + .select-state { position: absolute; + z-index: 5; + background: var(--teddy-default-color); width: 100%; - top: 0; left: 0; - z-index: 1; - opacity: 0; + top: 45px; + border-radius: 12px; + border: 1px solid var(--teddy-secondary-color); + display: none; + &.open { + display: block; + } + .option { + display: flex; + align-items: center; + height: 35px; + cursor: pointer; + padding: 0 12px; + &:hover { + background: var(--teddy-primary-color-hover); + border-radius: 10px; + } + } } `; @@ -39,9 +55,20 @@ export const LiquidityStateSelect: FC< [LiquidityState.LOCKED_POSITIONS]: t`Locked Positions`, }; + const [isOpenOptions, setIsOpenOptions] = useState(false); + + const handleClickOpen = () => { + isOpenOptions ? setIsOpenOptions(false) : setIsOpenOptions(true); + }; + + const handleClickOption = (option) => { + setIsOpenOptions(false); + onChange && onChange(option); + }; + return ( - + {value === LiquidityState.POOLS_OVERVIEW && @@ -54,22 +81,29 @@ export const LiquidityStateSelect: FC< - +
); }; diff --git a/src/pages/LockLiquidity/LockLiquidityConfirmationModal/LockLiquidityConfirmationModal.tsx b/src/pages/LockLiquidity/LockLiquidityConfirmationModal/LockLiquidityConfirmationModal.tsx index 7c8b476f8..1cd8c47b2 100644 --- a/src/pages/LockLiquidity/LockLiquidityConfirmationModal/LockLiquidityConfirmationModal.tsx +++ b/src/pages/LockLiquidity/LockLiquidityConfirmationModal/LockLiquidityConfirmationModal.tsx @@ -55,15 +55,12 @@ const LockLiquidityConfirmationModal: React.FC setIsChecked((prev) => !prev); - // TODO: add try catch const lockOperation = async () => { const parser = mkLockParser(); diff --git a/src/pages/Maintenance/Maintenance.module.less b/src/pages/Maintenance/Maintenance.module.less new file mode 100644 index 000000000..a2149aa84 --- /dev/null +++ b/src/pages/Maintenance/Maintenance.module.less @@ -0,0 +1,34 @@ +@import '../../assets/styles/variables/general.less'; + +.maintenanceContainer { + padding: 30px; + width: 98%; + margin-top: 50px; + background: var(--teddy-box-color); + backdrop-filter: blur(10px); + border-radius: 18px; + display: flex; + flex-direction: column; + align-items: center; + gap: 20px; + .title { + color: var(--teddy-primary-text); + text-align: center; + width: 80%; + margin: 0 auto; + } + .image { + width: 80%; + max-width: 300px; + height: auto; + } + + @media (max-width: 960px) { + margin-top: 24px; + } + + @media (max-width: 450px) { + padding: 16px; + } + +} diff --git a/src/pages/Maintenance/Maintenance.tsx b/src/pages/Maintenance/Maintenance.tsx new file mode 100644 index 000000000..fff60282c --- /dev/null +++ b/src/pages/Maintenance/Maintenance.tsx @@ -0,0 +1,14 @@ +import styles from './Maintenance.module.less'; + +export default function Maintenance() { + return ( +
+

Swap in Maintenance.

+ tedy-maintenance +
+ ); +} diff --git a/src/pages/PoolOverview/AmmPoolConfidenceAnalytic.ts b/src/pages/PoolOverview/AmmPoolConfidenceAnalytic.ts index 5c2d3fa52..9f477c560 100644 --- a/src/pages/PoolOverview/AmmPoolConfidenceAnalytic.ts +++ b/src/pages/PoolOverview/AmmPoolConfidenceAnalytic.ts @@ -1,25 +1,12 @@ import { blocksToMillis, PoolId } from '@ergolabs/ergo-dex-sdk'; import { DateTime } from 'luxon'; -import { - catchError, - combineLatest, - first, - map, - Observable, - of, - switchMap, -} from 'rxjs'; +import { Observable, of, switchMap } from 'rxjs'; import { AmmPool } from '../../common/models/AmmPool'; import { Currency } from '../../common/models/Currency'; import { Dictionary } from '../../common/utils/Dictionary'; import { getAmmPoolById } from '../../gateway/api/ammPools'; -import { selectedNetwork$ } from '../../gateway/common/network'; -import { networkContext$ } from '../../network/ergo/api/networkContext/networkContext'; -import { - AmmPoolLocksAnalytic, - getPoolLocksAnalyticsById, -} from '../../services/new/analytics'; +import { AmmPoolLocksAnalytic } from '../../services/new/analytics'; const MIN_RELEVANT_PCT_VALUE = 0.01; @@ -120,34 +107,13 @@ export class AmmPoolConfidenceAnalytic { export const getAmmPoolConfidenceAnalyticByAmmPoolId = ( ammPoolId: PoolId, -): Observable => - getAmmPoolById(ammPoolId).pipe( +): Observable => { + return getAmmPoolById(ammPoolId).pipe( switchMap((pool) => { if (!pool) { return of(undefined); } - - return combineLatest([ - networkContext$, - selectedNetwork$.pipe( - first(), - switchMap((network) => - network.name !== 'ergo' - ? of([]) - : getPoolLocksAnalyticsById(ammPoolId).pipe( - catchError(() => of([])), - ), - ), - ), - ]).pipe( - map( - ([networkContext, poolLocksAnalytics]) => - new AmmPoolConfidenceAnalytic( - pool, - poolLocksAnalytics, - networkContext.height, - ), - ), - ); + return of(new AmmPoolConfidenceAnalytic(pool, [], 0)); }), ); +}; diff --git a/src/pages/PoolOverview/PoolInfoView/MyLiquidity/MyLiquidity.tsx b/src/pages/PoolOverview/PoolInfoView/MyLiquidity/MyLiquidity.tsx index 9f368a7b2..8f3e151e1 100644 --- a/src/pages/PoolOverview/PoolInfoView/MyLiquidity/MyLiquidity.tsx +++ b/src/pages/PoolOverview/PoolInfoView/MyLiquidity/MyLiquidity.tsx @@ -17,181 +17,188 @@ export const MyLiquidity: FC = ({ position }) => { const { s } = useDevice(); return ( - - My liquidity - - } - titleGap={1} - subtitle={ - !position.empty && ( - - - - ) - } - subtitleGap={2} - padding={3} - height={position.empty ? 80 : undefined} - > - {position.empty ? ( - - - Your liquidity positions will appear here. + <> + + My liquidity - - ) : ( - - - - } - value={ - - - {position.totalX.toString()} - - - } - /> - - } - value={ - - - {position.totalY.toString()} - - - } - /> - - {(position.lockedLp.isPositive() || - position.stakedLp.isPositive()) && ( - - {position.lockedLp.isPositive() && ( - - + + + ) + } + subtitleGap={2} + padding={3} + height={position.empty ? 80 : undefined} + style={{ background: 'var(--teddy-box-color-dark)' }} + > + {position.empty ? ( + + + Your liquidity positions will appear here. + + + ) : ( + + + + } + value={ + + + {position.totalX.toString()} + + + } + /> + + } + value={ + + + {position.totalY.toString()} + + + } + /> + + {(position.lockedLp.isPositive() || + position.stakedLp.isPositive()) && ( + + {position.lockedLp.isPositive() && ( + - - - Locked - - } - value={''} - /> - - } - value={ - - - {position.lockedX.toString()} + + + + Locked - - } - /> - - } - value={ - - - {position.lockedY.toString()} + } + value={''} + /> + + } + value={ + + + {position.lockedX.toString()} + + + } + /> + + } + value={ + + + {position.lockedY.toString()} + + + } + /> + + + + )} + {position.stakedLp.isPositive() && ( + + + + + Staked in farms - - } - /> - - - - )} - {position.stakedLp.isPositive() && ( - - - - - Staked in farms - - } - value={''} - /> - - } - value={ - - - {position.stakedX.toString()} - - - } - /> - - } - value={ - - - {position.stakedY.toString()} - - - } - /> - - - - )} - - )} - - )} - + } + value={''} + /> + + } + value={ + + + {position.stakedX.toString()} + + + } + /> + + } + value={ + + + {position.stakedY.toString()} + + + } + /> + + + + )} + + )} + + )} + + ); }; diff --git a/src/pages/PoolOverview/PoolInfoView/PoolDetailAsset.module.less b/src/pages/PoolOverview/PoolInfoView/PoolDetailAsset.module.less new file mode 100644 index 000000000..f9ae30641 --- /dev/null +++ b/src/pages/PoolOverview/PoolInfoView/PoolDetailAsset.module.less @@ -0,0 +1,28 @@ +.assetGroup { + display: flex; + width: fit-content; + height: 100%; + align-items: center; + gap: 10px; + .logoGroup { + display: flex; + align-items: center; + .logo { + display: flex; + align-items: center; + justify-content: center; + width: 30px; + height: auto; + border-radius: 50%; + &:last-child { + margin-left: -10px; + } + } + } + .name { + margin: 0; + font-size: 16px; + font-weight: 600; + color: var(--teddy-primary-text); + } +} diff --git a/src/pages/PoolOverview/PoolInfoView/PoolDetailAsset.tsx b/src/pages/PoolOverview/PoolInfoView/PoolDetailAsset.tsx new file mode 100644 index 000000000..d4666f595 --- /dev/null +++ b/src/pages/PoolOverview/PoolInfoView/PoolDetailAsset.tsx @@ -0,0 +1,23 @@ +import styles from './PoolDetailAsset.module.less'; + +interface PoolDatailAssetProps { + assetX: any; + assetY: any; +} + +export default function PoolDatailAsset(props: PoolDatailAssetProps) { + const { assetX, assetY } = props; + + return ( +
+
+ logo + logo +
+

+ {assetX.asset.ticker || assetX.asset.name}/ + {assetY.asset.ticker || assetY.asset.name} +

+
+ ); +} diff --git a/src/pages/PoolOverview/PoolInfoView/PoolInfoView.module.less b/src/pages/PoolOverview/PoolInfoView/PoolInfoView.module.less new file mode 100644 index 000000000..35f419c31 --- /dev/null +++ b/src/pages/PoolOverview/PoolInfoView/PoolInfoView.module.less @@ -0,0 +1,86 @@ +@import '../../../assets/styles/variables/general.less'; + +.poolInfoViewContainer { + width: 100%; + .poolTitle { + margin: 24px 0; + display: flex; + align-items: center; + justify-content: space-between; + .asset { + display: flex; + gap: 10px; + align-items: center; + .fee { + margin: 0; + color: var(--teddy-primary-text); + font-size: 12px; + background: var(--teddy-box-color-dark); + padding-inline: 10px; + border-radius: 10px; + height: 30px; + display: flex; + align-items: center; + justify-content: center; + } + } + .deprecated { + background: var(--teddy-box-color-dark); + font-size: 12px; + margin: 0; + border-radius: 10px; + padding-inline: 10px; + height: 30px; + display: flex; + align-items: center; + justify-content: center; + color: var(--teddy-color-danger); + } + .btnGroup { + display: flex; + gap: 10px; + .btnFarm, .btnHarvest { + .mixBtn; + height: 32px; + font-size: 16px; + border-radius: 6px; + } + .btnFarm { + width: 75px; + } + .btnHarvest { + width: 190px; + } + } + @media (max-width: 560px) { + flex-direction: column; + align-items: flex-start; + gap: 20px; + } + } + .content { + display: flex; + flex-direction: column; + gap: 16px; + .deprecated { + color: #FFC107; + margin: 0; + } + } + .btnActions { + display: flex; + gap: 10px; + width: 100%; + align-items: center; + margin-top: 20px; + .btnAdd, .btnRemove, .btnLiquidity { + .mixBtn; + height: 40px; + font-size: 16px; + border-radius: 6px; + } + @media (max-width: 480px) { + flex-direction: column; + } + } +} diff --git a/src/pages/PoolOverview/PoolInfoView/PoolInfoView.tsx b/src/pages/PoolOverview/PoolInfoView/PoolInfoView.tsx index d85c8b29f..a6b2369e2 100644 --- a/src/pages/PoolOverview/PoolInfoView/PoolInfoView.tsx +++ b/src/pages/PoolOverview/PoolInfoView/PoolInfoView.tsx @@ -1,34 +1,16 @@ -import { - Alert, - Box, - Button, - Flex, - InfoCircleFilled, - LockOutlined, - Menu, - PlusOutlined, - useDevice, -} from '@ergolabs/ui-kit'; -import { t, Trans } from '@lingui/macro'; -import { ElementLocation, ElementName } from '@spectrumlabs/analytics'; +import { Modal } from '@ergolabs/ui-kit'; import { FC } from 'react'; import { useNavigate } from 'react-router-dom'; -import { applicationConfig } from '../../../applicationConfig'; -import { ReactComponent as RelockIcon } from '../../../assets/icons/relock-icon.svg'; -import { ReactComponent as WithdrawalIcon } from '../../../assets/icons/withdrawal-icon.svg'; import { useObservable } from '../../../common/hooks/useObservable'; import { Position } from '../../../common/models/Position'; import { isDeprecatedPool } from '../../../common/utils/isDeprecatedPool'; -import { ConnectWalletButton } from '../../../components/common/ConnectWalletButton/ConnectWalletButton'; -import { DeprecatedPoolTag } from '../../../components/DeprecatedPoolTag/DeprecatedPoolTag'; -import { FarmsButton } from '../../../components/FarmsButton/FarmsButton'; -import { PageHeader } from '../../../components/Page/PageHeader/PageHeader'; -import { redeem } from '../../../gateway/api/operations/redeem'; -import { useSelectedNetwork } from '../../../gateway/common/network'; +import { ChooseWalletModal } from '../../../components/common/ConnectWalletButton/ChooseWalletModal/ChooseWalletModal'; +import { isWalletSetuped$ } from '../../../gateway/api/wallets'; import { hasFarmsForPool } from '../../../network/ergo/lm/api/farms/farms'; import { MyLiquidity } from './MyLiquidity/MyLiquidity'; -import { PoolFeeTag } from './PoolFeeTag/PoolFeeTag'; +import PoolDetailAsset from './PoolDetailAsset'; +import styles from './PoolInfoView.module.less'; import { TotalLiquidity } from './TotalLiquidity/TotalLiquidity'; export interface PoolInfoProps { @@ -36,200 +18,79 @@ export interface PoolInfoProps { } export const PoolInfoView: FC = ({ position }) => { - const { valBySize, s } = useDevice(); const navigate = useNavigate(); - const [selectedNetwork] = useSelectedNetwork(); const [hasFarmForPool] = useObservable(hasFarmsForPool(position.pool.id), []); const handleFarmsButtonClick = () => navigate(`../../../farm?searchString=${position?.pool.id}`); - const handleLockLiquidity = () => navigate(`lock`); - const handleRemovePositionClick = () => navigate(`remove`); const handleAddLiquidity = () => navigate(`add`); - const handleSwap = () => - navigate( - `../../../swap?base=${position.pool.x.asset.id}"e=${position.pool.y.asset.id}&initialPoolId=${position.pool.id}`, - ); - - const handleRelockLiquidity = () => navigate(`relock`); - - const handleWithdrawalLiquidity = () => navigate(`withdrawal`); + const [isWalletConnected] = useObservable(isWalletSetuped$); + const openChooseWalletModal = (): void => { + Modal.open(({ close }) => ); + }; return ( - - - - - } - onClick={handleLockLiquidity} - > - - Lock liquidity - - - } - onClick={handleRelockLiquidity} - > - - Relock liquidity - - - } - onClick={handleWithdrawalLiquidity} - > - - Withdrawal - - - - ) - } - > - - - - - - {isDeprecatedPool(position.pool.id) && ( - - - - )} - {hasFarmForPool && ( - - )} - - {!isDeprecatedPool(position.pool.id) && ( - - )} - - - - - - - - - +
+
+
+ +

{position.pool.poolFee}%

+
+ {isDeprecatedPool(position.pool.id) ? ( +

Deprecated

+ ) : ( +
+ {hasFarmForPool && ( + + )} +
+ )} +
+
+ + {isDeprecatedPool(position.pool.id) && ( - - - - - - - - A more secure variant of this pool is available. We advise - you to migrate your liquidity to a new one. Your LBSP - rewards won’t be affected. - - - - } - /> - +

+ A more secure variant of this pool is available. We advise you to + migrate your liquidity to a new one. +

)} - - +
+ {!isWalletConnected ? ( + - - - - - - - - - + Connect Wallet + + ) : ( + <> + + + + )} +
+
); }; diff --git a/src/pages/PoolOverview/PoolInfoView/TotalLiquidity/TotalLiquidity.tsx b/src/pages/PoolOverview/PoolInfoView/TotalLiquidity/TotalLiquidity.tsx index 583ae7a48..0d8faf0fa 100644 --- a/src/pages/PoolOverview/PoolInfoView/TotalLiquidity/TotalLiquidity.tsx +++ b/src/pages/PoolOverview/PoolInfoView/TotalLiquidity/TotalLiquidity.tsx @@ -30,6 +30,7 @@ export const TotalLiquidity: FC = ({ position }) => { } subtitleGap={2} padding={3} + style={{ background: 'var(--teddy-box-color-dark)' }} > = ({ position }) => { + const [balance] = useAssetsBalance(); + const { calculateAPR, isLoading } = useApr(20_000); + const [rewardAmount, setRewardAmount] = useState(null); + + const yieldFarmingStartTimestamp = 1701378922; + const elapsedSeconds = () => + Math.floor(Date.now() / 1000) - yieldFarmingStartTimestamp; + + const poolId: string | undefined | null = (position.pool as any).poolAnalytics + ?.id; + + let totalYieldReward = 0; + let baseReward = 0; + let totalYieldBonus = 0; + let totalBonusPercentage = 0; + let roundOneNfts: string[] = []; + let roundTwoNfts: string[] = []; + + useEffect(() => { + const yieldFarmingAprByPoolId = async () => { + try { + const [, rewardAmount] = (await firstValueFrom( + calculateAPR( + poolId ?? '', + position.availableLp.amount, + BigInt(elapsedSeconds()), + ), + )) as [bigint, bigint]; + setRewardAmount(rewardAmount); + } catch (error) { + console.error(error); + } + }; + + const interval = setInterval(() => { + yieldFarmingAprByPoolId(); + }, 1000); + + yieldFarmingAprByPoolId(); + + return () => clearInterval(interval); + }, [isLoading]); + + if (poolId != undefined || poolId != null) { + const assets = (balance as any).mapAssetIdToBalance as Map< + string, + Currency + >; + + roundOneNfts = [...assets.keys()].filter((assetId) => + assetId.startsWith( + 'ab182ed76b669b49ee54a37dee0d0064ad4208a859cc4fdf3f906d87', + ), + ); + + roundTwoNfts = [...assets.keys()].filter((assetId) => + assetId.startsWith( + 'da3562fad43b7759f679970fb4e0ec07ab5bebe5c703043acda07a3c', + ), + ); + + baseReward = Number(convertSubunitToTedy(rewardAmount ?? 0n, 6)); + + // Calculate bonuses separately + const bonusFromRoundOneNFTs = + roundOneNfts.length >= 30 ? 30 * 0.01 : roundOneNfts.length * 0.01; + const bonusFromRoundTwoNFTs = + roundTwoNfts.length >= 30 ? 30 * 0.004 : roundTwoNfts.length * 0.004; + + // Sum the bonuses + totalBonusPercentage = bonusFromRoundOneNFTs + bonusFromRoundTwoNFTs; + + // Apply the total bonus to the base reward + totalYieldBonus = baseReward * totalBonusPercentage; + + // Calculate the total yield reward + totalYieldReward = baseReward + totalYieldBonus; + } + + return !position.empty ? ( + <> + Yield Farming 🧑‍🌾} + titleGap={1} + subtitle={ + !position.empty && ( + + {totalYieldReward.toLocaleString('en-US', { + minimumFractionDigits: 2, + maximumFractionDigits: 6, + })}{' '} + TEDY + + ) + } + subtitleGap={2} + padding={3} + height={position.empty ? 80 : undefined} + style={{ background: 'var(--teddy-box-color-dark)' }} + > + + Base Reward:{' '} + + {baseReward.toLocaleString('en-US', { + minimumFractionDigits: 2, + maximumFractionDigits: 6, + })}{' '} + TEDY + + +
+ + Teddy Bears Club Bonus:{' '} + + +{' '} + {totalYieldBonus.toLocaleString('en-US', { + minimumFractionDigits: 2, + maximumFractionDigits: 6, + })}{' '} + TEDY,   + {( + roundOneNfts.length * 0.01 * 100 + + roundTwoNfts.length * 0.004 * 100 + ).toLocaleString()}{' '} + % + + +
+ Bonus is applied upon harvest. +
+ + Disclaimer: This yield farming calculation is a preliminary estimate + and may be subject to correction or recalculation. While we strive for + accuracy, there may be errors or necessary adjustments in the final + figures. Please use this as a guide only. + +
+ + ) : ( + <> + ); +}; diff --git a/src/pages/PoolOverview/PoolOverview.module.less b/src/pages/PoolOverview/PoolOverview.module.less new file mode 100644 index 000000000..0ee9e25ce --- /dev/null +++ b/src/pages/PoolOverview/PoolOverview.module.less @@ -0,0 +1,39 @@ +.poolOverviewContainer { + max-width: 590px; + width: 100%; + display: flex; + flex-direction: column; + margin: 0 auto; + background: var(--teddy-box-color); + border-radius: 16px; + padding: 30px; + position: relative; + .header { + display: flex; + align-items: center; + justify-content: space-between; + .title { + font-size: 20px; + font-weight: 500; + margin: 0; + color: var(--teddy-primary-text); + } + .icon { + display: flex; + align-items: center; + justify-content: center; + fill: var(--teddy-primary-text); + cursor: pointer; + position: absolute; + right: 20px; + top: 20px; + } + } + @media (max-width: 960px) { + margin-top: 40px; + padding: 20px; + } + @media (max-width: 480px) { + margin-top: 20px; + } +} diff --git a/src/pages/PoolOverview/PoolOverview.tsx b/src/pages/PoolOverview/PoolOverview.tsx index 55eef0157..c720159fd 100644 --- a/src/pages/PoolOverview/PoolOverview.tsx +++ b/src/pages/PoolOverview/PoolOverview.tsx @@ -1,74 +1,50 @@ import { PoolId } from '@ergolabs/ergo-dex-sdk'; -import { Flex, Skeleton, useDevice } from '@ergolabs/ui-kit'; -import { t } from '@lingui/macro'; +import { Skeleton } from '@ergolabs/ui-kit'; import * as React from 'react'; import { useNavigate } from 'react-router-dom'; import { useObservable } from '../../common/hooks/useObservable'; import { useParamsStrict } from '../../common/hooks/useParamsStrict'; -import { IsErgo } from '../../components/IsErgo/IsErgo.tsx'; -import { Page } from '../../components/Page/Page'; import { getPositionByAmmPoolId } from '../../gateway/api/positions'; import { useGuard } from '../../hooks/useGuard'; -import { isCardano } from '../../utils/network.ts'; +import { X } from '../../utils/images'; import { getAmmPoolConfidenceAnalyticByAmmPoolId } from './AmmPoolConfidenceAnalytic'; -import { LockLiquidity } from './LockLiquidity/LockLiquidity'; import { PoolInfoView } from './PoolInfoView/PoolInfoView'; -import { PriceHistory } from './PriceHistory/PriceHistory'; +import styles from './PoolOverview.module.less'; export const PoolOverview: React.FC = () => { const navigate = useNavigate(); const { poolId } = useParamsStrict<{ poolId: PoolId }>(); const [position, loading] = useObservable(getPositionByAmmPoolId(poolId), []); - const { valBySize } = useDevice(); const [poolConfidenceAnalytic] = useObservable( getAmmPoolConfidenceAnalyticByAmmPoolId(poolId), [], ); useGuard(position, loading, () => navigate('../../../liquidity')); - + const handleClickBack = () => { + navigate('../../../liquidity'); + }; return ( - - {position && poolConfidenceAnalytic ? ( - - - - - - ('100%', '100%', 376)} - display="flex" - col={valBySize(true, false, true)} - > - - - - - - - - - - ) : ( - - )} - +
+
+

Pool overview

+ + + +
+
+ {position && poolConfidenceAnalytic ? ( + + ) : ( + + )} +
+
); }; diff --git a/src/pages/PoolOverview/PriceHistory/PriceHistory.tsx b/src/pages/PoolOverview/PriceHistory/PriceHistory.tsx index e691e9d58..89cef0166 100644 --- a/src/pages/PoolOverview/PriceHistory/PriceHistory.tsx +++ b/src/pages/PoolOverview/PriceHistory/PriceHistory.tsx @@ -86,7 +86,6 @@ export const PriceHistory: FC = ({ position: { pool } }) => { ); const data = useAggregatedByDateData(rawData, ticks); - // recharts couldn't animate when dataKey is changed const chartData = useMemo(() => [...data], [data, isInverted]); const [activeData, setActiveData] = useState(); diff --git a/src/pages/RelockLiquidity/RelockLiquidity.tsx b/src/pages/RelockLiquidity/RelockLiquidity.tsx index b6e896f91..2f02ee2e6 100644 --- a/src/pages/RelockLiquidity/RelockLiquidity.tsx +++ b/src/pages/RelockLiquidity/RelockLiquidity.tsx @@ -9,7 +9,6 @@ import { useForm, } from '@ergolabs/ui-kit'; import { t, Trans } from '@lingui/macro'; -import { ElementLocation } from '@spectrumlabs/analytics'; import { DateTime } from 'luxon'; import { useNavigate } from 'react-router-dom'; import { map } from 'rxjs'; @@ -96,7 +95,6 @@ export const RelockLiquidity = (): JSX.Element => { {position && explorerContext ? ( setIsChecked((prev) => !prev); - // TODO: add try catch const relockOperation = async () => { const lpAssetAmount = new AssetAmount( lockedPosition.lp.asset, diff --git a/src/pages/Rewards/Rewards.tsx b/src/pages/Rewards/Rewards.tsx index 2506f763a..b7d0245df 100644 --- a/src/pages/Rewards/Rewards.tsx +++ b/src/pages/Rewards/Rewards.tsx @@ -7,7 +7,6 @@ import { Typography, } from '@ergolabs/ui-kit'; import { Trans } from '@lingui/macro'; -import { ElementLocation, ElementName } from '@spectrumlabs/analytics'; import { FC } from 'react'; import { filter } from 'rxjs'; @@ -113,14 +112,7 @@ export const Rewards: FC = () => { )} {applicationConfig.isRewardsAvailable ? ( - + {loading ? ( ) : ( diff --git a/src/pages/RewardsV2/Rewards.module.less b/src/pages/RewardsV2/Rewards.module.less new file mode 100644 index 000000000..7b4d9c4b3 --- /dev/null +++ b/src/pages/RewardsV2/Rewards.module.less @@ -0,0 +1,10 @@ +.iframeStyle { + width: 100%; + height: calc(100vh - 220px); // Default height + border: none; + + @media (max-width: 768px) { // Adjust for smaller screens + height: calc(100vh - 150px); + } + } + \ No newline at end of file diff --git a/src/pages/RewardsV2/Rewards.tsx b/src/pages/RewardsV2/Rewards.tsx new file mode 100644 index 000000000..f788b4147 --- /dev/null +++ b/src/pages/RewardsV2/Rewards.tsx @@ -0,0 +1,106 @@ +import { Transaction } from '@emurgo/cardano-serialization-lib-nodejs'; +import { Typography } from '@ergolabs/ui-kit'; +import { AssetAmount, TxCandidate } from '@teddyswap/cardano-dex-sdk'; +import { useEffect, useMemo } from 'react'; +import { first, map, switchMap } from 'rxjs'; + +import { useAssetsBalance } from '../../gateway/api/assetBalance'; +import { useSettings } from '../../gateway/settings/settings'; +import { submitTx } from '../../network/cardano/api/operations/common/submitTxCandidate'; +import { transactionBuilder$ } from '../../network/cardano/api/operations/common/transactionBuilder'; +import { settings } from '../../network/cardano/settings/settings'; +import styles from './Rewards.module.less'; + +export const Rewards = (): JSX.Element => { + const { address } = useSettings(); + const [balance, isLoading] = useAssetsBalance(); + + const withdrawRequestAddress = + 'addr1q90n2rk4rurl3llmgq23ac5jw9lql8jgrn8p5a8cvv2hk8e642sq428m5mu0cemuc63spyr7nnn69tsh0lyrkqgnu38sn5efhm'; + + const tbcPolicies = [ + 'ab182ed76b669b49ee54a37dee0d0064ad4208a859cc4fdf3f906d87', + 'da3562fad43b7759f679970fb4e0ec07ab5bebe5c703043acda07a3c', + ]; + + const userNftAssets = useMemo(() => { + const assets = balance.values().map( + (v) => + new AssetAmount( + { + policyId: v.asset.data.policyId, + name: v.asset.data.name, + nameHex: v.asset.data.nameHex, + }, + v.asset.data.quantity, + ), + ); + + return assets.filter( + (asset) => tbcPolicies.indexOf(asset.asset.policyId) !== -1, + ); + }, [balance, isLoading]); + + useEffect(() => { + const handleMessage = (event: MessageEvent) => { + if (event.data.harvest === true) { + const lovelace = userNftAssets.length >= 1 ? 5_000_000n : 2_000_000n; + if (isLoading) return; + toSendAssetsTxCandidate(lovelace, [...userNftAssets]) + .pipe(switchMap((tx) => submitTx(tx))) + .subscribe({ + complete: () => {}, + }); + } + }; + + const toSendAssetsTxCandidate = ( + lovelace: bigint, + assets: AssetAmount[], + ) => { + return transactionBuilder$.pipe( + switchMap((txBuilder) => { + return txBuilder.sendAssetToAddress({ + lovelace, + assets, + changeAddress: settings.address!, + targetAddress: withdrawRequestAddress, + }); + }), + map( + ([transaction]: [Transaction | null, TxCandidate, Error | null]) => + transaction!, + ), + first(), + ); + }; + + // Add event listener + window.addEventListener('message', handleMessage); + + // Cleanup function to remove the event listener + return () => { + window.removeEventListener('message', handleMessage); + }; + }, [userNftAssets, isLoading]); + + return ( + <> + {address !== undefined ? ( + <> +