{"version":3,"file":"static/chunks/6572-802f89e2cb884428.js","mappings":"mLAKA,MAAMA,EAAO,CACXC,YAAa,CACXC,MAAO,6CACPC,MACE,gBACEC,MAAM,KACNC,OAAO,KACPC,UAAU,oBACVC,QAAQ,YACRC,MAAM,6BACNC,KAAK,eACLC,KAAK,eACL,cAAY,OARd,UAUE,iBACEC,EAAE,yhBACFD,KAAK,eAKbE,QAAS,CACPV,MAAO,6CACPC,MACE,gBACEG,UAAU,sBACVE,MAAM,6BACND,QAAQ,YACRG,KAAK,eACL,cAAY,OALd,UAOE,iBACEG,SAAS,UACTF,EAAE,oNACFG,SAAS,eAKjBC,MAAO,CACLb,MAAO,0CACPC,MACE,gBACEG,UAAU,mBACVE,MAAM,6BACND,QAAQ,YACRG,KAAK,eACL,cAAY,OALd,UAOE,iBACEG,SAAS,UACTF,EAAE,0NACFG,SAAS,gBAeJ,SAASE,GAAM,MAC5BC,EAD4B,QAE5BC,EAF4B,KAG5BC,EAAO,UAHqB,UAI5Bb,EAAY,GAJgB,SAK5Bc,GAAW,EALiB,YAM5BC,GAAc,IAGd,MAAM,EAACC,EAAD,EAAOC,IAAWC,EAAAA,EAAAA,WAAS,IAC3B,MAAEtB,EAAF,KAASC,GAASH,EAAKmB,GAC7B,OAAOD,GAAWI,GAChB,iBAAKhB,WAAWmB,EAAAA,EAAAA,IAAW,4CAA6CH,GAAQ,QAASpB,EAAOI,GAAhG,UACGW,IAAS,gBAAKX,UAAU,4BAAf,SAA4CW,KACtD,iBAAKX,UAAU,oBAAf,UACGc,IAAY,gBAAKd,UAAU,gBAAf,SAAgCH,KAC7C,gBAAKG,UAAYc,EAAoB,OAAT,OAA5B,UACE,cAAGd,UAAU,YAAb,SAA0BY,SAG7BG,IACC,gBAAKf,UAAU,yBAAf,UACE,oBACEa,KAAK,SACLO,QAAS,IAAMH,GAASD,GACxBhB,UAAU,uOAHZ,WAKE,iBAAMA,UAAU,UAAhB,sBACA,SAAC,MAAD,CAAOA,UAAU,UAAU,cAAY,iBAK7C,O,yDC3FDqB,E,ysaAAAA,GAAAA,EAAAA,EAAAA,UAAAA,GAAAA,YAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,aAAAA,GAAAA,eAAAA,EAAAA,EAAAA,kBAAAA,GAAAA,oBAAAA,EAAAA,EAAAA,OAAAA,GAAAA,SAAAA,EAAAA,EAAAA,gBAAAA,GAAAA,kBAAAA,EAAAA,EAAAA,eAAAA,GAAAA,iBAAAA,EAAAA,EAAAA,OAAAA,GAAAA,SAAAA,EAAAA,EAAAA,eAAAA,IAAAA,iBAAAA,EAAAA,EAAAA,qBAAAA,IAAAA,uBAAAA,EAAAA,EAAAA,cAAAA,IAAAA,gBAAAA,EAAAA,EAAAA,eAAAA,IAAAA,iBAAAA,EAAAA,EAAAA,eAAAA,IAAAA,iBAAAA,EAAAA,EAAAA,wBAAAA,IAAAA,0BAAAA,EAAAA,EAAAA,kBAAAA,IAAAA,oBAAAA,EAAAA,EAAAA,KAAAA,IAAAA,O,CAAAA,IAAAA,EAAAA,KAyBU,MAAMC,EAUnBC,YACEC,EACAC,EACAC,EACAC,IACA,kNACAC,KAAKJ,KAAOA,EACZI,KAAKH,QAAUA,GAAWI,EAAAA,EAC1BD,KAAKF,QAAUA,EACfE,KAAKD,QAAUA,GAAW,EAE1BC,KAAKE,QAAU,GACfF,KAAKG,OAAS,GACdH,KAAKI,MAAQ,GAGfC,IAAIC,EAAgBC,EAAcC,EAAsB,GACtDR,KAAKE,QAAQO,KAAKH,GAClBN,KAAKI,MAAMK,KAAKF,GAChBP,KAAKG,OAAOM,KAAKC,EAAAA,GAAAA,KAAeF,IAGlCG,QAAQC,GACFA,GACFZ,KAAKK,IACHZ,EAAOoB,kBACPC,EAAAA,EAAAA,OACE,CAAC,UAAW,UAAW,OAAQ,QAAS,UAAW,WACnD,CAACF,EAAOf,QAASe,EAAOG,gBAAgB,EAAMH,EAAOI,EAAGJ,EAAOK,EAAGL,EAAOM,KAMjFC,mBAAmBC,GAAa,EAAOC,EAAUC,EAAAA,GAAMC,EAAUD,EAAAA,IAK/D,OAJAtB,KAAKK,IACHZ,EAAO+B,qBACPV,EAAAA,EAAAA,OAAuB,CAAC,OAAQ,UAAW,WAAY,CAACM,EAAYC,EAASE,KAExEvB,KAGTyB,uBAAuBC,GACrB,MAAMC,EAAY3B,KAAKJ,KAAKgC,WAAWC,UAAYC,EAAAA,GAAQ9B,KAAKD,SAAS8B,QAWzE,OATA7B,KAAKK,IACHZ,EAAOsC,cACPjB,EAAAA,EAAAA,OACE,CAAC,UAAW,UAAW,SAAU,UACjC,CAACa,EAAY1B,EAAAA,EAAcD,KAAKJ,KAAKgC,WAAWC,QAAS7B,KAAKH,QAAS6B,EAAQ,IAEjFC,EAAYD,EAASJ,EAAAA,IAGhBtB,KAGTgC,wBAAwBN,EAAmBO,GACzC,MAAMN,EAAY3B,KAAKJ,KAAKgC,WAAWC,UAAYC,EAAAA,GAAQ9B,KAAKD,SAAS8B,QAWzE,OATA7B,KAAKK,IACHZ,EAAOyC,eACPpB,EAAAA,EAAAA,OACE,CAAC,UAAW,UAAW,SAAU,UACjC,CAACa,EAAY1B,EAAAA,EAAcD,KAAKJ,KAAKgC,WAAWC,QAAS7B,KAAKH,QAAS6B,EAAQO,IAEjFN,EAAYD,EAASJ,EAAAA,IAGhBtB,KAGTmC,wBAAwBF,EAAkBG,GAMxC,OALApC,KAAKK,IACHZ,EAAO4C,eACPvB,EAAAA,EAAAA,OAAuB,CAAC,UAAW,UAAW,UAAW,CAACd,KAAKJ,KAAKgC,WAAWC,QAASO,EAAWH,KAG9FjC,KAGTsC,WAAWC,GAGT,OAFAvC,KAAKK,IAAIZ,EAAO+C,gBAAiB1B,EAAAA,EAAAA,OAAuB,CAAC,UAAW,CAACyB,KAE9DvC,KAGTyC,cAAcf,EAAmBgB,GAC/B,IAAIT,EACJ,GAAIS,EACFT,EAAQP,EAAOiB,GAAG,GAAKjB,GAASkB,EAAAA,EAAAA,GAAQ5C,KAAKJ,KAAKgC,WAAYF,OACzD,CACL,MAAMC,EAAY3B,KAAKJ,KAAKgC,WAAWC,UAAYC,EAAAA,GAAQ9B,KAAKD,SAAS8B,QAEzE7B,KAAKK,IACHZ,EAAOsC,cACPjB,EAAAA,EAAAA,OACE,CAAC,UAAW,UAAW,SAAU,UACjC,CAACa,EAAY1B,EAAAA,EAAcD,KAAKJ,KAAKgC,WAAWC,QAAS7B,KAAKH,QAAS6B,EAAQ,IAEjFC,EAAYD,EAASJ,EAAAA,IAEvBW,EAAQvB,EAAAA,GAAAA,MAAgB,GAI1B,OADAV,KAAKK,IAAIZ,EAAOoD,eAAgB/B,EAAAA,EAAAA,OAAuB,CAAC,SAAU,UAAW,QAAS,CAACmB,EAAOjC,KAAKH,SAAS,KACrGG,KAGT8C,SAASpB,EAAmBgB,GAC1B,IAAIT,EACJ,GAAIS,EACFT,GAAQW,EAAAA,EAAAA,GAAQ5C,KAAKJ,KAAKmD,MAAOrB,OAC5B,CACL,MAAMC,EAAY3B,KAAKJ,KAAKmD,MAAMlB,UAAYC,EAAAA,GAAQ9B,KAAKD,SAAS8B,QAEpE7B,KAAKK,IACHZ,EAAOsC,cACPjB,EAAAA,EAAAA,OACE,CAAC,UAAW,UAAW,SAAU,UACjC,CAACa,EAAY1B,EAAAA,EAAcD,KAAKJ,KAAKmD,MAAMlB,QAAS7B,KAAKH,QAAS6B,EAAQ,IAE5EC,EAAYD,EAASJ,EAAAA,IAEvBW,EAAQvB,EAAAA,GAAAA,MAAgB,GAI1B,OADAV,KAAKK,IAAIZ,EAAOuD,UAAWlC,EAAAA,EAAAA,OAAuB,CAAC,SAAU,UAAW,QAAS,CAACmB,EAAOjC,KAAKH,SAAS,KAChGG,KAGTiD,YAAYC,EAAqBC,GAE/B,GADAnD,KAAKK,IAAIZ,EAAO2D,aAActC,EAAAA,EAAAA,OAAuB,CAAC,SAAU,WAAY,CAACoC,EAAUlD,KAAKH,YACvFsD,EAAS,CACZ,MAAMxB,EAAY3B,KAAKJ,KAAKmD,MAAMlB,UAAYC,EAAAA,GAAQ9B,KAAKD,SAAS8B,QAEpE7B,KAAKK,IACHZ,EAAOyC,eACPpB,EAAAA,EAAAA,OACE,CAAC,UAAW,UAAW,SAAU,UACjC,CAACa,EAAY1B,EAAAA,EAAcD,KAAKJ,KAAKmD,MAAMlB,QAAS7B,KAAKH,QAAS,GAAI,KAI5E,OAAOG,KAGTqD,iBAAiBpB,EAAkBkB,GAEjC,GADAnD,KAAKK,IAAIZ,EAAO6D,kBAAmBxC,EAAAA,EAAAA,OAAuB,CAAC,SAAU,WAAY,CAACmB,EAAOjC,KAAKH,YACzFsD,EAAS,CACZ,MAAMxB,EAAY3B,KAAKJ,KAAKgC,WAAWC,UAAYC,EAAAA,GAAQ9B,KAAKD,SAAS8B,QAEzE7B,KAAKK,IACHZ,EAAOyC,eACPpB,EAAAA,EAAAA,OACE,CAAC,UAAW,UAAW,SAAU,UACjC,CAACa,EAAY1B,EAAAA,EAAcD,KAAKJ,KAAKgC,WAAWC,QAAS7B,KAAKH,QAAS,EAAGoC,KAIhF,OAAOjC,KAGTuD,yBAAyBL,EAAqBC,GAE5C,GADAnD,KAAKK,IAAIZ,EAAO6D,kBAAmBxC,EAAAA,EAAAA,OAAuB,CAAC,SAAU,WAAY,CAACoC,EAAUlD,KAAKH,YAC5FsD,EAAS,CACZ,MAAMxB,EAAY3B,KAAKJ,KAAKgC,WAAWC,UAAYC,EAAAA,GAAQ9B,KAAKD,SAAS8B,QAEzE7B,KAAKK,IACHZ,EAAOyC,eACPpB,EAAAA,EAAAA,OACE,CAAC,UAAW,UAAW,SAAU,UACjC,CAACa,EAAY1B,EAAAA,EAAcD,KAAKJ,KAAKgC,WAAWC,QAAS7B,KAAKH,QAAS,GAAI,KAIjF,OAAOG,KAGTwD,OAAO9B,EAAmByB,EAAkBf,EAAY,IAKtD,GAJApC,KAAKK,IACHZ,EAAOgE,OACP3C,EAAAA,EAAAA,OAAuB,CAAC,SAAU,WAAY,CAACY,EAAQU,GAAae,EAAUf,EAAYpC,KAAKH,YAE5FsD,EAAS,CACZ,MAAMxB,EAAY3B,KAAKJ,KAAKmD,MAAMlB,UAAYC,EAAAA,GAAQ9B,KAAKD,SAAS8B,QAEpE7B,KAAKK,IACHZ,EAAOyC,eACPpB,EAAAA,EAAAA,OACE,CAAC,UAAW,UAAW,SAAU,UACjC,CAACa,EAAY1B,EAAAA,EAAcD,KAAKJ,KAAKmD,MAAMlB,QAASO,GAAapC,KAAKH,QAAS6B,EAAQ,KAI7F,OAAO1B,KAGT0D,MAAMhC,EAAmBgB,GACvB,IAAKA,EAAW,CACd,MAAMf,EAAY3B,KAAKJ,KAAKmD,MAAMlB,UAAYC,EAAAA,GAAQ9B,KAAKD,SAAS8B,QAEpE7B,KAAKK,IACHZ,EAAOsC,cACPjB,EAAAA,EAAAA,OACE,CAAC,UAAW,UAAW,SAAU,UACjC,CAACa,EAAY1B,EAAAA,EAAcD,KAAKJ,KAAKmD,MAAMlB,QAAS7B,KAAKH,QAAS6B,EAAQ,IAE5EC,EAAYD,EAASJ,EAAAA,IAKzB,OAFAtB,KAAKK,IAAIZ,EAAOkE,eAAgB7C,EAAAA,EAAAA,OAAuB,CAAC,UAAW,CAAC4B,EAAYhB,GAAU,KAC1F1B,KAAKK,IAAIZ,EAAOmE,MAAO9C,EAAAA,EAAAA,OAAuB,CAAC,SAAU,UAAW,QAAS,EAAE,EAAGd,KAAKH,SAAS,KACzFG,KAGT6D,UAAUtB,EAAiBG,GACzB,IAAKA,EAAW,CACd,MAAMf,EAAY3B,KAAKJ,KAAKmD,MAAMlB,UAAYC,EAAAA,GAAQ9B,KAAKD,SAAS8B,QAEpE7B,KAAKK,IAAIZ,EAAO+C,gBAAiB1B,EAAAA,EAAAA,OAAuB,CAAC,UAAW,CAACyB,KACrEvC,KAAKK,IACHZ,EAAOsC,cACPjB,EAAAA,EAAAA,OACE,CAAC,UAAW,UAAW,SAAU,UACjC,CAACa,EAAY1B,EAAAA,EAAcD,KAAKJ,KAAKmD,MAAMlB,QAAS7B,KAAKH,QAAS,GAAI,IAGxE8B,GAAYiB,EAAAA,EAAAA,GAAQ5C,KAAKJ,KAAKmD,OAAOe,EAAAA,EAAAA,GAAU9D,KAAKJ,KAAKmE,YAAaxB,GAAM,IAAOyB,IAAI,MAAMC,IAAI,KAAQ3C,EAAAA,IAI7G,OADAtB,KAAKK,IAAIZ,EAAOmE,MAAO9C,EAAAA,EAAAA,OAAuB,CAAC,SAAU,UAAW,QAAS,CAACyB,EAAMvC,KAAKH,SAAS,KAC3FG,KAGTM,OACEuB,EACArB,EACAD,EACA2D,EACAC,EACAC,GAEApE,KAAKK,IACHZ,EAAO4E,KACPvD,EAAAA,EAAAA,OACE,CAAC,UAAW,QAAS,OAAQ,OAAQ,SACrC,CAACe,EAAStB,EAAM2D,EAAWC,EAAWC,IAExC5D,GAIM,aACR,IAAKR,KAAKF,QACR,MAAO,CACLwE,SAAS,GAIb,MAAMC,EAAyB,IAAIC,EAAAA,GACjCxE,KAAKJ,KAAKiC,QACV4C,GACAC,EAAAA,EAAAA,IAAoB1E,KAAKF,QAASE,KAAKH,UAGzC,IACE,MAAO,CACLyE,SAAS,EACTK,SAAUJ,EAAuBK,KAAK5E,KAAKE,QAASF,KAAKG,OAAQH,KAAKI,MAAO,CAC3EI,MAAOR,KAAKG,OAAO0E,QAAO,CAACC,EAAGC,IAAMD,EAAEzE,IAAI0E,IAAIzD,EAAAA,OAGlD,MAAOzC,GAEP,OADAmG,QAAQnG,MAAM,sBAAuBA,GAC9B,CACLyF,SAAS,EACTzF,MAAOA,O,kNCxTR,IAAKoG,EAgBAC,G,SAhBAD,GAAAA,EAAAA,EAAAA,QAAAA,GAAAA,UAAAA,EAAAA,EAAAA,aAAAA,GAAAA,eAAAA,EAAAA,EAAAA,QAAAA,GAAAA,UAAAA,EAAAA,EAAAA,OAAAA,GAAAA,SAAAA,EAAAA,EAAAA,SAAAA,GAAAA,W,CAAAA,IAAAA,EAAAA,K,SAgBAC,GAAAA,EAAAA,EAAAA,QAAAA,GAAAA,UAAAA,EAAAA,EAAAA,SAAAA,GAAAA,WAAAA,EAAAA,EAAAA,OAAAA,GAAAA,SAAAA,EAAAA,EAAAA,UAAAA,GAAAA,Y,CAAAA,IAAAA,EAAAA,KA8HZ,KAjHA,WAOE,MAAM,QAAErF,EAAF,QAAWC,EAAX,QAAoBC,IAAYoF,EAAAA,EAAAA,KAChCC,GAAWC,EAAAA,EAAAA,OACX,EAACC,EAAD,EAAuBC,IAA2BjG,EAAAA,EAAAA,WAAkB,IACpE,EAACkG,EAAD,EAAcC,IAAkBnG,EAAAA,EAAAA,eAAkCoG,IAExEC,EAAAA,EAAAA,YAAU,KACRF,OAAeC,KACd,CAAC7F,EAASE,IAEb,MAAMgB,EAAiBhB,GAAW6F,EAAAA,GAAc7F,GAE1C8F,GAAkBC,EAAAA,EAAAA,MAClBC,GAAiBC,EAAAA,EAAAA,IAA8BjF,EAAgBlB,GAAWI,EAAAA,GAC1EgG,GAAiBC,EAAAA,EAAAA,MAGjBC,GAAoCC,EAAAA,EAAAA,UAAQ,IAC3CrF,GACAgF,GAAkBF,EAAwBZ,EAAmBoB,QAE3DN,EAAiBd,EAAmBqB,SAAWrB,EAAmBsB,aAH7CtB,EAAmBuB,SAI9C,CAACzF,EAAgBgF,EAAgBF,IAE9BY,GAAmBC,EAAAA,EAAAA,MAEnB/F,GAAUgG,EAAAA,EAAAA,cAAYC,UAC1B,GAAIT,IAAkBlB,EAAmBsB,aAEvC,OADAvB,QAAQnG,MAAM,oCACP,CAAEgI,QAAS3B,EAAoB4B,WAExC,IAAK/F,EAEH,OADAiE,QAAQnG,MAAM,YACP,CAAEgI,QAAS3B,EAAoB4B,WAGxC,IAAKL,EAEH,OADAzB,QAAQnG,MAAM,wBACP,CAAEgI,QAAS3B,EAAoB4B,WAGxC,IAAKjH,EAEH,OADAmF,QAAQnG,MAAM,cACP,CAAEgI,QAAS3B,EAAoB4B,WAExC,IAAKhH,EAEH,OADAkF,QAAQnG,MAAM,cACP,CAAEgI,QAAS3B,EAAoB4B,WAGxC,IACE,MAAMC,QAAkBC,EAAAA,EAAAA,IACtBP,EACA1F,EACAlB,EACAC,GACA,EACAC,IAEI,EAAEiB,EAAF,EAAKC,EAAL,EAAQC,IAAM+F,EAAAA,EAAAA,GAAeF,GACnC,MAAO,CACLF,QAAS3B,EAAoBgC,QAC7BtG,OAAQ,CAAEf,QAAAA,EAASkB,eAAAA,EAAgBC,EAAAA,EAAGC,EAAAA,EAAGC,EAAAA,IAE3C,MAAOiG,GACP,MAAO,CACLN,QAAoB,OAAXM,EAAEC,KAAgBlC,EAAoBmC,SAAWnC,EAAoBoC,WAGjF,CAACnB,EAAetG,EAASC,EAASC,EAAS0G,EAAkB1F,IAmChE,MAAO,CAACoF,EAAeb,EAAsBE,EAjC3BoB,iBAChB,GAAKtB,EAOE,CACL,MAAMX,QAAK,OAAM8B,QAAN,IAAMA,OAAN,EAAMA,EAAkBc,0BAA0B1H,EAASkB,GAAgB,EAAM,EAAGyG,EAAAA,EAAUA,EAAAA,IACzGpC,GAASqC,EAAAA,EAAAA,IAAwB,wBAC3B9C,EAAG+C,OACTtC,GAASqC,EAAAA,EAAAA,IAAwB,SAXR,CACzB,MAAME,QAAehH,IACjBgH,EAAOd,UAAY3B,EAAoBgC,QACzCzB,EAAekC,EAAO/G,QACb+G,EAAOd,UAAY3B,EAAoBoC,QAChD/B,GAAwB,KAUfqB,eAAgBhH,EAAWgI,GACxC,MAAMC,EAAS,IAAInI,EAAAA,EAAYE,EAAMC,EAASC,EAASC,GACvD,IAAI+H,EACA3B,IAAkBlB,EAAmBsB,cAAgBf,GACvDqC,EAAOlH,QAAQ6E,GACfsC,EAAU,2BAA8BF,EAAQC,IAEhDC,QAAgBF,EAAQC,GAE1B,MAAMF,QAAeE,EAAOjD,OACxB+C,EAAOrD,UACT2B,EAAe0B,EAAOhD,GAAI,CAAEmD,QAAAA,IAC5BrC,OAAeC,SACTiC,EAAOhD,GAAG+C,Y,kLC7ItB,SAASK,EAAkBC,EAAsBC,GAC/C,MAAMC,ECFD,SAAoCF,EAAsBC,GAC/D,MAAM,QAAElI,IAAYoF,EAAAA,EAAAA,MAEbgD,EAAQC,GAAUrI,EAAU,QAACiI,QAAD,IAACA,OAAD,EAACA,EAAWK,QAAZ,OAAqBJ,QAArB,IAAqBA,OAArB,EAAqBA,EAAWI,SAAW,MAAC3C,OAAWA,GAEpF4C,GAAiBlC,EAAAA,EAAAA,UAAQ,KAAM,cACnC,OAAKrG,EAME,IAJK,UAAGwI,EAAAA,GAA8BxI,UAAjC,QAA6C,MACrCoI,GAAM,oBAAGK,EAAAA,GAAiBzI,UAApB,aAAG,EAA4BoI,EAAOtG,gBAAtC,QAAuD,MAC7DuG,GAAM,oBAAGI,EAAAA,GAAiBzI,UAApB,aAAG,EAA4BqI,EAAOvG,gBAAtC,QAAuD,IAJ5D,KAOpB,CAAC9B,EAASoI,EAAQC,IAEfK,GAA8BrC,EAAAA,EAAAA,UAClC,IAAMsC,GAAAA,CAAQJ,GAAQK,GAA2BL,EAAMM,KAAKC,GAAc,CAACF,EAAME,QACjF,CAACP,IAGH,OAAOlC,EAAAA,EAAAA,UACL,IACE+B,GAAUC,EACN,CAEE,CAACD,EAAQC,MAENE,EAAMM,KAAKD,GAAyB,CAACR,EAAQQ,QAE7CL,EAAMM,KAAKD,GAAyB,CAACP,EAAQO,QAE7CF,GAEFK,QAAQC,GAAqCC,QAAQD,EAAO,IAAMA,EAAO,MACzED,QAAO,EAAEG,EAAIC,KAAQD,EAAGpH,UAAYqH,EAAGrH,UACvCiH,QAAO,EAAEX,EAAQC,MAChB,IAAKrI,EAAS,OAAO,EACrB,MAAMoJ,EAAcC,EAAAA,GAAarJ,GAE3BsJ,EAAiC,OAAGF,QAAH,IAAGA,OAAH,EAAGA,EAAchB,EAAOtG,SACzDyH,EAAiC,OAAGH,QAAH,IAAGA,OAAH,EAAGA,EAAcf,EAAOvG,SAE/D,OAAKwH,IAAiBC,KAElBD,IAAiBA,EAAaE,MAAMZ,GAASP,EAAOoB,OAAOb,SAC3DW,IAAiBA,EAAaC,MAAMZ,GAASR,EAAOqB,OAAOb,SAInE,IACN,CAACR,EAAQC,EAAQE,EAAOG,EAAW1I,IDhDL0J,CAA2BzB,EAAWC,GAEhEyB,GAAWC,EAAAA,EAAAA,IAAWzB,GAG5B,OAAO9B,EAAAA,EAAAA,UACL,IACEwD,OAAOzJ,OACLuJ,EAEGZ,QAAQnB,GAA+CqB,QAAQrB,EAAO,KAAOkC,EAAAA,GAAAA,QAAoBlC,EAAO,MAExG9C,QAAwC,CAACiF,GAAO,CAAEC,MAAU,MAE3D,OADAD,EAAKC,EAAKC,eAAenI,SAAzB,UAAoCiI,EAAKC,EAAKC,eAAenI,gBAA7D,QAAyEkI,EAClED,IACN,MAET,CAACJ,IASE,SAASO,EACdC,EACAC,GACA,QAAEC,EARa,GAQU,IAEzB,MAAMC,EAAetC,EAAiB,OAACmC,QAAD,IAACA,OAAD,EAACA,EAAkBI,SAAUH,GAEnE,OAAO/D,EAAAA,EAAAA,UAAQ,KACb,GAAI8D,GAAoBC,GAAeE,EAAaE,OAAS,EAAG,CAC3C,MAAnB,GAAgB,IAAZH,EACF,iBACEI,EAAAA,GAAAA,iBAAuBH,EAAcH,EAAkBC,EAAa,CAClEC,QAAS,EACTK,cAAe,IACd,UAJL,QAIW,KAIb,IAAIC,EAA0E,KAC9E,IAAK,IAAIC,EAAI,EAAGA,GAAKP,EAASO,IAAK,OACjC,MAAMC,EAAqE,UACzEJ,EAAAA,GAAAA,iBAAuBH,EAAcH,EAAkBC,EAAa,CAClEC,QAASO,EACTF,cAAe,IACd,UAJsE,QAIhE,MAEPI,EAAAA,EAAAA,IAAcH,EAAgBE,EAAcE,EAAAA,MAC9CJ,EAAiBE,GAGrB,OAAOF,EAGT,OAAO,OACN,CAACL,EAAcH,EAAkBC,EAAaC,IAM5C,SAASW,EACdC,EACAC,GACA,QAAEb,EAhDa,GAgDU,IAEzB,MAAMC,EAAetC,EAAkBiD,EAAD,OAAaC,QAAb,IAAaA,OAAb,EAAaA,EAAmBX,UAEtE,OAAOlE,EAAAA,EAAAA,UAAQ,KACb,GAAI4E,GAAcC,GAAqBZ,EAAaE,OAAS,EAAG,CAC3C,MAAnB,GAAgB,IAAZH,EACF,iBACEI,EAAAA,GAAAA,kBAAwBH,EAAcW,EAAYC,EAAmB,CACnEb,QAAS,EACTK,cAAe,IACd,UAJL,QAIW,KAIb,IAAIC,EAA2E,KAC/E,IAAK,IAAIC,EAAI,EAAGA,GAAKP,EAASO,IAAK,OACjC,MAAMC,EAAY,UAChBJ,EAAAA,GAAAA,kBAAwBH,EAAcW,EAAYC,EAAmB,CACnEb,QAASO,EACTF,cAAe,IACd,UAJa,QAIP,MACPI,EAAAA,EAAAA,IAAcH,EAAgBE,EAAcE,EAAAA,MAC9CJ,EAAiBE,GAGrB,OAAOF,EAET,OAAO,OACN,CAACM,EAAYC,EAAmBZ,EAAcD","sources":["webpack://_N_E/./src/components/Alert/index.tsx","webpack://_N_E/./src/entities/KashiCooker.ts","webpack://_N_E/./src/hooks/useKashiApproveCallback.ts","webpack://_N_E/./src/hooks/useV2Trades.ts","webpack://_N_E/./src/hooks/useAllCurrencyCombinations.ts"],"sourcesContent":["import React, { useState } from 'react'\n\nimport { XIcon } from '@heroicons/react/solid'\nimport { classNames } from '../../functions'\n\nconst TYPE = {\n information: {\n color: 'bg-purple bg-opacity-20 text-high-emphesis',\n icon: (\n \n \n \n ),\n },\n warning: {\n color: 'bg-yellow bg-opacity-25 text-high-emphesis',\n icon: (\n \n \n \n ),\n },\n error: {\n color: 'bg-red bg-opacity-25 text-high-emphesis',\n icon: (\n \n \n \n ),\n },\n}\n\nexport interface AlertProps {\n title?: string\n message?: string | React.ReactChild | React.ReactChild[]\n type?: 'warning' | 'error' | 'information'\n showIcon?: boolean\n dismissable?: boolean\n}\n\nexport default function Alert({\n title,\n message,\n type = 'warning',\n className = '',\n showIcon = false,\n dismissable = true,\n}: AlertProps & React.HTMLAttributes): JSX.Element | null {\n // TODO: Persist this...\n const [show, setShow] = useState(true)\n const { color, icon } = TYPE[type]\n return message && show ? (\n
\n {title &&
{title}
}\n
\n {showIcon &&
{icon}
}\n
\n

{message}

\n
\n
\n {dismissable && (\n
\n setShow(!show)}\n className=\"inline-flex opacity-80 hover:opacity-100 focused:opacity-100 rounded p-1.5 text-primary hover:text-high-emphesis focus:text-high-emphesis focus:outline-none focus:ring focus:ring-offset focus:ring-offset-purple focus:ring-purple\"\n >\n Dismiss\n \n \n
\n )}\n
\n ) : null\n}\n","import { BigNumber, BigNumberish } from '@ethersproject/bignumber'\nimport { ChainId, WNATIVE } from '@sushiswap/core-sdk'\nimport { getProviderOrSigner } from '../functions/contract'\n\nimport { AddressZero } from '@ethersproject/constants'\nimport { Contract } from '@ethersproject/contracts'\nimport KASHIPAIR_ABI from '../constants/abis/kashipair.json'\nimport { KashiPermit } from '../hooks/useKashiApproveCallback'\nimport { Web3Provider } from '@ethersproject/providers'\nimport { ZERO } from '../functions/math'\nimport { defaultAbiCoder } from '@ethersproject/abi'\nimport { toElastic } from '../functions/rebase'\nimport { toShare } from '../functions/bentobox'\n\nenum Action {\n ADD_ASSET = 1,\n REPAY = 2,\n REMOVE_ASSET = 3,\n REMOVE_COLLATERAL = 4,\n BORROW = 5,\n GET_REPAY_SHARE = 6,\n GET_REPAY_PART = 7,\n ACCRUE = 8,\n\n // Functions that don't need accrue to be called\n ADD_COLLATERAL = 10,\n UPDATE_EXCHANGE_RATE = 11,\n\n // Function on BentoBox\n BENTO_DEPOSIT = 20,\n BENTO_WITHDRAW = 21,\n BENTO_TRANSFER = 22,\n BENTO_TRANSFER_MULTIPLE = 23,\n BENTO_SETAPPROVAL = 24,\n\n // Any external call (except to BentoBox)\n CALL = 30,\n}\n\nexport default class KashiCooker {\n private pair: any\n private account: string\n private library: Web3Provider | undefined\n private chainId: ChainId\n\n private actions: Action[]\n private values: BigNumber[]\n private datas: string[]\n\n constructor(\n pair: any,\n account: string | null | undefined,\n library: Web3Provider | undefined,\n chainId: ChainId | undefined\n ) {\n this.pair = pair\n this.account = account || AddressZero\n this.library = library\n this.chainId = chainId || 1\n\n this.actions = []\n this.values = []\n this.datas = []\n }\n\n add(action: Action, data: string, value: BigNumberish = 0): void {\n this.actions.push(action)\n this.datas.push(data)\n this.values.push(BigNumber.from(value))\n }\n\n approve(permit: KashiPermit): void {\n if (permit) {\n this.add(\n Action.BENTO_SETAPPROVAL,\n defaultAbiCoder.encode(\n ['address', 'address', 'bool', 'uint8', 'bytes32', 'bytes32'],\n [permit.account, permit.masterContract, true, permit.v, permit.r, permit.s]\n )\n )\n }\n }\n\n updateExchangeRate(mustUpdate = false, minRate = ZERO, maxRate = ZERO): KashiCooker {\n this.add(\n Action.UPDATE_EXCHANGE_RATE,\n defaultAbiCoder.encode(['bool', 'uint256', 'uint256'], [mustUpdate, minRate, maxRate])\n )\n return this\n }\n\n bentoDepositCollateral(amount: BigNumber): KashiCooker {\n const useNative = this.pair.collateral.address === WNATIVE[this.chainId].address\n\n this.add(\n Action.BENTO_DEPOSIT,\n defaultAbiCoder.encode(\n ['address', 'address', 'int256', 'int256'],\n [useNative ? AddressZero : this.pair.collateral.address, this.account, amount, 0]\n ),\n useNative ? amount : ZERO\n )\n\n return this\n }\n\n bentoWithdrawCollateral(amount: BigNumber, share: BigNumber): KashiCooker {\n const useNative = this.pair.collateral.address === WNATIVE[this.chainId].address\n\n this.add(\n Action.BENTO_WITHDRAW,\n defaultAbiCoder.encode(\n ['address', 'address', 'int256', 'int256'],\n [useNative ? AddressZero : this.pair.collateral.address, this.account, amount, share]\n ),\n useNative ? amount : ZERO\n )\n\n return this\n }\n\n bentoTransferCollateral(share: BigNumber, toAddress: string): KashiCooker {\n this.add(\n Action.BENTO_TRANSFER,\n defaultAbiCoder.encode(['address', 'address', 'int256'], [this.pair.collateral.address, toAddress, share])\n )\n\n return this\n }\n\n repayShare(part: BigNumber): KashiCooker {\n this.add(Action.GET_REPAY_SHARE, defaultAbiCoder.encode(['int256'], [part]))\n\n return this\n }\n\n addCollateral(amount: BigNumber, fromBento: boolean): KashiCooker {\n let share: BigNumber\n if (fromBento) {\n share = amount.lt(0) ? amount : toShare(this.pair.collateral, amount)\n } else {\n const useNative = this.pair.collateral.address === WNATIVE[this.chainId].address\n\n this.add(\n Action.BENTO_DEPOSIT,\n defaultAbiCoder.encode(\n ['address', 'address', 'int256', 'int256'],\n [useNative ? AddressZero : this.pair.collateral.address, this.account, amount, 0]\n ),\n useNative ? amount : ZERO\n )\n share = BigNumber.from(-2)\n }\n\n this.add(Action.ADD_COLLATERAL, defaultAbiCoder.encode(['int256', 'address', 'bool'], [share, this.account, false]))\n return this\n }\n\n addAsset(amount: BigNumber, fromBento: boolean): KashiCooker {\n let share: BigNumber\n if (fromBento) {\n share = toShare(this.pair.asset, amount)\n } else {\n const useNative = this.pair.asset.address === WNATIVE[this.chainId].address\n\n this.add(\n Action.BENTO_DEPOSIT,\n defaultAbiCoder.encode(\n ['address', 'address', 'int256', 'int256'],\n [useNative ? AddressZero : this.pair.asset.address, this.account, amount, 0]\n ),\n useNative ? amount : ZERO\n )\n share = BigNumber.from(-2)\n }\n\n this.add(Action.ADD_ASSET, defaultAbiCoder.encode(['int256', 'address', 'bool'], [share, this.account, false]))\n return this\n }\n\n removeAsset(fraction: BigNumber, toBento: boolean): KashiCooker {\n this.add(Action.REMOVE_ASSET, defaultAbiCoder.encode(['int256', 'address'], [fraction, this.account]))\n if (!toBento) {\n const useNative = this.pair.asset.address === WNATIVE[this.chainId].address\n\n this.add(\n Action.BENTO_WITHDRAW,\n defaultAbiCoder.encode(\n ['address', 'address', 'int256', 'int256'],\n [useNative ? AddressZero : this.pair.asset.address, this.account, 0, -1]\n )\n )\n }\n return this\n }\n\n removeCollateral(share: BigNumber, toBento: boolean): KashiCooker {\n this.add(Action.REMOVE_COLLATERAL, defaultAbiCoder.encode(['int256', 'address'], [share, this.account]))\n if (!toBento) {\n const useNative = this.pair.collateral.address === WNATIVE[this.chainId].address\n\n this.add(\n Action.BENTO_WITHDRAW,\n defaultAbiCoder.encode(\n ['address', 'address', 'int256', 'int256'],\n [useNative ? AddressZero : this.pair.collateral.address, this.account, 0, share]\n )\n )\n }\n return this\n }\n\n removeCollateralFraction(fraction: BigNumber, toBento: boolean): KashiCooker {\n this.add(Action.REMOVE_COLLATERAL, defaultAbiCoder.encode(['int256', 'address'], [fraction, this.account]))\n if (!toBento) {\n const useNative = this.pair.collateral.address === WNATIVE[this.chainId].address\n\n this.add(\n Action.BENTO_WITHDRAW,\n defaultAbiCoder.encode(\n ['address', 'address', 'int256', 'int256'],\n [useNative ? AddressZero : this.pair.collateral.address, this.account, 0, -1]\n )\n )\n }\n return this\n }\n\n borrow(amount: BigNumber, toBento: boolean, toAddress = ''): KashiCooker {\n this.add(\n Action.BORROW,\n defaultAbiCoder.encode(['int256', 'address'], [amount, toAddress && toBento ? toAddress : this.account])\n )\n if (!toBento) {\n const useNative = this.pair.asset.address === WNATIVE[this.chainId].address\n\n this.add(\n Action.BENTO_WITHDRAW,\n defaultAbiCoder.encode(\n ['address', 'address', 'int256', 'int256'],\n [useNative ? AddressZero : this.pair.asset.address, toAddress || this.account, amount, 0]\n )\n )\n }\n return this\n }\n\n repay(amount: BigNumber, fromBento: boolean): KashiCooker {\n if (!fromBento) {\n const useNative = this.pair.asset.address === WNATIVE[this.chainId].address\n\n this.add(\n Action.BENTO_DEPOSIT,\n defaultAbiCoder.encode(\n ['address', 'address', 'int256', 'int256'],\n [useNative ? AddressZero : this.pair.asset.address, this.account, amount, 0]\n ),\n useNative ? amount : ZERO\n )\n }\n this.add(Action.GET_REPAY_PART, defaultAbiCoder.encode(['int256'], [fromBento ? amount : -1]))\n this.add(Action.REPAY, defaultAbiCoder.encode(['int256', 'address', 'bool'], [-1, this.account, false]))\n return this\n }\n\n repayPart(part: BigNumber, fromBento: boolean): KashiCooker {\n if (!fromBento) {\n const useNative = this.pair.asset.address === WNATIVE[this.chainId].address\n\n this.add(Action.GET_REPAY_SHARE, defaultAbiCoder.encode(['int256'], [part]))\n this.add(\n Action.BENTO_DEPOSIT,\n defaultAbiCoder.encode(\n ['address', 'address', 'int256', 'int256'],\n [useNative ? AddressZero : this.pair.asset.address, this.account, 0, -1]\n ),\n // TODO: Put some warning in the UI or not allow repaying ETH directly from wallet, because this can't be pre-calculated\n useNative ? toShare(this.pair.asset, toElastic(this.pair.totalBorrow, part, true)).mul(1001).div(1000) : ZERO\n )\n }\n this.add(Action.REPAY, defaultAbiCoder.encode(['int256', 'address', 'bool'], [part, this.account, false]))\n return this\n }\n\n action(\n address: string,\n value: BigNumberish,\n data: string,\n useValue1: boolean,\n useValue2: boolean,\n returnValues: number\n ): void {\n this.add(\n Action.CALL,\n defaultAbiCoder.encode(\n ['address', 'bytes', 'bool', 'bool', 'uint8'],\n [address, data, useValue1, useValue2, returnValues]\n ),\n value\n )\n }\n\n async cook() {\n if (!this.library) {\n return {\n success: false,\n }\n }\n\n const kashiPairCloneContract = new Contract(\n this.pair.address,\n KASHIPAIR_ABI,\n getProviderOrSigner(this.library, this.account) as any\n )\n\n try {\n return {\n success: true,\n tx: await kashiPairCloneContract.cook(this.actions, this.values, this.datas, {\n value: this.values.reduce((a, b) => a.add(b), ZERO),\n }),\n }\n } catch (error) {\n console.error('KashiCooker Error: ', error)\n return {\n success: false,\n error: error,\n }\n }\n }\n}\n","import { KASHI_ADDRESS } from '@sushiswap/core-sdk'\nimport KashiCooker from '../entities/KashiCooker'\nimport { signMasterContractApproval } from '../functions'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { setKashiApprovalPending } from '../state/application/actions'\nimport { useActiveWeb3React } from '../services/web3'\nimport { useBentoBoxContract } from './useContract'\nimport { useBentoMasterContractAllowed } from '../state/bentobox/hooks'\nimport { useDispatch } from 'react-redux'\nimport { useKashiApprovalPending } from '../state/application/hooks'\nimport { useTransactionAdder } from '../state/transactions/hooks'\nimport { AddressZero, HashZero } from '@ethersproject/constants'\nimport { splitSignature } from '@ethersproject/bytes'\n\nexport enum BentoApprovalState {\n UNKNOWN,\n NOT_APPROVED,\n PENDING,\n FAILED,\n APPROVED,\n}\n\nexport interface KashiPermit {\n account: string\n masterContract: string\n v: number\n r: string\n s: string\n}\n\nexport enum BentoApproveOutcome {\n SUCCESS,\n REJECTED,\n FAILED,\n NOT_READY,\n}\n\nexport type BentoApproveResult = {\n outcome: BentoApproveOutcome\n permit?: KashiPermit\n}\n\n// returns a variable indicating the state of the approval and a function which approves if necessary or early returns\nfunction useKashiApproveCallback(): [\n BentoApprovalState,\n boolean,\n KashiPermit | undefined,\n () => void,\n (pair: any, execute: (cooker: KashiCooker) => Promise) => void\n] {\n const { account, library, chainId } = useActiveWeb3React()\n const dispatch = useDispatch()\n const [approveKashiFallback, setApproveKashiFallback] = useState(false)\n const [kashiPermit, setKashiPermit] = useState(undefined)\n\n useEffect(() => {\n setKashiPermit(undefined)\n }, [account, chainId])\n\n const masterContract = chainId && KASHI_ADDRESS[chainId]\n\n const pendingApproval = useKashiApprovalPending()\n const currentAllowed = useBentoMasterContractAllowed(masterContract, account || AddressZero)\n const addTransaction = useTransactionAdder()\n\n // check the current approval status\n const approvalState: BentoApprovalState = useMemo(() => {\n if (!masterContract) return BentoApprovalState.UNKNOWN\n if (!currentAllowed && pendingApproval) return BentoApprovalState.PENDING\n\n return currentAllowed ? BentoApprovalState.APPROVED : BentoApprovalState.NOT_APPROVED\n }, [masterContract, currentAllowed, pendingApproval])\n\n const bentoBoxContract = useBentoBoxContract()\n\n const approve = useCallback(async (): Promise => {\n if (approvalState !== BentoApprovalState.NOT_APPROVED) {\n console.error('approve was called unnecessarily')\n return { outcome: BentoApproveOutcome.NOT_READY }\n }\n if (!masterContract) {\n console.error('no token')\n return { outcome: BentoApproveOutcome.NOT_READY }\n }\n\n if (!bentoBoxContract) {\n console.error('no bentobox contract')\n return { outcome: BentoApproveOutcome.NOT_READY }\n }\n\n if (!account) {\n console.error('no account')\n return { outcome: BentoApproveOutcome.NOT_READY }\n }\n if (!library) {\n console.error('no library')\n return { outcome: BentoApproveOutcome.NOT_READY }\n }\n\n try {\n const signature = await signMasterContractApproval(\n bentoBoxContract,\n masterContract,\n account,\n library,\n true,\n chainId\n )\n const { v, r, s } = splitSignature(signature)\n return {\n outcome: BentoApproveOutcome.SUCCESS,\n permit: { account, masterContract, v, r, s },\n }\n } catch (e) {\n return {\n outcome: e.code === 4001 ? BentoApproveOutcome.REJECTED : BentoApproveOutcome.FAILED,\n }\n }\n }, [approvalState, account, library, chainId, bentoBoxContract, masterContract])\n\n const onApprove = async function () {\n if (!approveKashiFallback) {\n const result = await approve()\n if (result.outcome === BentoApproveOutcome.SUCCESS) {\n setKashiPermit(result.permit)\n } else if (result.outcome === BentoApproveOutcome.FAILED) {\n setApproveKashiFallback(true)\n }\n } else {\n const tx = await bentoBoxContract?.setMasterContractApproval(account, masterContract, true, 0, HashZero, HashZero)\n dispatch(setKashiApprovalPending('Approve Kashi'))\n await tx.wait()\n dispatch(setKashiApprovalPending(''))\n }\n }\n\n const onCook = async function (pair: any, execute: (cooker: KashiCooker) => Promise) {\n const cooker = new KashiCooker(pair, account, library, chainId)\n let summary\n if (approvalState === BentoApprovalState.NOT_APPROVED && kashiPermit) {\n cooker.approve(kashiPermit)\n summary = 'Approve Kashi and ' + (await execute(cooker))\n } else {\n summary = await execute(cooker)\n }\n const result = await cooker.cook()\n if (result.success) {\n addTransaction(result.tx, { summary })\n setKashiPermit(undefined)\n await result.tx.wait()\n }\n }\n\n return [approvalState, approveKashiFallback, kashiPermit, onApprove, onCook]\n}\n\nexport default useKashiApproveCallback\n","import { Currency, CurrencyAmount, Pair, Trade, TradeType } from '@sushiswap/core-sdk'\nimport { PairState, useV2Pairs } from './useV2Pairs'\n\nimport { BETTER_TRADE_LESS_HOPS_THRESHOLD } from '../constants'\nimport { isTradeBetter } from '../functions/trade'\nimport { useAllCurrencyCombinations } from './useAllCurrencyCombinations'\nimport { useMemo } from 'react'\n\nfunction useAllCommonPairs(currencyA?: Currency, currencyB?: Currency): Pair[] {\n const allCurrencyCombinations = useAllCurrencyCombinations(currencyA, currencyB)\n\n const allPairs = useV2Pairs(allCurrencyCombinations)\n\n // only pass along valid pairs, non-duplicated pairs\n return useMemo(\n () =>\n Object.values(\n allPairs\n // filter out invalid pairs\n .filter((result): result is [PairState.EXISTS, Pair] => Boolean(result[0] === PairState.EXISTS && result[1]))\n // filter out duplicated pairs\n .reduce<{ [pairAddress: string]: Pair }>((memo, [, curr]) => {\n memo[curr.liquidityToken.address] = memo[curr.liquidityToken.address] ?? curr\n return memo\n }, {})\n ),\n [allPairs]\n )\n}\n\nconst MAX_HOPS = 3\n\n/**\n * Returns the best trade for the exact amount of tokens in to the given token out\n */\nexport function useV2TradeExactIn(\n currencyAmountIn?: CurrencyAmount,\n currencyOut?: Currency,\n { maxHops = MAX_HOPS } = {}\n): Trade | null {\n const allowedPairs = useAllCommonPairs(currencyAmountIn?.currency, currencyOut)\n\n return useMemo(() => {\n if (currencyAmountIn && currencyOut && allowedPairs.length > 0) {\n if (maxHops === 1) {\n return (\n Trade.bestTradeExactIn(allowedPairs, currencyAmountIn, currencyOut, {\n maxHops: 1,\n maxNumResults: 1,\n })[0] ?? null\n )\n }\n // search through trades with varying hops, find best trade out of them\n let bestTradeSoFar: Trade | null = null\n for (let i = 1; i <= maxHops; i++) {\n const currentTrade: Trade | null =\n Trade.bestTradeExactIn(allowedPairs, currencyAmountIn, currencyOut, {\n maxHops: i,\n maxNumResults: 1,\n })[0] ?? null\n // if current trade is best yet, save it\n if (isTradeBetter(bestTradeSoFar, currentTrade, BETTER_TRADE_LESS_HOPS_THRESHOLD)) {\n bestTradeSoFar = currentTrade\n }\n }\n return bestTradeSoFar\n }\n\n return null\n }, [allowedPairs, currencyAmountIn, currencyOut, maxHops])\n}\n\n/**\n * Returns the best trade for the token in to the exact amount of token out\n */\nexport function useV2TradeExactOut(\n currencyIn?: Currency,\n currencyAmountOut?: CurrencyAmount,\n { maxHops = MAX_HOPS } = {}\n): Trade | null {\n const allowedPairs = useAllCommonPairs(currencyIn, currencyAmountOut?.currency)\n\n return useMemo(() => {\n if (currencyIn && currencyAmountOut && allowedPairs.length > 0) {\n if (maxHops === 1) {\n return (\n Trade.bestTradeExactOut(allowedPairs, currencyIn, currencyAmountOut, {\n maxHops: 1,\n maxNumResults: 1,\n })[0] ?? null\n )\n }\n // search through trades with varying hops, find best trade out of them\n let bestTradeSoFar: Trade | null = null\n for (let i = 1; i <= maxHops; i++) {\n const currentTrade =\n Trade.bestTradeExactOut(allowedPairs, currencyIn, currencyAmountOut, {\n maxHops: i,\n maxNumResults: 1,\n })[0] ?? null\n if (isTradeBetter(bestTradeSoFar, currentTrade, BETTER_TRADE_LESS_HOPS_THRESHOLD)) {\n bestTradeSoFar = currentTrade\n }\n }\n return bestTradeSoFar\n }\n return null\n }, [currencyIn, currencyAmountOut, allowedPairs, maxHops])\n}\n","import { ADDITIONAL_BASES, BASES_TO_CHECK_TRADES_AGAINST, CUSTOM_BASES } from '../config/routing'\nimport { Currency, Token } from '@sushiswap/core-sdk'\n\nimport flatMap from 'lodash/flatMap'\nimport { useActiveWeb3React } from '../services/web3'\nimport { useMemo } from 'react'\n\nexport function useAllCurrencyCombinations(currencyA?: Currency, currencyB?: Currency): [Token, Token][] {\n const { chainId } = useActiveWeb3React()\n\n const [tokenA, tokenB] = chainId ? [currencyA?.wrapped, currencyB?.wrapped] : [undefined, undefined]\n\n const bases: Token[] = useMemo(() => {\n if (!chainId) return []\n\n const common = BASES_TO_CHECK_TRADES_AGAINST[chainId] ?? []\n const additionalA = tokenA ? ADDITIONAL_BASES[chainId]?.[tokenA.address] ?? [] : []\n const additionalB = tokenB ? ADDITIONAL_BASES[chainId]?.[tokenB.address] ?? [] : []\n\n return [...common, ...additionalA, ...additionalB]\n }, [chainId, tokenA, tokenB])\n\n const basePairs: [Token, Token][] = useMemo(\n () => flatMap(bases, (base): [Token, Token][] => bases.map((otherBase) => [base, otherBase])),\n [bases]\n )\n\n return useMemo(\n () =>\n tokenA && tokenB\n ? [\n // the direct pair\n [tokenA, tokenB],\n // token A against all bases\n ...bases.map((base): [Token, Token] => [tokenA, base]),\n // token B against all bases\n ...bases.map((base): [Token, Token] => [tokenB, base]),\n // each base against all bases\n ...basePairs,\n ]\n .filter((tokens): tokens is [Token, Token] => Boolean(tokens[0] && tokens[1]))\n .filter(([t0, t1]) => t0.address !== t1.address)\n .filter(([tokenA, tokenB]) => {\n if (!chainId) return true\n const customBases = CUSTOM_BASES[chainId]\n\n const customBasesA: Token[] | undefined = customBases?.[tokenA.address]\n const customBasesB: Token[] | undefined = customBases?.[tokenB.address]\n\n if (!customBasesA && !customBasesB) return true\n\n if (customBasesA && !customBasesA.find((base) => tokenB.equals(base))) return false\n if (customBasesB && !customBasesB.find((base) => tokenA.equals(base))) return false\n\n return true\n })\n : [],\n [tokenA, tokenB, bases, basePairs, chainId]\n )\n}\n"],"names":["TYPE","information","color","icon","width","height","className","viewBox","xmlns","path","fill","d","warning","fillRule","clipRule","error","Alert","title","message","type","showIcon","dismissable","show","setShow","useState","classNames","onClick","Action","KashiCooker","constructor","pair","account","library","chainId","this","AddressZero","actions","values","datas","add","action","data","value","push","BigNumber","approve","permit","BENTO_SETAPPROVAL","defaultAbiCoder","masterContract","v","r","s","updateExchangeRate","mustUpdate","minRate","ZERO","maxRate","UPDATE_EXCHANGE_RATE","bentoDepositCollateral","amount","useNative","collateral","address","WNATIVE","BENTO_DEPOSIT","bentoWithdrawCollateral","share","BENTO_WITHDRAW","bentoTransferCollateral","toAddress","BENTO_TRANSFER","repayShare","part","GET_REPAY_SHARE","addCollateral","fromBento","lt","toShare","ADD_COLLATERAL","addAsset","asset","ADD_ASSET","removeAsset","fraction","toBento","REMOVE_ASSET","removeCollateral","REMOVE_COLLATERAL","removeCollateralFraction","borrow","BORROW","repay","GET_REPAY_PART","REPAY","repayPart","toElastic","totalBorrow","mul","div","useValue1","useValue2","returnValues","CALL","success","kashiPairCloneContract","Contract","KASHIPAIR_ABI","getProviderOrSigner","tx","cook","reduce","a","b","console","BentoApprovalState","BentoApproveOutcome","useActiveWeb3React","dispatch","useDispatch","approveKashiFallback","setApproveKashiFallback","kashiPermit","setKashiPermit","undefined","useEffect","KASHI_ADDRESS","pendingApproval","useKashiApprovalPending","currentAllowed","useBentoMasterContractAllowed","addTransaction","useTransactionAdder","approvalState","useMemo","PENDING","APPROVED","NOT_APPROVED","UNKNOWN","bentoBoxContract","useBentoBoxContract","useCallback","async","outcome","NOT_READY","signature","signMasterContractApproval","splitSignature","SUCCESS","e","code","REJECTED","FAILED","setMasterContractApproval","HashZero","setKashiApprovalPending","wait","result","execute","cooker","summary","useAllCommonPairs","currencyA","currencyB","allCurrencyCombinations","tokenA","tokenB","wrapped","bases","BASES_TO_CHECK_TRADES_AGAINST","ADDITIONAL_BASES","basePairs","flatMap","base","map","otherBase","filter","tokens","Boolean","t0","t1","customBases","CUSTOM_BASES","customBasesA","customBasesB","find","equals","useAllCurrencyCombinations","allPairs","useV2Pairs","Object","PairState","memo","curr","liquidityToken","useV2TradeExactIn","currencyAmountIn","currencyOut","maxHops","allowedPairs","currency","length","Trade","maxNumResults","bestTradeSoFar","i","currentTrade","isTradeBetter","BETTER_TRADE_LESS_HOPS_THRESHOLD","useV2TradeExactOut","currencyIn","currencyAmountOut"],"sourceRoot":""}