{"version":3,"file":"balances.cjs","sourceRoot":"","sources":["../src/balances.ts"],"names":[],"mappings":";;;AAAA,uDAA4D;AAI5D,uDAAyD;AAIzD,2CAKyB;AAEzB,6EAAiF;AAKjF,oEAAyE;AA2BzE,MAAM,uBAAuB,GAAG;IAC9B,IAAI,EAAE,sBAAsB;IAC5B,IAAI,EAAE,sBAAsB;IAC5B,KAAK,EAAE,uBAAuB;CACtB,CAAC;AAEX,MAAM,0BAA0B,GAAG;IACjC,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,KAAK;IACX,KAAK,EAAE,MAAM;CACd,CAAC;AAWF,MAAM,mBAAmB,GAAG,CAC1B,GAAwD,EACxD,EAAqB,EACZ,EAAE;IACX,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAA,yBAAiB,EAAC,EAAE,CAAC,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,0BAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,wBAAgB,EAAC,EAAE,CAAC,CAAC;IAC3C,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,2BAA2B,GAAG,CAClC,gBAA4C,EAC5C,aAAsC,EACtC,OAAe,EACI,EAAE;IACrB,MAAM,QAAQ,GAAG,IAAA,iCAAmB,EAAC,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACxD,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,OAAyB,CAAC,CAAC;IACvD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC,QAAQ;SAClB,GAAG,CACF,CAAC,SAAiB,EAAE,EAAE,CAAC,aAAa,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAC1E;SACA,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,KAAc,EAAmB,EAAE,CACzD,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAUpD;;;;;;;;;;;GAWG;AACH,SAAS,mBAAmB,CAC1B,OAAwB,EACxB,kBAAgD,EAChD,WAAkC,EAClC,eAA0C,EAC1C,iBAAoC,EACpC,iBAA4C,EAC5C,8BAGC;IAED,MAAM,YAAY,GAAG,4CAAmD,CAAC;IACzE,MAAM,eAAe,GACnB,kBAAkB,CAAC,aAAa,CAAC,OAAO,CAAC,OAAc,CAAC,IAAI,EAAE,CAAC;IAEjE,OAAO,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC;SACnC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAc,CAAC,CAAC;SACxD,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,EAAE,CACpC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9D,OAAO,EAAE,OAAc;QACvB,YAAY,EAAE,YAAmB;QACjC,OAAO;KACR,CAAC,CAAC,CACJ;SACA,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE;QACpB,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC;QAExD,MAAM,sBAAsB,GAC1B,8DAAmC,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,YAAY,KAAK,YAAY,CAAC;QAC/C,MAAM,cAAc,GAAG,sBAAsB;YAC3C,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,KAAK,sBAAsB,CAAC,WAAW,EAAE;YACrE,CAAC,CAAC,KAAK,CAAC;QAEV,qEAAqE;QACrE,IAAI,CAAC,QAAQ,IAAI,CAAC,cAAc,EAAE,CAAC;YACjC,MAAM,aAAa,GACjB,WAAW,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,YAAY,CAAC,CAAC;YACrE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,MAAM,iBAAiB,GACrB,QAAQ,IAAI,cAAc;YACxB,CAAC,CAAC,IAAA,iCAAqB,EAAC,OAAO,CAAC;YAChC,CAAC,CAAC,YAAY,CAAC;QACnB,MAAM,eAAe,GACnB,eAAe,EAAE,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC;QAE9D,uEAAuE;QACvE,oDAAoD;QACpD,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,CAAC,QAAQ,IAAI,cAAc,CAAC,EAAE,CAAC;YAC5D,MAAM,cAAc,GAClB,8BAA8B,EAAE,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;YAC5D,MAAM,YAAY,GAAG,cAAc;gBACjC,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,cAAc;gBACjE,CAAC,CAAC,SAAS,CAAC;YACd,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,CAAC;gBACpC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,iBAAiB,GACrB,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,YAAY,CAAC;YAErD,OAAO;gBACL,iBAAiB;gBACjB,eAAe,EAAE,eAAe,IAAI,IAAI;aACzC,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,sBAAsB;QACtB,MAAM,gBAAgB,GACpB,iBAAiB,CAAC,aAAa,CAAC,eAAe,CAAC,QAAQ,CAAC;YACvD,EAAE,cAAc,CAAC;QACrB,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,mBAAmB;QACnB,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,QAAQ,IAAI,CAAC,cAAc,EAAE,CAAC;YACjC,MAAM,aAAa,GACjB,WAAW,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,YAAY,CAAC,CAAC;YACrE,QAAQ,GAAG,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,CAAC;QACD,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,iBAAiB,GACrB,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACzC,eAAe,CAAC,KAAK;YACrB,gBAAgB,CAAC;QAEnB,OAAO;YACL,iBAAiB;YACjB,eAAe,EAAE,sCAAsC;SACxD,CAAC;IACJ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,IAAI,EAAoC,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACvE,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,sBAAsB,CAC7B,OAAwB,EACxB,uBAA0D,EAC1D,qBAAsD,EACtD,oBAA0D,EAC1D,mBAAwD;IAExD,MAAM,eAAe,GAAG,uBAAuB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IAC3E,MAAM,aAAa,GACjB,qBAAqB,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IAE3D,OAAO,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC;SACnC,MAAM,CACL,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CACZ,mBAAmB,CAAC,OAAwB,CAAC;QAC7C,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAwB,CAAC,CACpD;SACA,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,EAAE;QAC9B,MAAM,aAAa,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,cAAc,GAClB,oBAAoB,CAAC,eAAe,CAAC,OAAwB,CAAC,CAAC;QACjE,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,mBAAmB,GAAG,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,iBAAiB,GAAG,aAAa,GAAG,mBAAmB,CAAC;QAE9D,OAAO;YACL,OAAO,EAAE,OAAwB;YACjC,iBAAiB;YACjB,cAAc,EAAE,sCAAsC;SACvD,CAAC;IACJ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,IAAI,EAAoC,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACvE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,kCAAkC,CACzC,OAAwB,EACxB,kBAAgD,EAChD,WAAkC,EAClC,eAA0C,EAC1C,iBAAoC,EACpC,iBAA4C,EAC5C,8BAGC;IAED,MAAM,aAAa,GAAG,mBAAmB,CACvC,OAAO,EACP,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,8BAA8B,CAC/B,CAAC;IACF,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;AACpE,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,qCAAqC,CAC5C,OAAwB,EACxB,uBAA0D,EAC1D,qBAAsD,EACtD,oBAA0D,EAC1D,mBAAwD;IAExD,MAAM,aAAa,GAAG,sBAAsB,CAC1C,OAAO,EACP,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,CACpB,CAAC;IAEF,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;AACpE,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,6BAA6B,CAC3C,gBAA4C,EAC5C,aAAsC,EACtC,kBAAgD,EAChD,eAA0C,EAC1C,oBAA0D,EAC1D,uBAA0D,EAC1D,qBAAsD,EACtD,WAAkC,EAClC,iBAAoC,EACpC,iBAAsE,EACtE,8BAGC;IAED,MAAM,iBAAiB,GAAG,CAAC,OAAY,EAAW,EAAE,CAClD,mBAAmB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAElD,MAAM,mBAAmB,GAAG,CAAC,OAAsB,EAAW,EAAE,CAC9D,mBAAmB,CAAC,iBAAiB,EAAE,IAAA,0BAAkB,EAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;IAE9E,MAAM,UAAU,GAAG;QACjB,GAAG,EAAE,CAAC,OAAwB,EAAE,EAAE,CAChC,kCAAkC,CAChC,OAAO,EACP,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,8BAA8B,CAC/B;QACH,MAAM,EAAE,CAAC,OAAwB,EAAE,EAAE,CACnC,qCAAqC,CACnC,OAAO,EACP,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,CACpB;KACJ,CAAC;IAEF,MAAM,sBAAsB,GAAG,GAAG,EAAE,CAClC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,WAAW,CAAC,OAAO,IAAI,EAAE,CAAC;SACvD,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAC9B,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACpD,MAAM,QAAQ,GAAG,2BAA2B,CAC1C,gBAAgB,EAChB,aAAa,EACb,OAAO,CACR,CAAC;QAEF,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAChC,QAAQ;YACR,OAAO;YACP,OAAO;YACP,KAAK,EAAE,IAAA,8BAAgB,EAAC,OAAO,CAAC,IAAI,CAAC;SACtC,CAAC,CAAC,CAAC;IACN,CAAC,CAAC,CACH;SACA,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE;QACnB,MAAM,sBAAsB,GAAG,WAE9B,CAAC;QACF,sBAAsB,CAAC,OAAO,GAAG,WAAW,CAAC,KAAK;YAChD,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC;YACrC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3C,OAAO,sBAAsB,CAAC;IAChC,CAAC,CAAC,CAAC;IAEP,MAAM,mBAAmB,GAAG,CAC1B,mBAA8D,EACtD,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAEpE,MAAM,iBAAiB,GAAG,CACxB,mBAA8D,EAC/B,EAAE;QACjC,MAAM,OAAO,GAAkC,EAAE,CAAC;QAClD,MAAM,oBAAoB,GAAG,CAAC,QAAgB,EAAiB,EAAE,CAAC,CAAC;YACjE,QAAQ;YACR,MAAM,EAAE,EAAE;YACV,0BAA0B,EAAE,CAAC;YAC7B,YAAY,EAAE,iBAAiB,CAAC,eAAe;SAChD,CAAC,CAAC;QACH,MAAM,mBAAmB,GAAG,CAC1B,QAAgB,EAChB,OAAe,EACM,EAAE,CAAC,CAAC;YACzB,QAAQ;YACR,OAAO;YACP,0BAA0B,EAAE,CAAC;YAC7B,YAAY,EAAE,iBAAiB,CAAC,eAAe;SAChD,CAAC,CAAC;QAEH,mBAAmB,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;;YAC1C,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC;YACnD,OAAO,CAAC,QAAQ,MAAhB,OAAO,CAAC,QAAQ,IAAM,oBAAoB,CAAC,QAAQ,CAAC,EAAC;YACrD,MAAA,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAC,OAAO,SAAP,OAAO,IAAM,mBAAmB,CACvD,QAAQ,EACR,OAAO,CACR,EAAC;YACF,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,0BAA0B,IAAI,OAAO,CAAC;YACxE,OAAO,CAAC,QAAQ,CAAC,CAAC,0BAA0B,IAAI,OAAO,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,2DAA2D;QAC3D,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,WAAW,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CAChE,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE;YACrB,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO;YACT,CAAC;YACD,OAAO,CAAC,QAAQ,MAAhB,OAAO,CAAC,QAAQ,IAAM,oBAAoB,CAAC,QAAQ,CAAC,EAAC;YACrD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;;gBACnD,MAAA,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAC,OAAO,SAAP,OAAO,IAAM,mBAAmB,CACvD,QAAQ,EACR,OAAO,CACR,EAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CACF,CAAC;QAEF,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,sBAAsB,EAAE,CAAC;IAC9C,OAAO;QACL,OAAO,EAAE,iBAAiB,CAAC,YAAY,CAAC;QACxC,0BAA0B,EAAE,mBAAmB,CAAC,YAAY,CAAC;QAC7D,YAAY,EAAE,iBAAiB,CAAC,eAAe;KAChD,CAAC;AACJ,CAAC;AAnID,sEAmIC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAgB,mCAAmC,CACjD,gBAA4C,EAC5C,aAAsC,EACtC,kBAAgD,EAChD,eAA0C,EAC1C,oBAA0D,EAC1D,uBAA0D,EAC1D,qBAAsD,EACtD,WAAkC,EAClC,iBAAoC,EACpC,iBAAsE,EACtE,MAA2B,EAC3B,8BAGC;IAED,MAAM,iBAAiB,GAAG,CAAC,OAAY,EAAW,EAAE,CAClD,mBAAmB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAElD,MAAM,mBAAmB,GAAG,CAAC,OAAsB,EAAW,EAAE;QAC9D,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,0BAAkB,EAAC,OAAO,CAAC,CAAC;QAChD,OAAO,mBAAmB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG;QACvB,GAAG,EAAE,CAAC,OAAwB,EAAE,EAAE,CAChC,4BAA4B,CAC1B,OAAO,EACP,MAAM,EACN,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,8BAA8B,CAC/B;QACH,MAAM,EAAE,CAAC,OAAwB,EAAE,EAAE,CACnC,+BAA+B,CAC7B,OAAO,EACP,MAAM,EACN,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,CACpB;KACJ,CAAC;IAEF,MAAM,qBAAqB,GAAG,GAAG,EAAE,CACjC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,WAAW,CAAC,OAAO,IAAI,EAAE,CAAC;SACvD,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAC9B,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACpD,MAAM,QAAQ,GAAG,2BAA2B,CAC1C,gBAAgB,EAChB,aAAa,EACb,OAAO,CACR,CAAC;QACF,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAChC,QAAQ;YACR,OAAO;YACP,OAAO;YACP,KAAK,EAAE,IAAA,8BAAgB,EAAC,OAAO,CAAC,IAAI,CAAC;SACtC,CAAC,CAAC,CAAC;IACN,CAAC,CAAC,CACH;SACA,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE;QACnB,MAAM,qBAAqB,GAAG,WAG7B,CAAC;QAEF,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK;YAC9B,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC;YAC3C,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAEjD,qBAAqB,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/C,qBAAqB,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACjD,OAAO,qBAAqB,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEP,MAAM,mBAAmB,GAAG,CAC1B,kBAA4D,EAC5D,EAAE;QACF,OAAO,kBAAkB,CAAC,MAAM,CAC9B,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;YAClB,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;YAClC,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;YACpC,OAAO,MAAM,CAAC;QAChB,CAAC,EACD,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAC5B,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,qBAAqB,EAAE,CAAC;IACnD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;IACjE,MAAM,YAAY,GAAG,gBAAgB,CAAC,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC;IAC1E,MAAM,aAAa,GACjB,gBAAgB,CAAC,QAAQ,KAAK,CAAC;QAC7B,CAAC,CAAC,CAAC,YAAY,GAAG,gBAAgB,CAAC,QAAQ,CAAC,GAAG,GAAG;QAClD,CAAC,CAAC,CAAC,CAAC;IAER,OAAO;QACL,MAAM;QACN,0BAA0B,EAAE,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvE,2BAA2B,EAAE,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACzE,0BAA0B,EAAE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3D,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/C,YAAY,EAAE,iBAAiB,CAAC,eAAe;KAChD,CAAC;AACJ,CAAC;AA7GD,kFA6GC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,4BAA4B,CACnC,OAAwB,EACxB,MAA2B,EAC3B,kBAAgD,EAChD,WAAkC,EAClC,eAA0C,EAC1C,iBAAoC,EACpC,iBAA4C,EAC5C,8BAGC;IAED,MAAM,aAAa,GAAG,mBAAmB,CACvC,OAAO,EACP,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,8BAA8B,CAC/B,CAAC;IAEF,MAAM,YAAY,GAAG,aAAa;SAC/B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,UAAU,GACd,KAAK,CAAC,eAAe,EAAE,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,wEAAwE;YACxE,uCAAuC;YACvC,IAAI,KAAK,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;gBACnC,OAAO;oBACL,OAAO,EAAE,KAAK,CAAC,iBAAiB;oBAChC,QAAQ,EAAE,KAAK,CAAC,iBAAiB;iBAClC,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,iBAAiB;YAChC,QAAQ,EAAE,KAAK,CAAC,iBAAiB,GAAG,KAAK;SAC1C,CAAC;IACJ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,MAAM,EAAwC,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;IAE7E,OAAO,YAAY,CAAC,MAAM,CACxB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;QACjB,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;QACjC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;QACnC,OAAO,MAAM,CAAC;IAChB,CAAC,EACD,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAC5B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,+BAA+B,CACtC,OAAwB,EACxB,MAA2B,EAC3B,uBAA0D,EAC1D,qBAAsD,EACtD,oBAA0D,EAC1D,mBAAwD;IAExD,MAAM,aAAa,GAAG,sBAAsB,CAC1C,OAAO,EACP,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,CACpB,CAAC;IAEF,MAAM,YAAY,GAAG,aAAa;SAC/B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,kEAAkE;QAClE,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,EAAE,UAAU,CAAC;QACpD,MAAM,kBAAkB,GAAG,UAAU,EAAE,kBAAkB,CAAC;QAC1D,MAAM,UAAU,GACd,kBAAkB,EAAE,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC,CAAC;QAE3D,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,iBAAiB;YAChC,QAAQ,EAAE,KAAK,CAAC,iBAAiB,GAAG,KAAK;SAC1C,CAAC;IACJ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,MAAM,EAAwC,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;IAE7E,OAAO,YAAY,CAAC,MAAM,CACxB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;QACxC,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ;KAC5C,CAAC,EACF,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAC5B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,qCAAqC,CACnD,gBAA4C,EAC5C,aAAsC,EACtC,kBAAgD,EAChD,eAA0C,EAC1C,oBAA0D,EAC1D,uBAA0D,EAC1D,qBAAsD,EACtD,WAAkC,EAClC,iBAAoC,EACpC,iBAAsE,EACtE,OAAe,EACf,MAA2B,EAC3B,8BAGC;IAED,MAAM,iBAAiB,GAAG,CAAC,OAAY,EAAW,EAAE,CAClD,mBAAmB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAElD,MAAM,mBAAmB,GAAG,CAAC,OAAsB,EAAW,EAAE;QAC9D,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,0BAAkB,EAAC,OAAO,CAAC,CAAC;QAChD,OAAO,mBAAmB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG;QACvB,GAAG,EAAE,CAAC,OAAwB,EAAE,EAAE,CAChC,4BAA4B,CAC1B,OAAO,EACP,MAAM,EACN,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,8BAA8B,CAC/B;QACH,MAAM,EAAE,CAAC,OAAwB,EAAE,EAAE,CACnC,+BAA+B,CAC7B,OAAO,EACP,MAAM,EACN,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,CACpB;KACJ,CAAC;IAEF,MAAM,qBAAqB,GAAG,GAAG,EAAE;QACjC,MAAM,QAAQ,GAAG,2BAA2B,CAC1C,gBAAgB,EAChB,aAAa,EACb,OAAO,CACR,CAAC;QACF,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAChC,OAAO;YACP,KAAK,EAAE,IAAA,8BAAgB,EAAC,OAAO,CAAC,IAAI,CAAC;SACtC,CAAC,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,CAC1B,kBAA4D,EAC5D,EAAE;QACF,OAAO,kBAAkB,CAAC,MAAM,CAC9B,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,KAAK;gBAClB,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC;gBAC/B,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;YACjC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;YACnC,OAAO,MAAM,CAAC;QAChB,CAAC,EACD,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAC5B,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,qBAAqB,EAAE,CAAC;IACnD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;IAEjE,MAAM,YAAY,GAAG,gBAAgB,CAAC,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC;IAC1E,MAAM,aAAa,GACjB,gBAAgB,CAAC,QAAQ,KAAK,CAAC;QAC7B,CAAC,CAAC,CAAC,YAAY,GAAG,gBAAgB,CAAC,QAAQ,CAAC,GAAG,GAAG;QAClD,CAAC,CAAC,CAAC,CAAC;IAER,OAAO;QACL,MAAM;QACN,0BAA0B,EAAE,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvE,2BAA2B,EAAE,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACzE,0BAA0B,EAAE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3D,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/C,YAAY,EAAE,iBAAiB,CAAC,eAAe;KAChD,CAAC;AACJ,CAAC;AA9FD,sFA8FC","sourcesContent":["import { parseAccountGroupId } from '@metamask/account-api';\nimport type { AccountGroupId } from '@metamask/account-api';\nimport type { AccountTreeControllerState } from '@metamask/account-tree-controller';\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\nimport { isEvmAccountType } from '@metamask/keyring-api';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { Hex } from '@metamask/utils';\nimport type { CaipAssetType, CaipChainId } from '@metamask/utils';\nimport {\n  KnownCaipNamespace,\n  parseCaipAssetType,\n  parseCaipChainId,\n  isStrictHexString,\n} from '@metamask/utils';\n\nimport { STAKING_CONTRACT_ADDRESS_BY_CHAINID } from './AssetsContractController';\nimport type { CurrencyRateState } from './CurrencyRateController';\nimport type { MultichainAssetsControllerState } from './MultichainAssetsController';\nimport type { MultichainAssetsRatesControllerState } from './MultichainAssetsRatesController';\nimport type { MultichainBalancesControllerState } from './MultichainBalancesController';\nimport { getNativeTokenAddress } from './token-prices-service/codefi-v2';\nimport type { TokenBalancesControllerState } from './TokenBalancesController';\nimport type { TokenRatesControllerState } from './TokenRatesController';\nimport type { TokensControllerState } from './TokensController';\n\nexport type AccountGroupBalance = {\n  walletId: string;\n  groupId: string;\n  totalBalanceInUserCurrency: number;\n  userCurrency: string;\n};\n\nexport type WalletBalance = {\n  walletId: string;\n  groups: Record<string, AccountGroupBalance>;\n  totalBalanceInUserCurrency: number;\n  userCurrency: string;\n};\n\nexport type AllWalletsBalance = {\n  wallets: Record<string, WalletBalance>;\n  totalBalanceInUserCurrency: number;\n  userCurrency: string;\n};\n\nexport type BalanceChangePeriod = '1d' | '7d' | '30d';\n\nconst evmRatePropertiesRecord = {\n  '1d': 'pricePercentChange1d',\n  '7d': 'pricePercentChange7d',\n  '30d': 'pricePercentChange30d',\n} as const;\n\nconst nonEvmRatePropertiesRecord = {\n  '1d': 'P1D',\n  '7d': 'P7D',\n  '30d': 'P30D',\n};\n\nexport type BalanceChangeResult = {\n  period: BalanceChangePeriod;\n  currentTotalInUserCurrency: number;\n  previousTotalInUserCurrency: number;\n  amountChangeInUserCurrency: number;\n  percentChange: number;\n  userCurrency: string;\n};\n\nconst isChainEnabledByMap = (\n  map: Record<string, Record<string, boolean>> | undefined,\n  id: Hex | CaipChainId,\n): boolean => {\n  if (!map) {\n    return true;\n  }\n  if (isStrictHexString(id)) {\n    return Boolean(map[KnownCaipNamespace.Eip155]?.[id]);\n  }\n  const { namespace } = parseCaipChainId(id);\n  return Boolean(map[namespace]?.[id]);\n};\n\nconst getInternalAccountsForGroup = (\n  accountTreeState: AccountTreeControllerState,\n  accountsState: AccountsControllerState,\n  groupId: string,\n): InternalAccount[] => {\n  const walletId = parseAccountGroupId(groupId).wallet.id;\n  const wallet = accountTreeState.accountTree.wallets[walletId];\n  if (!wallet) {\n    return [];\n  }\n  const group = wallet.groups[groupId as AccountGroupId];\n  if (!group) {\n    return [];\n  }\n  return group.accounts\n    .map(\n      (accountId: string) => accountsState.internalAccounts.accounts[accountId],\n    )\n    .filter(Boolean);\n};\n\nconst isNonNaNNumber = (value: unknown): value is number =>\n  typeof value === 'number' && !Number.isNaN(value);\n\n/**\n * Minimal network config shape needed to derive native currency by chain.\n * Compatible with NetworkController's networkConfigurationsByChainId entries.\n */\nexport type NetworkConfigurationNativeCurrency = {\n  nativeCurrency: string;\n};\n\n/**\n * Combined function that gets valid token balances with calculation data\n *\n * @param account - Internal account.\n * @param tokenBalancesState - Token balances state.\n * @param tokensState - Tokens state.\n * @param tokenRatesState - Token rates state.\n * @param currencyRateState - Currency rate state.\n * @param isEvmChainEnabled - Predicate to check EVM chain enablement.\n * @param networkConfigurationsByChainId - Network configurations keyed by chain ID, used to look up native currency for fallback pricing.\n * @returns token calculation data\n */\nfunction getEvmTokenBalances(\n  account: InternalAccount,\n  tokenBalancesState: TokenBalancesControllerState,\n  tokensState: TokensControllerState,\n  tokenRatesState: TokenRatesControllerState,\n  currencyRateState: CurrencyRateState,\n  isEvmChainEnabled: (chainId: Hex) => boolean,\n  networkConfigurationsByChainId?: Record<\n    Hex,\n    NetworkConfigurationNativeCurrency\n  >,\n) {\n  const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as Hex;\n  const accountBalances =\n    tokenBalancesState.tokenBalances[account.address as Hex] ?? {};\n\n  return Object.entries(accountBalances)\n    .filter(([chainId]) => isEvmChainEnabled(chainId as Hex))\n    .flatMap(([chainId, chainBalances]) =>\n      Object.entries(chainBalances).map(([tokenAddress, balance]) => ({\n        chainId: chainId as Hex,\n        tokenAddress: tokenAddress as Hex,\n        balance,\n      })),\n    )\n    .map((tokenBalance) => {\n      const { chainId, tokenAddress, balance } = tokenBalance;\n\n      const stakingContractAddress =\n        STAKING_CONTRACT_ADDRESS_BY_CHAINID[chainId];\n      const isNative = tokenAddress === ZERO_ADDRESS;\n      const isStakedNative = stakingContractAddress\n        ? tokenAddress.toLowerCase() === stakingContractAddress.toLowerCase()\n        : false;\n\n      // Get Token Info (skip allTokens check for native and staked native)\n      if (!isNative && !isStakedNative) {\n        const accountTokens =\n          tokensState?.allTokens?.[chainId]?.[account.address];\n        const token = accountTokens?.find((t) => t.address === tokenAddress);\n        if (!token) {\n          return null;\n        }\n      }\n\n      // Get market data\n      const marketDataAddress =\n        isNative || isStakedNative\n          ? getNativeTokenAddress(chainId)\n          : tokenAddress;\n      const tokenMarketData =\n        tokenRatesState?.marketData?.[chainId]?.[marketDataAddress];\n\n      // For native/staked-native tokens, fall back to currencyRateState when\n      // tokenRatesState has no market data for the chain.\n      if (!tokenMarketData?.price && (isNative || isStakedNative)) {\n        const nativeCurrency =\n          networkConfigurationsByChainId?.[chainId]?.nativeCurrency;\n        const fallbackRate = nativeCurrency\n          ? currencyRateState.currencyRates[nativeCurrency]?.conversionRate\n          : undefined;\n        if (!fallbackRate) {\n          return null;\n        }\n\n        const decimalBalance = parseInt(balance, 16);\n        if (!isNonNaNNumber(decimalBalance)) {\n          return null;\n        }\n\n        const userCurrencyValue =\n          (decimalBalance / Math.pow(10, 18)) * fallbackRate;\n\n        return {\n          userCurrencyValue,\n          tokenMarketData: tokenMarketData ?? null,\n        };\n      }\n\n      if (!tokenMarketData?.price) {\n        return null;\n      }\n\n      // Get conversion rate\n      const nativeToUserRate =\n        currencyRateState.currencyRates[tokenMarketData.currency]\n          ?.conversionRate;\n      if (!nativeToUserRate) {\n        return null;\n      }\n\n      // Calculate values\n      let decimals = 18;\n      if (!isNative && !isStakedNative) {\n        const accountTokens =\n          tokensState?.allTokens?.[chainId]?.[account.address];\n        const token = accountTokens?.find((t) => t.address === tokenAddress);\n        decimals = isNonNaNNumber(token?.decimals) ? token?.decimals : 18;\n      }\n      const decimalBalance = parseInt(balance, 16);\n      if (!isNonNaNNumber(decimalBalance)) {\n        return null;\n      }\n\n      const userCurrencyValue =\n        (decimalBalance / Math.pow(10, decimals)) *\n        tokenMarketData.price *\n        nativeToUserRate;\n\n      return {\n        userCurrencyValue,\n        tokenMarketData, // Only needed for change calculations\n      };\n    })\n    .filter((item): item is NonNullable<typeof item> => item !== null);\n}\n\n/**\n * Combined function that gets valid non-EVM asset balances with calculation data\n *\n * @param account - Internal account.\n * @param multichainBalancesState - Multichain balances state.\n * @param multichainAssetsState - Multichain assets state (for ignored assets).\n * @param multichainRatesState - Multichain rates state.\n * @param isAssetChainEnabled - Predicate to check asset chain enablement.\n * @returns token calculation data\n */\nfunction getNonEvmAssetBalances(\n  account: InternalAccount,\n  multichainBalancesState: MultichainBalancesControllerState,\n  multichainAssetsState: MultichainAssetsControllerState,\n  multichainRatesState: MultichainAssetsRatesControllerState,\n  isAssetChainEnabled: (assetId: CaipAssetType) => boolean,\n) {\n  const accountBalances = multichainBalancesState.balances[account.id] ?? {};\n  const ignoredAssets =\n    multichainAssetsState.allIgnoredAssets[account.id] || [];\n\n  return Object.entries(accountBalances)\n    .filter(\n      ([assetId]) =>\n        isAssetChainEnabled(assetId as CaipAssetType) &&\n        !ignoredAssets.includes(assetId as CaipAssetType),\n    )\n    .map(([assetId, balanceData]) => {\n      const balanceAmount = parseFloat(balanceData.amount);\n      if (Number.isNaN(balanceAmount)) {\n        return null;\n      }\n\n      const conversionRate =\n        multichainRatesState.conversionRates[assetId as CaipAssetType];\n      if (!conversionRate) {\n        return null;\n      }\n\n      const conversionRateValue = parseFloat(conversionRate.rate);\n      if (Number.isNaN(conversionRateValue)) {\n        return null;\n      }\n\n      const userCurrencyValue = balanceAmount * conversionRateValue;\n\n      return {\n        assetId: assetId as CaipAssetType,\n        userCurrencyValue,\n        conversionRate, // Only needed for change calculations\n      };\n    })\n    .filter((item): item is NonNullable<typeof item> => item !== null);\n}\n\n/**\n * Sum EVM account token balances in user currency.\n *\n * @param account - Internal account.\n * @param tokenBalancesState - Token balances state.\n * @param tokensState - Tokens state.\n * @param tokenRatesState - Token rates state.\n * @param currencyRateState - Currency rate state.\n * @param isEvmChainEnabled - Predicate to check EVM chain enablement.\n * @param networkConfigurationsByChainId - Network configurations keyed by chain ID for fallback pricing.\n * @returns Total value in user currency.\n */\nfunction sumEvmAccountBalanceInUserCurrency(\n  account: InternalAccount,\n  tokenBalancesState: TokenBalancesControllerState,\n  tokensState: TokensControllerState,\n  tokenRatesState: TokenRatesControllerState,\n  currencyRateState: CurrencyRateState,\n  isEvmChainEnabled: (chainId: Hex) => boolean,\n  networkConfigurationsByChainId?: Record<\n    Hex,\n    NetworkConfigurationNativeCurrency\n  >,\n): number {\n  const tokenBalances = getEvmTokenBalances(\n    account,\n    tokenBalancesState,\n    tokensState,\n    tokenRatesState,\n    currencyRateState,\n    isEvmChainEnabled,\n    networkConfigurationsByChainId,\n  );\n  return tokenBalances.reduce((a, b) => a + b.userCurrencyValue, 0);\n}\n\n/**\n * Sum non‑EVM account balances in user currency from multichain sources.\n *\n * @param account - Internal account.\n * @param multichainBalancesState - Multichain balances state.\n * @param multichainAssetsState - Multichain assets state (for ignored assets).\n * @param multichainRatesState - Multichain rates state.\n * @param isAssetChainEnabled - Predicate to check asset chain enablement.\n * @returns Total value in user currency.\n */\nfunction sumNonEvmAccountBalanceInUserCurrency(\n  account: InternalAccount,\n  multichainBalancesState: MultichainBalancesControllerState,\n  multichainAssetsState: MultichainAssetsControllerState,\n  multichainRatesState: MultichainAssetsRatesControllerState,\n  isAssetChainEnabled: (assetId: CaipAssetType) => boolean,\n): number {\n  const assetBalances = getNonEvmAssetBalances(\n    account,\n    multichainBalancesState,\n    multichainAssetsState,\n    multichainRatesState,\n    isAssetChainEnabled,\n  );\n\n  return assetBalances.reduce((a, b) => a + b.userCurrencyValue, 0);\n}\n\n/**\n * Calculate balances for all wallets and groups.\n * Pure function – accepts controller states and returns aggregated totals.\n *\n * @param accountTreeState - AccountTreeController state\n * @param accountsState - AccountsController state\n * @param tokenBalancesState - TokenBalancesController state\n * @param tokenRatesState - TokenRatesController state\n * @param multichainRatesState - MultichainAssetsRatesController state\n * @param multichainBalancesState - MultichainBalancesController state\n * @param multichainAssetsState - MultichainAssetsController state\n * @param tokensState - TokensController state\n * @param currencyRateState - CurrencyRateController state\n * @param enabledNetworkMap - Map of enabled networks keyed by namespace\n * @param networkConfigurationsByChainId - Network configurations by chain ID.\n * @returns Aggregated balances for all wallets\n */\nexport function calculateBalanceForAllWallets(\n  accountTreeState: AccountTreeControllerState,\n  accountsState: AccountsControllerState,\n  tokenBalancesState: TokenBalancesControllerState,\n  tokenRatesState: TokenRatesControllerState,\n  multichainRatesState: MultichainAssetsRatesControllerState,\n  multichainBalancesState: MultichainBalancesControllerState,\n  multichainAssetsState: MultichainAssetsControllerState,\n  tokensState: TokensControllerState,\n  currencyRateState: CurrencyRateState,\n  enabledNetworkMap: Record<string, Record<string, boolean>> | undefined,\n  networkConfigurationsByChainId?: Record<\n    Hex,\n    NetworkConfigurationNativeCurrency\n  >,\n): AllWalletsBalance {\n  const isEvmChainEnabled = (chainId: Hex): boolean =>\n    isChainEnabledByMap(enabledNetworkMap, chainId);\n\n  const isAssetChainEnabled = (assetId: CaipAssetType): boolean =>\n    isChainEnabledByMap(enabledNetworkMap, parseCaipAssetType(assetId).chainId);\n\n  const getBalance = {\n    evm: (account: InternalAccount) =>\n      sumEvmAccountBalanceInUserCurrency(\n        account,\n        tokenBalancesState,\n        tokensState,\n        tokenRatesState,\n        currencyRateState,\n        isEvmChainEnabled,\n        networkConfigurationsByChainId,\n      ),\n    nonEvm: (account: InternalAccount) =>\n      sumNonEvmAccountBalanceInUserCurrency(\n        account,\n        multichainBalancesState,\n        multichainAssetsState,\n        multichainRatesState,\n        isAssetChainEnabled,\n      ),\n  };\n\n  const getFlatAccountBalances = () =>\n    Object.entries(accountTreeState.accountTree.wallets ?? {})\n      .flatMap(([walletId, wallet]) =>\n        Object.keys(wallet?.groups || {}).flatMap((groupId) => {\n          const accounts = getInternalAccountsForGroup(\n            accountTreeState,\n            accountsState,\n            groupId,\n          );\n\n          return accounts.map((account) => ({\n            walletId,\n            groupId,\n            account,\n            isEvm: isEvmAccountType(account.type),\n          }));\n        }),\n      )\n      .map((flatAccount) => {\n        const flatAccountWithBalance = flatAccount as typeof flatAccount & {\n          balance: number;\n        };\n        flatAccountWithBalance.balance = flatAccount.isEvm\n          ? getBalance.evm(flatAccount.account)\n          : getBalance.nonEvm(flatAccount.account);\n        return flatAccountWithBalance;\n      });\n\n  const getAggWalletBalance = (\n    flatAccountBalances: ReturnType<typeof getFlatAccountBalances>,\n  ): number => flatAccountBalances.reduce((a, b) => a + b.balance, 0);\n\n  const getWalletBalances = (\n    flatAccountBalances: ReturnType<typeof getFlatAccountBalances>,\n  ): Record<string, WalletBalance> => {\n    const wallets: Record<string, WalletBalance> = {};\n    const defaultWalletBalance = (walletId: string): WalletBalance => ({\n      walletId,\n      groups: {},\n      totalBalanceInUserCurrency: 0,\n      userCurrency: currencyRateState.currentCurrency,\n    });\n    const defaultGroupBalance = (\n      walletId: string,\n      groupId: string,\n    ): AccountGroupBalance => ({\n      walletId,\n      groupId,\n      totalBalanceInUserCurrency: 0,\n      userCurrency: currencyRateState.currentCurrency,\n    });\n\n    flatAccountBalances.forEach((flatAccount) => {\n      const { walletId, groupId, balance } = flatAccount;\n      wallets[walletId] ??= defaultWalletBalance(walletId);\n      wallets[walletId].groups[groupId] ??= defaultGroupBalance(\n        walletId,\n        groupId,\n      );\n      wallets[walletId].groups[groupId].totalBalanceInUserCurrency += balance;\n      wallets[walletId].totalBalanceInUserCurrency += balance;\n    });\n\n    // Ensure all groups (including empty ones) are represented\n    Object.entries(accountTreeState.accountTree.wallets ?? {}).forEach(\n      ([walletId, wallet]) => {\n        if (!wallet) {\n          return;\n        }\n        wallets[walletId] ??= defaultWalletBalance(walletId);\n        Object.keys(wallet.groups || {}).forEach((groupId) => {\n          wallets[walletId].groups[groupId] ??= defaultGroupBalance(\n            walletId,\n            groupId,\n          );\n        });\n      },\n    );\n\n    return wallets;\n  };\n\n  const flatAccounts = getFlatAccountBalances();\n  return {\n    wallets: getWalletBalances(flatAccounts),\n    totalBalanceInUserCurrency: getAggWalletBalance(flatAccounts),\n    userCurrency: currencyRateState.currentCurrency,\n  };\n}\n\n/**\n * Calculate aggregated portfolio value change for a given period (1d, 7d, 30d).\n * Logic mirrors extension/mobile historical aggregation:\n * - For each asset with available percent change for the requested period, compute current value in user currency.\n * - Reconstruct previous value by dividing current by (1 + percent/100).\n * - Sum across all assets, then compute amount change and percent change.\n *\n * @param accountTreeState - AccountTreeController state.\n * @param accountsState - AccountsController state.\n * @param tokenBalancesState - TokenBalancesController state.\n * @param tokenRatesState - TokenRatesController state.\n * @param multichainRatesState - MultichainAssetsRatesController state.\n * @param multichainBalancesState - MultichainBalancesController state.\n * @param multichainAssetsState - MultichainAssetsController state.\n * @param tokensState - TokensController state.\n * @param currencyRateState - CurrencyRateController state.\n * @param enabledNetworkMap - Map of enabled networks keyed by namespace.\n * @param period - Period to compute change for ('1d' | '7d' | '30d').\n * @param networkConfigurationsByChainId - Optional network configurations to derive native currency fallback pricing.\n * @returns Aggregated change details for the requested period.\n */\nexport function calculateBalanceChangeForAllWallets(\n  accountTreeState: AccountTreeControllerState,\n  accountsState: AccountsControllerState,\n  tokenBalancesState: TokenBalancesControllerState,\n  tokenRatesState: TokenRatesControllerState,\n  multichainRatesState: MultichainAssetsRatesControllerState,\n  multichainBalancesState: MultichainBalancesControllerState,\n  multichainAssetsState: MultichainAssetsControllerState,\n  tokensState: TokensControllerState,\n  currencyRateState: CurrencyRateState,\n  enabledNetworkMap: Record<string, Record<string, boolean>> | undefined,\n  period: BalanceChangePeriod,\n  networkConfigurationsByChainId?: Record<\n    Hex,\n    NetworkConfigurationNativeCurrency\n  >,\n): BalanceChangeResult {\n  const isEvmChainEnabled = (chainId: Hex): boolean =>\n    isChainEnabledByMap(enabledNetworkMap, chainId);\n\n  const isAssetChainEnabled = (assetId: CaipAssetType): boolean => {\n    const { chainId } = parseCaipAssetType(assetId);\n    return isChainEnabledByMap(enabledNetworkMap, chainId);\n  };\n\n  const getAccountChange = {\n    evm: (account: InternalAccount) =>\n      sumEvmAccountChangeForPeriod(\n        account,\n        period,\n        tokenBalancesState,\n        tokensState,\n        tokenRatesState,\n        currencyRateState,\n        isEvmChainEnabled,\n        networkConfigurationsByChainId,\n      ),\n    nonEvm: (account: InternalAccount) =>\n      sumNonEvmAccountChangeForPeriod(\n        account,\n        period,\n        multichainBalancesState,\n        multichainAssetsState,\n        multichainRatesState,\n        isAssetChainEnabled,\n      ),\n  };\n\n  const getFlatAccountChanges = () =>\n    Object.entries(accountTreeState.accountTree.wallets ?? {})\n      .flatMap(([walletId, wallet]) =>\n        Object.keys(wallet?.groups || {}).flatMap((groupId) => {\n          const accounts = getInternalAccountsForGroup(\n            accountTreeState,\n            accountsState,\n            groupId,\n          );\n          return accounts.map((account) => ({\n            walletId,\n            groupId,\n            account,\n            isEvm: isEvmAccountType(account.type),\n          }));\n        }),\n      )\n      .map((flatAccount) => {\n        const flatAccountWithChange = flatAccount as typeof flatAccount & {\n          current: number;\n          previous: number;\n        };\n\n        const change = flatAccount.isEvm\n          ? getAccountChange.evm(flatAccount.account)\n          : getAccountChange.nonEvm(flatAccount.account);\n\n        flatAccountWithChange.current = change.current;\n        flatAccountWithChange.previous = change.previous;\n        return flatAccountWithChange;\n      });\n\n  const getAggregatedTotals = (\n    flatAccountChanges: ReturnType<typeof getFlatAccountChanges>,\n  ) => {\n    return flatAccountChanges.reduce(\n      (totals, account) => {\n        totals.current += account.current;\n        totals.previous += account.previous;\n        return totals;\n      },\n      { current: 0, previous: 0 },\n    );\n  };\n\n  const flatAccountChanges = getFlatAccountChanges();\n  const aggregatedTotals = getAggregatedTotals(flatAccountChanges);\n  const amountChange = aggregatedTotals.current - aggregatedTotals.previous;\n  const percentChange =\n    aggregatedTotals.previous !== 0\n      ? (amountChange / aggregatedTotals.previous) * 100\n      : 0;\n\n  return {\n    period,\n    currentTotalInUserCurrency: Number(aggregatedTotals.current.toFixed(8)),\n    previousTotalInUserCurrency: Number(aggregatedTotals.previous.toFixed(8)),\n    amountChangeInUserCurrency: Number(amountChange.toFixed(8)),\n    percentChange: Number(percentChange.toFixed(8)),\n    userCurrency: currencyRateState.currentCurrency,\n  };\n}\n\n/**\n * Sum EVM account change for a period (current and previous totals).\n *\n * @param account - Internal account to aggregate.\n * @param period - Change period ('1d' | '7d' | '30d').\n * @param tokenBalancesState - Token balances controller state.\n * @param tokensState - Tokens controller state.\n * @param tokenRatesState - Token rates controller state.\n * @param currencyRateState - Currency rate controller state.\n * @param isEvmChainEnabled - Predicate that returns true if the EVM chain is enabled.\n * @param networkConfigurationsByChainId - Network configurations keyed by chain ID for fallback pricing.\n * @returns Object with current and previous totals in user currency.\n */\nfunction sumEvmAccountChangeForPeriod(\n  account: InternalAccount,\n  period: BalanceChangePeriod,\n  tokenBalancesState: TokenBalancesControllerState,\n  tokensState: TokensControllerState,\n  tokenRatesState: TokenRatesControllerState,\n  currencyRateState: CurrencyRateState,\n  isEvmChainEnabled: (chainId: Hex) => boolean,\n  networkConfigurationsByChainId?: Record<\n    Hex,\n    NetworkConfigurationNativeCurrency\n  >,\n): { current: number; previous: number } {\n  const tokenBalances = getEvmTokenBalances(\n    account,\n    tokenBalancesState,\n    tokensState,\n    tokenRatesState,\n    currencyRateState,\n    isEvmChainEnabled,\n    networkConfigurationsByChainId,\n  );\n\n  const tokenChanges = tokenBalances\n    .map((token) => {\n      const percentRaw =\n        token.tokenMarketData?.[evmRatePropertiesRecord[period]];\n      if (!isNonNaNNumber(percentRaw)) {\n        // Fallback tokens (no market data) still contribute their current value\n        // but are treated as having 0% change.\n        if (token.tokenMarketData === null) {\n          return {\n            current: token.userCurrencyValue,\n            previous: token.userCurrencyValue,\n          };\n        }\n        return null;\n      }\n\n      const denom = Number((1 + percentRaw / 100).toFixed(8));\n      if (denom === 0) {\n        return null;\n      }\n\n      return {\n        current: token.userCurrencyValue,\n        previous: token.userCurrencyValue / denom,\n      };\n    })\n    .filter((change): change is NonNullable<typeof change> => change !== null);\n\n  return tokenChanges.reduce(\n    (totals, change) => {\n      totals.current += change.current;\n      totals.previous += change.previous;\n      return totals;\n    },\n    { current: 0, previous: 0 },\n  );\n}\n\n/**\n * Sum non-EVM account change for a period (current and previous totals).\n *\n * @param account - Internal account to aggregate.\n * @param period - Change period ('1d' | '7d' | '30d').\n * @param multichainBalancesState - Multichain balances controller state.\n * @param multichainAssetsState - Multichain assets controller state.\n * @param multichainRatesState - Multichain assets rates controller state.\n * @param isAssetChainEnabled - Predicate that returns true if the asset's chain is enabled.\n * @returns Object with current and previous totals in user currency.\n */\nfunction sumNonEvmAccountChangeForPeriod(\n  account: InternalAccount,\n  period: BalanceChangePeriod,\n  multichainBalancesState: MultichainBalancesControllerState,\n  multichainAssetsState: MultichainAssetsControllerState,\n  multichainRatesState: MultichainAssetsRatesControllerState,\n  isAssetChainEnabled: (assetId: CaipAssetType) => boolean,\n): { current: number; previous: number } {\n  const assetBalances = getNonEvmAssetBalances(\n    account,\n    multichainBalancesState,\n    multichainAssetsState,\n    multichainRatesState,\n    isAssetChainEnabled,\n  );\n\n  const assetChanges = assetBalances\n    .map((asset) => {\n      // Safely access the percent change data with proper type checking\n      const marketData = asset.conversionRate?.marketData;\n      const pricePercentChange = marketData?.pricePercentChange;\n      const percentRaw =\n        pricePercentChange?.[nonEvmRatePropertiesRecord[period]];\n\n      if (!isNonNaNNumber(percentRaw)) {\n        return null;\n      }\n\n      const denom = Number((1 + percentRaw / 100).toFixed(8));\n      if (denom === 0) {\n        return null;\n      }\n\n      return {\n        current: asset.userCurrencyValue,\n        previous: asset.userCurrencyValue / denom,\n      };\n    })\n    .filter((change): change is NonNullable<typeof change> => change !== null);\n\n  return assetChanges.reduce(\n    (totals, change) => ({\n      current: totals.current + change.current,\n      previous: totals.previous + change.previous,\n    }),\n    { current: 0, previous: 0 },\n  );\n}\n\n/**\n * Calculate portfolio value change for a specific account group and period.\n *\n * @param accountTreeState - AccountTreeController state.\n * @param accountsState - AccountsController state.\n * @param tokenBalancesState - TokenBalancesController state.\n * @param tokenRatesState - TokenRatesController state.\n * @param multichainRatesState - MultichainAssetsRatesController state.\n * @param multichainBalancesState - MultichainBalancesController state.\n * @param multichainAssetsState - MultichainAssetsController state.\n * @param tokensState - TokensController state.\n * @param currencyRateState - CurrencyRateController state.\n * @param enabledNetworkMap - Map of enabled networks keyed by namespace.\n * @param groupId - Account group ID to compute change for.\n * @param period - Change period ('1d' | '7d' | '30d').\n * @param networkConfigurationsByChainId - Optional network configurations to derive native currency fallback pricing.\n * @returns Change result including current, previous, delta, percent, and period.\n */\nexport function calculateBalanceChangeForAccountGroup(\n  accountTreeState: AccountTreeControllerState,\n  accountsState: AccountsControllerState,\n  tokenBalancesState: TokenBalancesControllerState,\n  tokenRatesState: TokenRatesControllerState,\n  multichainRatesState: MultichainAssetsRatesControllerState,\n  multichainBalancesState: MultichainBalancesControllerState,\n  multichainAssetsState: MultichainAssetsControllerState,\n  tokensState: TokensControllerState,\n  currencyRateState: CurrencyRateState,\n  enabledNetworkMap: Record<string, Record<string, boolean>> | undefined,\n  groupId: string,\n  period: BalanceChangePeriod,\n  networkConfigurationsByChainId?: Record<\n    Hex,\n    NetworkConfigurationNativeCurrency\n  >,\n): BalanceChangeResult {\n  const isEvmChainEnabled = (chainId: Hex): boolean =>\n    isChainEnabledByMap(enabledNetworkMap, chainId);\n\n  const isAssetChainEnabled = (assetId: CaipAssetType): boolean => {\n    const { chainId } = parseCaipAssetType(assetId);\n    return isChainEnabledByMap(enabledNetworkMap, chainId);\n  };\n\n  const getAccountChange = {\n    evm: (account: InternalAccount) =>\n      sumEvmAccountChangeForPeriod(\n        account,\n        period,\n        tokenBalancesState,\n        tokensState,\n        tokenRatesState,\n        currencyRateState,\n        isEvmChainEnabled,\n        networkConfigurationsByChainId,\n      ),\n    nonEvm: (account: InternalAccount) =>\n      sumNonEvmAccountChangeForPeriod(\n        account,\n        period,\n        multichainBalancesState,\n        multichainAssetsState,\n        multichainRatesState,\n        isAssetChainEnabled,\n      ),\n  };\n\n  const getFlatAccountChanges = () => {\n    const accounts = getInternalAccountsForGroup(\n      accountTreeState,\n      accountsState,\n      groupId,\n    );\n    return accounts.map((account) => ({\n      account,\n      isEvm: isEvmAccountType(account.type),\n    }));\n  };\n\n  const getAggregatedTotals = (\n    flatAccountChanges: ReturnType<typeof getFlatAccountChanges>,\n  ) => {\n    return flatAccountChanges.reduce(\n      (totals, { account, isEvm }) => {\n        const change = isEvm\n          ? getAccountChange.evm(account)\n          : getAccountChange.nonEvm(account);\n        totals.current += change.current;\n        totals.previous += change.previous;\n        return totals;\n      },\n      { current: 0, previous: 0 },\n    );\n  };\n\n  const flatAccountChanges = getFlatAccountChanges();\n  const aggregatedTotals = getAggregatedTotals(flatAccountChanges);\n\n  const amountChange = aggregatedTotals.current - aggregatedTotals.previous;\n  const percentChange =\n    aggregatedTotals.previous !== 0\n      ? (amountChange / aggregatedTotals.previous) * 100\n      : 0;\n\n  return {\n    period,\n    currentTotalInUserCurrency: Number(aggregatedTotals.current.toFixed(8)),\n    previousTotalInUserCurrency: Number(aggregatedTotals.previous.toFixed(8)),\n    amountChangeInUserCurrency: Number(amountChange.toFixed(8)),\n    percentChange: Number(percentChange.toFixed(8)),\n    userCurrency: currencyRateState.currentCurrency,\n  };\n}\n"]}