{"version":3,"sources":["../src/transaction.ts","../src/builder.ts","../src/helpers.ts"],"names":["ProtoTransaction"],"mappings":";;;;;;AAuBO,IAAM,WAAA,GAAN,MAAM,YAAA,SAAoBA,aAAA,CAAiB;AAAA,EACxC,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,YAAY,IAAA,EAAqB;AAC/B,IAAA,KAAA,CAAM,IAAI,CAAA;AAEV,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,OAAA,GAAsB;AACpB,IAAA,OAAOA,aAAA,CAAiB,MAAA,CAAO,IAAI,CAAA,CAAE,MAAA,EAAO;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,KAAA,GAAgB;AACd,IAAA,OAAO,SAAA,CAAU,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,EACjC;AAAA,EAEgB,MAAA,GAAmC;AACjD,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,EAAO;AAG1B,IAAA,IAAI,OAAO,IAAA,CAAK,UAAU,CAAA,KAAM,QAAA,EAAU;AACxC,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,UAAU,CAAC,CAAA;AACxC,MAAA,IAAI,CAAC,MAAA,CAAO,aAAA,CAAc,QAAQ,CAAA,IAAK,WAAW,CAAA,EAAG;AACnD,QAAA,MAAM,IAAI,iBAAiB,wBAAwB,CAAA;AAAA,MACrD;AACA,MAAA,IAAA,CAAK,UAAU,CAAA,GAAI,QAAA;AAAA,IACrB;AAGA,IAAA,IAAI,KAAK,SAAS,CAAA,IAAK,OAAO,IAAA,CAAK,SAAS,MAAM,QAAA,EAAU;AAC1D,MAAA,MAAM,OAAA,GAAU,KAAK,SAAS,CAAA;AAK9B,MAAA,4BAAA,CAA6B,OAAA,EAAS;AAAA,QACpC,OAAA;AAAA,QACA,SAAA;AAAA,QACA,cAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACD,CAAA;AAGD,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAC,CAAA,EAAG;AACtC,QAAA,OAAA,CAAQ,UAAU,CAAA,GAAI,OAAA,CAAQ,UAAU,CAAA,CAAE,GAAA,CAAI,CAAC,QAAA,KAAsB;AACnE,UAAA,IAAI,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC5C,YAAA,MAAM,CAAA,GAAI,QAAA;AAEV,YAAA,IAAI,OAAO,CAAA,CAAE,MAAM,CAAA,KAAM,QAAA,EAAU;AAEjC,cAAA,MAAM,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,MAAM,CAA8B,CAAA;AACrE,cAAA,CAAA,CAAE,MAAM,CAAA,GAAI,OAAO,cAAc,QAAA,GAAW,SAAA,GAAY,EAAE,MAAM,CAAA;AAAA,YAClE;AAAA,UACF;AACA,UAAA,OAAO,QAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,IAAA,CAAK,MAAM,IAAI,IAAA,CAAK,IAAA;AAAA,IACtB;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,KAAK,UAAA,EAA8C;AAEvD,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AAGpC,IAAA,MAAM,SAAA,GAAY,MAAM,cAAA,CAAe,WAAA,CAAY,WAAW,UAAU,CAAA;AAGxE,IAAA,IAAA,CAAK,SAAA,GAAY,CAAC,SAAA,CAAU,KAAK,CAAA;AAEjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,QAAA,GAAoB;AAClB,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,UAAU,MAAA,GAAS,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,WAAA,GAAsB;AACpB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,EAAS,OAAA,IAAW,CAAA;AACzC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,EAAS,YAAA,IAAgB,CAAA;AAEnD,IAAA,MAAM,aAAA,GAAgB,OAAO,OAAA,KAAY,QAAA,GAAW,UAAU,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA;AACvF,IAAA,MAAM,kBAAA,GACJ,OAAO,YAAA,KAAiB,QAAA,GAAW,eAAe,MAAA,CAAO,YAAA,CAAa,UAAU,CAAA;AAClF,IAAA,OAAO,aAAA,GAAgB,kBAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,YAAA,GAA2B;AACzB,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,iBAAiB,4BAA4B,CAAA;AAAA,IACzD;AAGA,IAAA,MAAM,eAAeA,aAAA,CAAiB,GAAA,CAAI,OAAO,IAAA,CAAK,OAAO,EAAE,MAAA,EAAO;AAGtE,IAAA,OAAO,WAAA,CAAY,cAAc,EAAE,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,OAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,IAAA,GAAO,SAAA,CAAU,IAAA,CAAK,YAAA,EAAc,CAAA;AACzC,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO,QAAQ,GAAA,EAA0B;AACvC,IAAA,MAAM,KAAA,GAAQ,UAAU,GAAG,CAAA;AAC3B,IAAA,MAAM,OAAA,GAAUA,aAAA,CAAiB,MAAA,CAAO,KAAK,CAAA;AAC7C,IAAA,OAAO,IAAI,aAAY,OAAO,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,OAAO,UAAU,KAAA,EAAgC;AAC/C,IAAA,MAAM,OAAA,GAAUA,aAAA,CAAiB,MAAA,CAAO,KAAK,CAAA;AAC7C,IAAA,OAAO,IAAI,aAAY,OAAO,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BA,OAAgB,WAAW,GAAA,EAA4C;AACrE,IAAA,MAAM,OAAA,GAAUA,aAAA,CAAiB,UAAA,CAAW,GAAG,CAAA;AAC/C,IAAA,OAAO,IAAI,aAAY,OAAO,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,OAAO,gBAAgB,EAAA,EAA8B;AACnD,IAAA,MAAM,OAAA,GAAUA,aAAA,CAAiB,UAAA,CAAW,EAAE,CAAA;AAC9C,IAAA,OAAO,IAAI,aAAY,OAAO,CAAA;AAAA,EAChC;AACF;AAWA,SAAS,4BAAA,CACP,KACA,KAAA,EACM;AACN,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC3B,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,IAAI,YAAY,MAAA,EAAW;AAE3B,IAAA,IAAI,MAAA,GAA+C,GAAA;AACnD,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAM,IAAA,GAAgB,OAAO,GAAG,CAAA;AAChC,MAAA,MAAA,GAAS,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,GAAY,IAAA,GAAoC,MAAA;AAAA,IACnF;AAEA,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,OAAO,MAAM,QAAA,EAAU;AACjD,MAAA,MAAA,CAAO,OAAO,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,IAC1C;AAAA,EACF;AACF;ACnSO,IAAM,kBAAA,GAAN,MAAM,mBAAA,CAAmB;AAAA,EAS9B,YAAoB,QAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAAuB;AAAA,EARnC,YAAmC,EAAC;AAAA,EACpC,QAAA;AAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBR,OAAO,OAAO,QAAA,EAA0C;AACtD,IAAA,OAAO,IAAI,oBAAmB,QAAQ,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAqC;AACnC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,QAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,WAAW,OAAA,EAAuB;AAChC,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,OAAO,OAAA,EAAuB;AAC5B,IAAA,IAAI,CAAC,cAAA,CAAe,OAAO,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,eAAA,CAAgB,CAAA,wBAAA,EAA2B,OAAO,CAAA,CAAA,EAAI,EAAE,SAAS,CAAA;AAAA,IAC7E;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwCA,MAAM,KAAA,EAAqB;AACzB,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,MAAM,IAAI,eAAA,CAAgB,4BAAA,EAA8B,EAAE,OAAO,CAAA;AAAA,IACnE;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BA,OAAO,GAAA,EAAgD;AACrD,IAAA,IAAI,CAAC,IAAI,GAAA,EAAK;AACZ,MAAA,MAAM,IAAI,gBAAgB,8BAA8B,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAI,GAAA,CAAI,QAAQ,KAAA,EAAO;AACrB,MAAA,MAAM,IAAI,gBAAgB,8DAAA,EAAgE;AAAA,QACxF,SAAS,GAAA,CAAI;AAAA,OACd,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,MAAA,GAAS,OAAO,GAAA,CAAI,MAAA,KAAW,WAAW,GAAA,CAAI,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAC9E,IAAA,IAAI,SAAS,EAAA,EAAI;AACf,MAAA,MAAM,IAAI,eAAA,CAAgB,qCAAA,EAAuC,EAAE,QAAQ,CAAA;AAAA,IAC7E;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,GAAA,EAAK,GAAA,CAAI,KAAK,MAAA,EAAO;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,aAAa,EAAA,EAAkB;AAC7B,IAAA,IAAA,CAAK,aAAA,GAAgB,EAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgCA,KAAK,IAAA,EAAsB;AACzB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCA,YAAY,OAAA,EAAiC;AAC3C,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,MAAM,CAAA;AAAA,IAC5B;AACA,IAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAW;AAC/B,MAAA,IAAA,CAAK,KAAA,CAAM,QAAQ,KAAK,CAAA;AAAA,IAC1B;AACA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,MAAM,CAAA;AAAA,IAC5B;AACA,IAAA,IAAI,OAAA,CAAQ,iBAAiB,MAAA,EAAW;AACtC,MAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,YAAY,CAAA;AAAA,IACxC;AACA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,IAAA,CAAK,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA,IACxB;AACA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAGlB,IAAA,IAAI,QAAQ,KAAA,EAAO;AAGnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuCA,YAAY,QAAA,EAAqC;AAC/C,IAAA,MAAM,EAAE,YAAA,EAAc,GAAG,MAAA,EAAO,GAAI,QAAA;AAEpC,IAAA,QAAQ,YAAA;AAAc,MACpB,KAAK,CAAA;AACH,QAAA,OAAO,IAAA,CAAK,SAAS,MAAyB,CAAA;AAAA,MAChD,KAAK,CAAA;AACH,QAAA,OAAO,IAAA,CAAK,OAAO,MAAuB,CAAA;AAAA,MAC5C,KAAK,CAAA;AACH,QAAA,OAAO,IAAA,CAAK,SAAS,MAAyB,CAAA;AAAA,MAChD,KAAK,CAAA;AACH,QAAA,OAAO,IAAA,CAAK,SAAS,MAAyB,CAAA;AAAA,MAChD,KAAK,CAAA;AACH,QAAA,OAAO,IAAA,CAAK,WAAW,MAA2B,CAAA;AAAA,MACpD,KAAK,CAAA;AACH,QAAA,OAAO,IAAA,CAAK,SAAS,MAAyB,CAAA;AAAA,MAChD,KAAK,CAAA;AACH,QAAA,OAAO,IAAA,CAAK,MAAM,MAAsB,CAAA;AAAA,MAC1C,KAAK,CAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAY,MAA4B,CAAA;AAAA,MACtD,KAAK,CAAA;AACH,QAAA,OAAO,IAAA,CAAK,gBAAgB,MAAgC,CAAA;AAAA,MAC9D,KAAK,EAAA;AACH,QAAA,OAAO,IAAA,CAAK,KAAK,MAAqB,CAAA;AAAA,MACxC,KAAK,EAAA;AACH,QAAA,OAAO,IAAA,CAAK,cAAc,MAA8B,CAAA;AAAA,MAC1D;AAEE,QAAA,IAAA,CAAK,SAAA,CAAU,KAAK,QAAQ,CAAA;AAC5B,QAAA,OAAO,IAAA;AAAA;AACX,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgDA,SAAS,MAAA,EAA+B;AACtC,IAAA,IAAI,CAAC,cAAA,CAAe,MAAA,CAAO,QAAQ,CAAA,EAAG;AACpC,MAAA,MAAM,IAAI,eAAA,CAAgB,CAAA,2BAAA,EAA8B,MAAA,CAAO,QAAQ,CAAA,CAAA,EAAI;AAAA,QACzE,SAAS,MAAA,CAAO;AAAA,OACjB,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,MAAA,GAAS,OAAO,MAAA,CAAO,MAAA,KAAW,WAAW,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAEvF,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,eAAA,CAAgB,kCAAA,EAAoC,EAAE,MAAA,EAAQ,MAAA,CAAO,QAAQ,CAAA;AAAA,IACzF;AAEA,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK;AAAA,MAClB,YAAA,EAAc,CAAA;AAAA,MACd,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,MAAA;AAAA,MACA,GAAI,MAAA,CAAO,GAAA,IAAO,EAAE,GAAA,EAAK,OAAO,GAAA,EAAI;AAAA,MACpC,GAAI,MAAA,CAAO,YAAA,IAAgB,EAAE,YAAA,EAAc,OAAO,YAAA,EAAa;AAAA,MAC/D,GAAI,MAAA,CAAO,YAAA,IAAgB,EAAE,YAAA,EAAc,OAAO,YAAA;AAAa,KAChE,CAAA;AAED,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgCA,OAAO,MAAA,EAA6B;AAClC,IAAA,MAAM,MAAA,GAAS,OAAO,MAAA,CAAO,MAAA,KAAW,WAAW,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAEvF,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,eAAA,CAAgB,gCAAA,EAAkC,EAAE,MAAA,EAAQ,MAAA,CAAO,QAAQ,CAAA;AAAA,IACvF;AAEA,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK;AAAA,MAClB,YAAA,EAAc,CAAA;AAAA,MACd,MAAA;AAAA,MACA,GAAI,MAAA,CAAO,GAAA,IAAO,EAAE,GAAA,EAAK,OAAO,GAAA;AAAI,KACrC,CAAA;AAED,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgCA,SAAS,MAAA,EAA+B;AACtC,IAAA,IAAI,CAAC,OAAO,GAAA,EAAK;AACf,MAAA,MAAM,IAAI,gBAAgB,8BAA8B,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK;AAAA,MAClB,YAAA,EAAc,CAAA;AAAA,MACd,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,GAAI,MAAA,CAAO,QAAA,IAAY,EAAE,QAAA,EAAU,OAAO,QAAA;AAAS,KACpD,CAAA;AAED,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgCA,SAAS,MAAA,EAA+B;AACtC,IAAA,IAAI,CAAC,cAAA,CAAe,MAAA,CAAO,QAAQ,CAAA,EAAG;AACpC,MAAA,MAAM,IAAI,eAAA,CAAgB,CAAA,2BAAA,EAA8B,MAAA,CAAO,QAAQ,CAAA,CAAA,EAAI;AAAA,QACzE,SAAS,MAAA,CAAO;AAAA,OACjB,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK;AAAA,MAClB,YAAA,EAAc,CAAA;AAAA,MACd,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,GAAI,MAAA,CAAO,QAAA,IAAY,EAAE,QAAA,EAAU,OAAO,QAAA;AAAS,KACpD,CAAA;AAED,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,WAAW,MAAA,EAAiC;AAC1C,IAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACpB,MAAA,MAAM,IAAI,gBAAgB,sCAAsC,CAAA;AAAA,IAClE;AAEA,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK;AAAA,MAClB,YAAA,EAAc,CAAA;AAAA,MACd,GAAG;AAAA,KACJ,CAAA;AAED,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkCA,SAAS,MAAA,EAA+B;AACtC,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK;AAAA,MAClB,YAAA,EAAc,CAAA;AAAA,MACd,GAAG;AAAA,KACJ,CAAA;AAED,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BA,MAAM,MAAA,EAA4B;AAChC,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK;AAAA,MAClB,YAAA,EAAc,CAAA;AAAA,MACd,GAAG;AAAA,KACJ,CAAA;AAED,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiDA,YAAY,MAAA,EAAkC;AAC5C,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK;AAAA,MAClB,YAAA,EAAc,CAAA;AAAA,MACd,GAAG;AAAA,KACJ,CAAA;AAED,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsCA,gBAAgB,MAAA,EAAsC;AACpD,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK;AAAA,MAClB,YAAA,EAAc,CAAA;AAAA,MACd,GAAG;AAAA,KACJ,CAAA;AAED,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkCA,KAAK,MAAA,EAA2B;AAC9B,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK;AAAA,MAClB,YAAA,EAAc,EAAA;AAAA,MACd,GAAG;AAAA,KACJ,CAAA;AAED,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmDA,cAAc,MAAA,EAAoC;AAChD,IAAA,MAAM,SAAU,MAAA,CAAgC,MAAA;AAChD,IAAA,IAAI,MAAA,KAAW,CAAA,IAAK,MAAA,KAAW,CAAA,IAAK,WAAW,CAAA,EAAG;AAChD,MAAA,MAAM,IAAI,gBAAgB,CAAA,iCAAA,EAAoC,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,CAAA;AAAA,IAC5F;AAEA,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,SAAA,IAAa,MAAA,EAAQ;AAC9C,MAAA,MAAM,IAAI,gBAAgB,2DAAA,EAA6D;AAAA,QACrF,QAAQ,MAAA,CAAO;AAAA,OAChB,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA,IAAK,MAAA,CAAO,WAAW,CAAA,KAAM,CAAC,OAAO,OAAA,EAAS;AACnE,MAAA,MAAM,IAAI,gBAAgB,gEAAA,EAAkE;AAAA,QAC1F,QAAQ,MAAA,CAAO;AAAA,OAChB,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,OAAO,OAAA,IAAW,CAAC,cAAA,CAAe,MAAA,CAAO,OAAO,CAAA,EAAG;AACrD,MAAA,MAAM,IAAI,eAAA,CAAgB,CAAA,0BAAA,EAA6B,MAAA,CAAO,OAAO,CAAA,CAAA,EAAI;AAAA,QACvE,SAAS,MAAA,CAAO;AAAA,OACjB,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,OAAO,MAAA,KAAW,CAAA,IAAK,OAAO,MAAA,KAAW,CAAA,KAAM,OAAO,OAAA,EAAS;AAClE,MAAA,IAAI,CAAC,sBAAA,CAAuB,MAAA,CAAO,OAAO,CAAA,EAAG;AAC3C,QAAA,MAAM,IAAI,eAAA,CAAgB,CAAA,gCAAA,EAAmC,MAAA,CAAO,OAAO,CAAA,CAAA,EAAI;AAAA,UAC7E,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,QAAQ,MAAA,CAAO;AAAA,SAChB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,IAAA,CAAK,UAAU,IAAA,CAAK;AAAA,QAClB,YAAA,EAAc,EAAA;AAAA,QACd,GAAG;AAAA,OACJ,CAAA;AAED,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK;AAAA,MAClB,YAAA,EAAc,EAAA;AAAA,MACd,GAAG;AAAA,KACJ,CAAA;AAED,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,GAAA,EAAuB;AACnD,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,MAAA,OAAO,OAAO,GAAG,CAAA;AAAA,IACnB;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,MAAA,OAAO,IAAI,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,qBAAA,CAAsB,IAAI,CAAC,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,QAAA,EAAU;AAC3C,MAAA,MAAM,YAAqC,EAAC;AAC5C,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,QAAA,SAAA,CAAU,GAAG,CAAA,GAAI,IAAA,CAAK,qBAAA,CAAsB,KAAK,CAAA;AAAA,MACnD;AACA,MAAA,OAAO,SAAA;AAAA,IACT;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,YAAA,GAAwC;AACtC,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,gBAAgB,mCAAmC,CAAA;AAAA,IAC/D;AAEA,IAAA,MAAM,OAAA,GAAmC;AAAA,MACvC,SAAA,EAAW,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,SAAS;AAAA,KACtD;AAGA,IAAA,IAAI,IAAA,CAAK,OAAA,KAAY,MAAA,EAAW,OAAA,CAAQ,SAAS,IAAA,CAAK,OAAA;AACtD,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,QAAQ,IAAA,CAAK,MAAA;AACpD,IAAA,IAAI,KAAK,OAAA,KAAY,MAAA,EAAW,OAAA,CAAQ,MAAA,GAAS,KAAK,OAAA,CAAQ,GAAA;AAC9D,IAAA,IAAI,IAAA,CAAK,aAAA,KAAkB,MAAA,EAAW,OAAA,CAAQ,eAAe,IAAA,CAAK,aAAA;AAElE,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,YAAA,KAAiB,EAAE,CAAA,IAAK,IAAA,CAAK,KAAA,KAAU,MAAA,EAAW;AACjF,MAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,MAAA,OAAA,CAAQ,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,YAAA,CAAa,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAAA,IACtE,CAAA,MAAA,IAAW,IAAA,CAAK,KAAA,KAAU,MAAA,EAAW;AACnC,MAAA,OAAA,CAAQ,OAAO,IAAA,CAAK,KAAA;AAAA,IACtB;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsEA,UAAA,CAAW,OAAA,GAA4B,EAAC,EAAgB;AACtD,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,gBAAgB,mCAAmC,CAAA;AAAA,IAC/D;AAGA,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAGhC,IAAA,MAAM,OAAA,GACJ,OAAA,CAAQ,OAAA,IACR,IAAA,CAAK,QAAA,KACJ,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,UAAA,EAAW,CAAE,OAAA,GAAU,MAAA,CAAA;AACxD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA;AAG3C,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,IAAA,CAAK,OAAA;AACtC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,MAAA;AACpC,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,IAAA,CAAK,OAAA;AACtC,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,YAAA,IAAgB,IAAA,CAAK,aAAA,IAAiB,IAAA;AACnE,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,IAAQ,IAAA,CAAK,KAAA;AAElC,IAAA,IAAI,QAAQ,KAAA,EAAO;AAEjB,MAAA,MAAM,IAAI,gBAAgB,0DAAA,EAA4D;AAAA,QACpF,OAAO,OAAA,CAAQ;AAAA,OAChB,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,gBAAgB,iEAAiE,CAAA;AAAA,IAC7F;AAEA,IAAA,MAAM,WAAA,GAAc,aAAa,MAAM,CAAA;AAEvC,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,MAAM,IAAI,gBAAgB,sDAAsD,CAAA;AAAA,IAClF;AAGA,IAAA,MAAM,SAAA,GAAY,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAC,MAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAC,CAAA,GAAI,IAAA;AAG9D,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,EAAM,OAAA,IAAW,CAAA;AAC1C,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,IAAA,EAAM,YAAA,IAAgB,CAAA;AAGpD,IAAA,MAAM,WAAA,GACJ,MAAA,IAAU,MAAA,CAAO,GAAA,GACb;AAAA,MACE,GAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA;AAAA,MAC9B,QACE,OAAO,MAAA,CAAO,MAAA,KAAW,QAAA,GACrB,OAAO,MAAA,CAAO,MAAM,CAAA,GACpB,OAAO,OAAO,MAAA,KAAW,QAAA,GACvB,OAAO,MAAA,CAAO,MAAM,IACpB,MAAA,CAAO;AAAA,KACjB,GACA,IAAA;AAGN,IAAA,OAAO,IAAI,WAAA,CAAY;AAAA,MACrB,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,YAAA;AAAA,QACT,KAAA,EAAO,KAAA;AAAA,QACP,QAAQ,WAAA,CAAY,IAAA;AAAA;AAAA,QAEpB,QAAA,EAAU,IAAA;AAAA;AAAA,QAEV,YAAA,EAAc,YAAA;AAAA;AAAA,QAGd,IAAA,EAAM,SAAA;AAAA;AAAA,QAGN,OAAA,EAAS,QAAA;AAAA,QACT,YAAA,EAAc,aAAA;AAAA,QACd,MAAA,EAAQ;AAAA;AACV,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwDA,MAAM,KAAA,GAA8B;AAClC,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,MAAM,IAAI,eAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,gBAAgB,mCAAmC,CAAA;AAAA,IAC/D;AAGA,IAAA,MAAM,OAAA,GAAU,KAAK,YAAA,EAAa;AAGlC,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,QAAA,CAAS,iBAAiB,OAAO,CAAA;AAEjE,IAAA,IAAI,CAAC,aAAa,MAAA,EAAQ;AACxB,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AACA,IAAA,OAAQ,YAAA,CAAa,OAAoC,UAAU,CAAA;AAInE,IAAA,OAAO,WAAA,CAAY,UAAA,CAAW,YAAA,CAAa,MAAkC,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsCA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,YAAY,EAAC;AAClB,IAAA,OAAO,IAAA,CAAK,OAAA;AACZ,IAAA,OAAO,IAAA,CAAK,MAAA;AACZ,IAAA,OAAO,IAAA,CAAK,OAAA;AACZ,IAAA,OAAO,IAAA,CAAK,aAAA;AACZ,IAAA,OAAO,IAAA,CAAK,KAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACpyCO,SAAS,eAAe,MAAA,EAIX;AAClB,EAAA,MAAM,GAAA,GAAuB;AAAA,IAC3B,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,QAAQ,MAAA,CAAO;AAAA,GACjB;AACA,EAAA,IAAI,MAAA,CAAO,GAAA,KAAQ,MAAA,EAAW,GAAA,CAAI,MAAM,MAAA,CAAO,GAAA;AAC/C,EAAA,OAAO,GAAA;AACT;AAyBO,SAAS,4BAA4B,MAAA,EAMxB;AAClB,EAAA,MAAM,GAAA,GAAuB;AAAA,IAC3B,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,QAAQ,MAAA,CAAO;AAAA,GACjB;AACA,EAAA,IAAI,MAAA,CAAO,GAAA,KAAQ,MAAA,EAAW,GAAA,CAAI,MAAM,MAAA,CAAO,GAAA;AAC/C,EAAA,IAAI,MAAA,CAAO,YAAA,KAAiB,MAAA,EAAW,GAAA,CAAI,eAAe,MAAA,CAAO,YAAA;AACjE,EAAA,IAAI,MAAA,CAAO,YAAA,KAAiB,MAAA,EAAW,GAAA,CAAI,eAAe,MAAA,CAAO,YAAA;AACjE,EAAA,OAAO,GAAA;AACT;AA4BO,SAAS,aAAa,MAAA,EAA6D;AACxF,EAAA,OAAO,MAAA;AACT;AAmBO,SAAS,eAAe,MAAA,EAA6D;AAC1F,EAAA,OAAO,MAAA;AACT;AAmBO,SAAS,eAAe,MAAA,EAAkE;AAC/F,EAAA,OAAO,MAAA;AACT;AAiBO,SAAS,iBAAiB,MAAA,EAAiD;AAChF,EAAA,OAAO,MAAA;AACT;AAqBO,SAAS,eAAe,MAAA,EAKX;AAClB,EAAA,OAAO,MAAA;AACT;AAmBO,SAAS,YAAY,MAAA,EAA0D;AACpF,EAAA,OAAO,MAAA;AACT;AAqCO,SAAS,oBAAoB,MAAA,EAQb;AACrB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,CAAA;AAAA;AAAA,IACN,GAAG;AAAA,GACL;AACF;AA8BO,SAAS,oBAAoB,MAAA,EAQb;AACrB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,CAAA;AAAA;AAAA,IACN,SAAA,EAAW,CAAA;AAAA;AAAA,IACX,SAAA,EAAW,CAAA;AAAA;AAAA,IACX,GAAG;AAAA,GACL;AACF;AA0BO,SAAS,cAAc,MAAA,EAKN;AACtB,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,CAAA;AAAA;AAAA,IACb,GAAG;AAAA,GACL;AACF;AAmBO,SAAS,WAAW,MAAA,EAAsE;AAC/F,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,CAAA;AAAA;AAAA,IACb,GAAG;AAAA,GACL;AACF;AAqBO,SAAS,WAAW,MAAA,EAIH;AACtB,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,CAAA;AAAA;AAAA,IACb,GAAG;AAAA,GACL;AACF;AAiBO,SAAS,YAAY,MAAA,EAAkD;AAC5E,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,CAAA;AAAA;AAAA,IACb,GAAG;AAAA,GACL;AACF;AAiBO,SAAS,aAAa,MAAA,EAAkD;AAC7E,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,CAAA;AAAA;AAAA,IACb,GAAG;AAAA,GACL;AACF;AAiDO,SAAS,gBAAgB,MAAA,EAUL;AACzB,EAAA,OAAO,MAAA;AACT;AAkCO,SAAS,eAAe,MAAA,EAIX;AAClB,EAAA,OAAO,MAAA;AACT;AAgCO,SAAS,WAAW,MAAA,EAIX;AACd,EAAA,OAAO,MAAA;AACT;AA6BO,SAAS,qBAAqB,MAAA,EAAiD;AACpF,EAAA,OAAO,MAAA;AACT;AAiCO,SAAS,wBAAwB,MAAA,EAAoD;AAC1F,EAAA,OAAO,MAAA;AACT;AAoBO,SAAS,WAAW,MAAA,EAAiC;AAC1D,EAAA,MAAM,MAAM,OAAO,MAAA,KAAW,QAAA,GAAW,UAAA,CAAW,MAAM,CAAA,GAAI,MAAA;AAC9D,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,GAAS,EAAE,QAAA,EAAS;AAC9C;AAgBO,SAAS,aAAa,MAAA,EAA0C;AACrE,EAAA,MAAM,GAAA,GACJ,OAAO,MAAA,KAAW,QAAA,GACd,MAAA,CAAO,MAAM,CAAA,GACb,OAAO,MAAA,KAAW,QAAA,GAChB,QAAA,CAAS,MAAM,CAAA,GACf,MAAA;AACR,EAAA,OAAA,CAAQ,GAAA,GAAM,KAAW,QAAA,EAAS;AACpC;AAmBO,SAAS,OAAA,CAAQ,QAAyB,SAAA,EAA2B;AAC1E,EAAA,MAAM,MAAM,OAAO,MAAA,KAAW,QAAA,GAAW,UAAA,CAAW,MAAM,CAAA,GAAI,MAAA;AAC9D,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,SAAS,CAAA;AACzC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,UAAU,EAAE,QAAA,EAAS;AAC/C;AAmBO,SAAS,SAAA,CAAU,QAAkC,SAAA,EAA2B;AACrF,EAAA,MAAM,GAAA,GACJ,OAAO,MAAA,KAAW,QAAA,GACd,MAAA,CAAO,MAAM,CAAA,GACb,OAAO,MAAA,KAAW,QAAA,GAChB,QAAA,CAAS,MAAM,CAAA,GACf,MAAA;AACR,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,SAAS,CAAA;AACtC,EAAA,OAAA,CAAQ,GAAA,GAAM,SAAS,QAAA,EAAS;AAClC","file":"index.mjs","sourcesContent":["import { TransactionError } from '@klever/connect-core'\nimport { cryptoProvider } from '@klever/connect-crypto'\nimport type { PrivateKey } from '@klever/connect-crypto'\nimport {\n  Transaction as ProtoTransaction,\n  type ITransaction,\n  ContractType,\n} from '@klever/connect-encoding'\nimport { hexEncode, hexDecode, hashBlake2b } from '@klever/connect-encoding'\n\n/**\n * Transaction class representing a Klever blockchain transaction\n * Extends the protobuf Transaction class with convenience methods\n *\n * This class wraps the proto-generated Transaction and provides:\n * - Easy signing with private keys\n * - Serialization to bytes/hex\n * - Fee calculations\n * - Transaction state management\n *\n * This is a pure data class - no network dependencies.\n * Use provider.sendRawTransaction(tx.toHex()) to broadcast.\n */\nexport class Transaction extends ProtoTransaction {\n  private hash?: string // Cached transaction hash\n\n  /**\n   * Create a Transaction from proto-generated transaction data\n   * @param data - Proto transaction data (from node or local build)\n   */\n  constructor(data?: ITransaction) {\n    super(data)\n    // Precompute and cache the transaction hash if RawData is present\n    if (this.RawData) {\n      this.getHash()\n    }\n  }\n\n  /**\n   * Get raw proto bytes for the transaction\n   * This is what gets signed and broadcast to the network\n   *\n   * @returns Proto bytes as Uint8Array\n   *\n   * @example\n   * ```typescript\n   * const tx = new Transaction(txData)\n   * const bytes = tx.toBytes()\n   * // bytes: Uint8Array [10, 32, 65, ...]\n   * // Use for signing or network transmission\n   * ```\n   */\n  toBytes(): Uint8Array {\n    return ProtoTransaction.encode(this).finish()\n  }\n\n  /**\n   * Get proto bytes as hex string\n   * Useful for broadcasting to node via HTTP or storing in databases\n   *\n   * @returns Hex encoded proto bytes (without 0x prefix)\n   *\n   * @example\n   * ```typescript\n   * const tx = new Transaction(txData)\n   * await tx.sign(privateKey)\n   * const hex = tx.toHex()\n   * // hex: \"0a20418f2b3c...\"\n   *\n   * // Broadcast to network\n   * const hash = await provider.sendRawTransaction(hex)\n   * ```\n   */\n  toHex(): string {\n    return hexEncode(this.toBytes())\n  }\n\n  public override toJSON(): { [k: string]: unknown } {\n    const json = super.toJSON()\n\n    // Convert GasLimit from string to number (top-level field)\n    if (typeof json['GasLimit'] === 'string') {\n      const gasLimit = Number(json['GasLimit'])\n      if (!Number.isSafeInteger(gasLimit) || gasLimit < 0) {\n        throw new TransactionError('Invalid GasLimit value')\n      }\n      json['GasLimit'] = gasLimit\n    }\n\n    // Convert numeric string fields to actual numbers\n    if (json['RawData'] && typeof json['RawData'] === 'object') {\n      const rawData = json['RawData'] as { [k: string]: unknown }\n\n      // proto.js serializes 64-bit integer fields (int64/uint64) as strings;\n      // the extension unmarshals RawData expecting numbers. Nested fields use\n      // dot notation (e.g. \"KDAFee.Amount\").\n      numericStringFieldsToNumbers(rawData, [\n        'Nonce',\n        'KAppFee',\n        'BandwidthFee',\n        'PermID',\n        'KDAFee.Amount',\n      ])\n\n      // Convert contract types from enum strings to numbers\n      if (Array.isArray(rawData['Contract'])) {\n        rawData['Contract'] = rawData['Contract'].map((contract: unknown) => {\n          if (contract && typeof contract === 'object') {\n            const c = contract as { [k: string]: unknown }\n            // Convert Type enum from string name to numeric value\n            if (typeof c['Type'] === 'string') {\n              // Look up the enum value\n              const enumValue = ContractType[c['Type'] as keyof typeof ContractType]\n              c['Type'] = typeof enumValue === 'number' ? enumValue : c['Type']\n            }\n          }\n          return contract\n        })\n      }\n    }\n\n    // Include additional fields as needed\n    if (this.hash) {\n      json['hash'] = this.hash\n    }\n\n    return json\n  }\n\n  /**\n   * Sign the transaction with a private key\n   * Signs the transaction hash (blake2b of RawData)\n   * @param privateKey - Private key to sign with\n   * @returns This transaction instance with signature added\n   *\n   * @example\n   * ```typescript\n   * const tx = new Transaction(txData)\n   * await tx.sign(privateKey)\n   * // tx now has Signature field populated\n   * ```\n   */\n  async sign(privateKey: PrivateKey): Promise<Transaction> {\n    // Get transaction hash bytes (blake2b of RawData)\n    const hashBytes = this.getHashBytes()\n\n    // Sign the hash\n    const signature = await cryptoProvider.signMessage(hashBytes, privateKey)\n\n    // Add signature to transaction (proto uses Signature field)\n    this.Signature = [signature.bytes]\n\n    return this\n  }\n\n  /**\n   * Check if transaction is signed\n   * Verifies whether the transaction has been signed and is ready for broadcast\n   *\n   * @returns true if transaction has at least one signature, false otherwise\n   *\n   * @example\n   * ```typescript\n   * const tx = new Transaction(txData)\n   * console.log(tx.isSigned()) // false\n   *\n   * await tx.sign(privateKey)\n   * console.log(tx.isSigned()) // true\n   *\n   * // Only broadcast if signed\n   * if (tx.isSigned()) {\n   *   await provider.sendRawTransaction(tx.toHex())\n   * }\n   * ```\n   */\n  isSigned(): boolean {\n    return !!this.Signature && this.Signature.length > 0\n  }\n\n  /**\n   * Get total fee (KAppFee + BandwidthFee)\n   * Returns the combined fee for the transaction in smallest KLV units\n   *\n   * @returns Total fee amount in KLV smallest units (1 KLV = 1,000,000 units)\n   *\n   * @example\n   * ```typescript\n   * const tx = new Transaction(txData)\n   * const totalFee = tx.getTotalFee()\n   * console.log(`Total fee: ${totalFee} units`) // e.g., \"600000 units\"\n   *\n   * // Convert to human-readable KLV\n   * const feeInKLV = Number(totalFee) / 1_000_000\n   * console.log(`Fee: ${feeInKLV} KLV`) // e.g., \"0.6 KLV\"\n   * ```\n   */\n  getTotalFee(): bigint {\n    const kAppFee = this.RawData?.KAppFee ?? 0\n    const bandwidthFee = this.RawData?.BandwidthFee ?? 0\n    // Convert Long to bigint if needed\n    const kAppFeeBigInt = typeof kAppFee === 'bigint' ? kAppFee : BigInt(kAppFee.toString())\n    const bandwidthFeeBigInt =\n      typeof bandwidthFee === 'bigint' ? bandwidthFee : BigInt(bandwidthFee.toString())\n    return kAppFeeBigInt + bandwidthFeeBigInt\n  }\n\n  /**\n   * Get the transaction hash bytes\n   * Computes blake2b hash of the RawData proto bytes\n   * @returns Transaction hash as Uint8Array\n   *\n   * @example\n   * ```typescript\n   * const tx = new Transaction(txData)\n   * const hashBytes = tx.getHashBytes()\n   * // Use for signing or other operations\n   * ```\n   */\n  getHashBytes(): Uint8Array {\n    if (!this.RawData) {\n      throw new TransactionError('Transaction has no RawData')\n    }\n\n    // Encode RawData to proto bytes\n    const rawDataBytes = ProtoTransaction.Raw.encode(this.RawData).finish()\n\n    // Hash using blake2b (32 bytes output)\n    return hashBlake2b(rawDataBytes, 32)\n  }\n\n  /**\n   * Get the transaction hash\n   * Computes blake2b hash of the RawData proto bytes\n   * @returns Transaction hash as hex string\n   *\n   * @example\n   * ```typescript\n   * const tx = new Transaction(txData)\n   * const hash = tx.getHash()\n   * // hash: \"a3f2e8d9...\"\n   * ```\n   */\n  getHash(): string {\n    this.hash = hexEncode(this.getHashBytes())\n    return this.hash\n  }\n\n  /**\n   * Create a Transaction from hex-encoded proto bytes\n   * Decodes a hex string back into a Transaction object\n   *\n   * @param hex - Hex string of proto-encoded transaction (with or without 0x prefix)\n   * @returns Transaction instance\n   *\n   * @example\n   * ```typescript\n   * // Decode hex string from storage or API\n   * const hex = \"0a20418f2b3c...\"\n   * const tx = Transaction.fromHex(hex)\n   *\n   * // Verify signature\n   * console.log(tx.isSigned()) // true or false\n   *\n   * // Get transaction hash\n   * console.log(tx.getHash())\n   * ```\n   */\n  static fromHex(hex: string): Transaction {\n    const bytes = hexDecode(hex)\n    const decoded = ProtoTransaction.decode(bytes)\n    return new Transaction(decoded)\n  }\n\n  /**\n   * Create a Transaction from raw proto bytes\n   * Decodes protobuf bytes back into a Transaction object\n   *\n   * @param bytes - Proto-encoded transaction bytes\n   * @returns Transaction instance\n   *\n   * @example\n   * ```typescript\n   * // Decode bytes from storage or network\n   * const bytes = new Uint8Array([10, 32, 65, ...])\n   * const tx = Transaction.fromBytes(bytes)\n   *\n   * // Verify and use\n   * console.log(tx.getHash())\n   * console.log(tx.isSigned())\n   * ```\n   */\n  static fromBytes(bytes: Uint8Array): Transaction {\n    const decoded = ProtoTransaction.decode(bytes)\n    return new Transaction(decoded)\n  }\n\n  /**\n   * Create a Transaction from a plain JSON object (from API)\n   * Properly converts base64 strings to Uint8Array for proto fields.\n   * This is typically used when receiving transaction data from the node's API.\n   *\n   * @param obj - Plain object with base64-encoded byte fields\n   * @returns Transaction instance\n   *\n   * @example\n   * ```typescript\n   * // Response from node's /transaction/build endpoint\n   * const response = await fetch('/transaction/build', {\n   *   method: 'POST',\n   *   body: JSON.stringify(buildRequest)\n   * })\n   * const data = await response.json()\n   *\n   * // Convert API response to Transaction\n   * const tx = Transaction.fromObject(data.result)\n   *\n   * // Sign and broadcast\n   * await tx.sign(privateKey)\n   * await provider.sendRawTransaction(tx.toHex())\n   * ```\n   */\n  static override fromObject(obj: { [k: string]: unknown }): Transaction {\n    const decoded = ProtoTransaction.fromObject(obj)\n    return new Transaction(decoded)\n  }\n\n  /**\n   * Create a new Transaction from an existing Transaction\n   * Creates a deep copy of the transaction\n   *\n   * @param tx - Existing Transaction instance\n   * @returns New Transaction instance\n   *\n   * @example\n   * ```typescript\n   * const originalTx = new Transaction(txData)\n   * const copiedTx = Transaction.fromTransaction(originalTx)\n   *\n   * // Modifications to copiedTx won't affect originalTx\n   * await copiedTx.sign(privateKey)\n   * ```\n   */\n  static fromTransaction(tx: Transaction): Transaction {\n    const decoded = ProtoTransaction.fromObject(tx)\n    return new Transaction(decoded)\n  }\n}\n\n/**\n * Convert the given fields of an object from string to number, in place.\n *\n * Supports nested fields via dot notation (e.g. \"KDAFee.Amount\"). Fields that\n * are absent, unreachable, or already numeric are left untouched.\n *\n * @param obj - Object to mutate\n * @param paths - Field paths to convert (dot-separated for nested fields)\n */\nfunction numericStringFieldsToNumbers(\n  obj: { [k: string]: unknown },\n  paths: readonly string[],\n): void {\n  for (const path of paths) {\n    const keys = path.split('.')\n    const leafKey = keys.pop()\n    if (leafKey === undefined) continue\n\n    let target: { [k: string]: unknown } | undefined = obj\n    for (const key of keys) {\n      if (!target) break\n      const next: unknown = target[key]\n      target = next && typeof next === 'object' ? (next as { [k: string]: unknown }) : undefined\n    }\n\n    if (target && typeof target[leafKey] === 'string') {\n      target[leafKey] = Number(target[leafKey])\n    }\n  }\n}\n","import { ValidationError } from '@klever/connect-core'\nimport type {\n  IProvider,\n  BuildTransactionRequest,\n  TransferRequest,\n  FreezeRequest,\n  UnfreezeRequest,\n  DelegateRequest,\n  UndelegateRequest,\n  WithdrawRequest,\n  ClaimRequest,\n  CreateAssetRequest,\n  CreateValidatorRequest,\n  VoteRequest,\n  SmartContractRequest,\n  ContractRequestData,\n} from '@klever/connect-provider'\nimport { isValidAddress, isValidContractAddress } from '@klever/connect-core'\nimport { Transaction } from './transaction'\n\nimport { bech32Decode, base64Encode } from '@klever/connect-encoding'\nimport type { AmountLike } from '@klever/connect-provider'\nimport type { IKDAFee } from '@klever/connect-encoding'\n\n/**\n * Build call options\n * All fields are optional - will use builder's state if not provided\n */\nexport interface BuildCallOptions {\n  /** Value to send with transaction (e.g., { KLV: parseKLV('1') }) */\n  value?: Record<string, bigint>\n  /** Chain ID for offline transaction building */\n  chainId?: string\n  /** Sender address */\n  sender?: string\n  /** Nonce for offline transaction building */\n  nonce?: number\n  /** Fees for offline transaction building */\n  fees?: {\n    kAppFee: number\n    bandwidthFee: number\n  }\n  /** KDA fee for offline transaction building */\n  kdaFee?: { kda: string; amount: AmountLike }\n  /** Permission ID for the transaction */\n  permissionId?: number\n  /** Transaction data (for smart contract calls) */\n  data?: string[]\n}\n\n/**\n * TransactionBuilder - Fluent API for building Klever blockchain transactions\n *\n * Supports three build modes:\n * 1. buildRequest() - Create request object for node endpoint\n * 2. buildProto(options) - Build proto offline (client-side)\n * 3. build() - Build using node endpoint (requires provider)\n *\n * @example\n * ```typescript\n * // Chainable building and signing\n * const tx = await TransactionBuilder.create(provider)\n *   .sender('klv1...')\n *   .transfer({ receiver: 'klv1...', amount: '1000000' })\n *   .build()\n *\n * await tx.sign(privateKey)\n * const hash = await provider.sendRawTransaction(tx.toHex())\n *\n * // Node-assisted building\n * const provider = new KleverProvider({ network: 'mainnet' })\n * const tx = await new TransactionBuilder(provider)\n *   .sender('klv1...')\n *   .transfer({ receiver: 'klv1...', amount: '1000000' })\n *   .build()\n *\n * // Offline building\n * const tx = new TransactionBuilder()\n *   .transfer({ receiver: 'klv1...', amount: '1000000' })\n *   .buildProto({\n *     sender: 'klv1...',\n *     nonce: 123,\n *     fees: { kAppFee: 500000, bandwidthFee: 100000 }\n *   })\n * ```\n */\nexport class TransactionBuilder {\n  private contracts: ContractRequestData[] = []\n  private _chainId?: string // Default to provider's network if available\n  private _sender?: string\n  private _nonce?: number\n  private _kdaFee?: { kda: string; amount: AmountLike }\n  private _permissionId?: number\n  private _data?: string[]\n\n  constructor(private provider?: IProvider) {}\n\n  /**\n   * Create a new TransactionBuilder with provider (static factory)\n   * Provides a cleaner API for chainable transaction building\n   *\n   * @example\n   * ```typescript\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender(address)\n   *   .transfer({ receiver, amount })\n   *   .build()\n   *\n   * await tx.sign(privateKey)\n   * const hash = await provider.sendRawTransaction(tx.toHex())\n   * ```\n   */\n  static create(provider?: IProvider): TransactionBuilder {\n    return new TransactionBuilder(provider)\n  }\n\n  /**\n   * Get the provider instance\n   */\n  getProvider(): IProvider | undefined {\n    return this.provider\n  }\n\n  /**\n   * Set the provider instance\n   */\n  setProvider(provider: IProvider): this {\n    this.provider = provider\n    return this\n  }\n\n  /**\n   * Set chain ID (overrides provider's network if set)\n   * The chain ID identifies which Klever network to use (e.g., \"100\" for mainnet)\n   *\n   * @param chainId - Chain ID string (e.g., \"100\" for mainnet, \"101\" for testnet)\n   * @returns This builder instance for chaining\n   *\n   * @example\n   * ```typescript\n   * const tx = TransactionBuilder.create()\n   *   .setChainId('100')\n   *   .sender('klv1...')\n   *   .transfer({ receiver: 'klv1...', amount: '1000000' })\n   *   .buildProto({ nonce: 1, fees: { kAppFee: 500000, bandwidthFee: 100000 } })\n   * ```\n   */\n  setChainId(chainId: string): this {\n    this._chainId = chainId\n    return this\n  }\n\n  /**\n   * Set sender address for the transaction\n   *\n   * @param address - Bech32 encoded Klever address (e.g., \"klv1...\")\n   * @returns This builder instance for chaining\n   * @throws {ValidationError} If address format is invalid\n   *\n   * @example\n   * ```typescript\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1fpwjz234gy8aaae3gx0e8q9f52vymzzn3z5q0s5h60pvktzx0n0qwvtux5')\n   *   .transfer({ receiver: 'klv1...', amount: '1000000' })\n   *   .build()\n   * ```\n   */\n  sender(address: string): this {\n    if (!isValidAddress(address)) {\n      throw new ValidationError(`Invalid sender address: ${address}`, { address })\n    }\n    this._sender = address\n    return this\n  }\n\n  /**\n   * Set nonce manually for offline transaction building\n   * The nonce is a sequential counter that prevents transaction replay attacks.\n   * Each account has its own nonce that increments with every transaction.\n   *\n   * **When to use:**\n   * - Offline transaction building (required with buildProto())\n   * - Manual nonce management for batch transactions\n   * - Testing or debugging specific scenarios\n   *\n   * **Getting current nonce:**\n   * Use `provider.getAccount(address)` to get the current nonce from the network\n   *\n   * @param nonce - Transaction nonce (must be non-negative)\n   * @returns This builder instance for chaining\n   * @throws {ValidationError} If nonce is negative\n   *\n   * @example\n   * ```typescript\n   * // Manual nonce for offline building\n   * const tx = TransactionBuilder.create()\n   *   .sender('klv1...')\n   *   .nonce(123)\n   *   .transfer({ receiver: 'klv1...', amount: '1000000' })\n   *   .buildProto({\n   *     chainId: '100',\n   *     fees: { kAppFee: 500000, bandwidthFee: 100000 }\n   *   })\n   *\n   * // Get nonce from provider first\n   * const account = await provider.getAccount('klv1...')\n   * const tx = TransactionBuilder.create()\n   *   .sender('klv1...')\n   *   .nonce(account.nonce)\n   *   .transfer({ receiver: 'klv1...', amount: '1000000' })\n   *   .buildProto({ chainId: '100', fees: { kAppFee: 500000, bandwidthFee: 100000 } })\n   * ```\n   */\n  nonce(nonce: number): this {\n    if (nonce < 0) {\n      throw new ValidationError('Nonce must be non-negative', { nonce })\n    }\n    this._nonce = nonce\n    return this\n  }\n\n  /**\n   * Set KDA fee to pay transaction fees in a custom KDA asset instead of KLV\n   * By default, transactions pay fees in KLV (kAppFee + bandwidthFee).\n   * This method allows paying fees in a different asset.\n   *\n   * **Important:**\n   * - Cannot use 'KLV' as kdaFee (KLV is the default fee asset)\n   * - The asset must support being used as a fee payment option\n   *\n   * @param fee - KDA fee configuration\n   * @param fee.kda - Asset ID to use for fee payment (cannot be 'KLV')\n   * @param fee.amount - Fee amount in smallest units of the KDA asset\n   * @returns This builder instance for chaining\n   * @throws {ValidationError} If kda is 'KLV' or amount is negative\n   *\n   * @example\n   * ```typescript\n   * // Pay fees in custom token instead of KLV\n   * const tx = TransactionBuilder.create()\n   *   .sender('klv1...')\n   *   .kdaFee({ kda: 'MYTOKEN-ABCD', amount: '1000000' })\n   *   .transfer({ receiver: 'klv1...', amount: '1000000' })\n   *   .buildProto({\n   *     nonce: 1,\n   *     chainId: '100',\n   *   })\n   * ```\n   */\n  kdaFee(fee: { kda: string; amount: AmountLike }): this {\n    if (!fee.kda) {\n      throw new ValidationError('KDA fee asset ID is required')\n    }\n    // can`t use KLV as kdaFee (its default if not set)\n    if (fee.kda === 'KLV') {\n      throw new ValidationError('KDA fee cannot be KLV - use KAppFee and BandwidthFee instead', {\n        assetId: fee.kda,\n      })\n    }\n\n    const amount = typeof fee.amount === 'bigint' ? fee.amount : BigInt(fee.amount)\n    if (amount < 0n) {\n      throw new ValidationError('KDA fee amount must be non-negative', { amount })\n    }\n    this._kdaFee = { kda: fee.kda, amount }\n    return this\n  }\n\n  /**\n   * Set permission ID for multi-signature transactions\n   * Permission IDs enable complex account structures with multiple signers and permissions.\n   *\n   * **Use cases:**\n   * - Multi-signature wallets requiring multiple approvals\n   * - Corporate accounts with different permission levels\n   * - Smart contract interactions with specific permissions\n   *\n   * @param id - Permission ID number\n   * @returns This builder instance for chaining\n   *\n   * @example\n   * ```typescript\n   * // Transaction requiring specific permission\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .permissionId(2)\n   *   .transfer({ receiver: 'klv1...', amount: '1000000' })\n   *   .build()\n   * ```\n   */\n  permissionId(id: number): this {\n    this._permissionId = id\n    return this\n  }\n\n  /**\n   * Set transaction data for smart contract calls\n   * Data is used primarily for smart contract interactions, where it contains:\n   * - Function name (first element)\n   * - Function arguments (remaining elements)\n   *\n   * **Important:**\n   * - Data is automatically base64 encoded when building with buildRequest()\n   * - For offline building with buildProto(), provide UTF-8 strings\n   *\n   * @param data - Array of strings containing function name and arguments\n   * @returns This builder instance for chaining\n   *\n   * @example\n   * ```typescript\n   * // Smart contract call with arguments\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .smartContract({ address: 'klv1contract...', scType: 0 })\n   *   .data(['transfer', 'klv1receiver...', '1000000'])\n   *   .build()\n   *\n   * // Multiple data fields\n   * const tx = TransactionBuilder.create()\n   *   .sender('klv1...')\n   *   .smartContract({ address: 'klv1contract...', scType: 0 })\n   *   .data(['functionName', 'arg1', 'arg2', 'arg3'])\n   *   .buildProto({ nonce: 1, chainId: '100', fees: { kAppFee: 500000, bandwidthFee: 100000 } })\n   * ```\n   */\n  data(data: string[]): this {\n    this._data = data\n    return this\n  }\n\n  /**\n   * Add multiple build options at once\n   * Convenience method to set multiple builder options in a single call.\n   * This is particularly useful when working with smart contracts or offline building.\n   *\n   * **Note:** The `value` option is not supported here - set callValue directly in smartContract()\n   *\n   * @param options - Build options object\n   * @param options.sender - Sender's bech32 address\n   * @param options.nonce - Transaction nonce\n   * @param options.kdaFee - KDA fee configuration\n   * @param options.permissionId - Permission ID\n   * @param options.data - Transaction data array\n   * @param options.chainId - Chain ID\n   * @param options.fees - Fee amounts (kAppFee and bandwidthFee) - currently not implemented\n   * @returns This builder instance for chaining\n   *\n   * @example\n   * ```typescript\n   * // Set multiple options at once\n   * const tx = TransactionBuilder.create()\n   *   .transfer({ receiver: 'klv1...', amount: '1000000' })\n   *   .callOptions({\n   *     sender: 'klv1...',\n   *     nonce: 123,\n   *     chainId: '100',\n   *     permissionId: 1\n   *   })\n   *   .buildProto({ fees: { kAppFee: 500000, bandwidthFee: 100000 } })\n   * ```\n   */\n  callOptions(options: BuildCallOptions): this {\n    if (options.sender) {\n      this.sender(options.sender)\n    }\n    if (options.nonce !== undefined) {\n      this.nonce(options.nonce)\n    }\n    if (options.kdaFee) {\n      this.kdaFee(options.kdaFee)\n    }\n    if (options.permissionId !== undefined) {\n      this.permissionId(options.permissionId)\n    }\n    if (options.data) {\n      this.data(options.data)\n    }\n    if (options.fees) {\n      // TODO: implement fees setting\n    }\n    if (options.value) {\n      // should be set in smart contract directly -- ignore --\n    }\n    return this\n  }\n  /**\n   * Add a contract using ContractRequestData\n   * Routes to the appropriate builder method based on contractType.\n   * This is a generic method that automatically calls the correct specialized method.\n   *\n   * **Contract Types:**\n   * - 0: Transfer\n   * - 1: CreateAsset\n   * - 2: CreateValidator\n   * - 4: Freeze\n   * - 5: Unfreeze\n   * - 6: Delegate\n   * - 7: Undelegate\n   * - 8: Withdraw\n   * - 9: Claim\n   * - 14: Vote\n   * - 63: SmartContract\n   *\n   * @param contract - Contract request data with contractType\n   * @returns This builder instance for chaining\n   *\n   * @example\n   * ```typescript\n   * // Add transfer contract directly\n   * builder.addContract({\n   *   contractType: 0,\n   *   receiver: 'klv1...',\n   *   amount: 1000000\n   * })\n   *\n   * // Add freeze contract\n   * builder.addContract({\n   *   contractType: 4,\n   *   amount: 5000000,\n   *   kda: 'KLV'\n   * })\n   * ```\n   */\n  addContract(contract: ContractRequestData): this {\n    const { contractType, ...params } = contract\n\n    switch (contractType) {\n      case 0: // Transfer\n        return this.transfer(params as TransferRequest)\n      case 4: // Freeze\n        return this.freeze(params as FreezeRequest)\n      case 5: // Unfreeze\n        return this.unfreeze(params as UnfreezeRequest)\n      case 6: // Delegate\n        return this.delegate(params as DelegateRequest)\n      case 7: // Undelegate\n        return this.undelegate(params as UndelegateRequest)\n      case 8: // Withdraw\n        return this.withdraw(params as WithdrawRequest)\n      case 9: // Claim\n        return this.claim(params as ClaimRequest)\n      case 1: // CreateAsset\n        return this.createAsset(params as CreateAssetRequest)\n      case 2: // CreateValidator\n        return this.createValidator(params as CreateValidatorRequest)\n      case 14: // Vote\n        return this.vote(params as VoteRequest)\n      case 63: // SmartContract\n        return this.smartContract(params as SmartContractRequest)\n      default:\n        // For unsupported types, add directly to contracts array\n        this.contracts.push(contract)\n        return this\n    }\n  }\n\n  /**\n   * Add transfer contract to send KLV or KDA assets\n   *\n   * @param params - Transfer parameters\n   * @param params.receiver - Recipient's bech32 address\n   * @param params.amount - Amount to transfer in smallest units (e.g., 1000000 = 1 KLV)\n   * @param params.kda - Optional asset ID to transfer (defaults to KLV if not specified)\n   * @param params.kdaRoyalties - Optional KDA royalties amount\n   * @param params.klvRoyalties - Optional KLV royalties amount\n   * @returns This builder instance for chaining\n   * @throws {ValidationError} If receiver address is invalid or amount is not positive\n   *\n   * @example\n   * ```typescript\n   * // Transfer KLV\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .transfer({\n   *     receiver: 'klv1abc123...',\n   *     amount: '1000000' // 1 KLV\n   *   })\n   *   .build()\n   *\n   * // Transfer custom KDA token\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .transfer({\n   *     receiver: 'klv1abc123...',\n   *     amount: '5000000',\n   *     kda: 'MYTOKEN-ABCD'\n   *   })\n   *   .build()\n   *\n   * // Transfer with royalties (for NFTs)\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .transfer({\n   *     receiver: 'klv1abc123...',\n   *     amount: '1',\n   *     kda: 'NFT-COLLECTION/NONCE-1',\n   *     kdaRoyalties: '100000',\n   *     klvRoyalties: '50000'\n   *   })\n   *   .build()\n   * ```\n   */\n  transfer(params: TransferRequest): this {\n    if (!isValidAddress(params.receiver)) {\n      throw new ValidationError(`Invalid recipient address: ${params.receiver}`, {\n        address: params.receiver,\n      })\n    }\n\n    const amount = typeof params.amount === 'bigint' ? params.amount : BigInt(params.amount)\n\n    if (amount <= 0n) {\n      throw new ValidationError('Transfer amount must be positive', { amount: params.amount })\n    }\n\n    this.contracts.push({\n      contractType: 0,\n      receiver: params.receiver,\n      amount: amount,\n      ...(params.kda && { kda: params.kda }),\n      ...(params.kdaRoyalties && { kdaRoyalties: params.kdaRoyalties }),\n      ...(params.klvRoyalties && { klvRoyalties: params.klvRoyalties }),\n    })\n\n    return this\n  }\n\n  /**\n   * Add freeze (stake) contract to lock KLV or KDA assets\n   * Freezing creates a bucket that can be delegated to validators or used for governance\n   *\n   * @param params - Freeze parameters\n   * @param params.amount - Amount to freeze in smallest units\n   * @param params.kda - Optional asset ID to freeze (defaults to KLV if not specified)\n   * @returns This builder instance for chaining\n   * @throws {ValidationError} If amount is not positive\n   *\n   * @example\n   * ```typescript\n   * // Freeze KLV for staking\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .freeze({\n   *     amount: '5000000' // 5 KLV\n   *   })\n   *   .build()\n   *\n   * // Freeze custom KDA token\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .freeze({\n   *     amount: '1000000',\n   *     kda: 'MYTOKEN-ABCD'\n   *   })\n   *   .build()\n   * ```\n   */\n  freeze(params: FreezeRequest): this {\n    const amount = typeof params.amount === 'bigint' ? params.amount : BigInt(params.amount)\n\n    if (amount <= 0n) {\n      throw new ValidationError('Freeze amount must be positive', { amount: params.amount })\n    }\n\n    this.contracts.push({\n      contractType: 4,\n      amount: amount,\n      ...(params.kda && { kda: params.kda }),\n    })\n\n    return this\n  }\n\n  /**\n   * Add unfreeze (unstake) contract to unlock frozen assets\n   * Unfreezing initiates the unlocking process - assets become available after the unlock period\n   *\n   * @param params - Unfreeze parameters\n   * @param params.kda - Asset ID to unfreeze (required)\n   * @param params.bucketId - Bucket ID to unfreeze (required for KLV, optional for other assets)\n   * @returns This builder instance for chaining\n   * @throws {ValidationError} If kda parameter is missing\n   *\n   * @example\n   * ```typescript\n   * // Unfreeze KLV bucket\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .unfreeze({\n   *     kda: 'KLV',\n   *     bucketId: 'bucket-hash-123'\n   *   })\n   *   .build()\n   *\n   * // Unfreeze custom KDA token\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .unfreeze({\n   *     kda: 'MYTOKEN-ABCD'\n   *   })\n   *   .build()\n   * ```\n   */\n  unfreeze(params: UnfreezeRequest): this {\n    if (!params.kda) {\n      throw new ValidationError('KDA is required for unfreeze')\n    }\n\n    this.contracts.push({\n      contractType: 5,\n      kda: params.kda,\n      ...(params.bucketId && { bucketId: params.bucketId }),\n    })\n\n    return this\n  }\n\n  /**\n   * Add delegate contract to assign a frozen bucket to a validator\n   * Delegation allows validators to use your staked KLV for consensus and earn rewards\n   *\n   * @param params - Delegate parameters\n   * @param params.receiver - Validator's bech32 address to delegate to\n   * @param params.bucketId - Optional bucket ID to delegate (if not specified, delegates all available buckets)\n   * @returns This builder instance for chaining\n   * @throws {ValidationError} If validator address is invalid\n   *\n   * @example\n   * ```typescript\n   * // Delegate specific bucket to validator\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .delegate({\n   *     receiver: 'klv1validator123...',\n   *     bucketId: 'bucket-hash-123'\n   *   })\n   *   .build()\n   *\n   * // Delegate all available buckets\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .delegate({\n   *     receiver: 'klv1validator123...'\n   *   })\n   *   .build()\n   * ```\n   */\n  delegate(params: DelegateRequest): this {\n    if (!isValidAddress(params.receiver)) {\n      throw new ValidationError(`Invalid validator address: ${params.receiver}`, {\n        address: params.receiver,\n      })\n    }\n\n    this.contracts.push({\n      contractType: 6,\n      receiver: params.receiver,\n      ...(params.bucketId && { bucketId: params.bucketId }),\n    })\n\n    return this\n  }\n\n  /**\n   * Add undelegate contract to remove delegation from a validator\n   * Undelegation returns the bucket to your control but keeps it frozen\n   *\n   * @param params - Undelegate parameters\n   * @param params.bucketId - Bucket ID to undelegate (required)\n   * @returns This builder instance for chaining\n   * @throws {ValidationError} If bucketId is missing\n   *\n   * @example\n   * ```typescript\n   * // Undelegate bucket from validator\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .undelegate({\n   *     bucketId: 'bucket-hash-123'\n   *   })\n   *   .build()\n   * ```\n   */\n  undelegate(params: UndelegateRequest): this {\n    if (!params.bucketId) {\n      throw new ValidationError('Bucket ID is required for undelegate')\n    }\n\n    this.contracts.push({\n      contractType: 7,\n      ...params,\n    })\n\n    return this\n  }\n\n  /**\n   * Add withdraw contract to retrieve available funds\n   * Used to withdraw staking rewards, unlocked frozen assets, or other withdrawable amounts\n   *\n   * @param params - Withdraw parameters\n   * @param params.withdrawType - Type of withdrawal (0 = staking, 1 = FPR, etc.)\n   * @param params.kda - Optional asset ID to withdraw\n   * @param params.amount - Optional specific amount to withdraw\n   * @param params.currencyID - Optional currency ID for cross-currency withdrawals\n   * @returns This builder instance for chaining\n   *\n   * @example\n   * ```typescript\n   * // Withdraw staking rewards\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .withdraw({\n   *     withdrawType: 0 // Staking rewards\n   *   })\n   *   .build()\n   *\n   * // Withdraw specific KDA amount\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .withdraw({\n   *     withdrawType: 0,\n   *     kda: 'MYTOKEN-ABCD',\n   *     amount: '1000000'\n   *   })\n   *   .build()\n   * ```\n   */\n  withdraw(params: WithdrawRequest): this {\n    this.contracts.push({\n      contractType: 8,\n      ...params,\n    })\n\n    return this\n  }\n\n  /**\n   * Add claim contract to claim rewards or allocations\n   * Used for claiming staking rewards, airdrops, or other claimable amounts\n   *\n   * @param params - Claim parameters\n   * @param params.claimType - Type of claim (0 = staking rewards, 1 = market rewards, etc.)\n   * @param params.id - Optional claim ID for specific claims\n   * @returns This builder instance for chaining\n   *\n   * @example\n   * ```typescript\n   * // Claim staking rewards\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .claim({\n   *     claimType: 0 // Staking rewards\n   *   })\n   *   .build()\n   *\n   * // Claim specific allocation\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .claim({\n   *     claimType: 1,\n   *     id: 'allocation-id-123'\n   *   })\n   *   .build()\n   * ```\n   */\n  claim(params: ClaimRequest): this {\n    this.contracts.push({\n      contractType: 9,\n      ...params,\n    })\n\n    return this\n  }\n\n  /**\n   * Add create asset contract to create a new token or NFT collection\n   * Creates fungible tokens (FTs), non-fungible tokens (NFTs), or other asset types\n   *\n   * @param params - Asset creation parameters\n   * @param params.type - Asset type (0 = Fungible Token, 1 = NFT, etc.)\n   * @param params.name - Full name of the asset\n   * @param params.ticker - Short ticker symbol\n   * @param params.ownerAddress - Owner's bech32 address\n   * @param params.precision - Number of decimal places (0 for NFTs)\n   * @param params.maxSupply - Maximum supply in smallest units\n   * @param params.initialSupply - Optional initial supply to mint\n   * @param params.properties - Optional asset properties (mintable, burnable, etc.)\n   * @param params.royalties - Optional royalty configuration (for NFTs)\n   * @returns This builder instance for chaining\n   *\n   * @example\n   * ```typescript\n   * // Create fungible token\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .createAsset({\n   *     type: 0,\n   *     name: 'My Token',\n   *     ticker: 'MTK',\n   *     ownerAddress: 'klv1...',\n   *     precision: 6,\n   *     maxSupply: '1000000000000',\n   *     initialSupply: '100000000000'\n   *   })\n   *   .build()\n   *\n   * // Create NFT collection\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .createAsset({\n   *     type: 1,\n   *     name: 'My NFT Collection',\n   *     ticker: 'MYNFT',\n   *     ownerAddress: 'klv1...',\n   *     precision: 0,\n   *     maxSupply: 0,\n   *     royalties: { address: 'klv1...', percentage: 5 }\n   *   })\n   *   .build()\n   * ```\n   */\n  createAsset(params: CreateAssetRequest): this {\n    this.contracts.push({\n      contractType: 1,\n      ...params,\n    })\n\n    return this\n  }\n\n  /**\n   * Add create validator contract to register a new validator node\n   * Validators participate in consensus and earn rewards for securing the network\n   *\n   * @param params - Validator creation parameters\n   * @param params.blsPublicKey - BLS public key for validator signing\n   * @param params.ownerAddress - Owner's bech32 address\n   * @param params.commission - Commission rate percentage (e.g., 10 for 10%)\n   * @param params.canDelegate - Whether delegators can stake to this validator\n   * @param params.rewardAddress - Optional address to receive rewards\n   * @param params.maxDelegationAmount - Optional maximum delegation amount\n   * @param params.name - Optional validator name\n   * @param params.logo - Optional logo URI\n   * @param params.uris - Optional additional URIs (website, social media, etc.)\n   * @returns This builder instance for chaining\n   *\n   * @example\n   * ```typescript\n   * // Create validator node\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .createValidator({\n   *     blsPublicKey: '0xabcd1234...',\n   *     ownerAddress: 'klv1...',\n   *     commission: 10, // 10% commission\n   *     canDelegate: true,\n   *     name: 'My Validator',\n   *     logo: 'https://example.com/logo.png',\n   *     uris: {\n   *       website: 'https://validator.example.com',\n   *       twitter: 'https://twitter.com/myvalidator'\n   *     }\n   *   })\n   *   .build()\n   * ```\n   */\n  createValidator(params: CreateValidatorRequest): this {\n    this.contracts.push({\n      contractType: 2,\n      ...params,\n    })\n\n    return this\n  }\n\n  /**\n   * Add vote contract to participate in governance proposals\n   * Voting allows token holders to participate in network governance decisions\n   *\n   * @param params - Vote parameters\n   * @param params.proposalId - ID of the proposal to vote on\n   * @param params.type - Vote type (0 = abstain, 1 = yes, 2 = no)\n   * @param params.amount - Optional stake amount to use for voting weight\n   * @returns This builder instance for chaining\n   *\n   * @example\n   * ```typescript\n   * // Vote yes on proposal\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .vote({\n   *     proposalId: 5,\n   *     type: 1, // Yes\n   *     amount: '1000000' // Optional voting weight\n   *   })\n   *   .build()\n   *\n   * // Vote no on proposal\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .vote({\n   *     proposalId: 5,\n   *     type: 2 // No\n   *   })\n   *   .build()\n   * ```\n   */\n  vote(params: VoteRequest): this {\n    this.contracts.push({\n      contractType: 14,\n      ...params,\n    })\n\n    return this\n  }\n\n  /**\n   * Add smart contract call to interact with deployed contracts\n   * Enables calling functions on smart contracts deployed on the Klever blockchain\n   *\n   * **Contract Call Types (scType):**\n   * - 0: Invoke contract function\n   * - 1: Deploy contract\n   * - 2: Upgrade contract\n   *\n   * **Important:**\n   * - Use `.data()` to specify function name and arguments\n   * - callValue allows sending KLV or KDA tokens with the call\n   * - Invoke and upgrade require a valid contract address\n   * - Deploy must not include an address\n   *\n   * @param params - Smart contract parameters\n   * @param params.address - Required contract bech32 address for invoke/upgrade; forbidden for deploy\n   * @param params.scType - Contract call type (0 = invoke, 1 = deploy, 2 = upgrade)\n   * @param params.callValue - Optional amounts to send (e.g., { KLV: '1000000' })\n   * @returns This builder instance for chaining\n   * @throws {ValidationError} If scType is unsupported\n   * @throws {ValidationError} If invoke/upgrade is missing a contract address\n   * @throws {ValidationError} If deploy includes a contract address\n   * @throws {ValidationError} If contract address format is invalid\n   *\n   * @example\n   * ```typescript\n   * // Invoke contract function\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .smartContract({\n   *     address: 'klv1contract...',\n   *     scType: 0, // Invoke\n   *     callValue: { KLV: '1000000' } // Send 1 KLV\n   *   })\n   *   .data(['transfer', 'klv1receiver...', '500000'])\n   *   .build()\n   *\n   * // Call contract without sending value\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1...')\n   *   .smartContract({\n   *     address: 'klv1contract...',\n   *     scType: 0\n   *   })\n   *   .data(['getValue'])\n   *   .build()\n   * ```\n   */\n  smartContract(params: SmartContractRequest): this {\n    const scType = (params as { scType?: unknown }).scType\n    if (scType !== 0 && scType !== 1 && scType !== 2) {\n      throw new ValidationError(`Unsupported smart contract type: ${String(scType)}`, { scType })\n    }\n\n    if (params.scType === 1 && 'address' in params) {\n      throw new ValidationError('Contract address is not allowed for smart contract deploy', {\n        scType: params.scType,\n      })\n    }\n\n    if ((params.scType === 0 || params.scType === 2) && !params.address) {\n      throw new ValidationError('Contract address is required for smart contract invoke/upgrade', {\n        scType: params.scType,\n      })\n    }\n\n    if (params.address && !isValidAddress(params.address)) {\n      throw new ValidationError(`Invalid contract address: ${params.address}`, {\n        address: params.address,\n      })\n    }\n\n    if ((params.scType === 0 || params.scType === 2) && params.address) {\n      if (!isValidContractAddress(params.address)) {\n        throw new ValidationError(`Invalid smart contract address: ${params.address}`, {\n          address: params.address,\n          scType: params.scType,\n        })\n      }\n    }\n\n    if (params.scType === 1) {\n      this.contracts.push({\n        contractType: 63,\n        ...params,\n      })\n\n      return this\n    }\n\n    this.contracts.push({\n      contractType: 63,\n      ...params,\n    })\n\n    return this\n  }\n\n  /**\n   * Recursively convert BigInt values to numbers for JSON serialization\n   */\n  private convertBigIntToNumber(obj: unknown): unknown {\n    if (typeof obj === 'bigint') {\n      return Number(obj)\n    }\n\n    if (Array.isArray(obj)) {\n      return obj.map((item) => this.convertBigIntToNumber(item))\n    }\n\n    if (obj !== null && typeof obj === 'object') {\n      const converted: Record<string, unknown> = {}\n      for (const [key, value] of Object.entries(obj)) {\n        converted[key] = this.convertBigIntToNumber(value)\n      }\n      return converted\n    }\n\n    return obj\n  }\n\n  /**\n   * Build transaction request object for node endpoint\n   * Creates a request object that can be sent to the node's /transaction/build endpoint\n   * The node will handle nonce fetching, fee calculation, and proto encoding\n   *\n   * @returns Request object ready to send to node's /transaction/build endpoint\n   * @throws {ValidationError} If no contracts have been added\n   *\n   * @example\n   * ```typescript\n   * const builder = TransactionBuilder.create()\n   *   .sender('klv1...')\n   *   .transfer({ receiver: 'klv1...', amount: '1000000' })\n   *\n   * const request = builder.buildRequest()\n   * // Send request to node via HTTP:\n   * // POST /transaction/build\n   * // Body: request\n   * ```\n   */\n  buildRequest(): BuildTransactionRequest {\n    if (this.contracts.length === 0) {\n      throw new ValidationError('At least one contract is required')\n    }\n\n    const request: BuildTransactionRequest = {\n      contracts: this.convertBigIntToNumber(this.contracts) as ContractRequestData[],\n    }\n\n    // Only add optional properties if they're defined\n    if (this._sender !== undefined) request.sender = this._sender\n    if (this._nonce !== undefined) request.nonce = this._nonce\n    if (this._kdaFee !== undefined) request.kdaFee = this._kdaFee.kda\n    if (this._permissionId !== undefined) request.permissionId = this._permissionId\n    // if smart contract transaction, request data must be converted to base64 if not already\n    if (this.contracts.some((c) => c.contractType === 63) && this._data !== undefined) {\n      const encoder = new TextEncoder()\n      request.data = this._data.map((d) => base64Encode(encoder.encode(d)))\n    } else if (this._data !== undefined) {\n      request.data = this._data\n    }\n\n    return request\n  }\n\n  /**\n   * Build proto transaction offline (client-side, no network required)\n   * This method creates a transaction entirely on the client side without contacting the node.\n   * You must provide all required parameters (sender, nonce, fees) either via builder state or options.\n   *\n   * **Offline Mode Benefits:**\n   * - No network latency\n   * - Works without internet connection\n   * - Full control over transaction parameters\n   * - Ideal for hardware wallets and air-gapped signing\n   *\n   * **Fee Calculation:**\n   * When building offline, fees must be provided manually or estimated:\n   * - KAppFee: Base fee for the contract type (typically 500000-1000000)\n   * - BandwidthFee: Fee based on transaction size (typically 100000-500000)\n   * - KDAFee: Optional - pay fees in custom KDA instead of KLV\n   *\n   * @param options - Build options (sender, nonce, fees, etc.)\n   * @param options.sender - Sender's bech32 address (required if not set via builder)\n   * @param options.nonce - Transaction nonce (required if not set via builder)\n   * @param options.chainId - Chain ID (defaults to provider's network if available)\n   * @param options.fees - Fee amounts (kAppFee and bandwidthFee)\n   * @param options.kdaFee - Optional KDA fee (pay fees in custom asset)\n   * @param options.permissionId - Optional permission ID for multi-sig\n   * @param options.data - Optional transaction data\n   * @returns Transaction object with proto bytes ready to sign\n   * @throws {ValidationError} If required parameters are missing or invalid\n   *\n   * @example\n   * ```typescript\n   * // Offline build with all parameters in options\n   * const tx = TransactionBuilder.create()\n   *   .transfer({ receiver: 'klv1abc...', amount: '1000000' })\n   *   .buildProto({\n   *     sender: 'klv1xyz...',\n   *     nonce: 123,\n   *     chainId: '100',\n   *     fees: {\n   *       kAppFee: 500000,\n   *       bandwidthFee: 100000\n   *     }\n   *   })\n   *\n   * await tx.sign(privateKey)\n   * const hex = tx.toHex()\n   *\n   * // Offline build using builder state\n   * const tx = TransactionBuilder.create()\n   *   .sender('klv1xyz...')\n   *   .nonce(123)\n   *   .setChainId('100')\n   *   .transfer({ receiver: 'klv1abc...', amount: '1000000' })\n   *   .buildProto({\n   *     fees: { kAppFee: 500000, bandwidthFee: 100000 }\n   *   })\n   *\n   * // Offline build with KDA fee (pay fees in custom token)\n   * const tx = TransactionBuilder.create()\n   *   .sender('klv1xyz...')\n   *   .nonce(123)\n   *   .transfer({ receiver: 'klv1abc...', amount: '1000000' })\n   *   .buildProto({\n   *     chainId: '100',\n   *     fees: { kAppFee: 0, bandwidthFee: 0 },\n   *     kdaFee: { kda: 'MYTOKEN-ABCD', amount: '1000000' }\n   *   })\n   * ```\n   */\n  buildProto(options: BuildCallOptions = {}): Transaction {\n    if (this.contracts.length === 0) {\n      throw new ValidationError('At least one contract is required')\n    }\n\n    // Convert string to Uint8Array (UTF-8 encoded)\n    const encoder = new TextEncoder()\n\n    // check chainId\n    const chainId =\n      options.chainId ??\n      this._chainId ??\n      (this.provider ? this.provider.getNetwork().chainId : undefined)\n    if (!chainId) {\n      throw new Error(\n        'Chain ID is required. Set via builder state or provide a provider with network configured.',\n      )\n    }\n\n    const chainIdBytes = encoder.encode(chainId)\n\n    // Merge options with builder state (options take precedence)\n    const sender = options.sender ?? this._sender\n    const nonce = options.nonce ?? this._nonce\n    const kdaFee = options.kdaFee ?? this._kdaFee\n    const permissionId = options.permissionId ?? this._permissionId ?? null\n    const data = options.data ?? this._data\n\n    if (options.value) {\n      // should be set in smart contract directly for offline proto building\n      throw new ValidationError('Value option is not supported for offline proto building', {\n        value: options.value,\n      })\n    }\n\n    // Validate required fields\n    if (!sender) {\n      throw new ValidationError('Sender address is required. Set via .sender() or options.sender')\n    }\n    // convert sender from bech32 to bytes\n    const senderBytes = bech32Decode(sender)\n\n    if (nonce === undefined) {\n      throw new ValidationError('Nonce is required. Set via .nonce() or options.nonce')\n    }\n\n    // convert data to Uint8Array[]\n    const dataBytes = data ? data.map((d) => encoder.encode(d)) : null\n\n    // TODO: compute kappFess and bandwidthFees if not provided\n    const kappFess = options.fees?.kAppFee ?? 0\n    const bandwidthFees = options.fees?.bandwidthFee ?? 0\n\n    // encode KDA fee buffer\n    const kdaFeeProto: IKDAFee | null =\n      kdaFee && kdaFee.kda\n        ? {\n            KDA: encoder.encode(kdaFee.kda),\n            Amount:\n              typeof kdaFee.amount === 'bigint'\n                ? Number(kdaFee.amount)\n                : typeof kdaFee.amount === 'string'\n                  ? Number(kdaFee.amount)\n                  : kdaFee.amount,\n          }\n        : null\n\n    // TODO: Implement contract encoding to proto\n    return new Transaction({\n      RawData: {\n        ChainID: chainIdBytes,\n        Nonce: nonce,\n        Sender: senderBytes.data,\n        /** Raw Contract */\n        Contract: null,\n        /** Raw PermissionID */\n        PermissionID: permissionId,\n\n        /** Raw Data */\n        Data: dataBytes,\n\n        /** TX Fees */\n        KAppFee: kappFess,\n        BandwidthFee: bandwidthFees,\n        KDAFee: kdaFeeProto,\n      },\n    })\n  }\n\n  /**\n   * Build transaction using node endpoint (requires provider)\n   * This is the recommended method for most use cases as the node handles complex operations.\n   *\n   * **Node-Assisted Building:**\n   * The node automatically handles:\n   * - Nonce fetching (gets current account nonce)\n   * - Fee calculation (computes optimal kAppFee and bandwidthFee)\n   * - Proto encoding (creates valid proto bytes)\n   * - Validation (ensures transaction is valid)\n   *\n   * **When to Use:**\n   * - Standard wallet applications\n   * - When you have internet connectivity\n   * - When you want automatic fee calculation\n   * - When you don't need to control every parameter\n   *\n   * **Comparison with buildProto():**\n   * - build() = Online, automatic, easy (requires provider)\n   * - buildProto() = Offline, manual, flexible (no network needed)\n   *\n   * @returns Transaction object with proto bytes from node, ready to sign\n   * @throws {ValidationError} If provider is not set or no contracts added\n   * @throws {Error} If node response is invalid or network request fails\n   *\n   * @example\n   * ```typescript\n   * // Simple node-assisted build\n   * const provider = new KleverProvider({ network: 'mainnet' })\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1xyz...')\n   *   .transfer({ receiver: 'klv1abc...', amount: '1000000' })\n   *   .build()\n   *\n   * // Node automatically fetches nonce and calculates fees\n   * await tx.sign(privateKey)\n   * const hash = await provider.sendRawTransaction(tx.toHex())\n   *\n   * // Build with multiple contracts\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1xyz...')\n   *   .transfer({ receiver: 'klv1abc...', amount: '1000000' })\n   *   .freeze({ amount: '5000000' })\n   *   .delegate({ receiver: 'klv1validator...' })\n   *   .build()\n   *\n   * // Override specific parameters\n   * const tx = await TransactionBuilder.create(provider)\n   *   .sender('klv1xyz...')\n   *   .nonce(150) // Override automatic nonce\n   *   .transfer({ receiver: 'klv1abc...', amount: '1000000' })\n   *   .build()\n   * ```\n   */\n  async build(): Promise<Transaction> {\n    if (!this.provider) {\n      throw new ValidationError(\n        'Provider required for node-assisted building. Use buildProto() for offline building.',\n      )\n    }\n\n    if (this.contracts.length === 0) {\n      throw new ValidationError('At least one contract is required')\n    }\n\n    // Build request object\n    const request = this.buildRequest()\n\n    // Send to node endpoint to build\n    const nodeResponse = await this.provider.buildTransaction(request)\n    // remove GasLimit\n    if (!nodeResponse.result) {\n      throw new Error('Node response has no result')\n    }\n    delete (nodeResponse.result as { [k: string]: unknown })['GasLimit']\n\n    // Return Transaction object from proto result\n    // Use fromObject to properly convert base64 strings to Uint8Arrays\n    return Transaction.fromObject(nodeResponse.result as { [k: string]: unknown })\n  }\n\n  /**\n   * Reset builder state to initial values\n   * Clears all contracts and builder configuration, allowing reuse of the builder instance\n   *\n   * **What gets reset:**\n   * - All added contracts\n   * - Sender address\n   * - Nonce\n   * - KDA fee\n   * - Permission ID\n   * - Transaction data\n   *\n   * **What persists:**\n   * - Provider (if set)\n   * - Chain ID (if set)\n   *\n   * @returns This builder instance for chaining\n   *\n   * @example\n   * ```typescript\n   * const builder = TransactionBuilder.create(provider)\n   *\n   * // Build first transaction\n   * const tx1 = await builder\n   *   .sender('klv1...')\n   *   .transfer({ receiver: 'klv1abc...', amount: '1000000' })\n   *   .build()\n   *\n   * // Reset and build second transaction\n   * const tx2 = await builder\n   *   .reset()\n   *   .sender('klv1...')\n   *   .freeze({ amount: '5000000' })\n   *   .build()\n   * ```\n   */\n  reset(): this {\n    this.contracts = []\n    delete this._sender\n    delete this._nonce\n    delete this._kdaFee\n    delete this._permissionId\n    delete this._data\n    return this\n  }\n}\n","/**\n * Helper functions for creating common Klever transactions\n * These provide a simple, function-based API as an alternative to the builder pattern\n */\n\nimport type {\n  TransferRequest,\n  FreezeRequest,\n  UnfreezeRequest,\n  DelegateRequest,\n  UndelegateRequest,\n  WithdrawRequest,\n  ClaimRequest,\n  CreateAssetRequest,\n  AssetTriggerRequest,\n  CreateValidatorRequest,\n  VoteRequest,\n  ProposalRequest,\n  SetAccountNameRequest,\n  SmartContractRequest,\n  AmountLike,\n} from '@klever/connect-provider'\n\n// ============================================================================\n// Transfer Operations\n// ============================================================================\n\n/**\n * Create a simple transfer request\n * Helper function to create a transfer request object for the TransactionBuilder\n *\n * @param params - Transfer parameters\n * @param params.receiver - Recipient's bech32 address\n * @param params.amount - Amount to transfer in smallest units (string, number, or bigint)\n * @param params.kda - Optional asset ID (defaults to KLV if not specified)\n * @returns TransferRequest object ready to use with builder.transfer()\n *\n * @example\n * ```typescript\n * const transfer = createTransfer({\n *   receiver: 'klv1abc...',\n *   amount: '1000000',\n *   kda: 'KLV'\n * })\n *\n * const tx = await TransactionBuilder.create(provider)\n *   .sender('klv1xyz...')\n *   .transfer(transfer)\n *   .build()\n * ```\n */\nexport function createTransfer(params: {\n  receiver: string\n  amount: AmountLike\n  kda?: string\n}): TransferRequest {\n  const req: TransferRequest = {\n    receiver: params.receiver,\n    amount: params.amount,\n  }\n  if (params.kda !== undefined) req.kda = params.kda\n  return req\n}\n\n/**\n * Create a transfer with royalties\n * Used for NFT transfers that include royalty payments to creators\n *\n * @param params - Transfer parameters with royalties\n * @param params.receiver - Recipient's bech32 address\n * @param params.amount - Amount to transfer in smallest units\n * @param params.kda - Optional asset ID (typically an NFT)\n * @param params.kdaRoyalties - Optional royalties in KDA asset\n * @param params.klvRoyalties - Optional royalties in KLV\n * @returns TransferRequest object with royalties\n *\n * @example\n * ```typescript\n * const transfer = createTransferWithRoyalties({\n *   receiver: 'klv1abc...',\n *   amount: '1',\n *   kda: 'NFT-COLLECTION/NONCE-1',\n *   kdaRoyalties: '100000',\n *   klvRoyalties: '50000'\n * })\n * ```\n */\nexport function createTransferWithRoyalties(params: {\n  receiver: string\n  amount: AmountLike\n  kda?: string\n  kdaRoyalties?: AmountLike\n  klvRoyalties?: AmountLike\n}): TransferRequest {\n  const req: TransferRequest = {\n    receiver: params.receiver,\n    amount: params.amount,\n  }\n  if (params.kda !== undefined) req.kda = params.kda\n  if (params.kdaRoyalties !== undefined) req.kdaRoyalties = params.kdaRoyalties\n  if (params.klvRoyalties !== undefined) req.klvRoyalties = params.klvRoyalties\n  return req\n}\n\n// ============================================================================\n// Staking Operations\n// ============================================================================\n\n/**\n * Create a freeze (stake) request\n * Freezing locks assets and creates a bucket that can be delegated or used for governance\n *\n * @param params - Freeze parameters\n * @param params.amount - Amount to freeze in smallest units\n * @param params.kda - Optional asset ID to freeze (defaults to KLV)\n * @returns FreezeRequest object ready to use with builder.freeze()\n *\n * @example\n * ```typescript\n * const freeze = createFreeze({\n *   amount: '5000000',\n *   kda: 'KLV'\n * })\n *\n * const tx = await TransactionBuilder.create(provider)\n *   .sender('klv1xyz...')\n *   .freeze(freeze)\n *   .build()\n * ```\n */\nexport function createFreeze(params: { amount: AmountLike; kda?: string }): FreezeRequest {\n  return params\n}\n\n/**\n * Create an unfreeze (unstake) request\n * Unfreezing initiates the unlock period for frozen assets\n *\n * @param params - Unfreeze parameters\n * @param params.bucketId - Bucket ID to unfreeze\n * @param params.kda - Optional asset ID (required for KLV)\n * @returns UnfreezeRequest object ready to use with builder.unfreeze()\n *\n * @example\n * ```typescript\n * const unfreeze = createUnfreeze({\n *   bucketId: 'bucket-hash-123',\n *   kda: 'KLV'\n * })\n * ```\n */\nexport function createUnfreeze(params: { bucketId: string; kda?: string }): UnfreezeRequest {\n  return params as UnfreezeRequest\n}\n\n/**\n * Create a delegate request\n * Delegates a frozen bucket to a validator for staking\n *\n * @param params - Delegate parameters\n * @param params.receiver - Validator's bech32 address\n * @param params.bucketId - Optional bucket ID to delegate\n * @returns DelegateRequest object ready to use with builder.delegate()\n *\n * @example\n * ```typescript\n * const delegate = createDelegate({\n *   receiver: 'klv1validator...',\n *   bucketId: 'bucket123'\n * })\n * ```\n */\nexport function createDelegate(params: { receiver: string; bucketId?: string }): DelegateRequest {\n  return params\n}\n\n/**\n * Create an undelegate request\n * Removes delegation from a validator, returning bucket to your control\n *\n * @param params - Undelegate parameters\n * @param params.bucketId - Bucket ID to undelegate (required)\n * @returns UndelegateRequest object ready to use with builder.undelegate()\n *\n * @example\n * ```typescript\n * const undelegate = createUndelegate({\n *   bucketId: 'bucket-hash-123'\n * })\n * ```\n */\nexport function createUndelegate(params: { bucketId: string }): UndelegateRequest {\n  return params\n}\n\n/**\n * Create a withdraw request\n * Withdraws available funds (staking rewards, unlocked assets, etc.)\n *\n * @param params - Withdraw parameters\n * @param params.withdrawType - Type of withdrawal (0 = staking, 1 = FPR, etc.)\n * @param params.kda - Optional asset ID to withdraw\n * @param params.amount - Optional specific amount to withdraw\n * @param params.currencyID - Optional currency ID for cross-currency withdrawals\n * @returns WithdrawRequest object ready to use with builder.withdraw()\n *\n * @example\n * ```typescript\n * const withdraw = createWithdraw({\n *   withdrawType: 0, // Staking rewards\n *   kda: 'KLV'\n * })\n * ```\n */\nexport function createWithdraw(params: {\n  withdrawType: number\n  kda?: string\n  amount?: AmountLike\n  currencyID?: string\n}): WithdrawRequest {\n  return params\n}\n\n/**\n * Create a claim request\n * Claims rewards or allocations (staking rewards, airdrops, etc.)\n *\n * @param params - Claim parameters\n * @param params.claimType - Type of claim (0 = staking rewards, 1 = market rewards, etc.)\n * @param params.id - Optional claim ID for specific claims\n * @returns ClaimRequest object ready to use with builder.claim()\n *\n * @example\n * ```typescript\n * const claim = createClaim({\n *   claimType: 0, // Staking rewards\n *   id: 'claim123'\n * })\n * ```\n */\nexport function createClaim(params: { claimType: number; id?: string }): ClaimRequest {\n  return params\n}\n\n// ============================================================================\n// Asset Operations\n// ============================================================================\n\n/**\n * Create a basic fungible token (FT)\n * Fungible tokens are divisible assets like coins or tokens\n *\n * @param params - Fungible token parameters\n * @param params.name - Full name of the token\n * @param params.ticker - Short ticker symbol (e.g., \"MTK\")\n * @param params.ownerAddress - Owner's bech32 address\n * @param params.precision - Number of decimal places (e.g., 6 for standard tokens)\n * @param params.maxSupply - Maximum supply in smallest units\n * @param params.initialSupply - Optional initial supply to mint\n * @param params.properties - Optional token properties (mintable, burnable, etc.)\n * @returns CreateAssetRequest object ready to use with builder.createAsset()\n *\n * @example\n * ```typescript\n * const asset = createFungibleToken({\n *   name: 'My Token',\n *   ticker: 'MTK',\n *   ownerAddress: 'klv1...',\n *   precision: 6,\n *   maxSupply: '1000000000000',\n *   initialSupply: '100000000000'\n * })\n *\n * const tx = await TransactionBuilder.create(provider)\n *   .sender('klv1...')\n *   .createAsset(asset)\n *   .build()\n * ```\n */\nexport function createFungibleToken(params: {\n  name: string\n  ticker: string\n  ownerAddress: string\n  precision: number\n  maxSupply: AmountLike\n  initialSupply?: AmountLike\n  properties?: CreateAssetRequest['properties']\n}): CreateAssetRequest {\n  return {\n    type: 0, // Fungible Token\n    ...params,\n  } as CreateAssetRequest\n}\n\n/**\n * Create an NFT collection\n * NFTs are non-fungible tokens with unique properties and metadata\n *\n * @param params - NFT collection parameters\n * @param params.name - Collection name\n * @param params.ticker - Collection ticker symbol\n * @param params.ownerAddress - Owner's bech32 address\n * @param params.logo - Optional logo URI\n * @param params.uris - Optional metadata URIs\n * @param params.properties - Optional collection properties\n * @param params.royalties - Optional royalty configuration\n * @returns CreateAssetRequest object ready to use with builder.createAsset()\n *\n * @example\n * ```typescript\n * const nftCollection = createNFTCollection({\n *   name: 'My NFT Collection',\n *   ticker: 'MYNFT',\n *   ownerAddress: 'klv1...',\n *   logo: 'ipfs://...',\n *   royalties: {\n *     address: 'klv1...',\n *     percentage: 5 // 5% royalties\n *   }\n * })\n * ```\n */\nexport function createNFTCollection(params: {\n  name: string\n  ticker: string\n  ownerAddress: string\n  logo?: string\n  uris?: Record<string, string>\n  properties?: CreateAssetRequest['properties']\n  royalties?: CreateAssetRequest['royalties']\n}): CreateAssetRequest {\n  return {\n    type: 1, // NFT\n    precision: 0, // NFTs have no decimals\n    maxSupply: 0, // Unlimited for NFTs\n    ...params,\n  } as CreateAssetRequest\n}\n\n/**\n * Mint NFT\n * Creates a new NFT within an existing collection\n *\n * @param params - Mint NFT parameters\n * @param params.assetId - NFT collection asset ID\n * @param params.receiver - Optional recipient address (defaults to sender)\n * @param params.uris - Optional metadata URIs for the NFT\n * @param params.mime - Optional MIME type for the NFT\n * @returns AssetTriggerRequest object for minting NFT\n *\n * @example\n * ```typescript\n * const mintNFT = createMintNFT({\n *   assetId: 'MYNFT-ABCD',\n *   receiver: 'klv1...',\n *   uris: {\n *     image: 'ipfs://...',\n *     metadata: 'ipfs://...'\n *   },\n *   mime: 'image/png'\n * })\n * ```\n */\nexport function createMintNFT(params: {\n  assetId: string\n  receiver?: string\n  uris?: Record<string, string>\n  mime?: string\n}): AssetTriggerRequest {\n  return {\n    triggerType: 0, // Mint\n    ...params,\n  }\n}\n\n/**\n * Burn asset\n * Permanently destroys tokens, reducing total supply\n *\n * @param params - Burn parameters\n * @param params.assetId - Asset ID to burn\n * @param params.amount - Amount to burn in smallest units\n * @returns AssetTriggerRequest object for burning tokens\n *\n * @example\n * ```typescript\n * const burn = createBurn({\n *   assetId: 'MYTOKEN-ABCD',\n *   amount: '1000000'\n * })\n * ```\n */\nexport function createBurn(params: { assetId: string; amount: AmountLike }): AssetTriggerRequest {\n  return {\n    triggerType: 1, // Burn\n    ...params,\n  }\n}\n\n/**\n * Wipe asset (admin only)\n * Removes tokens from a specific address (admin function)\n *\n * @param params - Wipe parameters\n * @param params.assetId - Asset ID to wipe\n * @param params.receiver - Address to wipe tokens from\n * @param params.amount - Amount to wipe in smallest units\n * @returns AssetTriggerRequest object for wiping tokens\n *\n * @example\n * ```typescript\n * const wipe = createWipe({\n *   assetId: 'MYTOKEN-ABCD',\n *   receiver: 'klv1...',\n *   amount: '1000000'\n * })\n * ```\n */\nexport function createWipe(params: {\n  assetId: string\n  receiver: string\n  amount: AmountLike\n}): AssetTriggerRequest {\n  return {\n    triggerType: 2, // Wipe\n    ...params,\n  }\n}\n\n/**\n * Pause asset (admin only)\n * Temporarily freezes all transfers of the asset\n *\n * @param params - Pause parameters\n * @param params.assetId - Asset ID to pause\n * @returns AssetTriggerRequest object for pausing asset\n *\n * @example\n * ```typescript\n * const pause = createPause({\n *   assetId: 'MYTOKEN-ABCD'\n * })\n * ```\n */\nexport function createPause(params: { assetId: string }): AssetTriggerRequest {\n  return {\n    triggerType: 3, // Pause\n    ...params,\n  }\n}\n\n/**\n * Resume asset (admin only)\n * Resumes transfers of a paused asset\n *\n * @param params - Resume parameters\n * @param params.assetId - Asset ID to resume\n * @returns AssetTriggerRequest object for resuming asset\n *\n * @example\n * ```typescript\n * const resume = createResume({\n *   assetId: 'MYTOKEN-ABCD'\n * })\n * ```\n */\nexport function createResume(params: { assetId: string }): AssetTriggerRequest {\n  return {\n    triggerType: 4, // Resume\n    ...params,\n  }\n}\n\n// ============================================================================\n// Validator Operations\n// ============================================================================\n\n/**\n * Create a validator node registration\n * Registers a new validator to participate in network consensus\n *\n * **Requirements:**\n * - Valid BLS public key for consensus signing\n * - Sufficient minimum stake amount\n * - Unique validator configuration\n *\n * @param params - Validator parameters\n * @param params.blsPublicKey - BLS public key for validator signing (hex format)\n * @param params.ownerAddress - Owner's bech32 address\n * @param params.commission - Commission rate percentage (0-100, e.g., 10 = 10%)\n * @param params.canDelegate - Optional: Whether delegators can stake (defaults to true)\n * @param params.rewardAddress - Optional: Separate address to receive rewards\n * @param params.maxDelegationAmount - Optional: Maximum delegation limit\n * @param params.name - Optional: Validator display name\n * @param params.logo - Optional: Logo URL or URI\n * @param params.uris - Optional: Additional URIs (website, social media, etc.)\n * @returns CreateValidatorRequest object ready to use with builder.createValidator()\n *\n * @example\n * ```typescript\n * // Create validator with full details\n * const validator = createValidator({\n *   blsPublicKey: '0xabcd1234...',\n *   ownerAddress: 'klv1...',\n *   commission: 10, // 10% commission\n *   canDelegate: true,\n *   name: 'My Validator',\n *   logo: 'https://example.com/logo.png',\n *   uris: {\n *     website: 'https://validator.example.com',\n *     twitter: 'https://twitter.com/myvalidator'\n *   }\n * })\n *\n * const tx = await TransactionBuilder.create(provider)\n *   .sender('klv1...')\n *   .createValidator(validator)\n *   .build()\n * ```\n */\nexport function createValidator(params: {\n  blsPublicKey: string\n  ownerAddress: string\n  commission: number\n  canDelegate?: boolean\n  rewardAddress?: string\n  maxDelegationAmount?: AmountLike\n  name?: string\n  logo?: string\n  uris?: Record<string, string>\n}): CreateValidatorRequest {\n  return params\n}\n\n// ============================================================================\n// Governance Operations\n// ============================================================================\n\n/**\n * Create a governance proposal for network parameter changes\n * Proposals allow the community to vote on changes to network configuration\n *\n * @param params - Proposal parameters\n * @param params.parameters - Map of parameter IDs to new values\n * @param params.description - Optional human-readable description of the proposal\n * @param params.epochsDuration - Optional duration in epochs for voting period\n * @returns ProposalRequest object ready to use with builder\n *\n * @example\n * ```typescript\n * // Create proposal to change network parameters\n * const proposal = createProposal({\n *   parameters: {\n *     1: '1000000', // Parameter 1: New value\n *     5: '500000'   // Parameter 5: New value\n *   },\n *   description: 'Increase minimum stake amount',\n *   epochsDuration: 10 // 10 epochs for voting\n * })\n *\n * const tx = await TransactionBuilder.create(provider)\n *   .sender('klv1...')\n *   .addContract({ contractType: 13, ...proposal })\n *   .build()\n * ```\n */\nexport function createProposal(params: {\n  parameters: Record<number, string>\n  description?: string\n  epochsDuration?: number\n}): ProposalRequest {\n  return params\n}\n\n/**\n * Vote on a governance proposal\n * Allows token holders to vote on active proposals\n *\n * **Vote Types:**\n * - 0: Abstain (don't vote)\n * - 1: Yes (approve proposal)\n * - 2: No (reject proposal)\n *\n * @param params - Vote parameters\n * @param params.proposalId - ID of the proposal to vote on\n * @param params.type - Vote type (0 = abstain, 1 = yes, 2 = no)\n * @param params.amount - Optional stake amount to weight the vote\n * @returns VoteRequest object ready to use with builder.vote()\n *\n * @example\n * ```typescript\n * // Vote yes on proposal\n * const vote = createVote({\n *   proposalId: 5,\n *   type: 1, // Yes\n *   amount: '1000000' // Optional voting weight\n * })\n *\n * const tx = await TransactionBuilder.create(provider)\n *   .sender('klv1...')\n *   .vote(vote)\n *   .build()\n * ```\n */\nexport function createVote(params: {\n  proposalId: number\n  type: number\n  amount?: AmountLike\n}): VoteRequest {\n  return params\n}\n\n// ============================================================================\n// Account Management\n// ============================================================================\n\n/**\n * Set account name to create a human-readable identifier\n * Account names provide an easy-to-remember alias for addresses\n *\n * @param params - Account name parameters\n * @param params.name - Desired account name (must be unique on the network)\n * @returns SetAccountNameRequest object ready to use with builder\n *\n * @example\n * ```typescript\n * // Set a readable account name\n * const setName = createSetAccountName({\n *   name: 'myaccount'\n * })\n *\n * const tx = await TransactionBuilder.create(provider)\n *   .sender('klv1...')\n *   .addContract({ contractType: 15, ...setName })\n *   .build()\n *\n * // After setting, users can send to \"myaccount\" instead of \"klv1...\"\n * ```\n */\nexport function createSetAccountName(params: { name: string }): SetAccountNameRequest {\n  return params\n}\n\n// ============================================================================\n// Smart Contract Operations\n// ============================================================================\n\n/**\n * Create a smart contract call\n * Interacts with deployed smart contracts on the Klever blockchain\n *\n * @param params - Smart contract call parameters\n * @param params.address - Optional contract bech32 address\n * @param params.scType - Contract call type (0 = invoke, 1 = deploy, 2 = upgrade)\n * @param params.callValue - Optional KLV or KDA amounts to send with the call\n * @returns SmartContractRequest object ready to use with builder.smartContract()\n *\n * @example\n * ```typescript\n * const scCall = createSmartContractCall({\n *   address: 'klv1contract...',\n *   scType: 0, // Invoke\n *   callValue: {\n *     'KLV': '1000000'\n *   }\n * })\n *\n * const tx = await TransactionBuilder.create(provider)\n *   .sender('klv1...')\n *   .smartContract(scCall)\n *   .data(['functionName', 'arg1', 'arg2'])\n *   .build()\n * ```\n */\nexport function createSmartContractCall(params: SmartContractRequest): SmartContractRequest {\n  return params\n}\n\n// ============================================================================\n// Amount Conversion Helpers\n// ============================================================================\n\n/**\n * Convert KLV to the smallest unit (6 decimals)\n * KLV uses 6 decimal places, so 1 KLV = 1,000,000 smallest units\n *\n * @param amount - Amount in KLV (e.g., \"1.5\" or 1.5)\n * @returns Amount in smallest units as string (e.g., \"1500000\")\n *\n * @example\n * ```typescript\n * const amount = toKLVUnits('1.5') // Returns '1500000'\n * const amount2 = toKLVUnits(10) // Returns '10000000'\n * const amount3 = toKLVUnits('0.000001') // Returns '1'\n * ```\n */\nexport function toKLVUnits(amount: string | number): string {\n  const num = typeof amount === 'string' ? parseFloat(amount) : amount\n  return Math.floor(num * 1_000_000).toString()\n}\n\n/**\n * Convert smallest units to KLV\n * Converts from 6-decimal smallest units back to human-readable KLV\n *\n * @param amount - Amount in smallest units (string, number, or bigint)\n * @returns Amount in KLV as string (e.g., \"1.5\")\n *\n * @example\n * ```typescript\n * const klv = fromKLVUnits('1500000') // Returns '1.5'\n * const klv2 = fromKLVUnits(10000000) // Returns '10'\n * const klv3 = fromKLVUnits(1n) // Returns '0.000001'\n * ```\n */\nexport function fromKLVUnits(amount: string | number | bigint): string {\n  const num =\n    typeof amount === 'bigint'\n      ? Number(amount)\n      : typeof amount === 'string'\n        ? parseInt(amount)\n        : amount\n  return (num / 1_000_000).toString()\n}\n\n/**\n * Convert amount with custom precision\n * Useful for custom KDA tokens with different decimal places\n *\n * @param amount - Amount in human-readable format\n * @param precision - Number of decimal places (e.g., 6 for KLV, 8 for some tokens)\n * @returns Amount in smallest units as string\n *\n * @example\n * ```typescript\n * // Convert token with 8 decimals\n * const amount = toUnits('1.5', 8) // Returns '150000000'\n *\n * // Convert token with 2 decimals\n * const amount2 = toUnits('100.50', 2) // Returns '10050'\n * ```\n */\nexport function toUnits(amount: string | number, precision: number): string {\n  const num = typeof amount === 'string' ? parseFloat(amount) : amount\n  const multiplier = Math.pow(10, precision)\n  return Math.floor(num * multiplier).toString()\n}\n\n/**\n * Convert from units with custom precision\n * Converts smallest units back to human-readable format for custom tokens\n *\n * @param amount - Amount in smallest units\n * @param precision - Number of decimal places\n * @returns Amount in human-readable format as string\n *\n * @example\n * ```typescript\n * // Convert token with 8 decimals\n * const readable = fromUnits('150000000', 8) // Returns '1.5'\n *\n * // Convert token with 2 decimals\n * const readable2 = fromUnits('10050', 2) // Returns '100.5'\n * ```\n */\nexport function fromUnits(amount: string | number | bigint, precision: number): string {\n  const num =\n    typeof amount === 'bigint'\n      ? Number(amount)\n      : typeof amount === 'string'\n        ? parseInt(amount)\n        : amount\n  const divisor = Math.pow(10, precision)\n  return (num / divisor).toString()\n}\n"]}