{"version":3,"sources":["../src/context/contracts-app/contractConnectors.ts","../src/context/contracts-app/contractsContextFactory.tsx","../src/context/ethers-app/useBlockNumberContext.tsx","../src/context/EthersAppStore.ts","../src/hooks/useAreSignerEqual.ts","../src/hooks/useEthersUpdater.ts","../src/hooks/useBalance.ts","../src/hooks/useBlockNumber.ts","../src/hooks/useBurnerSigner.ts","../src/hooks/useContractExistsAtAddress.ts","../src/hooks/useContractReader.ts","../src/hooks/useEthersAdaptorFromProviderOrSigners.ts","../src/hooks/useEventListener.ts","../src/hooks/useGasPrice.ts","../src/hooks/useNonce.ts","../src/hooks/useSignerAddress.ts","../src/hooks/useSignerChainId.ts","../src/hooks/useTimestamp.ts","../src/hooks/useCheckIsMounted.ts","../src/context/ethers-app/EthersAppContext.tsx","../src/context/ethers-app/connectors/EthersModalConnector.ts","../src/context/ethers-app/connectors/connectorErrors.ts","../src/helpers/esm-fixtures/web3modal.ts","../src/context/ethers-app/queryClient.ts","../src/context/ethers-app/connectors/StaticJsonRpcProviderConnector.ts"],"names":["_a","merge","useEffect","invariant","create","useRef","useQuery","queryKey","keys","addresses","result","ethers","useCallback","args","utils","useDebounce","chainId","speed","currentNetworkInfo","address","blockNumber","Web3Provider","AbstractConnector","BigNumber","account"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,oBAA4B;AACrC,SAAS,aAAa;AA4BtB,IAAM,0BAA0B,CAAC,eAAmE;AA7BpG,MAAAA;AA8BE,QAAM,QAAQ,mCAAmC,UAAU,UAAU;AACrE,MAAI,CAAC,MAAM,SAAS;AAClB,YAAQ,MAAM,2EAA2E,MAAM,KAAK;AAAA,EACtG;AAEA,QAAM,eAAoC,CAAC;AAC3C,aAAW,cAAc,YAAY;AACnC,UAAM,UAAU,SAAS,UAAU;AACnC,QAAI,WAAW,QAAQ,MAAM,OAAO;AAAG;AAEvC,UAAM,yBAAwBA,MAAA,OAAO,OAAO,WAAW,QAAQ,EAAE;AAAA,MAC/D,CAAC,MAAM,SAAS,uBAAG,OAAO,MAAM;AAAA,IAClC,MAF8B,gBAAAA,IAE1B;AACJ,SAAI,+DAAuB,YAAW,MAAM;AAC1C,iBAAW,gBAAgB,sBAAsB,WAAW;AAC1D,cAAM,SAAmC;AAAA,UACvC,CAAC,UAAU,EAAE,SAAS,sBAAsB,UAAU,cAAc,SAAS,QAAQ;AAAA,QACvF;AAEA,cAAM,MAAM,sBAAsB,UAAU,cAAc;AAC1D,YAAI,QAAO,2BAAK,UAAS,GAAG;AAC1B,uBAAa,gBAAgB,MAAM,aAAa,iBAAiB,CAAC,GAAG,EAAE,IAAS,CAAC;AAAA,QACnF;AACA,qBAAa,gBAAgB,MAAM,EAAE,GAAG,aAAa,cAAc,GAAG,EAAE,OAAO,CAAC;AAAA,MAClF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAQA,IAAM,2BAA2B,CAAC,eAAqE;AACrG,QAAM,QAAQ,2BAA2B,UAAU,UAAU;AAC7D,MAAI,CAAC,MAAM,SAAS;AAClB,YAAQ,MAAM,wCAAwC,MAAM,KAAK;AAAA,EACnE;AAEA,QAAM,eAAuC,CAAC;AAC9C,aAAW,cAAc,YAAY;AACnC,UAAM,UAAU,SAAS,UAAU;AACnC,QAAI,WAAW,QAAQ,MAAM,OAAO;AAAG;AAEvC,eAAW,gBAAgB,WAAW,UAAU;AAC9C,YAAM,SAAmC;AAAA,QACvC,CAAC,UAAU,EAAE,SAAS,WAAW,SAAS,eAAe,QAAiB;AAAA,MAC5E;AACA,mBAAa,gBAAgB,MAAM,EAAE,GAAI,aAAa,iBAAiB,CAAC,EAAG,GAAG,EAAE,OAAO,CAAC;AAAA,IAC1F;AAAA,EACF;AAEA,SAAO;AACT;AAQA,IAAM,iCAAiC,CAAC,eAA4E;AAClH,QAAM,QAAQ,yCAAyC,UAAU,UAAU;AAC3E,MAAI,CAAC,MAAM,SAAS;AAClB,YAAQ,MAAM,oDAAoD,MAAM,KAAK;AAAA,EAC/E;AAEA,QAAM,eAAuC,CAAC;AAC9C,aAAW,cAAc,YAAY;AACnC,UAAM,UAAU,SAAS,UAAU;AACnC,QAAI,WAAW,QAAQ,MAAM,OAAO;AAAG;AAEvC,UAAM,sBAAsB,WAAW,SAAS,aAC7C,OAAO,CAAC,MAAM,EAAE,oBAAoB,QAAQ,EAC5C,IAAI,CAAC,MAAM;AACV,YAAM,KAAqB;AAAA,QACzB,cAAc,EAAE,aAAa,QAAQ,UAAU,EAAE,EAAE,QAAQ,UAAU,EAAE;AAAA,QACvE,SAAS,EAAE;AAAA,MACb;AACA,aAAO;AAAA,IACT,CAAC;AAEH,UAAM,mBAAmB,oBAAoB,IAAI,CAAC,MAAM,EAAE,YAAY;AAEtE,qBAAiB,QAAQ,CAAC,iBAAiB;AAtH/C,UAAAA;AAuHM,YAAM,OAAO,oBAAoB,OAAO,CAAC,MAAM,EAAE,iBAAiB,YAAY;AAC9E,UAAI,KAAK,WAAW,GAAG;AACrB,gBAAQ,MAAM,+CAA+C,cAAc,YAAY,SAAS;AAAA,MAClG,WAAW,KAAK,SAAS,GAAG;AAC1B,gBAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA,YAAY;AAAA,QACd;AAAA,MACF;AAEA,cAAQ,IAAI,eAAe,KAAK,EAAE;AAElC,YAAM,SAAmC;AAAA,QACvC,CAAC,UAAU,EAAE,UAASA,MAAA,6BAAO,OAAP,gBAAAA,IAAW,SAAS,QAAiB;AAAA,MAC7D;AAEA,mBAAa,gBAAgB,MAAM,EAAE,GAAI,aAAa,iBAAiB,CAAC,EAAG,GAAG,EAAE,OAAO,CAAC;AAAA,IAC1F,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAYO,IAAM,oCAAoC,CAI/C,cACA,kBACA,gCACsD;AACtD,QAAM,OAAO,wBAAwB,2BAA2B,EAAE;AAElE,MAAI,QAAQ,QAAQ,KAAK,OAAO,MAAM;AACpC,UAAM,IAAI;AAAA,MACR,YAAY;AAAA,IACd;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,SAAS,iBAAiB;AAAA,IAE1B,MAAM,6BAAM,QAAO,iBAAiB,OAAO,CAAC;AAAA,IAC5C,QAAQ;AAAA,MACN,GAAG,KAAK;AAAA,IACV;AAAA,EACF;AACF;AAYO,IAAM,oCAAoC,CAI/C,cACA,kBACA,uBACsD;AACtD,QAAM,OAAO,+BAA+B,kBAAkB,EAAE;AAEhE,MAAI,QAAQ,QAAQ,iBAAiB,OAAO,MAAM;AAChD,UAAM,IAAI;AAAA,MACR,YAAY;AAAA,IACd;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,SAAS,iBAAiB;AAAA,IAE1B,KAAM,iBAAiB,OAAO,CAAC;AAAA,IAC/B,QAAQ;AAAA,MACN,GAAG,KAAK;AAAA,IACV;AAAA,EACF;AACF;AAeO,IAAM,qCAAqC,CAIhD,cACA,kBACA,yBACsD;AACtD,QAAM,OAAO,yBAAyB,oBAAoB,EAAE;AAE5D,MAAI,QAAQ,MAAM;AAChB,UAAM,IAAI;AAAA,MACR,YAAY;AAAA,IACd;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,SAAS,iBAAiB;AAAA,IAE1B,KAAK,iBAAiB,OAAO,CAAC;AAAA,IAC9B,QAAQ;AAAA,MACN,GAAG,KAAK;AAAA,IACV;AAAA,EACF;AACF;AAgBO,IAAM,gCAAgC,CAI3C,cACA,QAKA,KACA,cAAuE,WACT;AAC9D,QAAM,mBAA6C,EAAE,GAAG,OAAO;AAC/D,aAAW,KAAK,kBAAkB;AAChC,qBAAiB,GAAG,UAAU,SAAS,CAAC;AAAA,EAC1C;AAEA,MAAI,aAAa;AACf,WAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF,OAAO;AACL,UAAM,yBAAsE,CAC1E,SACA,qBACG;AACH,YAAM,eAAe,IAAI,aAAa,SAAS,KAAK,gBAAgB;AACpE,mBAAa,eAAe;AAC5B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AACF;;;ACzTA,SAAS,SAAAC,cAAa;AACtB,SAAS,aAAa,WAAW,cAAc;AAC/C,SAAS,sBAAsB;AAC/B,SAAS,iBAAiB;AAC1B,SAAS,WAAW,cAAuC;AAkEpD,IAAM,0BAA0B,CAIrC,8BA+BG;AAWH,QAAM,6BAA6B,MAA0B;AAC3D,WAAO;AAAA,MACL,oBAAoB,CAAC;AAAA,MACrB,iBAAiB,CAAC;AAAA,MAClB,oBAAoB,CAAC;AAAA,IACvB;AAAA,EACF;AAQA,QAAM,iBAAiB,CAAC,6BAAoE;AAC1F,UAAM,QAAQ,2BAA2B;AACzC,UAAM,qBAAqB;AAC3B,WAAO;AAAA,EACT;AAQA,QAAM,oBAAoB,CAAC,UAAkD;AAC3E,UAAM,WAAW,2BAA2B;AAC5C,aAAS,qBAAqB,EAAE,GAAG,MAAM,mBAAmB;AAC5D,aAAS,kBAAkB,EAAE,GAAG,MAAM,gBAAgB;AACtD,aAAS,qBAAqB,EAAE,GAAG,MAAM,mBAAmB;AAE5D,WAAO;AAAA,EACT;AAEA,QAAM,yBAAyB,CAC7B,oBACyD;AACzD,QAAI,qBAA2E,CAAC;AAEhF,UAAM,QAA0B,OAAO,KAAK,eAAe;AAC3D,UAAM,QAAQ,CAAC,SAAS;AACtB,YAAM,WAAW,OAAO,KAAK,gBAAgB,KAAK,EAAE,IAAI,MAAM;AAC9D,eAAS,QAAQ,CAAC,YAAY;AAC5B,cAAM,OAAO;AAAA,UACX,CAAC,UAAU,EAAE,CAAC,OAAO,gBAAgB,MAAM,SAAS;AAAA,QACtD;AACA,cAAM,OAAOA,OAAM,oBAAoB,IAAI;AAC3C,6BAAqB;AAAA,MACvB,CAAC;AAAA,IACH,CAAC;AACD,WAAO;AAAA,EACT;AAEA,QAAM,sBAAsB,CAC1B,uBACsD;AACtD,QAAI,kBAAqE,CAAC;AAK1E,UAAM,WAAW,OAAO,KAAK,kBAAkB,EAAE,IAAI,MAAM;AAC3D,aAAS,QAAQ,CAAC,YAAY;AAC5B,YAAM,QAAQ,OAAO,KAAK,mBAAmB,QAAQ;AACrD,YAAM,QAAQ,CAAC,SAAS;AACtB,cAAM,OAAO;AAAA,UACX,CAAC,OAAO,EAAE,CAAC,UAAU,mBAAmB,SAAS,MAAM;AAAA,QACzD;AACA,cAAM,OAAOA,OAAM,iBAAiB,IAAI;AACxC,0BAAkB;AAAA,MACpB,CAAC;AAAA,IACH,CAAC;AAED,WAAO;AAAA,EACT;AAMA,QAAM,+BAA+B,CACnC,OACA,kBACuB;AACvB,SAAI,+CAAe,YAAW,MAAM;AAClC,YAAM,WAAW,kBAAkB,KAAK;AACxC,YAAM,UAAU,cAAc;AAC9B,aAAO,SAAS,mBAAmB;AAEnC,eAAS,kBAAkB,oBAAoB,SAAS,kBAAkB;AAC1E,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,QAAM,qCAAqC,CACzC,WACA,YACgC;AAvNpC,QAAAD,KAAA;AAwNI,QAAI,WAAW,QAAQ,CAAC,qBAAqB,OAAO,GAAG;AACrD,cAAQ,KAAK,iEAAiE;AAC9E,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,QAAQ,SAAS,IAAI;AAC7B,UAAM,mBAAmB,UAAU;AAEnC,UAAM,UAAU,QAAQ;AACxB,UAAM,mBAAkB,MAAAA,MAAA,uCAAW,WAAX,gBAAAA,IAAoB,aAApB,mBAA8B;AACtD,QAAI,mBAAmB,QAAQ,oBAAoB,MAAM;AACvD,YAAM,WAAW,UAAU,QAAQ,UAAU,OAAO,SAAS,SAAS,gBAAgB;AACtF,UAAI,YAAY,MAAM;AACpB,eAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,UAAU,OAAO,YAAY,MAAM;AACrC,cAAQ,KAAK,6EAA6E;AAAA,IAC5F;AACA,YAAQ;AAAA,MACN,gCAAgC,uCAAW,mCAAmC,oBAAoB,KAAK;AAAA,QACrG,uCAAW;AAAA,MACb;AAAA,IACF;AACA,YAAQ,IAAI,sHAAyF;AACrG,WAAO;AAAA,EACT;AAQA,QAAM,8BAA8B,CAClC,OACA,kBACuB;AACvB,QAAI,iBAAiB,QAAQ,CAAC,qBAAqB,aAAa,GAAG;AACjE,gBAAU,IAAI,+CAA+C;AAC7D,aAAO,6BAA6B,OAAO,aAAa;AAAA,IAC1D;AACA,UAAM,WAAW,kBAAkB,KAAK;AAExC,UAAM,EAAE,SAAS,QAAQ,SAAS,IAAI;AACtC,UAAM,mBAAmB,UAAU;AACnC,eAAW,gBAAgB,SAAS,oBAAoB;AACtD,YAAM,YAAY,SAAS,mBAAmB;AAC9C,UAAI,WAAW,UAAU,OAAO,YAAY,QAAQ,oBAAoB,MAAM;AAC5E,cAAM,WAAW,mCAAmC,WAAW,aAAa;AAC5E,cAAM,OAAO,EAAE,CAAC,eAAe,EAAE,CAAC,UAAU,SAAS,EAAE;AACvD,iBAAS,kBAAkBC,OAAM,SAAS,iBAAiB,IAAI;AAAA,MAIjE;AAAA,IACF;AACA,aAAS,qBAAqB,uBAAuB,SAAS,eAAe;AAC7E,WAAO;AAAA,EACT;AASA,QAAM,0BAA0B,CAC9B,OACA,cACA,kBACuB;AACvB,QAAI,iBAAiB,QAAQ,CAAC,qBAAqB,aAAa,GAAG;AACjE,gBAAU,IAAI,+CAA+C;AAC7D,aAAO,6BAA6B,OAAO,aAAa;AAAA,IAC1D;AAEA,UAAM,WAAW,kBAAkB,KAAK;AACxC,UAAM,EAAE,QAAQ,IAAI;AACpB,UAAM,oBAAoB,SAAS,mBAAmB;AAEtD,QAAI,WAAW,kBAAkB,OAAO,YAAY,MAAM;AACxD,YAAM,WAAW,mCAAmC,mBAAmB,aAAa;AACpF,eAAS,gBAAgB,kBAAkB,gBAAgB,CAAC;AAC5D,YAAM,OAAO,SAAS,gBAAgB,kBAAkB;AACxD,WAAK,WAAW;AAChB,eAAS,qBAAqB,uBAAuB,SAAS,eAAe;AAAA,IAC/E;AACA,WAAO;AAAA,EACT;AAEA,QAAM,8BAA8B,CAAC,uBAA8D;AACjG,UAAM,WAAW,eAAe,kBAAkB;AAClD,WAAO;AAAA,EACT;AAOA,QAAM,uBAAuB,OAAe,EAAE,CAAC,SAAS;AAAA,IACtD,eAAe;AAAA,IACf,kBAAkB,CAAC,kBACjB,IAAI,CAAC,UAAkB;AACrB,YAAM,gBAAgB;AACtB,aAAO;AAAA,IACT,CAAC;AAAA,IACH,uBAAuB,CAAC,kBACtB,IAAI,CAAC,UAAkB;AACrB,UAAI,MAAM,eAAe;AACvB,cAAM,gBAAgB,4BAA4B,MAAM,eAAe,aAAa;AACpF,cAAM,gBAAgB;AAAA,MACxB;AACA,aAAO;AAAA,IACT,CAAC;AAAA,IACH,mBAAmB,CAAC,cAA8B,kBAChD,IAAI,CAAC,UAAkB;AACrB,UAAI,MAAM,eAAe;AACvB,cAAM,gBAAgB,wBAAwB,MAAM,eAAe,cAAc,aAAa;AAC9F,cAAM,gBAAgB;AAAA,MACxB;AACA,aAAO;AAAA,IACT,CAAC;AAAA,IACH,uBAAuB,CAAC,uBACtB,IAAI,CAAC,UAAkB;AACrB,YAAM,gBAAgB,4BAA4B,kBAAkB;AACpE,YAAM,gBAAgB;AAEtB,aAAO;AAAA,IACT,CAAC;AAAA,EACL,EAAE;AAYF,QAAM,kBAAkB,CACtB,cACA,YAC6D;AA7WjE,QAAAD,KAAA;AA8WI,UAAM,iBAAiB,qBAAqB,CAAC,UAAU,MAAM,aAAa;AAC1E,UAAM,gBAAgB,oBAAoB;AAC1C,UAAM,YAAW,MAAAA,MAAA,iDAAgB,oBAAhB,gBAAAA,IAAkC,kBAAlC,mBAAkD,WAAW;AAC9E,UAAM,qBAAoB,sDAAgB,uBAAhB,mBAAqC;AAC/D,UAAM,aAAa,OAAO,EAAE;AAI5B,QACE,YAAY,SACZ,+CAAe,YAAW,SAC1B,uDAAmB,QAAO,QAC1B,YAAY,WAAW,SACvB;AACA,cAAQ,KAAK,yBAAe,mCAAmC,UAAU;AACzE,cAAQ;AAAA,QACN;AAAA,MACF;AACA,iBAAW,UAAU;AAAA,IACvB;AAEA,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAMA,QAAM,sBAAsB,MAAY;AACtC,UAAM,cAAc,eAAe;AACnC,UAAM,wBAAwB,qBAAqB,CAAC,UAAU,MAAM,qBAAqB;AAEzF,UAAM,OAAO,YAAY,MAAM;AAC7B,UAAI,6BAA6B,MAAM;AACrC,cAAM,aAAa,0BAA0B;AAC7C,YAAI,cAAc,MAAM;AACtB,gCAAsB,UAAU;AAChC,0BAAgB,aAAa,aAAa,SAAS;AAAA,QACrD;AAAA,MACF;AAAA,IAEF,GAAG,CAAC,CAAC;AAEL,cAAU,MAAM;AACd,WAAK,KAAK;AAAA,IACZ,GAAG,CAAC,IAAI,CAAC;AAAA,EACX;AAEA,QAAM,yBAAyB,CAAC,YAA8C;AAC5E,UAAM,cAAc,eAAe;AACnC,UAAM,wBAAwB,qBAAqB,CAAC,UAAU,MAAM,qBAAqB;AACzF,UAAM,oBAAoB,qBAAqB,OAAO;AAEtD,UAAM,UAAU,YAAY,MAAM;AAChC,WAAI,mCAAS,YAAW,MAAM;AAC5B,8BAAsB,OAAO;AAC7B,wBAAgB,aAAa,aAAa,SAAS;AAAA,MACrD;AAAA,IAEF,GAAG,CAAC,mCAAS,UAAU,mCAAS,QAAQ,mCAAS,SAAS,mCAAS,SAAS,iBAAiB,CAAC;AAE9F,cAAU,MAAM;AACd,WAAK,QAAQ;AAAA,IACf,GAAG,CAAC,OAAO,CAAC;AAAA,EACd;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACzbA,SAAS,aAAAE,kBAAiB;AAC1B,SAAS,aAAAC,kBAAiB;;;ACD1B,SAAS,WAAWC,eAAuC;AAapD,IAAM,oBAAoBA,QAAe,EAAE,CAAC,SAAS;AAAA,EAC1D,kBAAkB,CAAC;AAAA,EACnB,gBAAgB,CAAC,aAAqB,YACpC,IAAI,CAAC,UAAkB;AACrB,UAAM,iBAAiB,WAAW;AAClC,WAAO;AAAA,EACT,CAAC;AACL,EAAE;;;ACpBF,SAAS,gBAAgB;;;ACAzB,SAAS,UAAAC,eAAc;AAchB,IAAM,mBAAmB,CAC9B,QACA,aACA,SACA,yBAAkC,SACzB;AACT,qBAAmB,OAAO;AAC1B,QAAM,kBAAkBA,QAA2B,MAAS;AAG5D,QAAM,oBAAoB,cAAc,KAAK,MAAM,eAAe,QAAQ,uBAAuB,EAAE,IAAI;AAEvG,MAAI,wBAAwB;AAE1B,QAAI,CAAC,QAAQ,mBAAmB,sBAAsB,gBAAgB,SAAS;AAC7E,sBAAgB,UAAU;AAC1B,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AACF;;;AD1BA,IAAM,WAAW,EAAE,WAAW,aAAa,QAAQ,KAAK,oBAAoB;AAarE,IAAM,oBAAoB,CAC/B,SACA,SACA,UAA0B,0BAA0B,MACf;AACrC,QAAM,OAAO,CAAC,EAAE,GAAG,SAAS,GAAG,EAAE,YAAY,YAAY,OAAO,GAAG,YAAY,YAAY,OAAO,EAAE,CAAC;AACrG,QAAM,EAAE,MAAM,SAAS,OAAO,IAAI;AAAA,IAChC;AAAA,IACA,OAAO,UAAwC;AAC7C,UAAI,iBAAiB,OAAO,GAAG;AAC7B,cAAM,WAAW,OAAM,mCAAS;AAChC,cAAM,WAAW,OAAM,mCAAS;AAEhC,cAAM,WAAW,OAAM,mCAAS;AAChC,cAAM,WAAW,OAAM,mCAAS;AAChC,cAAM,UACJ,aAAa,YAAY,aAAa,YAAY,aAAa,UAAa,aAAa;AAC3F,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,GAAG,oBAAyC,OAAO;AAAA,IACrD;AAAA,EACF;AAEA,QAAM,cAAc,sBAAsB;AAC1C,mBAAiB,SAAS,aAAa,OAAO;AAE9C,SAAO,CAAC,MAAM,SAAS,MAAM;AAC/B;;;AElDA,SAAS,iBAAiB;AAC1B,SAAS,YAAAC,iBAAgB;AAgBzB,IAAMC,YAA0B,EAAE,WAAW,aAAa,QAAQ,KAAK,aAAa;AAEpF,IAAM,OAAO,UAAU,KAAK,CAAC;AA0BtB,IAAM,aAAa,CACxB,WACA,UAA0B,0BAA0B,GACpD,WAAsB,qBAAqB,MACE;AAC7C,QAAM,gBAAgB,oBAAoB,SAAS,mBAAmB;AACtE,QAAM,EAAE,SAAS,IAAI,eAAe,eAAe,QAAQ;AAE3D,QAAM,OAAO,CAAC,EAAE,GAAGA,WAAU,GAAG,YAAY,QAAQ,EAAE,GAAG,EAAE,UAAU,CAAC;AACtE,QAAM,EAAE,MAAM,SAAS,OAAO,IAAID;AAAA,IAChC;AAAA,IACA,OAAOE,UAA2D;AAChE,YAAM,EAAE,WAAAC,WAAU,IAAID,MAAK,SAAS;AAEpC,UAAI,YAAYC,YAAW;AACzB,YAAI,MAAM,QAAQA,UAAS,GAAG;AAC5B,gBAAMC,UAAsC,CAAC;AAC7C,gBAAM,aAAaD,YAAW,OAAO,YAAoB;AACvD,kBAAM,UAAU,MAAM,SAAS,WAAW,OAAO;AACjD,YAAAC,QAAO,WAAW;AAAA,UACpB,CAAC;AACD,iBAAOA;AAAA,QACT,OAAO;AACL,gBAAM,UAAkBD;AACxB,gBAAM,aAAa,MAAM,SAAS,WAAW,OAAO;AACpD,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,GAAG,oBAA6D,OAAO;AAAA,MACvE,aAAa,CAAC,WAAW,eAAc,uCAAW,WAAS,uCAAW;AAAA,IACxE;AAAA,EACF;AAEA,QAAM,cAAc,sBAAsB;AAC1C,mBAAiB,SAAS,aAAa,OAAO;AAE9C,MAAI;AACJ,MAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,aAAS,QAAS,CAAC;AAAA,EACrB,OAAO;AACL,aAAS,QAAS;AAAA,EACpB;AAEA,SAAO,CAAC,QAAQ,SAAS,MAAM;AACjC;;;AC5FA,SAAS,aAAAP,kBAAiB;AAC1B,SAAS,YAAAI,iBAAgB;AAKzB,IAAMC,YAA0B,EAAE,WAAW,aAAa,QAAQ,KAAK,iBAAiB;AAejF,IAAM,iBAAiB,CAC5B,UACA,UACA,UAA0B,0BAA0B,MAC5B;AAExB,QAAM,OAAO;AAAA,IACX;AAAA,MACE,GAAGA;AAAA,MACH,GAAG,YAAY,QAAQ;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,EAAE,MAAM,SAAS,OAAO,IAAID;AAAA,IAChC;AAAA,IACA,OAAO,UAAiC;AACtC,UAAI,UAAU;AACZ,cAAM,kBAAkB,OAAM,qCAAU;AACxC,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,GAAG,oBAAkC,OAAO;AAAA,IAC9C;AAAA,EACF;AAEA,EAAAJ,WAAU,MAAM;AAjDlB,QAAAF;AAkDI,QAAI,UAAU;AACZ,YAAM,WAAW,CAAC,qBAAmC;AACnD,aAAK,QAAQ;AAEb,YAAI,YAAY,MAAM;AACpB,cAAI;AACF,iBAAK,SAAS,gBAAgB;AAAA,UAChC,SAAS,GAAP;AACA,oBAAQ,KAAK,kCAAkC,CAAC;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AACA,OAAAA,MAAA,qCAAU,gBAAV,gBAAAA,IAAA,eAAwB,SAAS;AAEjC,UAAI,QAAQ,MAAM;AAChB,aAAK,QAAQ;AAAA,MACf;AAEA,aAAO,MAAY;AApEzB,YAAAA;AAqEQ,SAAAA,MAAA,qCAAU,mBAAV,gBAAAA,IAAA,eAA2B,SAAS;AAAA,MACtC;AAAA,IACF;AAAA,EAEF,GAAG,CAAC,UAAU,UAAU,OAAO,CAAC;AAEhC,SAAO,CAAC,QAAQ,GAAG,SAAS,MAAM;AACpC;;;AC5EA,SAAoB,UAAAW,SAAgB,cAAc;AAClD,SAAS,UAAU,aAAAT,YAAW,eAAAU,cAAa,UAAAP,eAAc;AACzD,SAAS,mBAAmB;AAI5B,IAAM,aAAa;AAQnB,IAAM,YAAY,CAAC,OAA8C;AAC/D,UAAO,yBAAI,YAAW,OAAM,yBAAI,YAAW;AAC7C;AAOA,IAAM,yBAAyB,CAAC,eAAgC;AAC9D,MAAI,UAAU,UAAU,GAAG;AACzB,UAAM,QAAQ;AACd,WAAO,QAAQ,UAAU,CAAC,GAAG,IAAI,GAAG;AACpC,UAAM,oBAAoB,OAAO,aAAa,QAAQ,UAAU;AAChE,QAAI,qBAAqB,sBAAsB,OAAO;AACpD,aAAO,aAAa,QAAQ,GAAG,oBAAoB,KAAK,IAAI,KAAK,iBAAiB;AAClF,cAAQ,IAAI,gCAAyB;AAAA,IACvC;AACA,WAAO,aAAa,QAAQ,GAAG,cAAc,MAAM,SAAS,CAAC;AAAA,EAC/D;AACF;AAOA,IAAM,2BAA2B,MAAqB;AACpD,QAAM,oBAAoB,OAAO,aAAa,QAAQ,UAAU;AAChE,SAAO;AACT;AA4CO,IAAM,kBAAkB,CAAC,kBAA8D;AAxF9F,MAAAL;AAyFE,QAAM,CAAC,iBAAiB,aAAa,IAAI,SAAoB;AAC7D,QAAM,YAAYK,QAAe;AACjC,QAAM,oBAAoBA,QAAO,KAAK;AACtC,QAAM,CAAC,MAAM,IAAI,YAAY,UAAU,SAAS,KAAK;AAAA,IACnD,UAAU;AAAA,IACV,YAAY,CAAC,GAAG,OAAM,uBAAG,cAAY,uBAAG,YAAW,KAAK,QAAQ,KAAK;AAAA,EACvE,CAAC;AACD,QAAM,WAAUL,MAAA,UAAU,YAAV,gBAAAA,IAAmB;AAEnC,QAAM,WAAW,CAAC,UAAwB;AACxC,QAAI;AACF,oBAAc,KAAK;AACnB,aAAO,aAAa,QAAQ,YAAY,KAAK;AAAA,IAC/C,SAAS,OAAP;AACA,cAAQ,IAAI,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,EAAAE,WAAU,MAAM;AACd,UAAM,YAAY,OAAO,aAAa,QAAQ,UAAU;AACxD,QAAI,CAAC,WAAW;AACd,cAAQ,IAAI,sBAAsB;AAClC,YAAM,YAAYS,QAAO,OAAO,aAAa;AAC7C,YAAM,SAAS,UAAU;AACzB,eAAS,MAAM;AAAA,IACjB,OAAO;AACL,eAAS,SAAS;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,EAAAT,WAAU,MAAM;AACd,QAAI,mBAAmB,eAAe;AACpC,YAAM,SAAS,IAAIS,QAAO,OAAO,eAAe;AAChD,YAAM,YAAY,OAAO,QAAQ,aAAa;AAC9C,gBAAU,UAAU;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,iBAAiB,aAAa,CAAC;AAKnC,QAAM,gBAAgBC,aAAY,MAAM;AACtC,YAAQ,IAAI,mCAA4B;AACxC,QAAI,mBAAmB,MAAM;AAC3B,6BAAuB,eAAe;AAAA,IACxC;AAAA,EACF,GAAG,CAAC,eAAe,CAAC;AAKpB,QAAM,uBAAuBA,aAAY,MAAM;AAC7C,QAAI,iBAAiB,CAAC,kBAAkB,SAAS;AAC/C,wBAAkB,UAAU;AAC5B,cAAQ,IAAI,uCAAgC;AAC5C,YAAM,SAAS,OAAO,aAAa;AACnC,oBAAc,CAAC,OAAO;AACpB,gBAAQ,IAAI,sBAAe;AAC3B,0BAAkB,UAAU;AAC5B,eAAO,OAAO;AAAA,MAChB,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,IAAI,uCAAkC;AAAA,IAChD;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAKlB,QAAM,uBAAuBA,aAAY,MAAM;AAC7C,QAAI,iBAAiB,MAAM;AACzB,YAAM,KAAK,yBAAyB;AACpC,UAAI,MAAM,UAAU,EAAE,GAAG;AACvB,gBAAQ,IAAI,iCAA0B;AACtC,sBAAc,EAAE;AAAA,MAClB,OAAO;AACL,6BAAqB;AAAA,MACvB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,oBAAoB,CAAC;AAEzB,QAAM,sBAAsB,MAA6B;AACvD,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACtLA,SAAuB,aAAa;AACpC,SAAS,YAAAN,iBAAgB;AAQzB,IAAMC,YAA0B,EAAE,WAAW,aAAa,WAAW,KAAK,6BAA6B;AAehG,IAAM,6BAA6B,CACxC,UACA,UAAmC,0BAA0B,MACpC;AACzB,QAAM,OAAO,CAAC,EAAE,GAAGA,WAAU,GAAG,YAAY,QAAQ,EAAE,GAAG,EAAE,iBAAiB,qCAAU,QAAQ,CAAC;AAC/F,QAAM,EAAE,MAAM,SAAS,OAAO,IAAID;AAAA,IAChC;AAAA,IACA,OAAOE,UAA2B;AAChC,YAAM,EAAE,gBAAgB,IAAIA,MAAK,SAAS;AAM1C,UAAI,mBAAmB,QAAQ,MAAM,UAAU,eAAe,MAAK,qCAAU,aAAY,MAAM;AAC7F,cAAM,WAAW,MAAM,SAAS,SAAS,QAAQ,eAAe;AAChE,eAAO,aAAa;AAAA,MACtB;AACA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,GAAG,oBAA6B,OAAO;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,cAAc,sBAAsB;AAC1C,mBAAiB,SAAS,aAAa,OAAO;AAE9C,SAAO,CAAC,QAAQ,OAAO,SAAS,MAAM;AACxC;;;ACpDA,SAAS,aAAAN,kBAAiB;AAC1B,SAAS,YAAAI,iBAAgB;AAQzB,IAAMC,YAAW,EAAE,WAAW,aAAa,WAAW,KAAK,oBAAoB;AAgBxE,IAAM,oBAAoB,CAI/B,UACA,cACA,MACA,iBACA,UAA0B,0BAA0B,MACY;AAChE,QAAM,OAAO;AAAA,IACX;AAAA,MACE,GAAGA;AAAA,MACH,GAAG,gBAAgB,UAAU,YAAY;AAAA,IAC3C;AAAA,IACA,EAAE,MAAM,QAAQ,CAAC,GAAG,gBAAgB;AAAA,EACtC;AACA,QAAM,EAAE,MAAM,SAAS,OAAO,IAAID;AAAA,IAChC;AAAA,IACA,OAAOE,UAAkE;AACvE,YAAM,EAAE,MAAAK,MAAK,IAAIL,MAAK,SAAS;AAE/B,UAAI,gBAAgB,QAAQ,YAAY,MAAM;AAE5C,cAAM,SAAS,MAAM,aAAa,GAAGK,KAAI;AAEzC,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,GAAG,oBAAoE,OAAO;AAAA,IAChF;AAAA,EACF;AAMA,EAAAX,WAAU,MAAM;AACd,QAAI,mBAAmB,MAAM;AAC3B,YAAM,WAAW,MAAY;AAC3B,aAAK,QAAQ;AAAA,MACf;AACA,UAAI;AACF,6CAAU,GAAG,iBAAiB;AAC9B,eAAO,MAAY;AACjB,+CAAU,IAAI,iBAAiB;AAAA,QACjC;AAAA,MACF,SAAS,GAAP;AACA,gBAAQ,IAAI,CAAC;AAAA,MACf;AAAA,IACF;AAAA,EACF,GAAG,CAAC,UAAU,iBAAiB,OAAO,CAAC;AAEvC,QAAM,cAAc,sBAAsB;AAI1C,QAAM,iCAAiC,mBAAmB;AAC1D,mBAAiB,SAAS,aAAa,SAAS,8BAA8B;AAE9E,SAAO,CAAC,MAAM,SAAS,MAAM;AAC/B;;;AC1FA,SAAS,aAAAA,kBAAiB;AAC1B,SAAS,YAAAI,iBAAgB;AAezB,IAAMC,YAA0B;AAAA,EAC9B,WAAW,aAAa;AAAA,EACxB,KAAK;AACP;AAWO,IAAM,wCAAwC,CACnD,kBACA,UAA0B,0BAA0B,MACR;AAC5C,QAAM,OAAO,CAAC,EAAE,GAAGA,WAAU,GAAG,YAAY,gBAAgB,EAAE,CAAC;AAC/D,QAAM,EAAE,MAAM,SAAS,OAAO,IAAID;AAAA,IAChC;AAAA,IACA,OAAO,UAA+C;AACpD,YAAM,SAAS,MAAM,sBAAsB,gBAAgB;AAC3D,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,GAAG,oBAAgD,OAAO;AAAA,MAC1D,aAAa,CAAC,SAAS,YAAY,eAAe,SAAS,OAAO;AAAA,IACpE;AAAA,EACF;AAEA,QAAM,oBAAoB,qBAAqB,IAAI;AAGnD,EAAAJ,WAAU,MAAM;AAlDlB,QAAAF;AAmDI,QAAI,QAAQ,QAAQ,CAAC,mBAAmB;AACtC,cAAQ,IAAI,WAAW;AACvB,UAAI,KAAK,UAAU;AACjB,aAAK,KAAK,SACP,WAAW,EACX,KAAK,MAAM,QAAQ,CAAC,EACpB,MAAM;AAAA,MACX,WAAW,KAAK,UAAU,KAAK,SAAS;AACtC,eAAKA,MAAA,KAAK,OAAO,aAAZ,gBAAAA,IACD,aACD,KAAK,MAAM,QAAQ,GACnB;AAAA,MACL;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,SAAS,iBAAiB,CAAC;AAErC,SAAO,CAAC,MAAM,SAAS,MAAM;AAC/B;;;AClEA,SAAS,aAAAE,kBAAiB;AAC1B,SAAS,YAAAI,iBAAgB;AAMzB,IAAMC,YAA0B,EAAE,WAAW,aAAa,WAAW,KAAK,mBAAmB;AAgBtF,IAAM,mBAAmB,CAC9B,UACA,aACA,YACA,UAA8B,QAC9B,UAAyC,0BAA0B,+BAA+B,MACnE;AAC/B,QAAM,OAAO;AAAA,IACX;AAAA,MACE,GAAGA;AAAA,MACH,GAAG,YAAY,QAAQ;AAAA,IACzB;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,EAAE,MAAM,SAAS,OAAO,IAAID;AAAA,IAChC;AAAA,IACA,OAAOE,UAAiC;AACtC;AACE,cAAM,EAAE,aAAa,cAAc,YAAY,aAAa,SAAS,SAAS,IAAIA,MAAK,SAAS;AAChG,cAAM,SAAS,OAAM,qCAAU,YAAY,cAA6B,aAAa;AACrF,eAAQ,UAA4B,CAAC;AAAA,MACvC;AAAA,IACF;AAAA,IACA;AAAA,MACE,GAAG,oBAAmC,OAAO;AAAA,IAC/C;AAAA,EACF;AAGA,EAAAN,WAAU,MAAM;AACd,QAAI,eAAe,MAAM;AACvB,YAAM,WAAW,MAAY;AAC3B,aAAK,QAAQ;AAAA,MACf;AACA,UAAI;AACF,6CAAU,GAAG,aAAa;AAC1B,eAAO,MAAY;AACjB,+CAAU,IAAI,aAAa;AAAA,QAC7B;AAAA,MACF,SAAS,GAAP;AACA,gBAAQ,IAAI,CAAC;AAAA,MACf;AAAA,IACF;AAAA,EACF,GAAG,CAAC,UAAU,aAAa,OAAO,CAAC;AAKnC,SAAO,CAAC,QAAQ,CAAC,GAAG,SAAS,MAAM;AACrC;;;AC9EA,SAAS,SAAAY,cAAa;AACtB,SAAS,YAAAR,iBAAgB;AACzB,SAAS,eAAAS,oBAAmB;AAc5B,IAAMR,YAA0B,EAAE,WAAW,aAAa,OAAO,KAAK,cAAc;AA+B7E,IAAM,cAAc,CACzB,SACA,OACA,oBACA,UAA0B,0BAA0B,GACpD,WAAsB,qBAAqB,MACP;AACpC,QAAM,gBAAgB,oBAAoB,SAAS,mBAAmB;AACtE,QAAM,EAAE,SAAS,IAAI,eAAe,eAAe,QAAQ;AAE3D,QAAM,OAAO;AAAA,IACX,EAAE,GAAGA,WAAU,GAAG,YAAY,QAAQ,EAAE;AAAA,IACxC,EAAE,SAAS,OAAO,mBAAmB;AAAA,EACvC;AACA,QAAM,EAAE,MAAM,SAAS,SAAS,OAAO,IAAID;AAAA,IACzC;AAAA,IACA,OAAOE,UAAsC;AAC3C,YAAM,EAAE,SAAAQ,UAAS,OAAAC,QAAO,oBAAAC,oBAAmB,IAAIV,MAAK,SAAS;AAC7D,UAAI,CAACQ,UAAS;AACZ,eAAO;AAAA,MACT,WAAWA,aAAY,GAAG;AACxB,YAAI,uCAAW,QAAQ;AACrB,gBAAM,aAAa;AACnB,gBAAM,WAAW,MAAM,MAAM,gDAAgD;AAC7E,gBAAMN,UAA+B,SAAS,KAAK,KAA6B,CAAC;AACjF,cAAI,cAAkCA,QAAOO,UAAS;AACtD,cAAI,CAAC;AAAa,0BAAcP,QAAO,UAAU;AACjD,iBAAO;AAAA,QACT;AAAA,MACF,WAAW,UAAU;AACnB,cAAM,MAAM,MAAM,SAAS,WAAW;AACtC,cAAM,QAAQ,IAAI,YAAY,IAAI;AAClC,YAAI,UAAS,+BAAO,cAAa,GAAG;AAClC,gBAAMA,UAAS,SAASI,OAAM,YAAY,OAAO,MAAM,CAAC,KAAK;AAC7D,iBAAOJ;AAAA,QACT;AAAA,MACF;AAEA,UAAIQ,uBAAA,gBAAAA,oBAAoB,UAAU;AAChC,eAAOA,oBAAmB;AAAA,MAC5B;AACA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,GAAG,oBAAwC,OAAO;AAAA,IACpD;AAAA,EACF;AAEA,QAAM,cAAc,sBAAsB;AAC1C,mBAAiB,SAAS,aAAa,OAAO;AAE9C,QAAM,SAAS,UAAU,SAAY;AACrC,QAAM,CAAC,iBAAiB,IAAIH,aAAY,QAAQ,KAAK,EAAE,UAAU,KAAK,CAAC;AACvE,SAAO,CAAC,mBAAmB,SAAS,MAAM;AAC5C;;;ACrGA,SAAS,YAAAT,iBAAgB;AAezB,IAAMC,YAA0B;AAAA,EAC9B,WAAW,aAAa;AAAA,EACxB,KAAK;AACP;AAeO,IAAM,WAAW,CACtB,SACA,UAA0B,0BAA0B,GACpD,WAAsB,qBAAqB,MACnB;AACxB,QAAM,gBAAgB,oBAAoB,SAAS,mBAAmB;AACtE,QAAM,EAAE,SAAS,IAAI,eAAe,eAAe,QAAQ;AAE3D,QAAM,OAAO,CAAC,EAAE,GAAGA,WAAU,GAAG,YAAY,QAAQ,EAAE,GAAG,EAAE,QAAQ,CAAC;AACpE,QAAM,EAAE,MAAM,SAAS,OAAO,IAAID;AAAA,IAChC;AAAA,IACA,OAAOE,UAAsC;AAC3C,YAAM,EAAE,SAAAW,SAAQ,IAAIX,MAAK,SAAS;AAClC,UAAIW,UAAS;AACX,cAAM,YAAY,OAAM,qCAAU,oBAAoBA;AACtD,eAAO,aAAa;AAAA,MACtB;AACA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,GAAG,oBAAwC,OAAO;AAAA,IACpD;AAAA,EACF;AAEA,QAAM,cAAc,sBAAsB;AAC1C,mBAAiB,SAAS,aAAa,OAAO;AAE9C,SAAO,CAAC,QAAQ,GAAG,SAAS,MAAM;AACpC;;;AC7DA,SAAS,YAAAb,kBAAgB;AAOzB,IAAMC,aAAW,EAAE,WAAW,aAAa,QAAQ,KAAK,mBAAmB;AAWpE,IAAM,mBAAmB,CAC9B,QACA,UAA0B,0BAA0B,MAChB;AACpC,QAAM,OAAO,CAAC,EAAE,GAAGA,YAAU,GAAG,YAAY,MAAM,EAAE,CAAC;AACrD,QAAM,EAAE,MAAM,SAAS,OAAO,IAAID;AAAA,IAChC;AAAA,IACA,OAAO,UAAuC;AAC5C,UAAI,QAAQ;AACV,cAAM,SAAS,MAAM,OAAO,WAAW;AACvC,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,GAAG,oBAAwC,OAAO;AAAA,IACpD;AAAA,EACF;AAEA,QAAM,cAAc,sBAAsB;AAC1C,mBAAiB,SAAS,aAAa,OAAO;AAE9C,SAAO,CAAC,MAAM,SAAS,MAAM;AAC/B;;;ACzCA,SAAS,YAAAA,kBAAgB;AAQzB,IAAMC,aAA0B,EAAE,WAAW,aAAa,QAAQ,KAAK,mBAAmB;AAWnF,IAAM,mBAAmB,CAC9B,QACA,UAA0B,0BAA0B,EAAE,GAAG,gCAAgC,CAAC,MACtD;AAEpC,QAAM,OAAO,CAAC,EAAE,GAAGA,YAAU,GAAG,YAAY,MAAM,EAAE,CAAC;AAErD,QAAM,EAAE,MAAM,SAAS,OAAO,IAAID;AAAA,IAChC;AAAA,IACA,OAAO,UAAiC;AAEtC,YAAM,UAAU,OAAM,iCAAQ;AAC9B,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,GAAG,oBAAkC,OAAO;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,cAAc,sBAAsB;AAC1C,mBAAiB,SAAS,aAAa,OAAO;AAE9C,SAAO,CAAC,MAAM,SAAS,MAAM;AAC/B;;;AC1CA,SAAS,YAAAA,kBAAgB;AAezB,IAAMC,aAA0B,EAAE,WAAW,aAAa,QAAQ,KAAK,eAAe;AAe/E,IAAM,eAAe,CAC1B,UAA0B,0BAA0B,GACpD,WAAsB,qBAAqB,MACnB;AACxB,QAAM,cAAc,sBAAsB;AAC1C,QAAM,gBAAgB,oBAAoB,SAAS,mBAAmB;AACtE,QAAM,EAAE,SAAS,IAAI,eAAe,eAAe,QAAQ;AAE3D,QAAM,OAAO,CAAC,EAAE,GAAGA,YAAU,GAAG,YAAY,QAAQ,EAAE,CAAC;AACvD,QAAM,EAAE,MAAM,SAAS,OAAO,IAAID;AAAA,IAChC;AAAA,IACA,OAAO,UAA2B;AAChC,YAAMc,eAAc,OAAM,qCAAU;AAEpC,UAAIA,gBAAe,MAAM;AACvB,cAAM,QAAQ,OAAM,qCAAU,SAASA;AACvC,aAAI,+BAAO,cAAa,MAAM;AAC5B,iBAAO,MAAM;AAAA,QACf;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,GAAG,oBAA4B,OAAO;AAAA,IACxC;AAAA,EACF;AAEA,mBAAiB,SAAS,aAAa,OAAO;AAC9C,SAAO,CAAC,QAAQ,GAAG,SAAS,MAAM;AACpC;;;AC3DA,SAAS,oBAAoB;AAEtB,IAAM,oBAAoB,MAAY;AAC3C,QAAM,OAAO,aAAa;AAC1B,MAAI,KAAK,GAAG;AACV,YAAQ,IAAI,YAAY;AAAA,EAC1B,OAAO;AACL,YAAQ,IAAI,aAAa;AAAA,EAC3B;AACF;;;AhBiBO,IAAM,wBAAwB,CAAC,SAAkB,aAAiC;AACvF,QAAM,gBAAgB,oBAAoB,qCAAU,mBAAmB;AACvE,QAAM,mBAAmB,kBAAkB,CAAC,UAAU,MAAM,gBAAgB;AAC5E,QAAM,iBAAiB,kBAAkB,CAAC,UAAU,MAAM,cAAc;AACxE,MAAI,SAA6B;AAEjC,GAAC,MAAM,IAAI,eAAe,cAAc,QAAQ;AAEhD,EAAAlB,WAAU,MAAM;AACd,QAAI,cAAc,WAAW,UAAU,QAAQ,WAAW,iBAAiB,cAAc,UAAU;AACjG,qBAAe,QAAQ,cAAc,OAAO;AAAA,IAC9C;AAAA,EACF,GAAG,CAAC,kBAAkB,cAAc,SAAS,QAAQ,cAAc,CAAC;AAEpE,MAAI,WAAW,YAAY,cAAc,SAAS;AAChD,QAAI,iBAAiB,YAAY;AAC/B,MAAAC,WAAU;AAAA,QACR;AAAA,QACA;AAAA,MACF;AACF,aAAS,iBAAiB,YAAY;AAAA,EACxC;AAEA,SAAO;AACT;;;AiBlDA,SAA6C,gBAAAkB,qBAAoB;AACjE,SAAS,qBAAAC,0BAAyB;AAClC,SAAS,cAAc,yBAAyB;AAChD,SAAS,cAAkB,eAAAV,oBAAmB;AAC9C,SAAS,2BAA2B;AACpC,SAAS,aAAAT,kBAAiB;;;ACL1B,SAAS,oBAAoB;AAC7B,SAAS,yBAAyB;AAElC,SAAS,aAAAoB,YAAmB,SAAAT,cAAa;AACzC,SAAS,aAAAX,kBAAiB;;;ACJnB,IAAM,qBAAqB;AAAA,EAChC,mCAAmC;AAAA,EACnC,8BAA8B;AAAA,EAC9B,uBAAuB;AAAA,EACvB,sBAAsB;AACxB;AAKO,IAAM,uBAAN,cAAmC,MAAM;AAAA,EACvC,cAAc;AACnB,UAAM;AACN,SAAK,OAAO,KAAK,YAAY;AAC7B,SAAK,UAAU,yBAAyB,mBAAmB;AAAA,EAC7D;AACF;AAKO,IAAM,wBAAN,cAAoC,MAAM;AAAA,EACxC,YAAY,OAAgB;AACjC,UAAM;AACN,SAAK,OAAO,KAAK,YAAY;AAC7B,SAAK,UAAU,yBAAyB,mBAAmB,2BAA4B,SAAoB;AAAA,EAC7G;AACF;AAKO,IAAM,+BAAN,cAA2C,MAAM;AAAA,EAC/C,cAAc;AACnB,UAAM;AACN,SAAK,OAAO,KAAK,YAAY;AAC7B,SAAK,UAAU,yBAAyB,mBAAmB;AAAA,EAC7D;AACF;AAKO,IAAM,oCAAN,cAAgD,MAAM;AAAA,EACpD,YAAY,OAAgB;AACjC,UAAM;AACN,SAAK,OAAO,KAAK,YAAY;AAC7B,SAAK,UAAU,yBAAyB,mBAAmB,wCACxD,SAAoB;AAAA,EAEzB;AACF;;;ACjDA,YAAY,SAAS;AAFrB;AAIO,IAAM,cAA0B,KAAI,gBAAJ,mBAAqB,YAAe;;;AFkEpE,IAAM,wBAAN,cAAmC,kBAAmD;AAAA,EACjF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EAGV,IAAI,SAAuC;AACzC,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,oBAA6B;AAtFtC,QAAAH;AAuFI,WAAO,CAAC,GAACA,MAAA,KAAK,eAAL,gBAAAA,IAAiB;AAAA,EAC5B;AAAA,EAQA,YACE,kBACA,SAA6B,EAAE,uBAAuB,OAAO,mBAAmB,MAAM,GACtF,IACA,QAAiB,OACjB;AACA,UAAM;AAEN,SAAK,WAAW;AAChB,SAAK,MAAM;AACX,SAAK,SAAS;AACd,SAAK,UAAU;AACf,SAAK,SAAU,iBAAiB,SAA2C;AAE3E,SAAK,qBAAqB,KAAK,mBAAmB,KAAK,IAAI;AAC3D,SAAK,wBAAwB,KAAK,sBAAsB,KAAK,IAAI;AACjE,SAAK,mBAAmB,KAAK,iBAAiB,KAAK,IAAI;AACvD,SAAK,cAAc,KAAK,YAAY,KAAK,IAAI;AAAA,EAC/C;AAAA,EAEU,OAAO,MAAmB;AAClC,QAAI,KAAK,QAAQ;AACf,cAAQ,IAAI,cAAO,IAAI;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,cAAoB;AAC1B,QAAI,UAAU,KAAK,QAAQ,uBAAuB;AAChD,aAAO,SAAS,OAAO;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,oBAA0B;AAChC,QAAI,KAAK,iBAAiB,GAAG;AAC3B,WAAK,kBAAkB,KAAK;AAAA,IAC9B,OAAO;AAEL,WAAK,kBAAkB,IAAI,aAAa,KAAK,eAAe,KAAK,QAAQ,oBAAoB,QAAQ,MAAS;AAAA,IAChH;AAAA,EACF;AAAA,EAEQ,mBAAmB,SAAgC;AAzI7D,QAAAA;AA0II,SAAK,IAAI,6BAA6B,6BAA6B;AACnE,SAAK,UAAU;AACf,KAAAA,MAAA,KAAK,eAAL,gBAAAA,IAAA,WAAkB,EAAE,SAAS,UAAU,KAAK,cAAc;AAC1D,SAAK,kBAAkB;AACvB,SAAK,KAAK,qBAAqB;AAC/B,SAAK,YAAY;AAAA,EACnB;AAAA,EAEQ,sBAAsB,UAA0B;AAlJ1D,QAAAA,KAAA;AAmJI,SAAK,IAAI,6BAA6B,QAAQ;AAC9C,QAAI,SAAS,WAAW,GAAG;AACzB,OAAAA,MAAA,KAAK,mBAAL,gBAAAA,IAAA;AAAA,IACF,OAAO;AACL,YAAM,aAAa,SAAS;AAC5B,WAAK,KAAK,qBAAqB,UAAU;AACzC,iBAAK,eAAL,8BAAkB,EAAE,SAAS,SAAS,GAAG;AAAA,IAC3C;AAAA,EACF;AAAA,EAEQ,iBAAiB,MAAW,QAAmB;AACrD,SAAK,IAAI,+BAA+B,MAAM,MAAM;AACpD,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,YAAY,MAAc,QAAsB;AACtD,SAAK,IAAI,0BAA0B,MAAM,MAAM;AAC/C,SAAK,WAAW;AAAA,EAClB;AAAA,EACO,gBAAsB;AAC3B,QAAI,CAAC,KAAK,YAAY;AAEpB,WAAK,aAAa,IAAI,UAAU,EAAE,GAAG,KAAK,UAAU,OAAO,KAAK,OAAO,CAAC;AAAA,IAC1E;AAAA,EACF;AAAA,EAiBA,MAAa,WAAqC;AA5LpD,QAAAA,KAAA;AA6LI,QAAI;AACF,WAAK,cAAc;AAEnB,UAAI,KAAK,YAAY;AACnB,YAAI,KAAK,SAAS,kBAAkB,SAAS,CAAC,KAAK,yBAAyB,GAAG;AAC7E,eAAK,WAAW;AAAA,QAClB;AAEA,8BAAqB,iBAAiB;AACtC,gBAAQ,IAAI,qBAAqB;AAEjC,cAAM,KAAK,WAAW,YAAY,KAAK,MAAM;AAE7C,YAAI,KAAK,KAAK;AACZ,eAAK,gBAAgB,MAAM,KAAK,WAAW,UAAU,KAAK,GAAG;AAAA,QAC/D,OAAO;AACL,eAAK,gBAAgB,MAAM,KAAK,WAAW,QAAQ;AAAA,QACrD;AAIA,aAAK,cAAc,GAAG,gBAAgB,KAAK,kBAAkB;AAC7D,aAAK,cAAc,GAAG,mBAAmB,KAAK,qBAAqB;AACnE,aAAK,cAAc,GAAG,cAAc,KAAK,gBAAuB;AAChE,aAAK,cAAc,GAAG,SAAS,KAAK,WAAkB;AAGtD,aAAK,kBAAkB;AAAA,MACzB;AAGA,YAAM,YAAkBA,MAAA,KAAK,kBAAL,gBAAAA,IAAoB,oBAAoB,MAAM,KAAK,WAAW;AACtF,UAAI,YACF,UAAK,kBAAL,mBAAoB,mBAAkBuB,WAAU,OAAK,UAAK,kBAAL,mBAAoB,YAAW,CAAC,EAAE,SAAS;AAClG,UAAI,YAAY,GAAG;AACjB,kBAAW,MAAM,KAAK,WAAW;AAAA,MACnC;AACA,WAAK,qBAAqB,OAAO;AAEjC,4BAAqB,iBAAiB;AACtC,aAAO,EAAE,UAAU,KAAK,eAAe,SAAS,QAAQ;AAAA,IAE1D,SAAS,OAAP;AACA,WAAK,WAAW;AAChB,UACE,OAAO,UAAU,cAChB,+BAAO,SAAS,mCAAiC,+BAAO,SAAS,iCAClE;AACA,QAAApB,WAAU,IAAI,KAAK;AACnB,aAAK,WAAW;AAChB,cAAM,IAAI,qBAAqB;AAAA,MACjC,WAAW,iBAAiB,mCAAmC;AAC7D,QAAAA,WAAU,KAAK,yBAAyB,mBAAmB,mCAAmC;AAC9F,cAAM;AAAA,MACR,WAAW,iBAAiB,8BAA8B;AACxD,QAAAA,WAAU,KAAK,yBAAyB,mBAAmB,8BAA8B;AACzF,cAAM;AAAA,MACR,OAAO;AACL,QAAAA,WAAU,KAAK,yBAAyB,mBAAmB,yBAAyB,OAAO,KAAK,aAAa;AAC7G,cAAM,IAAI,sBAAsB,KAAK;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBAA4B;AAClC,WAAO,iBAAiB,KAAK,aAAa;AAAA,EAC5C;AAAA,EAMO,aAAmB;AArQ5B,QAAAH,KAAA;AAuQI,KAAAA,MAAA,KAAK,mBAAL,gBAAAA,IAAA;AAEA,eAAK,kBAAL,mBAAoB,eAAe,cAAc,KAAK;AACtD,eAAK,kBAAL,mBAAoB,eAAe,gBAAgB,KAAK;AACxD,eAAK,kBAAL,mBAAoB,eAAe,mBAAmB,KAAK;AAC3D,eAAK,kBAAL,mBAAoB,eAAe,SAAS,KAAK;AAEjD,UAAM,WAAW,KAAK;AAGtB,+CAAU,eAAV;AAEA,+CAAU,UAAV;AAEA,SAAK,YAAY;AAAA,EAEnB;AAAA,EAEO,cAAoD;AACzD,WAAO,QAAQ,QAAQ,KAAK,eAAe;AAAA,EAC7C;AAAA,EAEA,MAAa,aAAuC;AA7RtD,QAAAA,KAAA;AA8RI,WAAO,QAAQ,UAAQ,MAAAA,MAAA,KAAK,oBAAL,gBAAAA,IAAsB,YAAtB,mBAA+B,YAAW,CAAC;AAAA,EACpE;AAAA,EAEA,MAAc,qBAAqB,SAAuC;AAjS5E,QAAAA,KAAA;AAkSI,QAAI,WAAWc,OAAM,UAAU,OAAO,KAAM,QAAMd,MAAA,KAAK,YAAL,gBAAAA,IAAc,kBAAkB,SAAS;AACzF,WAAK,WAAU,UAAK,oBAAL,mBAAsB,UAAU;AAAA,IACjD;AAAA,EACF;AAAA,EAEA,MAAa,aAAqC;AAvSpD,QAAAA;AAwSI,QAAI,KAAK,SAAS;AAChB,YAAMwB,WAAU,MAAM,KAAK,QAAQ,WAAW;AAC9C,UAAIV,OAAM,UAAUU,QAAO;AAAG,eAAOA;AAAA,IACvC;AAEA,UAAM,WAAW,QAAMxB,MAAA,KAAK,oBAAL,gBAAAA,IAAsB;AAC7C,UAAM,WAAU,qCAAW,OAAM;AACjC,UAAM,KAAK,qBAAqB,OAAO;AACvC,WAAO,QAAQ,SAAQ,qCAAW,OAAM,IAAI;AAAA,EAC9C;AAAA,EAEO,YAAgC;AACrC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAa,uBAAsC;AAvTrD,QAAAA;AAwTI,UAAM,UAAU,MAAM,KAAK,WAAW;AACtC,UAAM,KAAK,qBAAqB,OAAO;AACvC,KAAAA,MAAA,KAAK,eAAL,gBAAAA,IAAA,WAAkB,EAAE,QAAQ;AAAA,EAC9B;AAAA,EAOA,MAAa,aAAa,QAA+B;AAlU3D,QAAAA,KAAA;AAmUI,UAAM,UAAU,MAAM,OAAO,WAAW;AACxC,QAAIc,OAAM,UAAU,OAAO,KAAK,KAAK,WAAW,GAAG;AACjD,WAAK,UAAU;AACf,WAAK,sBAAsB,CAAC,OAAO,CAAC;AAEpC,cAAQ,IAAI,kCAAkC,MAAM,KAAK,WAAW,GAAG;AACvE,cAAQ,IAAI,wBAAuB,aAAMd,MAAA,OAAO,aAAP,gBAAAA,IAAiB,kBAAvB,mBAAsC,YAAW,IAAI;AAAA,IAC1F;AAAA,EACF;AAAA,EAEU,aAAsB;AAC9B,WAAO,KAAK,iBAAiB,QAAQ,KAAK,mBAAmB,QAAQ,KAAK,cAAc;AAAA,EAC1F;AAAA,EAMO,aAAmB;AArV5B,QAAAA;AAsVI,QAAI,KAAK,YAAY;AACnB,WAAK,WAAW,oBAAoB;AACpC,WAAK,gBAAgB;AACrB,WAAK,kBAAkB;AACvB,WAAK,UAAU;AACf,OAAAA,MAAA,KAAK,eAAL,gBAAAA,IAAA,WAAkB,EAAE,SAAS,QAAW,UAAU,QAAW,SAAS,OAAU;AAAA,IAClF;AAAA,EACF;AAAA,EAOO,cAAc,OAA4C;AAC/D,SAAK,SAAS;AAAA,EAChB;AAAA,EAEO,2BAAoC;AACzC,QAAI,sBAAqB,gBAAgB;AACvC,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,KAAK;AACnB,QAAI,SAAS,MAAM;AACjB,UAAI,CAAC,MAAM,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,cAAc,GAAG;AACtE,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AA/SO,IAAM,uBAAN;AAUL,cAVW,sBAUJ,kBAA0B;;;AGhFnC,SAAS,mBAAmB;AAErB,IAAM,qBAAqB,IAAI,YAAY;;;AJkM5C;AAlKC,IAAM,sBAAsB,CAAC,eAAwC;AAC1E,MAAI,eAAe;AAAW,YAAQ,KAAK,qEAAqE;AAChH,QAAM,EAAE,WAAW,UAAU,SAAS,SAAS,YAAY,YAAY,QAAQ,IAC7E,aAA8B,UAAU;AAE1C,MAAI,EAAE,qBAAqB,wBAAwB,qBAAqBsB,uBAAsB,aAAa,MAAM;AAC/G,UAAM;AAAA,EACR;AACA,QAAM,kBAAkB;AAExB,QAAM,YAAYV;AAAA,IAChB,CAAC,sBAAyD,YAAqC;AAC7F,UAAI,QAAQ,QAAQ;AAClB,mBAAW;AAAA,MACb;AAEA,UAAI,wBAAwB,MAAM;AAChC,QAAAT,WAAU,MAAM,+CAA+C;AAAA,MACjE;AACA,UAAI,wBAAwB,MAAM;AAChC,cAAM,kBAAkB,CAAC,UAAuB;AAtDxD,cAAAH;AAuDU,cAAI;AACF,aAAAA,MAAA,uCAAW,eAAX,gBAAAA,IAAA;AACA,oBAAQ,KAAK,KAAK;AAClB,+CAAU;AAAA,UACZ,QAAE;AAAA,UAAO;AAAA,QACX;AACA,aAAK,SAAS,sBAAsB,eAAe;AAAA,MACrD;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,QAAQ,YAAY,UAAU,SAAS;AAAA,EAClD;AAEA,QAAM,kBAAkBY;AAAA,IACtB,CAAC,cAA2B;AAC1B,sBAAgB,WAAW;AAC3B,iBAAW;AACX;AAAA,IACF;AAAA,IACA,CAAC,YAAY,eAAe;AAAA,EAC9B;AAEA,QAAM,SAAyB;AAAA,IAC7B,WAAW;AAAA,IACX,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,WAAW;AAAA,IACpB,QAAQ,mDAAiB;AAAA,IACzB;AAAA,IACA,cAAc,mDAAiB,aAAa,KAAK;AAAA,IACjD;AAAA,IACA;AAAA,IACA,eAAe,mDAAiB,cAAc,KAAK;AAAA,IACnD,GAAG;AAAA,EACL;AAEA,SAAO;AACT;AAUO,IAAM,mBAA+C,CAAC,eAAwC;AACnG,SAAO,oBAAoB,UAAU;AACvC;AA4CO,IAAM,8BAA4D,CACvE,UACA,cACoB;AACpB,MAAI,YAAY,MAAM;AACpB,UAAM,IAAI,6BAA6B;AAAA,EACzC;AAEA,MAAI,aAAiC;AACrC,MAAI,aAAa,qBAAqB,sBAAsB;AAC1D,iBAAa,UAAU,OAAO,oBAAoB,QAAQ;AAAA,EAC5D;AAEA,MAAI,iBAAiB,QAAQ,GAAG;AAC9B,WAAO;AAAA,EACT,OAAO;AAEL,WAAO,IAAIS,cAAa,UAAU,UAAU;AAAA,EAC9C;AACF;AAWO,IAAM,mBAA+C,CAAC,UAAU;AACrE,MAAI,MAAM,0BAA0B,MAAM;AACxC,IAAAlB;AAAA,MACE,CAAC,CAAC,MAAM,uBAAuB;AAAA,MAC/B;AAAA,IACF;AAEA,IAAAA;AAAA,MACE,MAAM,uBAAuB,iBAAiB;AAAA,MAC9C;AAAA,IACF;AAEA,IAAAA,WAAU,MAAM,uBAAuB,eAAe,WAAW,4CAA4C;AAE7G,UAAM,oBAAoB;AAAA,MACxB,MAAM,uBAAuB;AAAA,MAC7B,EAAE,YAAY,MAAM,qCAAqC,4BAA4B;AAAA,MACrF;AAAA,QAAG,gBAAM;AAAA,SAAT;AAAA;AAAA;AAAA;AAAA,aAAkB;AAAA,IACpB;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,UACJ,uBAAC;AAAA,IAAkB,YAAY,MAAM,qCAAqC;AAAA,IACvE,gBAAM;AAAA,KADT;AAAA;AAAA;AAAA;AAAA,SAEA;AAGF,MAAI,MAAM,+BAA+B;AACvC,WAAO;AAAA,EACT,OAAO;AACL,WAAO,uBAAC;AAAA,MAAoB,QAAQ;AAAA,MAAqB;AAAA,OAAlD;AAAA;AAAA;AAAA;AAAA,WAA0D;AAAA,EACnE;AACF;;;AKrNA,SAAS,6BAA6B;AAgC/B,IAAM,iCAAiC,OAC5C,UACA,SAC+C;AAC/C,QAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,MAAI;AACF,UAAM,WAAW,IAAI,sBAAsB,KAAK,KAAK,cAAc;AACnE,UAAM,SAAS,WAAW;AAC1B,UAAM,SAAS,eAAe;AAC9B,QAAI,EAAC,qCAAU,aAAY;AACzB,cAAQ,KAAK,+DAA+D,KAAK,uBAAuB,KAAK;AAAA,IAC/G;AACA,WAAO;AAAA,EACT,SAAS,GAAP;AACA,UAAM,IAAI,kCAAkC,CAAC;AAAA,EAC/C;AACF","sourcesContent":["import { BaseContract, ethers } from 'ethers';\nimport { merge } from 'merge-anything';\n\nimport {\n  TContractConnectorBase,\n  TContractConnector,\n  TContractConnectFunc,\n  TExternalContractsAddressMap,\n  TBasicContractDeployment,\n  TContractDeploymentMap,\n  TContractMapWithAbi,\n  TDeployedHardhatContractsJson,\n  deployedHardhatContractsJsonSchema,\n  TBasicContract,\n  TForgeDeploymentBroadcastCollection,\n  forgeDeploymentBroadcastCollectionSchema,\n  externalContractAddressMap,\n  TBaseContractExtended,\n} from '~~/models';\n\n/**\n * #### Summary\n * This function is used to extract the contract data from hardhat deployment json files\n *\n * @internal\n * @category ContractAppContext\n * @param configJson {@link TDeployedHardhatContractsJson}\n * @returns\n */\nconst extractHardhatContracts = (configJson: TDeployedHardhatContractsJson): TContractMapWithAbi => {\n  const parse = deployedHardhatContractsJsonSchema.safeParse(configJson);\n  if (!parse.success) {\n    console.error('Invalid deployment hardhat_contracts.json TDeployedHardhatContractsJson', parse.error);\n  }\n\n  const contractData: TContractMapWithAbi = {};\n  for (const chainIdStr in configJson) {\n    const chainId = parseInt(chainIdStr);\n    if (chainId == null || isNaN(chainId)) continue;\n\n    const deployedDataByNetwork = Object.values(configJson[chainId]).filter(\n      (f) => parseInt(f?.chainId) === chainId\n    )?.[0];\n    if (deployedDataByNetwork?.chainId != null) {\n      for (const contractName in deployedDataByNetwork.contracts) {\n        const config: TBasicContractDeployment = {\n          [chainId]: { address: deployedDataByNetwork.contracts[contractName].address, chainId },\n        };\n\n        const abi = deployedDataByNetwork.contracts[contractName].abi;\n        if (abi && abi?.length > 0) {\n          contractData[contractName] = merge(contractData[contractName] ?? {}, { abi: abi });\n        }\n        contractData[contractName] = merge({ ...contractData[contractName] }, { config });\n      }\n    }\n  }\n\n  return contractData;\n};\n\n/**\n * #### Summary\n * Extract externalContracts from TExternalContractsAddressMap\n * @param configJson\n * @returns\n */\nconst extractExternalContracts = (configJson: TExternalContractsAddressMap): TContractDeploymentMap => {\n  const parse = externalContractAddressMap.safeParse(configJson);\n  if (!parse.success) {\n    console.error('Invalid TExternalContractsAddressMap', parse.error);\n  }\n\n  const contractData: TContractDeploymentMap = {};\n  for (const chainIdStr in configJson) {\n    const chainId = parseInt(chainIdStr);\n    if (chainId == null || isNaN(chainId)) continue;\n\n    for (const contractName in configJson[chainId]) {\n      const config: TBasicContractDeployment = {\n        [chainId]: { address: configJson[chainId][contractName], chainId: chainId },\n      };\n      contractData[contractName] = merge({ ...(contractData[contractName] ?? {}) }, { config });\n    }\n  }\n\n  return contractData;\n};\n\n/**\n * #### Summary\n * Extract forge contracts from forgeDeploymentBroadcasts\n * @param configJson\n * @returns\n */\nconst extractForgeBroadcastContracts = (configJson: TForgeDeploymentBroadcastCollection): TContractDeploymentMap => {\n  const parse = forgeDeploymentBroadcastCollectionSchema.safeParse(configJson);\n  if (!parse.success) {\n    console.error('Invalid forge boradcast json TForgeBroadcastJson', parse.error);\n  }\n\n  const contractData: TContractDeploymentMap = {};\n  for (const chainIdStr in configJson) {\n    const chainId = parseInt(chainIdStr);\n    if (chainId == null || isNaN(chainId)) continue;\n\n    const contractDeployments = configJson[chainId].transactions\n      .filter((f) => f.transactionType === 'CREATE')\n      .map((m) => {\n        const td: TBasicContract = {\n          contractName: m.contractName.replace('Deploy', '').replace('deploy', ''),\n          address: m.contractAddress,\n        };\n        return td;\n      });\n\n    const contractNameList = contractDeployments.map((m) => m.contractName);\n\n    contractNameList.forEach((contractName) => {\n      const data = contractDeployments.filter((f) => f.contractName === contractName);\n      if (data.length === 0) {\n        console.error('Contract deployments NOT found for contract', contractName, `chainId: ${chainId}`);\n      } else if (data.length > 1) {\n        console.error(\n          'Multiple contract deployments found for contract on the same chainId',\n          contractName,\n          `chainId: ${chainId}`\n        );\n      }\n\n      console.log('output data', data[0]);\n\n      const config: TBasicContractDeployment = {\n        [chainId]: { address: data?.[0]?.address, chainId: chainId },\n      };\n\n      contractData[contractName] = merge({ ...(contractData[contractName] ?? {}) }, { config });\n    });\n  }\n\n  return contractData;\n};\n\n/**\n * ##### Summary\n * Creates a connector for any of your hardhat contracts\n *\n * @category ContractAppContext\n * @param contractName\n * @param typechainFactory\n * @param deployedHardhatContractJson\n * @returns\n */\nexport const createConnectorForHardhatContract = <\n  GContractNames extends string,\n  GBaseContract extends TBaseContractExtended<GContractNames>\n>(\n  contractName: GContractNames,\n  typechainFactory: TContractConnectorBase<GBaseContract>,\n  deployedHardhatContractJson: TDeployedHardhatContractsJson\n): TContractConnector<GContractNames, GBaseContract> => {\n  const info = extractHardhatContracts(deployedHardhatContractJson)[contractName];\n\n  if (info == null || info.abi == null) {\n    throw new Error(\n      `Contract ${contractName} not found in deployed contracts (hardhat_config.json).  Check your hardhat deploy scripts and hardhat_config.json`\n    );\n  }\n\n  return {\n    contractName,\n    connect: typechainFactory.connect,\n    // createInterface: typechainFactory.createInterface,\n    abi: (info?.abi ?? typechainFactory.abi ?? []) as Record<string, any>[],\n    config: {\n      ...info.config,\n    },\n  };\n};\n\n/**\n * ##### Summary\n * Creates a connector for any of your Foundry contracts, deployed forge scripts and forge broadcast output\n *\n * @category ContractAppContext\n * @param contractName\n * @param typechainFactory\n * @param forgeBroadcastJson\n * @returns\n */\nexport const createConnectorForFoundryContract = <\n  GContractNames extends string,\n  GBaseContract extends TBaseContractExtended<GContractNames>\n>(\n  contractName: GContractNames,\n  typechainFactory: TContractConnectorBase<GBaseContract>,\n  forgeBroadcastJson: TForgeDeploymentBroadcastCollection\n): TContractConnector<GContractNames, GBaseContract> => {\n  const info = extractForgeBroadcastContracts(forgeBroadcastJson)[contractName];\n\n  if (info == null || typechainFactory.abi == null) {\n    throw new Error(\n      `Contract ${contractName} not found in deployed contracts (foundry_config.json).  Check your foundry deploy script`\n    );\n  }\n\n  return {\n    contractName,\n    connect: typechainFactory.connect,\n    // createInterface: typechainFactory.createInterface,\n    abi: (typechainFactory.abi ?? []) as Record<string, any>[],\n    config: {\n      ...info.config,\n    },\n  };\n};\n\n/**\n * #### Summary\n * Creates a contract connector for any external contract\n *\n * ##### ✏️ Notes\n * - As an example you could use this for an external contract such as DAI\n *\n * @category ContractAppContext\n * @param contractName\n * @param typechainFactory\n * @param deployedContractJson\n * @returns\n */\nexport const createConnectorForExternalContract = <\n  GContractNames extends string,\n  GBaseContract extends TBaseContractExtended<GContractNames>\n>(\n  contractName: GContractNames,\n  typechainFactory: TContractConnectorBase<GBaseContract>,\n  deployedContractJson: TExternalContractsAddressMap\n): TContractConnector<GContractNames, GBaseContract> => {\n  const info = extractExternalContracts(deployedContractJson)[contractName];\n\n  if (info == null) {\n    throw new Error(\n      `Contract ${contractName} not found in external contract map.  Check that contractName: address map is correct.  This is required by eth-sdk`\n    );\n  }\n\n  return {\n    contractName,\n    connect: typechainFactory.connect,\n    // : typechainFactory.createInterface,\n    abi: typechainFactory.abi ?? [],\n    config: {\n      ...info.config,\n    },\n  };\n};\n\n/**\n * #### Summary\n * Create a contract connector from a ABI.\n *\n * ##### ✏️ Notes\n * - This can be used for unverified external contracts\n *\n * @category ContractAppContext\n * @param contractName\n * @param config\n * @param abi\n * @param connectFunc\n * @returns\n */\nexport const createConnectorForExternalAbi = <\n  GContractNames extends string,\n  GBaseContractExtended extends TBaseContractExtended<GContractNames> = TBaseContractExtended<GContractNames>\n>(\n  contractName: GContractNames,\n  config: {\n    [chainId: number]: {\n      address: string;\n    };\n  },\n  abi: Record<string, any>[],\n  connectFunc: TContractConnectFunc<GBaseContractExtended> | undefined = undefined\n): TContractConnector<GContractNames, GBaseContractExtended> => {\n  const deploymentConfig: TBasicContractDeployment = { ...config } as TBasicContractDeployment;\n  for (const k in deploymentConfig) {\n    deploymentConfig[k].chainId = parseInt(k);\n  }\n\n  if (connectFunc) {\n    return {\n      contractName,\n      connect: connectFunc,\n      abi: abi,\n      config: deploymentConfig,\n    };\n  } else {\n    const defaultConnectFunction: TContractConnectFunc<GBaseContractExtended> = (\n      address: string,\n      signerOrProvider: ethers.Signer | ethers.providers.Provider\n    ) => {\n      const baseContract = new BaseContract(address, abi, signerOrProvider) as GBaseContractExtended;\n      baseContract.contractName = contractName;\n      return baseContract;\n    };\n\n    return {\n      contractName,\n      connect: defaultConnectFunction,\n      abi: abi,\n      config: deploymentConfig,\n    };\n  }\n};\n","import { merge } from 'merge-anything';\nimport { useCallback, useEffect, useRef } from 'react';\nimport { useQueryClient } from 'react-query';\nimport { invariant } from 'ts-invariant';\nimport { default as create, StoreApi, UseBoundStore } from 'zustand';\n\nimport { useEthersAppContext } from '~~/context';\nimport { invalidateCache, isValidEthersAdaptor } from '~~/functions';\nimport {\n  TAppContractsContext,\n  TBaseContractExtended,\n  TConnectorList,\n  TContractConnector,\n  TContractsByChainId,\n  TContractsByName,\n  TEthersAdaptor,\n  TTypedContract,\n} from '~~/models';\nimport { keyNamespace } from '~~/models/constants';\n\nexport type { create, StoreApi, UseBoundStore };\n\n/**\n * i've added comment headers since this is a large file due to the factory function\n */\n\n/**\n * #### Summary\n * Props for the ContractContext generated by the contractContextFactory\n *\n * @category ContractAppContext\n */\nexport type TContractsContextProps = {\n  ethersContextKey?: string | undefined;\n};\n\ntype TContractsAppStore<\n  GContractNames extends string,\n  GAppConnectorList extends TConnectorList<GContractNames, TBaseContractExtended<GContractNames>>,\n  GContractsTypes extends ReturnType<GAppConnectorList[Extract<GContractNames, string>]['connect']> = ReturnType<\n    GAppConnectorList[Extract<GContractNames, string>]['connect']\n  >,\n  GAppContractsState = TAppContractsContext<GContractNames, GContractsTypes>\n> = {\n  contractState: GAppContractsState | undefined;\n  setContractState: (contractState: GAppContractsState) => void;\n  connectToAllContracts: (ethersAdaptor: TEthersAdaptor | undefined) => void;\n  connectToContract: (contractName: GContractNames, ethersAdaptor: TEthersAdaptor | undefined) => void;\n  setContractConnectors: (contractConnectors: GAppConnectorList) => void;\n};\n\n/* *************** ********************* ****************** */\n/* *************** 🏭 Contract Factory 🏭 ****************** */\n/* *************** ********************* ****************** */\n\n/**\n * #### Summary\n * This is the factory function that creates the ContractContext and returns the hooks you can use to access typed contracts through out your app.\n *\n * ##### ✏️ Notes\n * - you must define the generic GContractNames if you want type narrowing for the hooks: e.g. `contractsContextFactory<keyof TAppConnectorList, TAppConnectorList>(getAppContractsConfig);`, where getAppContractsConfig is a function that returns Record of contract names and connectors.\n * - See [this for an example](https://github.com/scaffold-eth/scaffold-eth-typescript/blob/release/packages/vite-app-ts/src/config/appContracts.config.ts) for an example of how to use this.\n *\n * @category ContractAppContext\n * @template GContractNames A type that represents the names of the contracts you want to access.  Should be `keyof ReturnType<loadAppContractConnectors>`, where `loadAppContractConnectors` is the function that returns the contract connectors config.\n * @template GAppConnectorList A type are the list of contracts and their connectors.  Should be `ReturnType<loadAppContractConnectors>`, where `loadAppContractConnectors` is the function that returns the contract connectors config.\n * @template GContractConnector TTypedContract<GContractNames, GAppConnectorList> allows the factory to strictly type contracts for the react hooks.  Should be `TTypedContract<keyof keyof ReturnType<loadAppContractConnectors>, ReturnType<loadAppContractConnectors>>`, where `loadAppContractConnectors` is the function that returns the contract connectors config.\n * @param loadAppContractConnectors A function that returns a list of app contract connectors. See [this for an example](https://github.com/scaffold-eth/scaffold-eth-typescript/blob/release/packages/vite-app-ts/src/config/appContracts.config.ts)\n * @returns A context for contracts, hook to access contracts, hook to load contracts, hook to connect to contracts in a network\n */\nexport const contractsContextFactory = <\n  GContractNames extends string,\n  GAppConnectorList extends TConnectorList<GContractNames, TBaseContractExtended<GContractNames>>\n>(\n  loadAppContractConnectors: () => GAppConnectorList\n): {\n  /**\n   * #### Summary\n   * This hook allows you to get the contracts attached to a particular network.\n   *\n   * ##### ✏️ Notes\n   * To be used with {@link useConnectAppContracts} which needs to be called in your app to connect to the contracts in a particular network.\n   *\n   * @category ContractAppContext\n   */\n  useAppContracts: <GContractName extends GContractNames>(\n    contractName: GContractName,\n    chainId: number | undefined\n  ) => TTypedContract<GContractName, GAppConnectorList> | never;\n  /**\n   * #### Summary\n   * This hook needs to be called in your app to load all your app contracts\n   *\n   * @category ContractAppContext\n   */\n  useLoadAppContracts: () => void;\n  /**\n   * #### Summary\n   * This hook needs to be called in your app to connect your app to a network\n   *\n   * @category ContractAppContext\n   */\n  useConnectAppContracts: (adaptor: TEthersAdaptor | undefined) => void;\n\n  useContractsAppStore: UseBoundStore<StoreApi<TContractsAppStore<GContractNames, GAppConnectorList>>>;\n} => {\n  /* *************** ******** *************************** */\n  /* *************** Base types ************************* */\n  /* *************** ******** *************************** */\n\n  type GContractsTypes = ReturnType<GAppConnectorList[Extract<GContractNames, string>]['connect']>;\n  type GAppContractsState = TAppContractsContext<GContractNames, GContractsTypes>;\n\n  /* *************** ******** *************************** */\n  /* *************** Helpers Functions ****************** */\n  /* *************** ******** *************************** */\n  const defaultAppContractsContext = (): GAppContractsState => {\n    return {\n      contractConnectors: {},\n      contractsByName: {},\n      contractsByChainId: {},\n    } as GAppContractsState;\n  };\n\n  /**\n   * Create context state\n   * @param appContractConnectorList\n   * @returns\n   * @internal\n   */\n  const initalizeState = (appContractConnectorList: GAppConnectorList): GAppContractsState => {\n    const state = defaultAppContractsContext();\n    state.contractConnectors = appContractConnectorList as unknown as GAppContractsState['contractConnectors'];\n    return state;\n  };\n\n  /**\n   * Helper function for immutability of state\n   * @param state\n   * @returns\n   * @internal\n   */\n  const cloneContextState = (state: GAppContractsState): GAppContractsState => {\n    const newState = defaultAppContractsContext();\n    newState.contractConnectors = { ...state.contractConnectors };\n    newState.contractsByName = { ...state.contractsByName };\n    newState.contractsByChainId = { ...state.contractsByChainId };\n\n    return newState;\n  };\n\n  const sortContractsByChainId = (\n    contractsByName: TContractsByName<GContractNames, GContractsTypes>\n  ): TContractsByChainId<GContractNames, GContractsTypes> => {\n    let contractsByChainId: TContractsByChainId<GContractNames, GContractsTypes> = {};\n\n    const names: GContractNames[] = Object.keys(contractsByName) as GContractNames[];\n    names.forEach((name) => {\n      const chainIds = Object.keys(contractsByName[name]).map(Number);\n      chainIds.forEach((chainId) => {\n        const data = {\n          [chainId]: { [name]: contractsByName[name][chainId] },\n        } as TContractsByName<GContractNames, GContractsTypes>;\n        const temp = merge(contractsByChainId, data);\n        contractsByChainId = temp as TContractsByChainId<GContractNames, GContractsTypes>;\n      });\n    });\n    return contractsByChainId;\n  };\n\n  const sortContractsByName = (\n    contractsByChainId: TContractsByChainId<GContractNames, GContractsTypes>\n  ): TContractsByName<GContractNames, GContractsTypes> => {\n    let contractsByName: TContractsByName<GContractNames, GContractsTypes> = {} as TContractsByName<\n      GContractNames,\n      GContractsTypes\n    >;\n\n    const chainIds = Object.keys(contractsByChainId).map(Number);\n    chainIds.forEach((chainId) => {\n      const names = Object.keys(contractsByChainId[chainId]) as GContractNames[];\n      names.forEach((name) => {\n        const data = {\n          [name]: { [chainId]: contractsByChainId[chainId][name] },\n        };\n        const temp = merge(contractsByName, data);\n        contractsByName = temp as TContractsByName<GContractNames, GContractsTypes>;\n      });\n    });\n\n    return contractsByName;\n  };\n\n  /* *************** ******** ************************** */\n  /* *************** Action Functions ****************** */\n  /* *************** ******** ************************** */\n\n  const removeInvalidContractsAction = (\n    state: GAppContractsState,\n    ethersAdaptor: TEthersAdaptor | undefined\n  ): GAppContractsState => {\n    if (ethersAdaptor?.chainId != null) {\n      const newState = cloneContextState(state);\n      const chainId = ethersAdaptor.chainId;\n      delete newState.contractsByChainId[chainId];\n\n      newState.contractsByName = sortContractsByName(newState.contractsByChainId);\n      return newState;\n    }\n    return state;\n  };\n\n  const connectToContractWithAdaptorAction = (\n    connector: TContractConnector<GContractNames, GContractsTypes>,\n    adaptor: TEthersAdaptor\n  ): GContractsTypes | undefined => {\n    if (adaptor == null || !isValidEthersAdaptor(adaptor)) {\n      console.warn('No valid ethers adaptor provided.  Skipping contract connection');\n      return undefined;\n    }\n\n    const { signer, provider } = adaptor;\n    const signerOrProvider = signer ?? provider;\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    const chainId = adaptor.chainId!;\n    const contractAddress = connector?.config?.[chainId]?.address;\n    if (contractAddress != null && signerOrProvider != null) {\n      const contract = connector.connect(connector.config[chainId].address, signerOrProvider);\n      if (contract != null) {\n        return contract;\n      }\n    }\n\n    // error handling\n    if (connector.config[chainId] != null) {\n      console.warn('ContractConnector requires signer with the same chainId to connect contract');\n    }\n    console.log(\n      `Couldn't connect to contract ${connector?.contractName}:   signer chainId: ${chainId}, config: ${JSON.stringify(\n        connector?.config\n      )}.`\n    );\n    console.log('🙅🏽‍♂️ Please make sure the correct network is connected and the contract is deployed.');\n    return undefined;\n  };\n\n  /**\n   * Internal function to connect to all contracts\n   * @param payload\n   * @returns\n   * @internal\n   */\n  const connectToAllContractsAction = (\n    state: GAppContractsState,\n    ethersAdaptor: TEthersAdaptor | undefined\n  ): GAppContractsState => {\n    if (ethersAdaptor == null || !isValidEthersAdaptor(ethersAdaptor)) {\n      invariant.log('connectToAllContracts: Invalid ethers adaptor');\n      return removeInvalidContractsAction(state, ethersAdaptor);\n    }\n    const newState = cloneContextState(state);\n\n    const { chainId, signer, provider } = ethersAdaptor;\n    const providerOrSigner = signer ?? provider;\n    for (const contractName in newState.contractConnectors) {\n      const connector = newState.contractConnectors[contractName];\n      if (chainId && connector.config[chainId] != null && providerOrSigner != null) {\n        const contract = connectToContractWithAdaptorAction(connector, ethersAdaptor);\n        const data = { [contractName]: { [chainId]: contract } } as TContractsByName<GContractNames, GContractsTypes>;\n        newState.contractsByName = merge(newState.contractsByName, data) as TContractsByName<\n          GContractNames,\n          GContractsTypes\n        >;\n      }\n    }\n    newState.contractsByChainId = sortContractsByChainId(newState.contractsByName);\n    return newState;\n  };\n\n  /**\n   * Internal function to connect to a single contract\n   * @param state\n   * @param payload\n   * @returns\n   * @internal\n   */\n  const connectToContractAction = (\n    state: GAppContractsState,\n    contractName: GContractNames,\n    ethersAdaptor: TEthersAdaptor | undefined\n  ): GAppContractsState => {\n    if (ethersAdaptor == null || !isValidEthersAdaptor(ethersAdaptor)) {\n      invariant.log('connectToAllContracts: Invalid ethers adaptor');\n      return removeInvalidContractsAction(state, ethersAdaptor);\n    }\n\n    const newState = cloneContextState(state);\n    const { chainId } = ethersAdaptor;\n    const contractConnector = newState.contractConnectors[contractName];\n\n    if (chainId && contractConnector.config[chainId] != null) {\n      const contract = connectToContractWithAdaptorAction(contractConnector, ethersAdaptor);\n      newState.contractsByName[contractConnector.contractName] = {};\n      const temp = newState.contractsByName[contractConnector.contractName];\n      temp[chainId] = contract;\n      newState.contractsByChainId = sortContractsByChainId(newState.contractsByName);\n    }\n    return newState;\n  };\n\n  const setContractConnectorsAction = (contractConnectors: GAppConnectorList): GAppContractsState => {\n    const newState = initalizeState(contractConnectors);\n    return newState;\n  };\n\n  /* *************** ******** *************************** */\n  /* *************** Store  Functions ****************** */\n  /* *************** ******** *************************** */\n  type TStore = TContractsAppStore<GContractNames, GAppConnectorList>;\n\n  const useContractsAppStore = create<TStore>()((set) => ({\n    contractState: undefined,\n    setContractState: (contractState: GAppContractsState): void =>\n      set((store): TStore => {\n        store.contractState = contractState;\n        return store;\n      }),\n    connectToAllContracts: (ethersAdaptor: TEthersAdaptor | undefined): void =>\n      set((store): TStore => {\n        if (store.contractState) {\n          const contractState = connectToAllContractsAction(store.contractState, ethersAdaptor);\n          store.contractState = contractState;\n        }\n        return store;\n      }),\n    connectToContract: (contractName: GContractNames, ethersAdaptor: TEthersAdaptor | undefined): void =>\n      set((store): TStore => {\n        if (store.contractState) {\n          const contractState = connectToContractAction(store.contractState, contractName, ethersAdaptor);\n          store.contractState = contractState;\n        }\n        return store;\n      }),\n    setContractConnectors: (contractConnectors: GAppConnectorList): void =>\n      set((store): TStore => {\n        const contractState = setContractConnectorsAction(contractConnectors);\n        store.contractState = contractState;\n\n        return store;\n      }),\n  }));\n\n  /* *************** ******** *************** */\n  /* *************** Hooks ****************** */\n  /* *************** ******** *************** */\n\n  /**\n   * Get Contracts for the given contract name\n   * @param contractName\n   * @param chainId\n   * @returns\n   */\n  const useAppContracts = <GContractName extends GContractNames>(\n    contractName: GContractName,\n    chainId: number | undefined\n  ): TTypedContract<GContractName, GAppConnectorList> | never => {\n    const contractsState = useContractsAppStore((state) => state.contractState);\n    const ethersContext = useEthersAppContext();\n    const contract = contractsState?.contractsByName?.[contractName]?.[chainId ?? -1]; // -1 is unknown chainId\n    const contractConnector = contractsState?.contractConnectors?.[contractName];\n    const chainIdRef = useRef(-1);\n\n    // just making sure app is initalized before spamming console logs\n    // connector abi initialized, ethers context is initalized\n    if (\n      contract == null &&\n      ethersContext?.chainId != null &&\n      contractConnector?.abi != null &&\n      chainId === chainIdRef.current\n    ) {\n      console.warn(`⚠️ Contract ${contractName} not found on chain ${chainId}.`);\n      console.warn(\n        `🙋🏽‍♂️ 1. Did you setup the contract in the config ? 2. Did you call useLoadAppContracts with an adaptor that has the correct chainId ?`\n      );\n      chainIdRef.current = chainId;\n    }\n\n    if (contract) {\n      return contract as TTypedContract<GContractName, GAppConnectorList>;\n    }\n    return undefined as never;\n  };\n\n  /**\n   *\n   * @param adaptor\n   */\n  const useLoadAppContracts = (): void => {\n    const queryClient = useQueryClient();\n    const setContractConnectors = useContractsAppStore((state) => state.setContractConnectors);\n\n    const load = useCallback(() => {\n      if (loadAppContractConnectors != null) {\n        const connectors = loadAppContractConnectors();\n        if (connectors != null) {\n          setContractConnectors(connectors);\n          invalidateCache(queryClient, keyNamespace.contracts);\n        }\n      }\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, []);\n\n    useEffect(() => {\n      void load();\n    }, [load]);\n  };\n\n  const useConnectAppContracts = (adaptor: TEthersAdaptor | undefined): void => {\n    const queryClient = useQueryClient();\n    const connectToAllContracts = useContractsAppStore((state) => state.connectToAllContracts);\n    const validAdaptorState = isValidEthersAdaptor(adaptor);\n\n    const connect = useCallback(() => {\n      if (adaptor?.chainId != null) {\n        connectToAllContracts(adaptor);\n        invalidateCache(queryClient, keyNamespace.contracts);\n      }\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [adaptor?.provider, adaptor?.signer, adaptor?.chainId, adaptor?.account, validAdaptorState]);\n\n    useEffect(() => {\n      void connect();\n    }, [connect]);\n  };\n\n  return {\n    useContractsAppStore,\n    useAppContracts,\n    useLoadAppContracts,\n    useConnectAppContracts,\n  };\n};\n","import { useEffect } from 'react';\nimport { invariant } from 'ts-invariant';\n\nimport { useEthersAppContext } from '~~/context';\nimport { useEthersAppStore } from '~~/context/EthersAppStore';\nimport { useBlockNumber } from '~~/hooks';\nimport { TOverride } from '~~/models';\n\n/**\n * #### Summary\n * A hook that gets you the current blocknumber and saves it to the store\n * - can be shared by your whole app.\n *\n * ##### ❔Use\n * Make sure to wrap your main app with the {@link EthersAppContext}.\n * - See [scaffold-eth-typescript example](https://github.com/scaffold-eth/scaffold-eth-typescript/blob/next/packages/vite-app-ts/src/components/routes/App.tsx#L38)\n *\n *\n * ##### ✏️ Notes\n * - this extensively used by eth-hooks to trigger hooks when a new block arrives\n * - uses the current provider {@link ethersProvider} from {@link useEthersContext}\n *\n * @category EthersAppContext\n *\n * @returns current block number\n */\nexport const useBlockNumberContext = (chainId?: number, override?: TOverride): number => {\n  const ethersContext = useEthersAppContext(override?.alternateContextKey);\n  const blockNumberState = useEthersAppStore((state) => state.blockNumberState);\n  const setBlockNumber = useEthersAppStore((state) => state.setBlockNumber);\n  let result: number | undefined = undefined;\n\n  [result] = useBlockNumber(ethersContext.provider);\n\n  useEffect(() => {\n    if (ethersContext.chainId && result != null && result !== blockNumberState[ethersContext.chainId]) {\n      setBlockNumber(result, ethersContext.chainId);\n    }\n  }, [blockNumberState, ethersContext.chainId, result, setBlockNumber]);\n\n  if (chainId && chainId !== ethersContext.chainId) {\n    if (blockNumberState[chainId] == null)\n      invariant.log(\n        'blockNumberState[chainId] in the store is null, make sure to have a provider for this chain',\n        chainId\n      );\n    result = blockNumberState[chainId] ?? 0;\n  }\n\n  return result;\n};\n","import { default as create, StoreApi, UseBoundStore } from 'zustand';\n\nimport { IBlockNumberState } from '~~/context/EthersAppState';\n\ninterface IStore {\n  blockNumberState: IBlockNumberState;\n  setBlockNumber: (blocknumber: number, chainId: number) => void;\n}\n\n// type TSetStoreFunc = IStore | Partial<IStore> | ((state: IStore) => IStore | Partial<IStore>);\nexport type TEthersAppStore = UseBoundStore<StoreApi<IStore>>;\nexport type { create, StoreApi, UseBoundStore };\n\nexport const useEthersAppStore = create<IStore>()((set) => ({\n  blockNumberState: {},\n  setBlockNumber: (blocknumber: number, chainId: number): void =>\n    set((state): IStore => {\n      state.blockNumberState[chainId] = blocknumber;\n      return state;\n    }),\n}));\n","import { useQuery } from 'react-query';\n\nimport { useBlockNumberContext } from '~~/context';\nimport { mergeDefaultUpdateOptions, processQueryOptions, providerKey, signerHasNetwork } from '~~/functions';\nimport { useEthersUpdater } from '~~/hooks/useEthersUpdater';\nimport { keyNamespace, TEthersSigner, THookResult, TUpdateOptions } from '~~/models';\n\nconst queryKey = { namespace: keyNamespace.signer, key: 'useAreSignerEqual' } as const;\n\n/**\n * #### Summary\n * Are the signers equal and valid\n *\n * @category Hooks\n *\n * @param signer1 Object for first signer to compare\n * @param signer2 Object for second signer to compare\n * @param options Options for how often and when to update\n * @returns\n */\nexport const useAreSignerEqual = (\n  signer1: TEthersSigner | undefined,\n  signer2: TEthersSigner | undefined,\n  options: TUpdateOptions = mergeDefaultUpdateOptions()\n): THookResult<boolean | undefined> => {\n  const keys = [{ ...queryKey }, { singer1Key: providerKey(signer1), signer2Key: providerKey(signer2) }] as const;\n  const { data, refetch, status } = useQuery(\n    keys,\n    async (_keys): Promise<boolean | undefined> => {\n      if (signerHasNetwork(signer1)) {\n        const chainId1 = await signer1?.getChainId();\n        const chainId2 = await signer2?.getChainId();\n\n        const address1 = await signer1?.getAddress();\n        const address2 = await signer2?.getAddress();\n        const isEqual =\n          address1 === address2 && chainId1 === chainId2 && address1 !== undefined && chainId1 !== undefined;\n        return isEqual;\n      }\n      return undefined;\n    },\n    {\n      ...processQueryOptions<boolean | undefined>(options),\n    }\n  );\n\n  const blockNumber = useBlockNumberContext();\n  useEthersUpdater(refetch, blockNumber, options);\n\n  return [data, refetch, status];\n};\n","import { useRef } from 'react';\n\nimport { checkUpdateOptions } from '~~/functions';\nimport { TUpdateOptions } from '~~/models';\n\n/**\n * #### Summary\n * A hook that invokes an update callback function based on update options and ethers network state (i.e. block number)\n *\n * @param update Function to call when update\n * @param blockNumber Current block number\n * @param options Options for how often and when to update\n * @param allowBlockNumberUpdate Boolean of if updating using this hook is allowed\n */\nexport const useEthersUpdater = (\n  update: (() => void) | (() => Promise<void>),\n  blockNumber: number | undefined,\n  options: TUpdateOptions,\n  allowBlockNumberUpdate: boolean = true\n): void => {\n  checkUpdateOptions(options);\n  const updateNumberRef = useRef<undefined | number>(undefined);\n\n  // number that only increases every (X * options.blockNumberInterval) blocks\n  const blockNumberFilter = blockNumber ? Math.floor(blockNumber / (options.blockNumberInterval ?? 1)) : undefined;\n\n  if (allowBlockNumberUpdate) {\n    // update if blocknumber or if polling\n    if (!options.refetchInterval && blockNumberFilter !== updateNumberRef.current) {\n      updateNumberRef.current = blockNumberFilter;\n      void update();\n    }\n  }\n};\n","import { BigNumber } from 'ethers';\nimport { useQuery } from 'react-query';\n\nimport { useEthersUpdater } from './useEthersUpdater';\n\nimport { useEthersAppContext, useBlockNumberContext } from '~~/context';\nimport {\n  asyncForEach,\n  ethersOverride,\n  mergeDefaultOverride,\n  mergeDefaultUpdateOptions,\n  processQueryOptions,\n} from '~~/functions';\nimport { providerKey, TRequiredKeys } from '~~/functions/keyHelpers';\nimport { THookResult, TOverride, TUpdateOptions } from '~~/models';\nimport { keyNamespace } from '~~/models/constants';\n\nconst queryKey: TRequiredKeys = { namespace: keyNamespace.signer, key: 'useBalance' };\n\nconst zero = BigNumber.from(0);\n\n/**\n * @internal\n * #### Summary\n * A conditional type for useBalance result based on input parameters.  It is either a BigNumber or a Record<string, BigNumber> depending on the input addres being a string or string[]\n */\ntype TUseBalanceResult<GAddress extends string | string[]> = GAddress extends string[]\n  ? Record<string, BigNumber>\n  : BigNumber;\n\n/**\n * #### Summary\n * Gets your balance in ETH for the given address.\n *\n * ##### ✏️ Notes\n * - updates triggered by {@link BlockNumberContext}\n * - uses the current provider {@link provider} from {@link useEthersContext}\n *\n * @category Hooks\n *\n * @param addresses Addresses of wallets to get balance for\n * @param override Options to override adapters and context\n * @param options Options for how often and when to update\n * @returns current balance\n */\nexport const useBalance = <GAddress extends string | Array<string>>(\n  addresses: GAddress | undefined,\n  options: TUpdateOptions = mergeDefaultUpdateOptions(),\n  override: TOverride = mergeDefaultOverride()\n): THookResult<TUseBalanceResult<GAddress>> => {\n  const ethersContext = useEthersAppContext(override.alternateContextKey);\n  const { provider } = ethersOverride(ethersContext, override);\n\n  const keys = [{ ...queryKey, ...providerKey(provider) }, { addresses }] as const;\n  const { data, refetch, status } = useQuery(\n    keys,\n    async (keys): Promise<TUseBalanceResult<GAddress> | undefined> => {\n      const { addresses } = keys.queryKey[1];\n\n      if (provider && addresses) {\n        if (Array.isArray(addresses)) {\n          const result: TUseBalanceResult<string[]> = {};\n          await asyncForEach(addresses, async (address: string) => {\n            const balance = await provider.getBalance(address);\n            result[address] = balance;\n          });\n          return result as TUseBalanceResult<GAddress>;\n        } else {\n          const address: string = addresses;\n          const newBalance = await provider.getBalance(address);\n          return newBalance as TUseBalanceResult<GAddress>;\n        }\n      }\n      return undefined;\n    },\n    {\n      ...processQueryOptions<TUseBalanceResult<GAddress> | undefined>(options),\n      isDataEqual: (oldResult, newResult) => oldResult?._hex === newResult?._hex,\n    }\n  );\n\n  const blockNumber = useBlockNumberContext();\n  useEthersUpdater(refetch, blockNumber, options);\n\n  let result: TUseBalanceResult<GAddress>;\n  if (Array.isArray(addresses)) {\n    result = data ?? ({} as TUseBalanceResult<GAddress>);\n  } else {\n    result = data ?? (zero as TUseBalanceResult<GAddress>);\n  }\n\n  return [result, refetch, status];\n};\n","import { useEffect } from 'react';\nimport { useQuery } from 'react-query';\n\nimport { mergeDefaultUpdateOptions, processQueryOptions, providerKey, TRequiredKeys } from '~~/functions';\nimport { keyNamespace, TEthersProvider, THookResult, TUpdateOptions } from '~~/models';\n\nconst queryKey: TRequiredKeys = { namespace: keyNamespace.signer, key: 'useBlockNumber' };\n\n/**\n * #### Summary\n * Get the current block number of the network. ✋🏽 @deprecated\n *\n * ##### ✏️ Notes\n * - ✋🏽 For app wide block number access use {@link useBlockNumberContext} instead.  See {@link BlockNumberContext} for more details, you get this as part of {@link EthersAppContext}\n * - uses the current provided block number\n *\n * @category Hooks\n *\n * @param provider\n * @returns block number\n */\nexport const useBlockNumber = (\n  provider: TEthersProvider | undefined,\n  callback?: ((blockNumber?: number) => void) | ((blockNumber?: number) => Promise<void>),\n  options: TUpdateOptions = mergeDefaultUpdateOptions()\n): THookResult<number> => {\n  type TAsyncResult = number | undefined;\n  const keys = [\n    {\n      ...queryKey,\n      ...providerKey(provider),\n    },\n  ] as const;\n\n  const { data, refetch, status } = useQuery(\n    keys,\n    async (_keys): Promise<TAsyncResult> => {\n      if (provider) {\n        const nextBlockNumber = await provider?.getBlockNumber();\n        return nextBlockNumber;\n      }\n\n      return undefined;\n    },\n    {\n      ...processQueryOptions<TAsyncResult>(options),\n    }\n  );\n\n  useEffect(() => {\n    if (provider) {\n      const listener = (blockNumberLocal: number): void => {\n        void refetch();\n\n        if (callback != null) {\n          try {\n            void callback(blockNumberLocal);\n          } catch (e) {\n            console.warn('useBlockNumber callback failed', e);\n          }\n        }\n      };\n      provider?.addListener?.('block', listener);\n\n      if (data == null) {\n        void refetch();\n      }\n\n      return (): void => {\n        provider?.removeListener?.('block', listener);\n      };\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [callback, provider, refetch]);\n\n  return [data ?? 0, refetch, status];\n};\n","import { BytesLike, ethers, Signer, Wallet } from 'ethers';\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { useDebounce } from 'use-debounce';\n\nimport { TEthersProvider } from '~~/models';\n\nconst storageKey = 'scaffold-eth-burner-privateKey';\n\n/**\n * Is the private key valid\n * @internal\n * @param pk\n * @returns\n */\nconst isValidPk = (pk: BytesLike | undefined | null): boolean => {\n  return pk?.length === 64 || pk?.length === 66;\n};\n\n/**\n * Save the current burner private key to storage\n * @internal\n * @param incomingPK\n */\nconst saveBurnerKeyToStorage = (incomingPK: BytesLike): void => {\n  if (isValidPk(incomingPK)) {\n    const rawPK = incomingPK;\n    window.history.pushState({}, '', '/');\n    const currentPrivateKey = window.localStorage.getItem(storageKey);\n    if (currentPrivateKey && currentPrivateKey !== rawPK) {\n      window.localStorage.setItem(`${storageKey}_backup${Date.now()}`, currentPrivateKey);\n      console.log('🔑 ...Saved Private Key');\n    }\n    window.localStorage.setItem(`${storageKey}`, rawPK.toString());\n  }\n};\n\n/**\n * Gets the current burner private key from storage\n * @internal\n * @returns\n */\nconst loadBurnerKeyFromStorage = (): string | null => {\n  const currentPrivateKey = window.localStorage.getItem(storageKey);\n  return currentPrivateKey;\n};\n\n/**\n * #### Summary\n * Return type of useBurnerSigner:\n *\n * ##### ✏️ Notes\n * - provides signer\n * - methods of interacting with burner signer\n * - methods to save and loadd signer from local storage\n *\n * @category Hooks\n */\nexport type TBurnerSigner = {\n  signer: Signer | undefined;\n  account: string | undefined;\n  /**\n   * save to local storage\n   */\n  saveBurner: () => void;\n  /**\n   * load from local storage, or if it doesn't exist, create\n   */\n  loadOrGenerateBurner: () => void;\n  /**\n   * create a new burner signer\n   */\n  generateBurnerSigner: () => void;\n  /**\n   * get your current burner pk\n   */\n  getBurnerPrivateKey: () => BytesLike | undefined;\n};\n\n/**\n * #### Summary\n * A hook that creates a burner signer/address and provides ways of interacting with\n * and updating the signer\n *\n * @category Hooks\n *\n * @param localProvider localhost provider\n * @returns IBurnerSigner\n */\nexport const useBurnerSigner = (localProvider: TEthersProvider | undefined): TBurnerSigner => {\n  const [privateKeyValue, setPrivateKey] = useState<BytesLike>();\n  const walletRef = useRef<Wallet>();\n  const creatingBurnerRef = useRef(false);\n  const [signer] = useDebounce(walletRef.current, 200, {\n    trailing: true,\n    equalityFn: (a, b) => a?.address === b?.address && a != null && b != null,\n  });\n  const account = walletRef.current?.address;\n\n  const setValue = (value: string): void => {\n    try {\n      setPrivateKey(value);\n      window.localStorage.setItem(storageKey, value);\n    } catch (error) {\n      console.log(error);\n    }\n  };\n\n  useEffect(() => {\n    const storedKey = window.localStorage.getItem(storageKey);\n    if (!storedKey) {\n      console.log('generating a new key');\n      const newWallet = ethers.Wallet.createRandom();\n      const newKey = newWallet.privateKey;\n      setValue(newKey);\n    } else {\n      setValue(storedKey);\n    }\n  }, []);\n\n  useEffect(() => {\n    if (privateKeyValue && localProvider) {\n      const wallet = new ethers.Wallet(privateKeyValue);\n      const newSigner = wallet.connect(localProvider);\n      walletRef.current = newSigner;\n    }\n  }, [privateKeyValue, localProvider]);\n\n  /**\n   * if valid save burner key to storage\n   */\n  const saveToStorage = useCallback(() => {\n    console.log('🔑 Incoming Private Key...');\n    if (privateKeyValue != null) {\n      saveBurnerKeyToStorage(privateKeyValue);\n    }\n  }, [privateKeyValue]);\n\n  /**\n   * create a new burnerkey\n   */\n  const generateBurnerSigner = useCallback(() => {\n    if (localProvider && !creatingBurnerRef.current) {\n      creatingBurnerRef.current = true;\n      console.log('🔑 Create new burner wallet...');\n      const wallet = Wallet.createRandom();\n      setPrivateKey((_v) => {\n        console.log('📝 ...Set key');\n        creatingBurnerRef.current = false;\n        return wallet.privateKey;\n      });\n    } else {\n      console.log('⚠ Could not create burner wallet');\n    }\n  }, [localProvider]);\n\n  /**\n   * Load burner key from storage\n   */\n  const loadOrGenerateBurner = useCallback(() => {\n    if (setPrivateKey != null) {\n      const pk = loadBurnerKeyFromStorage();\n      if (pk && isValidPk(pk)) {\n        console.log('🔑 ...Loaded Private Key');\n        setPrivateKey(pk);\n      } else {\n        generateBurnerSigner();\n      }\n    }\n  }, [generateBurnerSigner]);\n\n  const getBurnerPrivateKey = (): BytesLike | undefined => {\n    return privateKeyValue;\n  };\n\n  return {\n    signer,\n    account,\n    saveBurner: saveToStorage,\n    loadOrGenerateBurner,\n    generateBurnerSigner,\n    getBurnerPrivateKey,\n  };\n};\n","import { BaseContract, utils } from 'ethers';\nimport { useQuery } from 'react-query';\n\nimport { useBlockNumberContext } from '~~/context';\nimport { contractKey, mergeDefaultUpdateOptions, processQueryOptions, TRequiredKeys } from '~~/functions';\nimport { useEthersUpdater } from '~~/hooks/useEthersUpdater';\nimport { THookResult, TUpdateOptions } from '~~/models';\nimport { keyNamespace } from '~~/models/constants';\n\nconst queryKey: TRequiredKeys = { namespace: keyNamespace.contracts, key: 'useContractExistsAtAddress' } as const;\n\n/**\n * #### Summary\n * Checks whether a contract exists on the blockchain\n *\n * ##### ✏️ Notes\n * - uses the ethers.Contract object's provider to access the network\n * - checks the contract address to see if the contract is deployed\n *\n * @category Hooks\n *\n * @param contract ethers.BaseContract class\n * @returns\n */\nexport const useContractExistsAtAddress = <GContract extends BaseContract>(\n  contract: GContract | undefined,\n  options: TUpdateOptions<boolean> = mergeDefaultUpdateOptions()\n): THookResult<boolean> => {\n  const keys = [{ ...queryKey, ...contractKey(contract) }, { contractAddress: contract?.address }] as const;\n  const { data, refetch, status } = useQuery(\n    keys,\n    async (keys): Promise<boolean> => {\n      const { contractAddress } = keys.queryKey[1];\n      /**\n       * We can look at the blockchain and see what's stored at `contractAddress`\n       * If we find code then we know that a contract exists there.\n       * If we find nothing (0x0) then there is no contract deployed to that address\n       */\n      if (contractAddress != null && utils.isAddress(contractAddress) && contract?.provider != null) {\n        const bytecode = await contract.provider.getCode(contractAddress);\n        return bytecode !== '0x';\n      }\n      return false;\n    },\n    {\n      ...processQueryOptions<boolean>(options),\n    }\n  );\n\n  const blockNumber = useBlockNumberContext();\n  useEthersUpdater(refetch, blockNumber, options);\n\n  return [data ?? false, refetch, status];\n};\n","import { BaseContract, EventFilter } from 'ethers';\nimport { useEffect } from 'react';\nimport { useQuery } from 'react-query';\n\nimport { useBlockNumberContext } from '~~/context';\nimport { contractFuncKey, mergeDefaultUpdateOptions, processQueryOptions } from '~~/functions';\nimport { useEthersUpdater } from '~~/hooks/useEthersUpdater';\nimport { THookResult, TUpdateOptions } from '~~/models';\nimport { keyNamespace } from '~~/models/constants';\n\nconst queryKey = { namespace: keyNamespace.contracts, key: 'useContractReader' } as const;\n\n/**\n * #### Summary\n * Enables you to call a contract function with arguments and receive the output.  You can use this to easily track of contract outputs in react states\n *\n * ##### ✏️ Notes\n * - uses the ethers.Contract object's provider to access the network\n * - formatter is a function that can change the format of the output\n * @param contract Contract reading from\n * @param contractFunc Contract variable or function to read\n * @param args Typed tuple argument to contract function or variable\n * @param funcEventFilter Optional if only want contract to update on event\n * @param options Options for how often and when to update\n * @returns\n */\nexport const useContractReader = <\n  GContract extends BaseContract,\n  GContractFunc extends (...args: any[]) => Promise<any>\n>(\n  contract: GContract | undefined,\n  contractFunc: GContractFunc | undefined,\n  args?: Parameters<GContractFunc>,\n  funcEventFilter?: EventFilter | undefined,\n  options: TUpdateOptions = mergeDefaultUpdateOptions()\n): THookResult<Awaited<ReturnType<GContractFunc>> | undefined> => {\n  const keys = [\n    {\n      ...queryKey,\n      ...contractFuncKey(contract, contractFunc),\n    },\n    { args: args ?? [], funcEventFilter },\n  ] as const;\n  const { data, refetch, status } = useQuery(\n    keys,\n    async (keys): Promise<Awaited<ReturnType<GContractFunc>> | undefined> => {\n      const { args } = keys.queryKey[1];\n\n      if (contractFunc != null && contract != null) {\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n        const result = await contractFunc(...args);\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n        return result;\n      }\n\n      return undefined;\n    },\n    {\n      ...processQueryOptions<Awaited<ReturnType<GContractFunc>> | undefined>(options),\n    }\n  );\n\n  /**\n   * event based updates:\n   * you can use an event and only call the contract when there is an event\n   */\n  useEffect(() => {\n    if (funcEventFilter != null) {\n      const listener = (): void => {\n        void refetch();\n      };\n      try {\n        contract?.on(funcEventFilter, listener);\n        return (): void => {\n          contract?.off(funcEventFilter, listener);\n        };\n      } catch (e) {\n        console.log(e);\n      }\n    }\n  }, [contract, funcEventFilter, refetch]);\n\n  const blockNumber = useBlockNumberContext();\n  /**\n   * if event based updates is on, interval updates are disabled\n   */\n  const allowBlockNumberIntervalUpdate = funcEventFilter == null;\n  useEthersUpdater(refetch, blockNumber, options, allowBlockNumberIntervalUpdate);\n\n  return [data, refetch, status];\n};\n","import { useEffect } from 'react';\nimport { useQuery } from 'react-query';\n\nimport {\n  isAdaptorEqual,\n  isValidEthersAdaptor,\n  mergeDefaultUpdateOptions,\n  parseProviderOrSigner,\n  processQueryOptions,\n  providerKey,\n  TRequiredKeys,\n} from '~~/functions';\nimport { TEthersProviderOrSigner, THookResult, TUpdateOptions } from '~~/models';\nimport { keyNamespace } from '~~/models/constants';\nimport { TEthersAdaptor } from '~~/models/ethersAppContextTypes';\n\nconst queryKey: TRequiredKeys = {\n  namespace: keyNamespace.network,\n  key: 'useGetEthersAdaptorFromProviderOrSigners',\n} as const;\n\n/**\n * #### Summary\n * Gets the user {@link TEthersUser} for a signer or wallet\n *\n * @category Hooks\n *\n * @param providerOrSigner input signer\n * @returns\n */\nexport const useEthersAdaptorFromProviderOrSigners = (\n  providerOrSigner: TEthersProviderOrSigner | undefined,\n  options: TUpdateOptions = mergeDefaultUpdateOptions()\n): THookResult<TEthersAdaptor | undefined> => {\n  const keys = [{ ...queryKey, ...providerKey(providerOrSigner) }] as const;\n  const { data, refetch, status } = useQuery(\n    keys,\n    async (_keys): Promise<TEthersAdaptor | undefined> => {\n      const result = await parseProviderOrSigner(providerOrSigner);\n      return result;\n    },\n    {\n      ...processQueryOptions<TEthersAdaptor | undefined>(options),\n      isDataEqual: (oldData, newData) => isAdaptorEqual(oldData, newData),\n    }\n  );\n\n  const validAdaptorState = isValidEthersAdaptor(data);\n\n  // if the adaptor is not valid, refetch when the network is obtained\n  useEffect(() => {\n    if (data != null && !validAdaptorState) {\n      console.log('not valid');\n      if (data.provider) {\n        void data.provider\n          .getNetwork()\n          .then(() => refetch())\n          .catch();\n      } else if (data.signer && data.account) {\n        void data.signer.provider\n          ?.getNetwork()\n          .then(() => refetch())\n          .catch();\n      }\n    }\n  }, [data, refetch, validAdaptorState]);\n\n  return [data, refetch, status];\n};\n","import { EventFilter, BaseContract } from 'ethers';\nimport { Result } from 'ethers/lib/utils';\nimport { useEffect } from 'react';\nimport { useQuery } from 'react-query';\n\nimport { contractKey, mergeDefaultUpdateOptions, processQueryOptions, TRequiredKeys } from '~~/functions';\nimport { const_blockNumberIntervalMedium, THookResult, TUpdateOptions, TypedEvent } from '~~/models';\nimport { keyNamespace } from '~~/models/constants';\n\nconst queryKey: TRequiredKeys = { namespace: keyNamespace.contracts, key: 'useEventListener' } as const;\n/**\n * #### Summary\n * Tracks the events of associated with a contract\n *\n * ##### ✏️ Notes\n * - updates triggered through ethers event listener\n * - uses the current provider {@link ethersProvider} from {@link useEthersContext}\n *\n * @category Hooks\n *\n * @param contract ethers.Contract\n * @param eventName\n * @param startBlock\n * @returns\n */\nexport const useEventListener = <GTypedEvent extends TypedEvent<Result>>(\n  contract: BaseContract | undefined,\n  eventFilter: string | EventFilter | undefined,\n  startBlock: number,\n  toBlock: number | undefined = undefined,\n  options: TUpdateOptions<GTypedEvent[]> = mergeDefaultUpdateOptions(const_blockNumberIntervalMedium)\n): THookResult<GTypedEvent[]> => {\n  const keys = [\n    {\n      ...queryKey,\n      ...contractKey(contract),\n    },\n    {\n      eventFilter,\n      startBlock,\n      toBlock,\n    },\n  ] as const;\n  const { data, refetch, status } = useQuery(\n    keys,\n    async (keys): Promise<GTypedEvent[]> => {\n      {\n        const { eventFilter: eventFilter_, startBlock: startBlock_, toBlock: toBlock_ } = keys.queryKey[1];\n        const result = await contract?.queryFilter(eventFilter_ as EventFilter, startBlock_, toBlock_);\n        return (result as GTypedEvent[]) ?? [];\n      }\n    },\n    {\n      ...processQueryOptions<GTypedEvent[]>(options),\n    }\n  );\n\n  // update the result when ethers calls the event listner\n  useEffect(() => {\n    if (eventFilter != null) {\n      const listener = (): void => {\n        void refetch();\n      };\n      try {\n        contract?.on(eventFilter, listener);\n        return (): void => {\n          contract?.off(eventFilter, listener);\n        };\n      } catch (e) {\n        console.log(e);\n      }\n    }\n  }, [contract, eventFilter, refetch]);\n\n  // const blockNumber = useBlockNumberContext();\n  // useEthersUpdater(refetch, blockNumber, options);\n\n  return [data ?? [], refetch, status];\n};\n","import { utils } from 'ethers';\nimport { useQuery } from 'react-query';\nimport { useDebounce } from 'use-debounce';\n\nimport { useEthersAppContext, useBlockNumberContext } from '~~/context';\nimport {\n  ethersOverride,\n  mergeDefaultOverride,\n  mergeDefaultUpdateOptions,\n  processQueryOptions,\n  providerKey,\n  TRequiredKeys,\n} from '~~/functions';\nimport { useEthersUpdater } from '~~/hooks/useEthersUpdater';\nimport { TOverride, TNetworkInfo, TUpdateOptions, keyNamespace, THookResult } from '~~/models';\n\nconst queryKey: TRequiredKeys = { namespace: keyNamespace.state, key: 'useGasPrice' } as const;\n\n/**\n * Preset speeds for Eth Gas Station API\n    - fast: Recommended fast(expected to be mined in < 2 minutes) gas price in x10 Gwei(divite by 10 to convert it to gwei)\n    - fastest: Recommended fastest(expected to be mined in < 30 seconds) gas price in x10 Gwei(divite by 10 to convert it to gwei)\n    - safeLow: Recommended safe(expected to be mined in < 30 minutes) gas price in x10 Gwei(divite by 10 to convert it to gwei)\n    - average: Recommended average(expected to be mined in < 5 minutes) gas price in x10 Gwei(divite by 10 to convert it to gwei)\n\n    @category Hooks\n */\nexport type TGasStationSpeed = 'fast' | 'fastest' | 'safeLow' | 'average';\n\n/**\n * #### Summary\n * Gets the gas price for the current network as gwei\n * - uses EthGasStation for mainnet\n * - uses ethers.estimateGas other networks\n * - can use currentNetworkInfo {@link TNetworkInfo.gasPrice} gasPrice as fallback\n *\n * ##### ✏️ Notes\n * - if the gas price is unknown it returns undefined\n * - updates triggered by {@link BlockNumberContext}\n * - uses the current provider {@link ethersProvider} from {@link useEthersContext}\n *\n * @category Hooks\n *\n * @param speed\n * @param currentNetworkInfo uses gasPrice as a fallback\n * @returns gas as gwei\n */\nexport const useGasPrice = (\n  chainId: number | undefined,\n  speed: TGasStationSpeed,\n  currentNetworkInfo?: TNetworkInfo,\n  options: TUpdateOptions = mergeDefaultUpdateOptions(),\n  override: TOverride = mergeDefaultOverride()\n): THookResult<number | undefined> => {\n  const ethersContext = useEthersAppContext(override.alternateContextKey);\n  const { provider } = ethersOverride(ethersContext, override);\n\n  const keys = [\n    { ...queryKey, ...providerKey(provider) },\n    { chainId, speed, currentNetworkInfo },\n  ] as const;\n  const { data, refetch, isError, status } = useQuery(\n    keys,\n    async (keys): Promise<number | undefined> => {\n      const { chainId, speed, currentNetworkInfo } = keys.queryKey[1];\n      if (!chainId) {\n        return undefined;\n      } else if (chainId === 1) {\n        if (navigator?.onLine) {\n          const gweiFactor = 10;\n          const response = await fetch('https://ethgasstation.info/json/ethgasAPI.json');\n          const result: Record<string, any> = (response.json() as Record<string, any>) ?? {};\n          let newGasPrice: number | undefined = result[speed] / gweiFactor;\n          if (!newGasPrice) newGasPrice = result['fast'] / gweiFactor;\n          return newGasPrice;\n        }\n      } else if (provider) {\n        const fee = await provider.getFeeData();\n        const price = fee.gasPrice ?? fee.maxFeePerGas;\n        if (price && price?.toBigInt() > 0) {\n          const result = parseInt(utils.formatUnits(price, 'gwei')) ?? 0;\n          return result;\n        }\n      }\n\n      if (currentNetworkInfo?.gasPrice) {\n        return currentNetworkInfo.gasPrice;\n      }\n      return undefined;\n    },\n    {\n      ...processQueryOptions<number | undefined>(options),\n    }\n  );\n\n  const blockNumber = useBlockNumberContext();\n  useEthersUpdater(refetch, blockNumber, options);\n\n  const result = isError ? undefined : data;\n  const [gasPriceDebounced] = useDebounce(result, 250, { trailing: true });\n  return [gasPriceDebounced, refetch, status];\n};\n","import { useQuery } from 'react-query';\n\nimport { useBlockNumberContext, useEthersAppContext } from '~~/context';\nimport {\n  ethersOverride,\n  mergeDefaultOverride,\n  mergeDefaultUpdateOptions,\n  processQueryOptions,\n  providerKey,\n  TRequiredKeys,\n} from '~~/functions';\nimport { useEthersUpdater } from '~~/hooks/useEthersUpdater';\nimport { THookResult, TOverride, TUpdateOptions } from '~~/models';\nimport { keyNamespace } from '~~/models/constants';\n\nconst queryKey: TRequiredKeys = {\n  namespace: keyNamespace.signer,\n  key: 'useNonce',\n} as const;\n\n/**\n * #### Summary\n * Get the current nonce for the address provided\n *\n * ##### ✏️ Notes\n * - updates triggered by {@link BlockNumberContext}\n * - uses the current provider {@link ethersProvider} from {@link useEthersContext}\n *\n * @category Hooks\n *\n * @param address\n * @returns\n */\nexport const useNonce = (\n  address: string | undefined,\n  options: TUpdateOptions = mergeDefaultUpdateOptions(),\n  override: TOverride = mergeDefaultOverride()\n): THookResult<number> => {\n  const ethersContext = useEthersAppContext(override.alternateContextKey);\n  const { provider } = ethersOverride(ethersContext, override);\n\n  const keys = [{ ...queryKey, ...providerKey(provider) }, { address }] as const;\n  const { data, refetch, status } = useQuery(\n    keys,\n    async (keys): Promise<number | undefined> => {\n      const { address } = keys.queryKey[1];\n      if (address) {\n        const nextNonce = await provider?.getTransactionCount(address);\n        return nextNonce ?? 0;\n      }\n      return undefined;\n    },\n    {\n      ...processQueryOptions<number | undefined>(options),\n    }\n  );\n\n  const blockNumber = useBlockNumberContext();\n  useEthersUpdater(refetch, blockNumber, options);\n\n  return [data ?? 0, refetch, status];\n};\n","import { useQuery } from 'react-query';\n\nimport { useBlockNumberContext } from '~~/context';\nimport { mergeDefaultUpdateOptions, processQueryOptions, providerKey } from '~~/functions';\nimport { useEthersUpdater } from '~~/hooks/useEthersUpdater';\nimport { keyNamespace, TEthersSigner, THookResult, TUpdateOptions } from '~~/models';\n\nconst queryKey = { namespace: keyNamespace.signer, key: 'useSignerAddress' } as const;\n\n/**\n * #### Summary\n * Get the address from the signer\n *\n * @category Hooks\n *\n * @param signer\n * @returns\n */\nexport const useSignerAddress = (\n  signer: TEthersSigner | undefined,\n  options: TUpdateOptions = mergeDefaultUpdateOptions()\n): THookResult<string | undefined> => {\n  const keys = [{ ...queryKey, ...providerKey(signer) }] as const;\n  const { data, refetch, status } = useQuery(\n    keys,\n    async (_keys): Promise<string | undefined> => {\n      if (signer) {\n        const result = await signer.getAddress();\n        return result;\n      }\n      return undefined;\n    },\n    {\n      ...processQueryOptions<string | undefined>(options),\n    }\n  );\n\n  const blockNumber = useBlockNumberContext();\n  useEthersUpdater(refetch, blockNumber, options);\n\n  return [data, refetch, status];\n};\n","import { useQuery } from 'react-query';\n\nimport { useBlockNumberContext } from '~~/context';\nimport { mergeDefaultUpdateOptions, processQueryOptions, providerKey, TRequiredKeys } from '~~/functions';\nimport { useEthersUpdater } from '~~/hooks/useEthersUpdater';\nimport { const_blockNumberIntervalMedium, TEthersSigner, THookResult, TUpdateOptions } from '~~/models';\nimport { keyNamespace } from '~~/models/constants';\n\nconst queryKey: TRequiredKeys = { namespace: keyNamespace.signer, key: 'useSignerChainId' } as const;\n\n/**\n * #### Summary\n * Get the address from the signer\n *\n * @category Hooks\n *\n * @param signer\n * @returns\n */\nexport const useSignerChainId = (\n  signer: TEthersSigner | undefined,\n  options: TUpdateOptions = mergeDefaultUpdateOptions({ ...const_blockNumberIntervalMedium })\n): THookResult<number | undefined> => {\n  type TAsyncResult = number | undefined;\n  const keys = [{ ...queryKey, ...providerKey(signer) }] as const;\n\n  const { data, refetch, status } = useQuery(\n    keys,\n    async (_keys): Promise<TAsyncResult> => {\n      // const { signer } = keys.queryKey[1];\n      const chainId = await signer?.getChainId();\n      return chainId;\n    },\n    {\n      ...processQueryOptions<TAsyncResult>(options),\n    }\n  );\n\n  const blockNumber = useBlockNumberContext();\n  useEthersUpdater(refetch, blockNumber, options);\n\n  return [data, refetch, status];\n};\n","import { useQuery } from 'react-query';\n\nimport { useBlockNumberContext, useEthersAppContext } from '~~/context';\nimport {\n  ethersOverride,\n  mergeDefaultOverride,\n  mergeDefaultUpdateOptions,\n  processQueryOptions,\n  providerKey,\n  TRequiredKeys,\n} from '~~/functions';\nimport { useEthersUpdater } from '~~/hooks/useEthersUpdater';\nimport { THookResult, TOverride, TUpdateOptions } from '~~/models';\nimport { keyNamespace } from '~~/models/constants';\n\nconst queryKey: TRequiredKeys = { namespace: keyNamespace.signer, key: 'useTimestamp' } as const;\n\n/**\n * #### Summary\n * Get the current timestamp from the latest block\n *\n * ##### ✏️ Notes\n * - updates triggered by {@link BlockNumberContext}\n * - uses the current provider {@link ethersProvider} from {@link useEthersContext}\n *\n * @category Hooks\n *\n * @param pollTime\n * @returns\n */\nexport const useTimestamp = (\n  options: TUpdateOptions = mergeDefaultUpdateOptions(),\n  override: TOverride = mergeDefaultOverride()\n): THookResult<number> => {\n  const blockNumber = useBlockNumberContext();\n  const ethersContext = useEthersAppContext(override.alternateContextKey);\n  const { provider } = ethersOverride(ethersContext, override);\n\n  const keys = [{ ...queryKey, ...providerKey(provider) }] as const;\n  const { data, refetch, status } = useQuery(\n    keys,\n    async (_keys): Promise<number> => {\n      const blockNumber = await provider?.getBlockNumber();\n\n      if (blockNumber != null) {\n        const block = await provider?.getBlock(blockNumber);\n        if (block?.timestamp != null) {\n          return block.timestamp;\n        }\n      }\n      return 0;\n    },\n    {\n      ...processQueryOptions<number>(options),\n    }\n  );\n\n  useEthersUpdater(refetch, blockNumber, options);\n  return [data ?? 0, refetch, status];\n};\n","import { useIsMounted } from 'usehooks-ts';\n\nexport const useCheckIsMounted = (): void => {\n  const data = useIsMounted();\n  if (data()) {\n    console.log('is mounted');\n  } else {\n    console.log('not mounted');\n  }\n};\n","import { ExternalProvider, JsonRpcFetchFunc, Web3Provider } from '@ethersproject/providers';\nimport { AbstractConnector } from '@web3-react/abstract-connector';\nimport { useWeb3React, Web3ReactProvider } from '@web3-react/core';\nimport { cloneElement, FC, useCallback } from 'react';\nimport { QueryClientProvider } from 'react-query';\nimport { invariant } from 'ts-invariant';\n\nimport { NoEthereumProviderFoundError } from '~~/context';\nimport { EthersModalConnector, TEthersModalConnector } from '~~/context/ethers-app/connectors/EthersModalConnector';\nimport { defaultQueryClient } from '~~/context/ethers-app/queryClient';\nimport { isEthersProvider } from '~~/functions/ethersHelpers';\nimport { TEthersProvider } from '~~/models';\nimport { IEthersContext } from '~~/models/ethersAppContextTypes';\n\n/**\n * #### Summary\n * This Hook provides you with access to the current Ethers Provider Context.\n * This provider would be the one selected by using {@link EthersModalConnector} and Web3Modal\n *\n * ##### ✨ Features\n * Gives you access to consistent interface to get the current provider information {@link EthersModalConnector}\n * - ethers compatable provider {@link TEthersProvider}\n * - a callback to change the current account (signer)\n * - the current account, chainId and signer\n * - callbacks to open the web3Modal, logout or change theme\n *\n * ##### ✏️ Notes\n * - currently providerKey isnt being used\n *\n * @category EthersAppContext\n *\n * @param contextKey\n * @returns\n */\nexport const useEthersAppContext = (contextKey?: string): IEthersContext => {\n  if (contextKey === 'primary') console.warn('Do not explicitly use primary contextKey, pass in undefined instead');\n  const { connector, activate, library, account, deactivate, chainId, ...context } =\n    useWeb3React<TEthersProvider>(contextKey);\n\n  if (!(connector instanceof EthersModalConnector || connector instanceof AbstractConnector) && connector != null) {\n    throw 'Connector is not a EthersModalConnector';\n  }\n  const ethersConnector = connector as EthersModalConnector;\n\n  const openModal = useCallback<IEthersContext['openModal']>(\n    (ethersModalConnector: TEthersModalConnector | undefined, onError?: (error: Error) => void) => {\n      if (context.active) {\n        deactivate();\n      }\n\n      if (ethersModalConnector == null) {\n        invariant.error('A valid ethersModalConnector was not provided');\n      }\n      if (ethersModalConnector != null) {\n        const onActivateError = (error: Error): void => {\n          try {\n            connector?.deactivate?.();\n            console.warn(error);\n            onError?.(error);\n          } catch {}\n        };\n        void activate(ethersModalConnector, onActivateError);\n      }\n    },\n    [context.active, deactivate, activate, connector]\n  );\n\n  const disconnectModal = useCallback<IEthersContext['disconnectModal']>(\n    (onSuccess?: () => void) => {\n      ethersConnector.resetModal();\n      deactivate();\n      onSuccess?.();\n    },\n    [deactivate, ethersConnector]\n  );\n\n  const result: IEthersContext = {\n    connector: ethersConnector,\n    provider: library,\n    activate,\n    deactivate,\n    library,\n    account: account ?? undefined,\n    signer: ethersConnector?.getSigner(),\n    chainId,\n    changeSigner: ethersConnector?.changeSigner.bind(ethersConnector),\n    openModal,\n    disconnectModal,\n    setModalTheme: ethersConnector?.setModalTheme.bind(ethersConnector),\n    ...context,\n  };\n\n  return result;\n};\n\n/**\n * @deprecated Please use useEthersAppContext instead, this is a shim for backwards compatibility\n * #### Summary\n * This is just a shim around {@link useEthersAppContext} for backwards compatibility.  Will be removed later in a major update.\n *\n * @param contextKey\n * @returns\n */\nexport const useEthersContext: typeof useEthersAppContext = (contextKey?: string): IEthersContext => {\n  return useEthersAppContext(contextKey);\n};\n\n/**\n * #### Summary\n * Props for context\n *\n * ##### ✏️ Notes\n * - allow you specify alternate web3ReactRoot [See docs](https://github.com/NoahZinsmeister/web3-react/tree/v6/docs#createweb3reactroot).  You must provide both an alternate key and its root.\n * - allows you to use your own QueryClientProvider\n */\nexport type TEthersAppContextProps = {\n  children?: React.ReactNode;\n  /**\n   * Props for context that allow you specify alternate web3ReactRoot [See docs](https://github.com/NoahZinsmeister/web3-react/tree/v6/docs#createweb3reactroot).  You must provide both an alternate key and its root.\n   */\n  secondaryWeb3ReactRoot?: {\n    contextKey: string;\n    web3ReactRoot: JSX.Element;\n  };\n  /**\n   * disables the local queryClientRoot and QueryClientProvider for react-query and allows you to use your own\n   */\n  disableDefaultQueryClientRoot?: boolean;\n  /**\n   * if you want to pass in your own provider.\n   * Make sure it is compatable with ethers.js, see {@link TGetEthersAppProviderLibrary} for details\n   */\n  customGetEthersAppProviderLibrary?: TGetEthersAppProviderLibrary;\n};\n\nexport type TGetEthersAppProviderLibrary = (\n  provider: TEthersProvider | ExternalProvider | JsonRpcFetchFunc | any,\n  connector?: AbstractConnector\n) => TEthersProvider;\n\n/**\n * Convert the provider obtained from web3Modal into a ethers.web3provider\n *\n * @internal\n *\n * @param provider Should be either {@link TEthersProvider} or a {@link ExternalProvider} or {@link JsonRpcFetchFunc},\n * @param _connector\n * @returns\n */\nexport const getEthersAppProviderLibrary: TGetEthersAppProviderLibrary = (\n  provider: TEthersProvider | ExternalProvider | JsonRpcFetchFunc | any,\n  connector?: AbstractConnector\n): TEthersProvider => {\n  if (provider == null) {\n    throw new NoEthereumProviderFoundError();\n  }\n\n  let anyNetwork: string | undefined = undefined;\n  if (connector && connector instanceof EthersModalConnector) {\n    anyNetwork = connector.config.immutableProvider ? 'any' : undefined;\n  }\n\n  if (isEthersProvider(provider)) {\n    return provider as TEthersProvider;\n  } else {\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n    return new Web3Provider(provider, anyNetwork);\n  }\n};\n/**\n * #### Summary\n * Ethers App Context for your react app to be used with {@link useEthersAppContext}.\n * This is a wrapper around Web3ReactProvider that provides additional functionality such as a {@link BlockNumberContext} and access to {@link IEthersContext}.  See {@link TEthersAppContextProps} for more information on props for alternate context roots.\n *\n * @category EthersAppContext\n *\n * @param props {@link TEthersAppContextProps}\n * @returns\n */\nexport const EthersAppContext: FC<TEthersAppContextProps> = (props) => {\n  if (props.secondaryWeb3ReactRoot != null) {\n    invariant(\n      !!props.secondaryWeb3ReactRoot.contextKey,\n      'When using alternate web3-react roots, you need to provide a valid contextKeyName'\n    );\n\n    invariant(\n      props.secondaryWeb3ReactRoot.web3ReactRoot != null,\n      'When using alternate web3-react roots, you need to provide a valid web3ReactRoot'\n    );\n\n    invariant(props.secondaryWeb3ReactRoot.contextKey !== 'primary', 'You cannot use primary for alternate roots');\n\n    const alternateProvider = cloneElement(\n      props.secondaryWeb3ReactRoot.web3ReactRoot,\n      { getLibrary: props.customGetEthersAppProviderLibrary ?? getEthersAppProviderLibrary },\n      <>{props.children}</>\n    );\n\n    return alternateProvider;\n  }\n\n  const element = (\n    <Web3ReactProvider getLibrary={props.customGetEthersAppProviderLibrary ?? getEthersAppProviderLibrary}>\n      {props.children}\n    </Web3ReactProvider>\n  );\n\n  if (props.disableDefaultQueryClientRoot) {\n    return element;\n  } else {\n    return <QueryClientProvider client={defaultQueryClient}>{element}</QueryClientProvider>;\n  }\n};\n","import { Web3Provider } from '@ethersproject/providers';\nimport { AbstractConnector } from '@web3-react/abstract-connector';\nimport { ConnectorUpdate } from '@web3-react/types';\nimport { BigNumber, Signer, utils } from 'ethers';\nimport { invariant } from 'ts-invariant';\nimport { ICoreOptions, ThemeColors } from 'web3modal';\n\nimport { UserClosedModalError, CouldNotActivateError } from './connectorErrors';\n\nimport {\n  connectorErrorText,\n  NoEthereumProviderFoundError,\n  NoStaticJsonRPCProviderFoundError,\n} from '~~/context/ethers-app';\nimport { isEthersProvider } from '~~/functions/ethersHelpers';\nimport { Web3Modal } from '~~/helpers/esm-fixtures/web3modal';\nimport { TEthersProvider } from '~~/models';\nimport { const_web3DialogClosedByUser, const_web3DialogUserRejected } from '~~/models/constants/common';\n\ntype TEthersModalConfig = {\n  /**\n   * when network (chain) or provider changes reload the page\n   */\n  reloadOnNetworkChange: boolean;\n  /**\n   * #### Summary\n   * ethers.io recomments an immutable provider, and by default doesn't allow\n   * network changes (i.e.) metamask changing chains.\n   * - if immutableProvider is true, it will follow the default behaviour\n   * - if immutableProvider is false, it will allow network changes\n   *\n   * ##### ✏️ Notes\n   * see https://github.com/ethers-io/ethers.js/discussions/1480\n   */\n  immutableProvider: boolean;\n};\n\ntype TWeb3ModalTheme = 'light' | 'dark';\n\n/**\n * #### Summary\n * An interface implemented by {@link EthersModalConnector} in addition to AbstractConnector\n */\nexport interface ICommonModalConnector {\n  setModalTheme(theme: TWeb3ModalTheme | ThemeColors): void;\n  resetModal(): void;\n\n  hasCachedProvider(): boolean;\n  loadWeb3Modal: () => void;\n\n  getSigner: () => Signer | undefined;\n  changeSigner(signer: Signer): Promise<void>;\n}\n\nexport type TEthersModalConnector = ICommonModalConnector & AbstractConnector;\n\n/**\n * #### Summary\n * This is a connector for [web3-react](https://github.com/NoahZinsmeister/web3-react) that allows it to interface with [web3Modal](https://github.com/Web3Modal/web3modal).\n * The provider selected by user via web3modal is interfaced to the web3-react context.\n *\n * ##### ✨ Features\n * - This connector used with {@link useEthersContext} allows the app and all the hooks to effortlessly access the current network, provider, signer, address information {@link IEthersContext}\n * - The connector centralizes and takes care of management of the web3 interaction and provides a consistent exprience for your app.\n *\n * ##### ✏️ Notes\n * - inherits from web3-react class AbstractConnector\n *\n * @category EthersAppContext\n */\nexport class EthersModalConnector extends AbstractConnector implements ICommonModalConnector {\n  protected _options: Partial<ICoreOptions>;\n  protected _providerBase?: any;\n  protected _ethersProvider?: TEthersProvider;\n  protected _web3Modal?: typeof Web3Modal;\n  protected _id: string | undefined;\n  protected _debug: boolean = false;\n  protected _config: Readonly<TEthersModalConfig>;\n  protected _signer: Signer | undefined;\n  protected _theme: TWeb3ModalTheme | ThemeColors;\n  static isModalOpening: boolean = false;\n\n  get config(): Readonly<TEthersModalConfig> {\n    return this._config;\n  }\n\n  public hasCachedProvider(): boolean {\n    return !!this._web3Modal?.cachedProvider;\n  }\n\n  /**\n   * @param web3modalOptions see [web3modal docs](https://github.com/Web3Modal/web3modal#provider-options) for details.  You can also check the [scaffold-eth-typescript web3config](https://github.com/scaffold-eth/scaffold-eth-typescript/blob/next/packages/vite-app-ts/src/config/web3ModalConfig.ts) for an example.\n   * @param config Configuration for EthersModalConnector\n   * @param id allows you to connect directly to a specific provider.  [See docs](https://github.com/Web3Modal/web3modal#connect-to-specific-provider)\n   * @param debug turn on debug logging\n   */\n  constructor(\n    web3modalOptions: Partial<ICoreOptions>,\n    config: TEthersModalConfig = { reloadOnNetworkChange: false, immutableProvider: false },\n    id?: string,\n    debug: boolean = false\n  ) {\n    super();\n\n    this._options = web3modalOptions;\n    this._id = id;\n    this._debug = debug;\n    this._config = config;\n    this._theme = (web3modalOptions.theme as TWeb3ModalTheme | ThemeColors) ?? 'light';\n\n    this.handleChainChanged = this.handleChainChanged.bind(this);\n    this.handleAccountsChanged = this.handleAccountsChanged.bind(this);\n    this.handleDisconnect = this.handleDisconnect.bind(this);\n    this.handleClose = this.handleClose.bind(this);\n  }\n\n  protected log(...args: any[]): void {\n    if (this._debug) {\n      console.log('🔌 ', args);\n    }\n  }\n\n  private maybeReload(): void {\n    if (window && this._config.reloadOnNetworkChange) {\n      window.location.reload();\n    }\n  }\n\n  private setEthersProvider(): void {\n    if (this.isEthersProvider()) {\n      this._ethersProvider = this._providerBase as TEthersProvider;\n    } else {\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n      this._ethersProvider = new Web3Provider(this._providerBase, this._config.immutableProvider ? 'any' : undefined);\n    }\n  }\n\n  private handleChainChanged(chainId: number | string): void {\n    this.log(`Handling chain changed to ${chainId}! updating providers`);\n    this._signer = undefined;\n    this.emitUpdate?.({ chainId, provider: this._providerBase });\n    this.setEthersProvider();\n    void this.getSignerFromAccount();\n    this.maybeReload();\n  }\n\n  private handleAccountsChanged(accounts: string[]): void {\n    this.log(`Handling accounts changed`, accounts);\n    if (accounts.length === 0) {\n      this.emitDeactivate?.();\n    } else {\n      const newAccount = accounts[0];\n      void this.setSignerFromAccount(newAccount);\n      this.emitUpdate?.({ account: accounts[0] });\n    }\n  }\n\n  private handleDisconnect(code: any, reason: any): void {\n    this.log(`Handling disconnected event`, code, reason);\n    this.deactivate();\n  }\n\n  private handleClose(code: number, reason: string): void {\n    this.log(\"Handling 'close' event\", code, reason);\n    this.deactivate();\n  }\n  public loadWeb3Modal(): void {\n    if (!this._web3Modal) {\n      // @ts-expect-error\n      this._web3Modal = new Web3Modal({ ...this._options, theme: this._theme });\n    }\n  }\n\n  /**\n   * #### Summary\n   * Inherits from AbstractConnector.  This activates web3Modal and opens the modal.\n   *\n   * ##### ✏️ Notes\n   * Once the user selects a provider\n   * - this will activate the provider and attach the appropriate event listeners.\n   * - get the account and signer\n   * - gets the ethers compatable provider\n   *\n   * ##### ⚠️ Errors\n   * - {@link UserClosedModalError}\n   * - {@link CouldNotActivateError}\n   * @returns\n   */\n  public async activate(): Promise<ConnectorUpdate> {\n    try {\n      this.loadWeb3Modal();\n\n      if (this._web3Modal) {\n        if (this._options.cacheProvider === false || !this.checkValidCachedProvider()) {\n          this.resetModal();\n        }\n\n        EthersModalConnector.isModalOpening = true;\n        console.log('Open provider modal');\n\n        await this._web3Modal.updateTheme(this._theme);\n        /* eslint-disable @typescript-eslint/no-unsafe-assignment*/\n        if (this._id) {\n          this._providerBase = await this._web3Modal.connectTo(this._id);\n        } else {\n          this._providerBase = await this._web3Modal.connect();\n        }\n        /* eslint-enable */\n\n        /* eslint-disable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call*/\n        this._providerBase.on('chainChanged', this.handleChainChanged);\n        this._providerBase.on('accountsChanged', this.handleAccountsChanged);\n        this._providerBase.on('disconnect', this.handleDisconnect as any);\n        this._providerBase.on('close', this.handleClose as any);\n        /* eslint-enable */\n\n        this.setEthersProvider();\n      }\n\n      /* eslint-disable */\n      const account: string = this._providerBase?.selectedAddress ?? (await this.getAccount());\n      let chainId: number =\n        this._providerBase?.networkVersion ?? BigNumber.from(this._providerBase?.chainId ?? 0).toNumber();\n      if (chainId === 0) {\n        chainId = (await this.getChainId()) as number;\n      }\n      this.setSignerFromAccount(account);\n\n      EthersModalConnector.isModalOpening = false;\n      return { provider: this._providerBase, account, chainId };\n      /* eslint-enable */\n    } catch (error) {\n      this.resetModal();\n      if (\n        typeof error === 'string' &&\n        (error?.includes(const_web3DialogClosedByUser) || error?.includes(const_web3DialogUserRejected))\n      ) {\n        invariant.log(error);\n        this.deactivate();\n        throw new UserClosedModalError();\n      } else if (error instanceof NoStaticJsonRPCProviderFoundError) {\n        invariant.warn(`EthersModalConnector: ${connectorErrorText.NoStaticJsonRPCProviderFoundError}`);\n        throw error;\n      } else if (error instanceof NoEthereumProviderFoundError) {\n        invariant.warn(`EthersModalConnector: ${connectorErrorText.NoEthereumProviderFoundError}`);\n        throw error;\n      } else {\n        invariant.warn(`EthersModalConnector: ${connectorErrorText.CouldNotActivateError}`, error, this._providerBase);\n        throw new CouldNotActivateError(error);\n      }\n    }\n  }\n\n  private isEthersProvider(): boolean {\n    return isEthersProvider(this._providerBase);\n  }\n\n  /**\n   * #### Summary\n   * Safely deactivates the current provider and removes all event listeners\n   */\n  public deactivate(): void {\n    /* eslint-disable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call  */\n    this.emitDeactivate?.();\n\n    this._providerBase?.removeListener('disconnect', this.handleDisconnect);\n    this._providerBase?.removeListener('chainChanged', this.handleChainChanged);\n    this._providerBase?.removeListener('accountsChanged', this.handleAccountsChanged);\n    this._providerBase?.removeListener('close', this.handleClose);\n\n    const provider = this._providerBase;\n\n    // use disconnect function if exists\n    provider?.disconnect?.();\n    // use close function if exists\n    provider?.close?.();\n\n    this.maybeReload();\n    /* eslint-enable  */\n  }\n\n  public getProvider(): Promise<TEthersProvider | undefined> {\n    return Promise.resolve(this._ethersProvider) as Promise<TEthersProvider | undefined>;\n  }\n\n  public async getChainId(): Promise<number | string> {\n    return Promise.resolve(this._ethersProvider?.network?.chainId ?? 0) as Promise<number | string>;\n  }\n\n  private async setSignerFromAccount(account: string | null): Promise<void> {\n    if (account && utils.isAddress(account) && (await this._signer?.getAddress()) !== account) {\n      this._signer = this._ethersProvider?.getSigner(account);\n    }\n  }\n\n  public async getAccount(): Promise<null | string> {\n    if (this._signer) {\n      const account = await this._signer.getAddress();\n      if (utils.isAddress(account)) return account;\n    }\n\n    const accounts = await this._ethersProvider?.listAccounts();\n    const account = accounts?.[0] ?? null;\n    await this.setSignerFromAccount(account);\n    return Promise.resolve(accounts?.[0] ?? null);\n  }\n\n  public getSigner(): Signer | undefined {\n    return this._signer;\n  }\n\n  public async getSignerFromAccount(): Promise<void> {\n    const account = await this.getAccount();\n    await this.setSignerFromAccount(account);\n    this.emitUpdate?.({ account });\n  }\n\n  /**\n   * #### Summary\n   * Change the current signer and account used by the connector\n   * @param signer\n   */\n  public async changeSigner(signer: Signer): Promise<void> {\n    const account = await signer.getAddress();\n    if (utils.isAddress(account) && this.validState()) {\n      this._signer = signer;\n      this.handleAccountsChanged([account]);\n\n      console.log(`changeSigner: provider chainId ${await this.getChainId()}`);\n      console.log(`new signer chainId ${(await signer.provider?.getNetwork())?.chainId ?? ''}`);\n    }\n  }\n\n  protected validState(): boolean {\n    return this._providerBase != null && this._ethersProvider != null && this._web3Modal != null;\n  }\n\n  /**\n   * #### Summary\n   * Resets the web3Modal and clears the cache\n   */\n  public resetModal(): void {\n    if (this._web3Modal) {\n      this._web3Modal.clearCachedProvider();\n      this._providerBase = undefined;\n      this._ethersProvider = undefined;\n      this._signer = undefined;\n      this.emitUpdate?.({ account: undefined, provider: undefined, chainId: undefined });\n    }\n  }\n\n  /**\n   * #### Summary\n   * Sets the web3modal theme: light | dark | ThemeColors\n   * @param theme\n   */\n  public setModalTheme(theme: TWeb3ModalTheme | ThemeColors): void {\n    this._theme = theme;\n  }\n\n  public checkValidCachedProvider(): boolean {\n    if (EthersModalConnector.isModalOpening) {\n      return false;\n    }\n\n    const modal = this._web3Modal;\n    if (modal != null) {\n      if (!modal.getUserOptions().find((f) => f.id === modal.cachedProvider)) {\n        return false;\n      }\n    }\n    return true;\n  }\n}\n","export const connectorErrorText = {\n  NoStaticJsonRPCProviderFoundError: 'Could not find a static json-rpc provider.  Is it running?',\n  NoEthereumProviderFoundError: 'No web3 provider found',\n  CouldNotActivateError: 'Could not activate the web3 provider',\n  UserClosedModalError: 'Did not log in, the user did not select a web3 provider',\n} as const;\n\n/**\n * @category EthersAppContext\n */\nexport class UserClosedModalError extends Error {\n  public constructor() {\n    super();\n    this.name = this.constructor.name;\n    this.message = `EthersModalConnector: ${connectorErrorText.UserClosedModalError}.`;\n  }\n}\n\n/**\n * @category EthersAppContext\n */\nexport class CouldNotActivateError extends Error {\n  public constructor(error: unknown) {\n    super();\n    this.name = this.constructor.name;\n    this.message = `EthersModalConnector: ${connectorErrorText.CouldNotActivateError}.  ${(error as string) ?? ''}`;\n  }\n}\n\n/**\n * @category EthersAppContext\n */\nexport class NoEthereumProviderFoundError extends Error {\n  public constructor() {\n    super();\n    this.name = this.constructor.name;\n    this.message = `EthersModalConnector: ${connectorErrorText.NoEthereumProviderFoundError}.`;\n  }\n}\n\n/**\n * @category EthersAppContext\n */\nexport class NoStaticJsonRPCProviderFoundError extends Error {\n  public constructor(error: unknown) {\n    super();\n    this.name = this.constructor.name;\n    this.message = `EthersModalConnector: ${connectorErrorText.NoStaticJsonRPCProviderFoundError}.   ${\n      (error as string) ?? ''\n    }`;\n  }\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport * as cts from 'web3modal';\n\nexport const Web3Modal: cts.default = (cts.default as any)?.default ?? cts.default;\n","import { QueryClient } from 'react-query';\n\nexport const defaultQueryClient = new QueryClient();\n","import { StaticJsonRpcProvider } from '@ethersproject/providers';\nimport { IAbstractConnectorOptions } from 'web3modal';\n\nimport { NoStaticJsonRPCProviderFoundError } from '~~/context/ethers-app/connectors/connectorErrors';\n\n/**\n * #### Summary\n * A web3modal CustomProvider Options\n * - Options for web3modal that allows you to connect to a StaticJsonRpcProvider such as localhost\n *\n * @category EthersAppContext\n */\nexport interface IStaticJsonRpcProviderConnectorOptions extends IAbstractConnectorOptions {\n  rpc: { [chainId: number]: string };\n  currentChainId: number;\n}\n\n/**\n * #### Summary\n * A connector that can be used by apps to connect to a StaticJsonRpcProvider\n * - For example you can use this to connect to a localhost provider\n *\n * ##### ✏️ Notes\n * See scaffold-eth-typescript for an example that uses it to connect to a localhost burner wallet.\n * - [scaffold-eth-typescript example](https://github.com/scaffold-eth/scaffold-eth-typescript/blob/next/packages/vite-app-ts/src/config/web3ModalConfig.ts#L86)\n *\n * @category EthersAppContext\n *\n * @param _package not used\n * @param opts\n * @returns\n */\nexport const ConnectToStaticJsonRpcProvider = async (\n  _package: unknown,\n  opts: IStaticJsonRpcProviderConnectorOptions\n): Promise<StaticJsonRpcProvider | undefined> => {\n  const url = opts.rpc[opts.currentChainId];\n  try {\n    const provider = new StaticJsonRpcProvider(url, opts.currentChainId);\n    await provider.getNetwork();\n    await provider.getBlockNumber();\n    if (!provider?.anyNetwork) {\n      console.warn(`ConnectToStaticJsonRpcProvider: could not connect to chain: ${opts.currentChainId} url: ${url}`);\n    }\n    return provider;\n  } catch (e) {\n    throw new NoStaticJsonRPCProviderFoundError(e);\n  }\n};\n"]}