{"version":3,"file":"api-balance-fetcher.cjs","sourceRoot":"","sources":["../../src/multi-chain-accounts-service/api-balance-fetcher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AACA,wDAAoD;AAEpD,iEAKoC;AAGpC,2CAAmD;AACnD,kDAAuB;AAEvB,8EAAkF;AAClF,kDAIuB;AACvB,gDAAkE;AAClE,qEAAmE;AAGnE,+FAA+F;AAC/F,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC,iDAAiD;AACjD,MAAM,uBAAuB,GAAG,KAAM,CAAC;AAwCvC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAmB,EAAE,CACjD,IAAA,uCAAoB,EAAC,IAAI,CAAoB,CAAC;AAEhD,MAAM,aAAa,GAAG,CACpB,OAAmB,EACnB,OAAwB,EACJ,EAAE,CAAC,IAAA,0CAA6B,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAIzE,MAAa,yBAAyB;IAWpC,YACE,WAAmC,WAAW,EAC9C,WAAiC,EACjC,aAIC;;QAjBM,8CAAoC,WAAW,EAAC;QAEhD,yDAAmC;QAEnC,2DAIP;QAWA,uBAAA,IAAI,uCAAa,QAAQ,MAAA,CAAC;QAC1B,uBAAA,IAAI,0CAAgB,WAAW,MAAA,CAAC;QAChC,uBAAA,IAAI,4CAAkB,aAAa,MAAA,CAAC;IACtC,CAAC;IAED,QAAQ,CAAC,OAAmB;QAC1B,OAAO,8CAAkC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC;IAqLD,KAAK,CAAC,KAAK,CAAC,EACV,QAAQ,EACR,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,QAAQ,GAC+B;QACvC,MAAM,SAAS,GAAyB,EAAE,CAAC;QAE3C,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACvE,IAAI,gBAAgB,EAAE,CAAC;gBACrB,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACxB,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,OAA0B,CAAC,CAAC,CACrE,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC1B,CAAC;QAED,mEAAmE;QACnE,wDAAwD;QACxD,MAAM,WAAW,GAAG,MAAM,IAAA,2CAAwB,EAChD,GAAG,EAAE,CAAC,uBAAA,IAAI,sFAAe,MAAnB,IAAI,EAAgB,SAAS,EAAE,QAAQ,CAAC,EAC9C,KAAK,EAAE,yCAAyC;QAChD,uBAAuB,CACxB,CAAC;QAEF,uEAAuE;QACvE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,4DAA4D;QAC5D,uEAAuE;QACvE,oDAAoD;QACpD,MAAM,mBAAmB,GAA6B,WAAW;aAC9D,mBAAmB,EAAE,MAAM;YAC5B,CAAC,CAAC,WAAW,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC9C,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;oBAChC,sCAAsC;oBACtC,OAAO,IAAA,wBAAK,EAAC,IAAA,wBAAgB,EAAC,OAAsB,CAAC,CAAC,SAAS,CAAC,CAAC;gBACnE,CAAC;gBACD,wBAAwB;gBACxB,OAAO,IAAA,wBAAK,EAAC,OAAO,CAAC,CAAC;YACxB,CAAC,CAAC;YACJ,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,cAAc,GAAG,MAAM,uBAAA,IAAI,4FAAqB,MAAzB,IAAI,EAAsB,SAAS,CAAC,CAAC;QAElE,MAAM,OAAO,GAAuB,EAAE,CAAC;QAEvC,kEAAkE;QAClE,MAAM,eAAe,GAAG,IAAI,GAAG,EAA2B,CAAC;QAC3D,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC7B,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG,IAAA,wBAAK,EAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;YAC9C,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAE1C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC1C,eAAe,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YAClD,CAAC;YACD,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,8EAA8E;QAC9E,MAAM,YAAY,GAChB,4CAA+D,CAAC;QAClE,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAc,CAAC,CAAC,sCAAsC;QAC3F,MAAM,wBAAwB,GAAG,IAAI,GAAG,EAAc,CAAC,CAAC,sDAAsD;QAE9G,+BAA+B;QAC/B,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAC9C,CAAC,CAA0C,EAAE,EAAE;gBAC7C,MAAM,WAAW,GAAG,CAAC,CAAC,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpD,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,OAAO,EAAE,CAAC;gBACZ,CAAC;gBACD,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;gBACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBAClC,uEAAuE;gBACvE,qFAAqF;gBACrF,4DAA4D;gBAC5D,MAAM,YAAY,GAChB,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC;gBACjD,MAAM,OAAO,GAAG,IAAA,wBAAK,EAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBAEjC,IAAI,KAAqB,CAAC;gBAC1B,IAAI,CAAC;oBACH,wEAAwE;oBACxE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;oBAE5C,0DAA0D;oBAC1D,MAAM,CAAC,WAAW,GAAG,GAAG,EAAE,WAAW,GAAG,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAEpE,uDAAuD;oBACvD,MAAM,iBAAiB,GAAG,WAAW;yBAClC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC;yBACrB,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;oBAEtB,wBAAwB;oBACxB,MAAM,cAAc,GAAG,WAAW,GAAG,iBAAiB,CAAC;oBACvD,KAAK,GAAG,IAAI,eAAE,CAAC,cAAc,CAAC,CAAC;gBACjC,CAAC;gBAAC,MAAM,CAAC;oBACP,KAAK,GAAG,SAAS,CAAC;gBACpB,CAAC;gBAED,kCAAkC;gBAClC,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBAClD,qBAAqB,CAAC,GAAG,CAAC,GAAG,YAAY,IAAI,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;gBACjE,CAAC;gBAED,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBAClD,wBAAwB,CAAC,GAAG,CAC1B,GAAG,YAAY,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,OAAO,EAAE,EACjE,KAAK,CACN,CAAC;gBACJ,CAAC;gBAED,OAAO;oBACL;wBACE,OAAO,EAAE,KAAK,KAAK,SAAS;wBAC5B,KAAK;wBACL,OAAO,EAAE,YAAY;wBACrB,KAAK;wBACL,OAAO;qBACR;iBACF,CAAC;YACJ,CAAC,CACF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,0BAA0B,GAAG,CAAC,OAAe,EAAW,EAAE,CAC9D,gBAAgB;YACd,CAAC,CAAC,WAAW,CAAC,IAAI,CACd,CAAC,cAAc,EAAE,EAAE,CACjB,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CACjE;YACH,CAAC,CAAC,eAAe,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC;QAE9D,MAAM,iBAAiB,GAAsB,EAAE,CAAC;QAEhD,MAAM,mBAAmB,GAAG,CAC1B,OAAe,EACf,OAAmB,EACnB,YAAoB,EACd,EAAE;YACR,iBAAiB,CAAC,OAAO,MAAzB,iBAAiB,CAAC,OAAO,IAAM,EAAE,EAAC;YAClC,MAAM,+BAA+B,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YACnE,+BAA+B,CAAC,OAAO,MAAvC,+BAA+B,CAAC,OAAO,IAAM,EAAE,EAAC;YAChD,MAAM,wBAAwB,GAAG,+BAA+B,CAAC,OAAO,CAAC,CAAC;YAC1E,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBACrD,wBAAwB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC,CAAC;QAEF,uEAAuE;QACvE,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;YAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBACzB,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,OAAO,EAAE,CAAC;gBACpC,MAAM,eAAe,GAAG,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACvD,MAAM,wBAAwB,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC5D,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAChD,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;gBAC9D,MAAM,oBAAoB,GACxB,CAAC,eAAe;oBAChB,wBAAwB;oBACxB,gBAAgB;oBAChB,iBAAiB,CAAC;gBAEpB,IAAI,oBAAoB,EAAE,CAAC;oBACzB,uEAAuE;oBACvE,OAAO,CAAC,IAAI,CAAC;wBACX,OAAO,EAAE,IAAI;wBACb,KAAK,EAAE,IAAI,eAAE,CAAC,GAAG,CAAC;wBAClB,OAAO,EAAE,OAA0B;wBACnC,KAAK,EAAE,YAAY;wBACnB,OAAO;qBACR,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,gEAAgE;QAChE,gEAAgE;QAChE,2DAA2D;QAC3D,IAAI,uBAAA,IAAI,gDAAe,EAAE,CAAC;YACxB,MAAM,UAAU,GAAG,uBAAA,IAAI,gDAAe,MAAnB,IAAI,CAAiB,CAAC;YACzC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE;gBACvD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE;oBACnD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,EAAE;wBAChD,MAAM,cAAc,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;wBAClD,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,cAAc,IAAI,OAAO,EAAE,CAAC;wBACpE,MAAM,KAAK,GAAG,YAAY,KAAK,YAAY,CAAC;wBAC5C,MAAM,eAAe,GAAG,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;wBAC1D,MAAM,wBAAwB,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAc,CAAC,CAAC;wBACnE,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAc,CAAC,CAAC;wBACvD,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;wBAC9D,MAAM,oBAAoB,GACxB,CAAC,eAAe;4BAChB,wBAAwB;4BACxB,gBAAgB;4BAChB,iBAAiB,CAAC;wBAEpB,IAAI,KAAK,IAAI,oBAAoB,EAAE,CAAC;4BAClC,mBAAmB,CACjB,OAAO,CAAC,WAAW,EAAE,EACrB,OAAqB,EACrB,cAAc,CACf,CAAC;wBACJ,CAAC;oBACH,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QAED,sBAAsB;QACtB,OAAO,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;QAEhC,OAAO;YACL,QAAQ,EAAE,OAAO;YACjB,mBAAmB;YACnB,iBAAiB,EACf,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,GAAG,CAAC;gBACvC,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,SAAS;SAChB,CAAC;IACJ,CAAC;CACF;AAzbD,8DAybC;8QA5ZC,KAAK,yDACH,KAA2B;IAE3B,sEAAsE;IACtE,IAAI,CAAC,uBAAA,IAAI,8CAAa,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAuB,EAAE,CAAC;IAEvC,8BAA8B;IAC9B,MAAM,gBAAgB,GAA0C,EAAE,CAAC;IAEnE,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,IAAA,wBAAK,EAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE1C,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjC,CAAC;QACD,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAClD,CAAC;IAED,+BAA+B;IAC/B,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACpE,MAAM,UAAU,GAAG,OAAqB,CAAC;QAEzC,sEAAsE;QACtE,IACE,CAAC;YACC,2CAA8B,CAAC,OAAO;YACtC,2CAA8B,CAAC,KAAK;SACrC,CAAC,QAAQ,CAAC,UAA4C,CAAC,EACxD,CAAC;YACD,SAAS;QACX,CAAC;QAED,uDAAuD;QACvD,IAAI,CAAC,CAAC,UAAU,IAAI,8DAAmC,CAAC,EAAE,CAAC;YACzD,SAAS;QACX,CAAC;QAED,MAAM,eAAe,GAAG,8DAAmC,CAAC,UAAU,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,uBAAA,IAAI,8CAAa,MAAjB,IAAI,EAAc,UAAU,CAAC,CAAC;QAE/C,MAAM,GAAG,GAAG;YACV;gBACE,MAAM,EAAE;oBACN,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;iBAC9D;gBACD,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gBACjE,eAAe,EAAE,MAAM;gBACvB,IAAI,EAAE,UAAU;aACjB;YACD;gBACE,MAAM,EAAE;oBACN,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;iBAC7D;gBACD,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE;oBACP,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;iBAC7D;gBACD,eAAe,EAAE,MAAM;gBACvB,IAAI,EAAE,UAAU;aACjB;SACF,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,oBAAQ,CAAC,eAAe,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;YAE9D,8BAA8B;YAC9B,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;gBAChC,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,IAAA,gCAAa,EAAC,GAAG,EAAE,CACtC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAC5B,CAAC;oBAEF,IAAI,MAAM,IAAK,MAAoB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC1C,sDAAsD;wBACtD,MAAM,MAAM,GAAG,MAAM,IAAA,gCAAa,EAAC,GAAG,EAAE,CACtC,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CACjC,CAAC;wBAEF,IAAI,MAAM,EAAE,CAAC;4BACX,OAAO,CAAC,IAAI,CAAC;gCACX,OAAO,EAAE,IAAI;gCACb,KAAK,EAAE,IAAI,eAAE,CAAE,MAAoB,CAAC,QAAQ,EAAE,CAAC;gCAC/C,OAAO,EAAE,OAAO;gCAChB,KAAK,EAAE,QAAQ,CAAC,eAAe,CAAC;gCAChC,OAAO,EAAE,UAAU;6BACpB,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,yDAAyD;wBACzD,OAAO,CAAC,IAAI,CAAC;4BACX,OAAO,EAAE,IAAI;4BACb,KAAK,EAAE,IAAI,eAAE,CAAC,GAAG,CAAC;4BAClB,OAAO,EAAE,OAAO;4BAChB,KAAK,EAAE,QAAQ,CAAC,eAAe,CAAC;4BAChC,OAAO,EAAE,UAAU;yBACpB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,2CAA2C;oBAC3C,OAAO,CAAC,KAAK,CACX,qCAAqC,OAAO,GAAG,EAC/C,KAAK,CACN,CAAC;oBACF,OAAO,CAAC,IAAI,CAAC;wBACX,OAAO,EAAE,KAAK;wBACd,OAAO,EAAE,OAAO;wBAChB,KAAK,EAAE,QAAQ,CAAC,eAAe,CAAC;wBAChC,OAAO,EAAE,UAAU;qBACpB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,+CAA+C,OAAO,GAAG,EACzD,KAAK,CACN,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,6CAED,KAAK,mDACH,KAA2B,EAC3B,QAAiB;IAEjB,0EAA0E;IAC1E,IAAI,KAAK,CAAC,MAAM,IAAI,uBAAuB,EAAE,CAAC;QAC5C,OAAO,MAAM,IAAA,gDAAyB,EACpC,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAC3B,uBAAA,IAAI,2CAAU,EACd,QAAQ,CACT,CAAC;IACJ,CAAC;IASD,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC1D,MAAM,WAAW,GAAG,MAAM,IAAA,oCAAuB,EAG/C;QACA,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,uBAAuB;QAClC,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE;YACxC,MAAM,QAAQ,GAAG,MAAM,IAAA,gDAAyB,EAC9C,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAC3B,uBAAA,IAAI,2CAAU,EACd,QAAQ,CACT,CAAC;YACF,+CAA+C;YAC/C,IAAI,QAAQ,CAAC,mBAAmB,EAAE,CAAC;gBACjC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC/C,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,CACpC,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC1D,CAAC;QACD,aAAa,EAAE,EAAE;KAClB,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ,EAAE,WAAW;QACrB,mBAAmB,EAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC;KACxC,CAAC;AACpB,CAAC","sourcesContent":["import type { BigNumber } from '@ethersproject/bignumber';\nimport { Contract } from '@ethersproject/contracts';\nimport type { Web3Provider } from '@ethersproject/providers';\nimport {\n  safelyExecute,\n  safelyExecuteWithTimeout,\n  toHex,\n  toChecksumHexAddress,\n} from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { CaipAccountAddress, CaipChainId, Hex } from '@metamask/utils';\nimport { parseCaipChainId } from '@metamask/utils';\nimport BN from 'bn.js';\n\nimport { STAKING_CONTRACT_ADDRESS_BY_CHAINID } from '../AssetsContractController';\nimport {\n  accountAddressToCaipReference,\n  reduceInBatchesSerially,\n  SupportedStakedBalanceNetworks,\n} from '../assetsUtil';\nimport { SUPPORTED_NETWORKS_ACCOUNTS_API_V4 } from '../constants';\nimport { fetchMultiChainBalancesV4 } from './multi-chain-accounts';\nimport type { GetBalancesResponse } from './types';\n\n// Maximum number of account addresses that can be sent to the accounts API in a single request\nconst ACCOUNTS_API_BATCH_SIZE = 20;\n\n// Timeout for accounts API requests (10 seconds)\nconst ACCOUNTS_API_TIMEOUT_MS = 10_000;\n\nexport type ChainIdHex = Hex;\nexport type ChecksumAddress = Hex;\n\nexport type ProcessedBalance = {\n  success: boolean;\n  value?: BN;\n  account: ChecksumAddress | string;\n  token: ChecksumAddress;\n  chainId: ChainIdHex;\n};\n\n/**\n * Account -> ChainId -> TokenAddress[]\n */\nexport type UnprocessedTokens = {\n  [account: string]: {\n    [chainId: ChainIdHex]: string[];\n  };\n};\n\nexport type BalanceFetchResult = {\n  balances: ProcessedBalance[];\n  unprocessedChainIds?: ChainIdHex[];\n  unprocessedTokens?: UnprocessedTokens;\n};\n\nexport type BalanceFetcher = {\n  supports(chainId: ChainIdHex): boolean;\n  fetch(input: {\n    chainIds: ChainIdHex[];\n    queryAllAccounts: boolean;\n    selectedAccount: ChecksumAddress;\n    allAccounts: InternalAccount[];\n    jwtToken?: string;\n    unprocessedTokens?: UnprocessedTokens; // API Balance Fetcher does not process unprocessed tokens\n  }): Promise<BalanceFetchResult>;\n};\n\nconst checksum = (addr: string): ChecksumAddress =>\n  toChecksumHexAddress(addr) as ChecksumAddress;\n\nconst toCaipAccount = (\n  chainId: ChainIdHex,\n  account: ChecksumAddress,\n): CaipAccountAddress => accountAddressToCaipReference(chainId, account);\n\nexport type GetProviderFunction = (chainId: ChainIdHex) => Web3Provider;\n\nexport class AccountsApiBalanceFetcher implements BalanceFetcher {\n  readonly #platform: 'extension' | 'mobile' = 'extension';\n\n  readonly #getProvider?: GetProviderFunction;\n\n  readonly #getUserTokens?: () => {\n    [accountId: ChecksumAddress]: {\n      [chainId: ChainIdHex]: { [tokenAddress: ChecksumAddress]: unknown };\n    };\n  };\n\n  constructor(\n    platform: 'extension' | 'mobile' = 'extension',\n    getProvider?: GetProviderFunction,\n    getUserTokens?: () => {\n      [account: ChecksumAddress]: {\n        [chainId: ChainIdHex]: { [tokenAddress: ChecksumAddress]: unknown };\n      };\n    },\n  ) {\n    this.#platform = platform;\n    this.#getProvider = getProvider;\n    this.#getUserTokens = getUserTokens;\n  }\n\n  supports(chainId: ChainIdHex): boolean {\n    return SUPPORTED_NETWORKS_ACCOUNTS_API_V4.includes(chainId);\n  }\n\n  async #fetchStakedBalances(\n    addrs: CaipAccountAddress[],\n  ): Promise<ProcessedBalance[]> {\n    // Return empty array if no provider is available for blockchain calls\n    if (!this.#getProvider) {\n      return [];\n    }\n\n    const results: ProcessedBalance[] = [];\n\n    // Group addresses by chain ID\n    const addressesByChain: Record<ChainIdHex, ChecksumAddress[]> = {};\n\n    for (const caipAddr of addrs) {\n      const [, chainRef, address] = caipAddr.split(':');\n      const chainId = toHex(parseInt(chainRef, 10));\n      const checksumAddress = checksum(address);\n\n      if (!addressesByChain[chainId]) {\n        addressesByChain[chainId] = [];\n      }\n      addressesByChain[chainId].push(checksumAddress);\n    }\n\n    // Process each supported chain\n    for (const [chainId, addresses] of Object.entries(addressesByChain)) {\n      const chainIdHex = chainId as ChainIdHex;\n\n      // Only fetch staked balance on supported networks (mainnet and hoodi)\n      if (\n        ![\n          SupportedStakedBalanceNetworks.Mainnet,\n          SupportedStakedBalanceNetworks.Hoodi,\n        ].includes(chainIdHex as SupportedStakedBalanceNetworks)\n      ) {\n        continue;\n      }\n\n      // Only fetch staked balance if contract address exists\n      if (!(chainIdHex in STAKING_CONTRACT_ADDRESS_BY_CHAINID)) {\n        continue;\n      }\n\n      const contractAddress = STAKING_CONTRACT_ADDRESS_BY_CHAINID[chainIdHex];\n      const provider = this.#getProvider(chainIdHex);\n\n      const abi = [\n        {\n          inputs: [\n            { internalType: 'address', name: 'account', type: 'address' },\n          ],\n          name: 'getShares',\n          outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n          stateMutability: 'view',\n          type: 'function',\n        },\n        {\n          inputs: [\n            { internalType: 'uint256', name: 'shares', type: 'uint256' },\n          ],\n          name: 'convertToAssets',\n          outputs: [\n            { internalType: 'uint256', name: 'assets', type: 'uint256' },\n          ],\n          stateMutability: 'view',\n          type: 'function',\n        },\n      ];\n\n      try {\n        const contract = new Contract(contractAddress, abi, provider);\n\n        // Get shares for each address\n        for (const address of addresses) {\n          try {\n            const shares = await safelyExecute(() =>\n              contract.getShares(address),\n            );\n\n            if (shares && (shares as BigNumber).gt(0)) {\n              // Convert shares to assets (actual staked ETH amount)\n              const assets = await safelyExecute(() =>\n                contract.convertToAssets(shares),\n              );\n\n              if (assets) {\n                results.push({\n                  success: true,\n                  value: new BN((assets as BigNumber).toString()),\n                  account: address,\n                  token: checksum(contractAddress),\n                  chainId: chainIdHex,\n                });\n              }\n            } else {\n              // Return zero balance for accounts with no staked assets\n              results.push({\n                success: true,\n                value: new BN('0'),\n                account: address,\n                token: checksum(contractAddress),\n                chainId: chainIdHex,\n              });\n            }\n          } catch (error) {\n            // Log error and continue with next address\n            console.error(\n              `Error fetching staked balance for ${address}:`,\n              error,\n            );\n            results.push({\n              success: false,\n              account: address,\n              token: checksum(contractAddress),\n              chainId: chainIdHex,\n            });\n          }\n        }\n      } catch (error) {\n        console.error(\n          `Error setting up staking contract for chain ${chainId}:`,\n          error,\n        );\n      }\n    }\n\n    return results;\n  }\n\n  async #fetchBalances(\n    addrs: CaipAccountAddress[],\n    jwtToken?: string,\n  ): Promise<GetBalancesResponse> {\n    // If we have fewer than or equal to the batch size, make a single request\n    if (addrs.length <= ACCOUNTS_API_BATCH_SIZE) {\n      return await fetchMultiChainBalancesV4(\n        { accountAddresses: addrs },\n        this.#platform,\n        jwtToken,\n      );\n    }\n\n    // Otherwise, batch the requests to respect the 50-element limit\n    type BalanceData = Awaited<\n      ReturnType<typeof fetchMultiChainBalancesV4>\n    >['balances'][number];\n\n    type ResponseData = Awaited<ReturnType<typeof fetchMultiChainBalancesV4>>;\n\n    const allUnprocessedNetworks = new Set<number | string>();\n    const allBalances = await reduceInBatchesSerially<\n      CaipAccountAddress,\n      BalanceData[]\n    >({\n      values: addrs,\n      batchSize: ACCOUNTS_API_BATCH_SIZE,\n      eachBatch: async (workingResult, batch) => {\n        const response = await fetchMultiChainBalancesV4(\n          { accountAddresses: batch },\n          this.#platform,\n          jwtToken,\n        );\n        // Collect unprocessed networks from each batch\n        if (response.unprocessedNetworks) {\n          response.unprocessedNetworks.forEach((network) =>\n            allUnprocessedNetworks.add(network),\n          );\n        }\n        return [...(workingResult || []), ...response.balances];\n      },\n      initialResult: [],\n    });\n\n    return {\n      balances: allBalances,\n      unprocessedNetworks: Array.from(allUnprocessedNetworks),\n    } as ResponseData;\n  }\n\n  async fetch({\n    chainIds,\n    queryAllAccounts,\n    selectedAccount,\n    allAccounts,\n    jwtToken,\n  }: Parameters<BalanceFetcher['fetch']>[0]): Promise<BalanceFetchResult> {\n    const caipAddrs: CaipAccountAddress[] = [];\n\n    for (const chainId of chainIds.filter((chain) => this.supports(chain))) {\n      if (queryAllAccounts) {\n        allAccounts.forEach((a) =>\n          caipAddrs.push(toCaipAccount(chainId, a.address as ChecksumAddress)),\n        );\n      } else {\n        caipAddrs.push(toCaipAccount(chainId, selectedAccount));\n      }\n    }\n\n    if (!caipAddrs.length) {\n      return { balances: [] };\n    }\n\n    // Let errors propagate to TokenBalancesController for RPC fallback\n    // Use timeout to prevent hanging API calls (30 seconds)\n    const apiResponse = await safelyExecuteWithTimeout(\n      () => this.#fetchBalances(caipAddrs, jwtToken),\n      false, // don't log error here, let it propagate\n      ACCOUNTS_API_TIMEOUT_MS,\n    );\n\n    // If API call timed out or failed, throw error to trigger RPC fallback\n    if (!apiResponse) {\n      throw new Error('Accounts API request timed out or failed');\n    }\n\n    // Extract unprocessed networks and convert to hex chain IDs\n    // V4 API returns CAIP chain IDs like 'eip155:1329', need to parse them\n    // V2 API returns decimal numbers, handle both cases\n    const unprocessedChainIds: ChainIdHex[] | undefined = apiResponse\n      .unprocessedNetworks?.length\n      ? apiResponse.unprocessedNetworks.map((network) => {\n          if (typeof network === 'string') {\n            // CAIP chain ID format: 'eip155:1329'\n            return toHex(parseCaipChainId(network as CaipChainId).reference);\n          }\n          // Decimal number format\n          return toHex(network);\n        })\n      : undefined;\n\n    const stakedBalances = await this.#fetchStakedBalances(caipAddrs);\n\n    const results: ProcessedBalance[] = [];\n\n    // Collect all unique addresses and chains from the CAIP addresses\n    const addressChainMap = new Map<string, Set<ChainIdHex>>();\n    caipAddrs.forEach((caipAddr) => {\n      const [, chainRef, address] = caipAddr.split(':');\n      const chainId = toHex(parseInt(chainRef, 10));\n      const checksumAddress = checksum(address);\n\n      if (!addressChainMap.has(checksumAddress)) {\n        addressChainMap.set(checksumAddress, new Set());\n      }\n      addressChainMap.get(checksumAddress)?.add(chainId);\n    });\n\n    // Ensure native token entries exist for all addresses on all requested chains\n    const ZERO_ADDRESS =\n      '0x0000000000000000000000000000000000000000' as ChecksumAddress;\n    const nativeBalancesFromAPI = new Map<string, BN>(); // key: `${accountAddress}-${chainId}`\n    const nonNativeBalancesFromAPI = new Map<string, BN>(); // key: `${accountAddress}-${tokenAddress}-${chainId}`\n\n    // Process regular API balances\n    if (apiResponse.balances) {\n      const apiBalances = apiResponse.balances.flatMap(\n        (b: GetBalancesResponse['balances'][number]) => {\n          const addressPart = b.accountAddress?.split(':')[2];\n          if (!addressPart) {\n            return [];\n          }\n          const account = checksum(addressPart);\n          const token = checksum(b.address);\n          // Use original address for zero address tokens, checksummed for others\n          // TODO: this is a hack to get the correct account address type but needs to be fixed\n          // by mgrating tokenBalancesController to checksum addresses\n          const finalAccount: ChecksumAddress | string =\n            token === ZERO_ADDRESS ? account : addressPart;\n          const chainId = toHex(b.chainId);\n\n          let value: BN | undefined;\n          try {\n            // Convert string balance to BN avoiding floating point precision issues\n            const { balance: balanceStr, decimals } = b;\n\n            // Split the balance string into integer and decimal parts\n            const [integerPart = '0', decimalPart = ''] = balanceStr.split('.');\n\n            // Pad or truncate decimal part to match token decimals\n            const paddedDecimalPart = decimalPart\n              .padEnd(decimals, '0')\n              .slice(0, decimals);\n\n            // Combine and create BN\n            const fullIntegerStr = integerPart + paddedDecimalPart;\n            value = new BN(fullIntegerStr);\n          } catch {\n            value = undefined;\n          }\n\n          // Track native balances for later\n          if (token === ZERO_ADDRESS && value !== undefined) {\n            nativeBalancesFromAPI.set(`${finalAccount}-${chainId}`, value);\n          }\n\n          if (token !== ZERO_ADDRESS && value !== undefined) {\n            nonNativeBalancesFromAPI.set(\n              `${finalAccount.toLowerCase()}-${token.toLowerCase()}-${chainId}`,\n              value,\n            );\n          }\n\n          return [\n            {\n              success: value !== undefined,\n              value,\n              account: finalAccount,\n              token,\n              chainId,\n            },\n          ];\n        },\n      );\n      results.push(...apiBalances);\n    }\n\n    const isAccountIncludedInRequest = (address: string): boolean =>\n      queryAllAccounts\n        ? allAccounts.some(\n            (currentAccount) =>\n              currentAccount.address.toLowerCase() === address.toLowerCase(),\n          )\n        : selectedAccount.toLowerCase() === address.toLowerCase();\n\n    const unprocessedTokens: UnprocessedTokens = {};\n\n    const addUnprocessedToken = (\n      account: string,\n      chainId: ChainIdHex,\n      tokenAddress: string,\n    ): void => {\n      unprocessedTokens[account] ??= {};\n      const accountUnprocessedTokensByChain = unprocessedTokens[account];\n      accountUnprocessedTokensByChain[chainId] ??= [];\n      const accountUnprocessedTokens = accountUnprocessedTokensByChain[chainId];\n      if (!accountUnprocessedTokens.includes(tokenAddress)) {\n        accountUnprocessedTokens.push(tokenAddress);\n      }\n    };\n\n    // Add zero native balance entries for addresses that API didn't return\n    addressChainMap.forEach((chains, address) => {\n      chains.forEach((chainId) => {\n        const key = `${address}-${chainId}`;\n        const existingBalance = nativeBalancesFromAPI.get(key);\n        const isChainIncludedInRequest = chainIds.includes(chainId);\n        const isChainSupported = this.supports(chainId);\n        const isAccountIncluded = isAccountIncludedInRequest(address);\n        const shouldZeroOutBalance =\n          !existingBalance &&\n          isChainIncludedInRequest &&\n          isChainSupported &&\n          isAccountIncluded;\n\n        if (shouldZeroOutBalance) {\n          // Add zero native balance entry if API succeeded but didn't return one\n          results.push({\n            success: true,\n            value: new BN('0'),\n            account: address as ChecksumAddress,\n            token: ZERO_ADDRESS,\n            chainId,\n          });\n        }\n      });\n    });\n\n    // Track ERC-20 balances that were not returned by Accounts API.\n    // These can then be fetched by a fallback fetcher (RPC) without\n    // overwriting potentially stale balances with zero values.\n    if (this.#getUserTokens) {\n      const userTokens = this.#getUserTokens();\n      Object.entries(userTokens).forEach(([account, chains]) => {\n        Object.entries(chains).forEach(([chainId, tokens]) => {\n          Object.entries(tokens).forEach(([tokenAddress]) => {\n            const tokenLowerCase = tokenAddress.toLowerCase();\n            const key = `${account.toLowerCase()}-${tokenLowerCase}-${chainId}`;\n            const isERC = tokenAddress !== ZERO_ADDRESS;\n            const existingBalance = nonNativeBalancesFromAPI.get(key);\n            const isChainIncludedInRequest = chainIds.includes(chainId as Hex);\n            const isChainSupported = this.supports(chainId as Hex);\n            const isAccountIncluded = isAccountIncludedInRequest(account);\n            const shouldZeroOutBalance =\n              !existingBalance &&\n              isChainIncludedInRequest &&\n              isChainSupported &&\n              isAccountIncluded;\n\n            if (isERC && shouldZeroOutBalance) {\n              addUnprocessedToken(\n                account.toLowerCase(),\n                chainId as ChainIdHex,\n                tokenLowerCase,\n              );\n            }\n          });\n        });\n      });\n    }\n\n    // Add staked balances\n    results.push(...stakedBalances);\n\n    return {\n      balances: results,\n      unprocessedChainIds,\n      unprocessedTokens:\n        Object.keys(unprocessedTokens).length > 0\n          ? unprocessedTokens\n          : undefined,\n    };\n  }\n}\n"]}