@metamask/transaction-pay-controller 6.0.0 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -1
- package/dist/constants.cjs +5 -1
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +4 -0
- package/dist/constants.d.cts.map +1 -1
- package/dist/constants.d.mts +4 -0
- package/dist/constants.d.mts.map +1 -1
- package/dist/constants.mjs +4 -0
- package/dist/constants.mjs.map +1 -1
- package/dist/strategy/bridge/bridge-quotes.cjs +37 -22
- package/dist/strategy/bridge/bridge-quotes.cjs.map +1 -1
- package/dist/strategy/bridge/bridge-quotes.mjs +37 -22
- package/dist/strategy/bridge/bridge-quotes.mjs.map +1 -1
- package/dist/strategy/relay/constants.cjs +1 -4
- package/dist/strategy/relay/constants.cjs.map +1 -1
- package/dist/strategy/relay/constants.d.cts +0 -3
- package/dist/strategy/relay/constants.d.cts.map +1 -1
- package/dist/strategy/relay/constants.d.mts +0 -3
- package/dist/strategy/relay/constants.d.mts.map +1 -1
- package/dist/strategy/relay/constants.mjs +0 -3
- package/dist/strategy/relay/constants.mjs.map +1 -1
- package/dist/strategy/relay/relay-quotes.cjs +34 -8
- package/dist/strategy/relay/relay-quotes.cjs.map +1 -1
- package/dist/strategy/relay/relay-quotes.d.cts.map +1 -1
- package/dist/strategy/relay/relay-quotes.d.mts.map +1 -1
- package/dist/strategy/relay/relay-quotes.mjs +32 -6
- package/dist/strategy/relay/relay-quotes.mjs.map +1 -1
- package/dist/strategy/relay/types.cjs.map +1 -1
- package/dist/strategy/relay/types.d.cts +1 -0
- package/dist/strategy/relay/types.d.cts.map +1 -1
- package/dist/strategy/relay/types.d.mts +1 -0
- package/dist/strategy/relay/types.d.mts.map +1 -1
- package/dist/strategy/relay/types.mjs.map +1 -1
- package/dist/strategy/test/TestStrategy.cjs +24 -2
- package/dist/strategy/test/TestStrategy.cjs.map +1 -1
- package/dist/strategy/test/TestStrategy.d.cts.map +1 -1
- package/dist/strategy/test/TestStrategy.d.mts.map +1 -1
- package/dist/strategy/test/TestStrategy.mjs +24 -2
- package/dist/strategy/test/TestStrategy.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +17 -1
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +17 -1
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/gas.cjs +85 -12
- package/dist/utils/gas.cjs.map +1 -1
- package/dist/utils/gas.d.cts +12 -3
- package/dist/utils/gas.d.cts.map +1 -1
- package/dist/utils/gas.d.mts +12 -3
- package/dist/utils/gas.d.mts.map +1 -1
- package/dist/utils/gas.mjs +86 -13
- package/dist/utils/gas.mjs.map +1 -1
- package/dist/utils/quotes.cjs +1 -1
- package/dist/utils/quotes.cjs.map +1 -1
- package/dist/utils/quotes.mjs +1 -1
- package/dist/utils/quotes.mjs.map +1 -1
- package/dist/utils/source-amounts.cjs +1 -1
- package/dist/utils/source-amounts.cjs.map +1 -1
- package/dist/utils/source-amounts.d.cts.map +1 -1
- package/dist/utils/source-amounts.d.mts.map +1 -1
- package/dist/utils/source-amounts.mjs +1 -1
- package/dist/utils/source-amounts.mjs.map +1 -1
- package/dist/utils/token.cjs +11 -4
- package/dist/utils/token.cjs.map +1 -1
- package/dist/utils/token.d.cts +1 -1
- package/dist/utils/token.d.cts.map +1 -1
- package/dist/utils/token.d.mts +1 -1
- package/dist/utils/token.d.mts.map +1 -1
- package/dist/utils/token.mjs +12 -5
- package/dist/utils/token.mjs.map +1 -1
- package/dist/utils/totals.cjs +51 -26
- package/dist/utils/totals.cjs.map +1 -1
- package/dist/utils/totals.d.cts.map +1 -1
- package/dist/utils/totals.d.mts.map +1 -1
- package/dist/utils/totals.mjs +51 -26
- package/dist/utils/totals.mjs.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge-quotes.mjs","sourceRoot":"","sources":["../../../src/strategy/bridge/bridge-quotes.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAEV,oCAAoC;AAGrC,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAE,mCAAmC;AACzE,OAAO,EAAE,eAAe,EAAE,yCAAyC;AAInE,OAAO,EAAE,kBAAkB,EAAE,wBAAwB;AACrD,OAAO,EAAE,SAAS,EAAE,qBAAqB;;;AAQzC,OAAO,EAAE,sBAAsB,EAAE,wBAAc;AAC/C,OAAO,EAAE,aAAa,EAAE,yBAAqB;AAU7C,OAAO,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,4BAAwB;AAChF,OAAO,EAAE,gBAAgB,EAAE,8BAA0B;AAErD,MAAM,uBAAuB,GAAG,iBAAiB,CAAC;AAClD,MAAM,sCAAsC,GAAG,0BAA0B,CAAC;AAC1E,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,sBAAsB,GAAG,IAAI,CAAC;AACpC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACjC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AACvC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B,MAAM,8BAA8B,GAAG,IAAI,GAAG,CAA6B;IACzE,CAAC,eAAe,CAAC,YAAY,EAAE,SAAS,CAAC,KAAK,CAAC;CAChD,CAAC,CAAC;AAEH,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAoC;IAEpC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAEhC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAE5D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAC7B,8BAA8B,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAClD,CACF,CAAC;QAEF,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CACjC,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,CACpE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAA8D;IAE9D,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC;IAE9C,IAAI,UAAU,EAAE,UAAU,KAAK,UAAU,EAAE,WAAW,EAAE,CAAC;QACvD,GAAG,CAAC,gDAAgD,CAAC,CAAC;QACtD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;SACtB,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACjB,MAAM,MAAM,GAAG,EAAE,CAAC;QAElB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG,mBAAmB,CAAC,KAAK,CAAC,QAAkB,CAAC;gBAChD,IAAI,EAAE,eAAe,CAAC,YAAY;aACnC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,CAAC,IAAI,CAAC;YACV,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAe,CAAC;YAC7C,IAAI,EAAE,eAAe,CAAC,IAAI;SAC3B,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAA6C;IAE7C,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAEvC,MAAM,kBAAkB,GAAG,SAAS,CAAC,IAAI,CACvC,sCAAsC,CACvC,CAAC,kBAAkB,CAAC,cAAgD,CAAC;IAEtE,MAAM,aAAa,GACjB,kBAAkB,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC;IAEnE,MAAM,cAAc,GAAG,kBAAkB,EAAE,WAAW,CAAC;IAEvD,OAAO,aAAa,IAAI,cAAc,CAAC;AACzC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAqD,EACrD,SAA4C,EAC5C,WAA4B;IAE5B,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CACzC,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,EAC7C,SAAS,EACT,WAAW,CACZ,CAAC;IAEF,GAAG,CAAC,iBAAiB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;IAEtD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,WAAmB;IAC9C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAW,CAAC;IACrC,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3E,MAAM,EAAE,GAAG,WAAW,CAAC,EAAS,CAAC;IACjC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAY,CAAC;IAEvC,OAAO;QACL,IAAI;QACJ,GAAG;QACH,OAAO,EAAE,KAAK;QACd,EAAE;QACF,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,8BAA8B,CAC3C,YAAgC,EAChC,KAAa,EACb,OAAoC;IAEpC,MAAM,EACJ,WAAW,EACX,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,GACnB,GAAG,YAAY,CAAC;IAEjB,MAAM,iBAAiB,GAAG,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAC9D,MAAM,oBAAoB,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEzB,IAAI,mBAAmB,GAAG,iBAAiB,CAAC;IAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,cAAc,GAAG;YACrB,GAAG,YAAY;YACf,iBAAiB,EAAE,mBAAmB;SACvC,CAAC;QAEF,IAAI,CAAC;YACH,GAAG,CAAC,SAAS,EAAE;gBACb,OAAO,EAAE,CAAC,GAAG,CAAC;gBACd,WAAW;gBACX,aAAa;gBACb,UAAU;gBACV,mBAAmB;gBACnB,MAAM,EAAE,kBAAkB;aAC3B,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,oBAAoB,CACvC,cAAc,EACd,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,WAAW,CACpB,CAAC;YAEF,MAAM,IAAI,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC;iBACxD,KAAK,CAAC,mBAAmB,CAAC;iBAC1B,QAAQ,CAAC,EAAE,CAAC,CAAC;YAEhB,GAAG,CAAC,mBAAmB,EAAE;gBACvB,OAAO,EAAE,CAAC,GAAG,CAAC;gBACd,MAAM,EAAE,kBAAkB;gBAC1B,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,kBAAkB;gBAC7C,UAAU,EAAE,mBAAmB;gBAC/B,IAAI;gBACJ,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;YAEH,OAAO;gBACL,GAAG,MAAM;gBACT,OAAO,EAAE;oBACP,QAAQ,EAAE,CAAC,GAAG,CAAC;oBACf,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,CAAC;oBAC/B,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;iBAC5B;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAI,KAA6B,CAAC,OAAO,CAAC;YAE5D,IAAI,YAAY,KAAK,sCAAsC,EAAE,CAAC;gBAC5D,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,IACE,IAAI,SAAS,CAAC,mBAAmB,CAAC,CAAC,sBAAsB,CACvD,gBAAgB,CACjB,EACD,CAAC;YACD,GAAG,CAAC,uBAAuB,EAAE;gBAC3B,kBAAkB;gBAClB,gBAAgB;gBAChB,mBAAmB;gBACnB,OAAO,EAAE,CAAC,GAAG,CAAC;aACf,CAAC,CAAC;YAEH,MAAM;QACR,CAAC;QAED,MAAM,eAAe,GAAG,oBAAoB,CAAC,YAAY,CACvD,CAAC,GAAG,MAAM,GAAG,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAClC,CAAC;QAEF,mBAAmB,GAAG,eAAe,CAAC,UAAU,CAAC,gBAAgB,CAAC;YAChE,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5B,CAAC,CAAC,gBAAgB,CAAC;IACvB,CAAC;IAED,GAAG,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,CAAC;IAE/C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,oBAAoB,CACjC,YAAgC,EAChC,SAA4C,EAC5C,WAA4B;IAE5B,MAAM,EACJ,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,kBAAkB,GACnB,GAAG,YAAY,CAAC;IAEjB,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC;IAC7B,MAAM,SAAS,GAAG,8BAA8B,CAAC,GAAG,CAAC,IAAuB,CAAC,CAAC;IAE9E,MAAM,aAAa,GAAwB;QACzC,WAAW,EAAE,aAAa;QAC1B,gBAAgB,EAAE,oBAAoB,CAAC,kBAAkB,CAAC;QAC1D,iBAAiB,EAAE,IAAI;QACvB,WAAW,EAAE,KAAK;QAClB,eAAe,EAAE,KAAK;QACtB,eAAe,EAAE,KAAK;QACtB,QAAQ,EAAE,QAAQ,GAAG,GAAG;QACxB,UAAU,EAAE,aAAa;QACzB,eAAe,EAAE,oBAAoB,CAAC,kBAAkB,CAAC;QACzD,cAAc,EAAE,iBAAiB;QACjC,aAAa,EAAE,IAAI;KACpB,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CACjC,8BAA8B,EAC9B,aAAa,EACb,SAAS,EACT,SAAS,CACV,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAElD,OAAO;QACL,GAAG,MAAM;QACT,OAAO,EAAE,YAAY;KACtB,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,YAAY,CACnB,MAAuB,EACvB,OAA2B;IAE3B,MAAM,aAAa,GAAG,OAAO,CAC3B,MAAM,EACN,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,gCAAgC,EACjD,KAAK,CACN,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEd,MAAM,uBAAuB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7D,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,sBAAsB,CAClE,OAAO,CAAC,mBAAmB,CAC5B,CACF,CAAC;IAEF,GAAG,CAAC,oBAAoB,EAAE;QACxB,SAAS,EAAE,MAAM;QACjB,aAAa;QACb,uBAAuB;KACxB,CAAC,CAAC;IAEH,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAC3B,uBAAuB,EACvB,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,EAC/D,MAAM,CACP,CAAC,CAAC,CAAC,CAAC;IAEL,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,gBAAgB,CACvB,QAAwB,EACxB,SAA4C;IAE5C,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAEhD,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,YAAY,EAAE,CAAC,CAAC;SACnD,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QACtB,MAAM,cAAc,GAAG,KAAK,KAAK,CAAC,CAAC;QACnC,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7D,MAAM,gBAAgB,GAAG,QAAQ;aAC9B,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YACxB,MAAM,YAAY,GAChB,KAAK,CAAC,kBAAkB,CAAC,WAAW,EAAE;gBACpC,OAAO,CAAC,kBAAkB,CAAC,WAAW,EAAE;gBAC1C,KAAK,CAAC,aAAa,KAAK,OAAO,CAAC,aAAa,CAAC;YAEhD,IAAI,cAAc,IAAI,CAAC,GAAG,KAAK,IAAI,YAAY,EAAE,CAAC;gBAChD,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC5C,CAAC;YAED,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,IAAI,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;aAC1C,OAAO,CAAC,CAAC,CAAC,CAAC;QAEd,OAAO;YACL,GAAG,OAAO;YACV,WAAW;YACX,gBAAgB;SACjB,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CAAC,SAA4C;IACnE,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,sCAAsC,CAAC;SACxE,kBAAkB,CAAC,iBAAuD,CAAC;IAE9E,OAAO;QACL,WAAW,EAAE,YAAY,EAAE,WAAW,IAAI,oBAAoB;QAC9D,aAAa,EAAE,YAAY,EAAE,aAAa,IAAI,sBAAsB;QACpE,UAAU,EAAE,YAAY,EAAE,UAAU,IAAI,mBAAmB;QAC3D,gBAAgB,EACd,YAAY,EAAE,gBAAgB,IAAI,yBAAyB;QAC7D,QAAQ,EAAE,YAAY,EAAE,QAAQ,IAAI,gBAAgB;KACrD,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,cAAc,CACrB,KAAgC,EAChC,OAA2B,EAC3B,SAA4C,EAC5C,WAA4B;IAE5B,MAAM,cAAc,GAAG,gBAAgB,CACrC,SAAS,EACT,OAAO,CAAC,kBAAkB,EAC1B,OAAO,CAAC,aAAa,CACtB,CAAC;IAEF,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,oDAAoD,OAAO,CAAC,aAAa,cAAc,OAAO,CAAC,kBAAkB,EAAE,CACpH,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,gBAAgB,CACrC,SAAS,EACT,OAAO,CAAC,kBAAkB,EAC1B,OAAO,CAAC,aAAa,CACtB,CAAC;IAEF,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,oDAAoD,OAAO,CAAC,aAAa,cAAc,OAAO,CAAC,kBAAkB,EAAE,CACpH,CAAC;IACJ,CAAC;IAED,MAAM,uBAAuB,GAAG,kBAAkB,CAChD,KAAK,CAAC,KAAK,CAAC,kBAAkB,EAC9B,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAC9B,cAAc,CAAC,QAAQ,EACvB,cAAc,CAAC,OAAO,CACvB,CAAC;IAEF,MAAM,gBAAgB,GAAG,kBAAkB,CACzC,KAAK,CAAC,KAAK,CAAC,cAAc,EAC1B,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAC7B,cAAc,CAAC,QAAQ,EACvB,cAAc,CAAC,OAAO,CACvB,CAAC;IAEF,MAAM,gBAAgB,GAAG,kBAAkB,CACzC,OAAO,CAAC,mBAAmB,EAC3B,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAC9B,cAAc,CAAC,QAAQ,EACvB,cAAc,CAAC,OAAO,CACvB,CAAC;IAEF,MAAM,aAAa,GAAG,2BAA2B,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC1E,MAAM,aAAa,GAAG,yBAAyB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAElE,OAAO;QACL,iBAAiB,EAAE,KAAK,CAAC,gCAAgC;QACzD,IAAI,EAAE;YACJ,IAAI,EAAE,IAAI,SAAS,CAAC,uBAAuB,CAAC,IAAI,CAAC;iBAC9C,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC;iBAC5B,QAAQ,CAAC,EAAE,CAAC;YACf,GAAG,EAAE,IAAI,SAAS,CAAC,uBAAuB,CAAC,GAAG,CAAC;iBAC5C,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC;iBAC3B,QAAQ,CAAC,EAAE,CAAC;SAChB;QACD,IAAI,EAAE;YACJ,QAAQ,EAAE;gBACR,IAAI,EAAE,IAAI,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC;qBACvC,KAAK,CAAC,uBAAuB,CAAC,IAAI,CAAC;qBACnC,QAAQ,CAAC,EAAE,CAAC;gBACf,GAAG,EAAE,IAAI,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC;qBACrC,KAAK,CAAC,uBAAuB,CAAC,GAAG,CAAC;qBAClC,QAAQ,CAAC,EAAE,CAAC;aAChB;YACD,aAAa;YACb,aAAa;SACd;QACD,QAAQ,EAAE,KAAK;QACf,OAAO;QACP,QAAQ,EAAE,sBAAsB,CAAC,MAAM;KACxC,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,kBAAkB,CACzB,MAAc,EACd,QAAgB,EAChB,YAAoB,EACpB,WAAmB;IAEnB,MAAM,WAAW,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAG,WAAW,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,WAAW,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEjE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACvB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,yBAAyB,CAChC,KAAgC,EAChC,SAA4C;IAE5C,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAElC,MAAM,YAAY,GAAG,QAAQ;QAC3B,CAAC,CAAC,wBAAwB,CAAC,QAAkB,EAAE,SAAS,CAAC;QACzD,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAE5B,MAAM,SAAS,GAAG,wBAAwB,CAAC,KAAe,EAAE,SAAS,CAAC,CAAC;IAEvE,OAAO;QACL,IAAI,EAAE,IAAI,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxE,GAAG,EAAE,IAAI,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;KACtE,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,wBAAwB,CAC/B,WAAmB,EACnB,SAA4C;IAE5C,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC;IAE/C,OAAO,gBAAgB,CAAC;QACtB,GAAG,WAAW;QACd,GAAG,EAAE,YAAY,IAAI,QAAQ,IAAI,KAAK;QACtC,SAAS;KACV,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n FeatureId,\n type GenericQuoteRequest,\n} from '@metamask/bridge-controller';\nimport type { TxData } from '@metamask/bridge-controller';\nimport type { QuoteResponse } from '@metamask/bridge-controller';\nimport { toChecksumHexAddress, toHex } from '@metamask/controller-utils';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type { BatchTransaction } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport { orderBy } from 'lodash';\n\nimport type {\n BridgeFeatureFlags,\n TransactionPayBridgeQuote,\n BridgeQuoteRequest,\n} from './types';\nimport { TransactionPayStrategy } from '../..';\nimport { projectLogger } from '../../logger';\nimport type {\n FiatValue,\n PayStrategyGetBatchRequest,\n PayStrategyGetQuotesRequest,\n PayStrategyGetRefreshIntervalRequest,\n QuoteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { calculateGasCost, calculateTransactionGasCost } from '../../utils/gas';\nimport { getTokenFiatRate } from '../../utils/token';\n\nconst ERROR_MESSAGE_NO_QUOTES = 'No quotes found';\nconst ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM = 'All quotes under minimum';\nconst ATTEMPTS_MAX_DEFAULT = 5;\nconst BUFFER_INITIAL_DEFAULT = 0.04;\nconst BUFFER_STEP_DEFAULT = 0.04;\nconst BUFFER_SUBSEQUENT_DEFAULT = 0.05;\nconst SLIPPAGE_DEFAULT = 0.005;\n\nconst FEATURE_ID_BY_TRANSACTION_TYPE = new Map<TransactionType, FeatureId>([\n [TransactionType.perpsDeposit, FeatureId.PERPS],\n]);\n\nconst log = createModuleLogger(projectLogger, 'bridge-strategy');\n\n/**\n * Fetch bridge quotes for multiple requests.\n *\n * @param request - Request object.\n * @returns An array of bridge quotes.\n */\nexport async function getBridgeQuotes(\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<TransactionPayBridgeQuote>[]> {\n log('Fetching quotes', request);\n\n const { requests, messenger, transaction } = request;\n\n try {\n const finalRequests = getFinalRequests(requests, messenger);\n\n const quotes = await Promise.all(\n finalRequests.map((r, index) =>\n getSufficientSingleBridgeQuote(r, index, request),\n ),\n );\n\n return quotes.map((quote, index) =>\n normalizeQuote(quote, finalRequests[index], messenger, transaction),\n );\n } catch (error) {\n log('Error fetching quotes', { error });\n throw new Error(`Failed to fetch bridge quotes: ${String(error)}`);\n }\n}\n\n/**\n * Get bridge batch transactions if needed by the quotes.\n *\n * @param request - Request object.\n * @returns Array of batch transactions.\n */\nexport async function getBridgeBatchTransactions(\n request: PayStrategyGetBatchRequest<TransactionPayBridgeQuote>,\n): Promise<BatchTransaction[]> {\n const { quotes } = request;\n const firstQuote = quotes[0]?.original?.quote;\n\n if (firstQuote?.srcChainId !== firstQuote?.destChainId) {\n log('No batch transactions needed for bridge quotes');\n return [];\n }\n\n return quotes\n .map((q) => q.original)\n .flatMap((quote) => {\n const result = [];\n\n if (quote.approval) {\n result.push({\n ...getBatchTransaction(quote.approval as TxData),\n type: TransactionType.swapApproval,\n });\n }\n\n result.push({\n ...getBatchTransaction(quote.trade as TxData),\n type: TransactionType.swap,\n });\n\n return result;\n });\n}\n\n/**\n * Get the refresh interval for bridge quotes.\n *\n * @param request - Request object.\n * @returns Refresh interval in milliseconds.\n */\nexport function getBridgeRefreshInterval(\n request: PayStrategyGetRefreshIntervalRequest,\n): number | undefined {\n const { chainId, messenger } = request;\n\n const bridgeFeatureFlags = messenger.call(\n 'RemoteFeatureFlagController:getState',\n ).remoteFeatureFlags.bridgeConfigV2 as BridgeFeatureFlags | undefined;\n\n const chainInterval =\n bridgeFeatureFlags?.chains?.[parseInt(chainId, 16)]?.refreshRate;\n\n const globalInterval = bridgeFeatureFlags?.refreshRate;\n\n return chainInterval ?? globalInterval;\n}\n\n/**\n * Get a fresh quote for a previously fetched bridge quote to avoid expiration.\n *\n * @param quote - Original quote.\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns Fresh quote response.\n */\nexport async function refreshQuote(\n quote: TransactionPayQuote<TransactionPayBridgeQuote>,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<TransactionPayBridgeQuote> {\n const newQuote = await getSingleBridgeQuote(\n { ...quote.original.request, attemptsMax: 1 },\n messenger,\n transaction,\n );\n\n log('Refreshed quote', { old: quote, new: newQuote });\n\n return newQuote;\n}\n\n/**\n * Convert a quote trade or approval to a batch transaction.\n *\n * @param transaction - Quote trade or approval.\n * @returns Batch transaction.\n */\nfunction getBatchTransaction(transaction: TxData): BatchTransaction {\n const data = transaction.data as Hex;\n const gas = transaction.gasLimit ? toHex(transaction.gasLimit) : undefined;\n const to = transaction.to as Hex;\n const value = transaction.value as Hex;\n\n return {\n data,\n gas,\n isAfter: false,\n to,\n value,\n };\n}\n\n/**\n * Retry fetching a single bridge quote until it meets the minimum target amount.\n *\n * @param quoteRequest - Original quote request.\n * @param index - Index of the request in the array.\n * @param request - Full quotes request.\n * @returns The sufficient bridge quote.\n */\nasync function getSufficientSingleBridgeQuote(\n quoteRequest: BridgeQuoteRequest,\n index: number,\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayBridgeQuote> {\n const {\n attemptsMax,\n bufferInitial,\n bufferStep,\n bufferSubsequent,\n sourceBalanceRaw,\n sourceTokenAmount,\n targetAmountMinimum,\n targetTokenAddress,\n } = quoteRequest;\n\n const sourceAmountValue = new BigNumber(sourceTokenAmount);\n const buffer = index === 0 ? bufferInitial : bufferSubsequent;\n const originalSourceAmount = sourceAmountValue.div(1 + buffer);\n const start = Date.now();\n\n let currentSourceAmount = sourceTokenAmount;\n\n for (let i = 0; i < attemptsMax; i++) {\n const currentRequest = {\n ...quoteRequest,\n sourceTokenAmount: currentSourceAmount,\n };\n\n try {\n log('Attempt', {\n attempt: i + 1,\n attemptsMax,\n bufferInitial,\n bufferStep,\n currentSourceAmount,\n target: targetTokenAddress,\n });\n\n const result = await getSingleBridgeQuote(\n currentRequest,\n request.messenger,\n request.transaction,\n );\n\n const dust = new BigNumber(result.quote.minDestTokenAmount)\n .minus(targetAmountMinimum)\n .toString(10);\n\n log('Found valid quote', {\n attempt: i + 1,\n target: targetTokenAddress,\n targetAmount: result.quote.minDestTokenAmount,\n goalAmount: targetAmountMinimum,\n dust,\n quote: result,\n });\n\n return {\n ...result,\n metrics: {\n attempts: i + 1,\n buffer: buffer + bufferStep * i,\n latency: Date.now() - start,\n },\n };\n } catch (error) {\n const errorMessage = (error as { message: string }).message;\n\n if (errorMessage !== ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM) {\n throw error;\n }\n }\n\n if (\n new BigNumber(currentSourceAmount).isGreaterThanOrEqualTo(\n sourceBalanceRaw,\n )\n ) {\n log('Reached balance limit', {\n targetTokenAddress,\n sourceBalanceRaw,\n currentSourceAmount,\n attempt: i + 1,\n });\n\n break;\n }\n\n const newSourceAmount = originalSourceAmount.multipliedBy(\n 1 + buffer + bufferStep * (i + 1),\n );\n\n currentSourceAmount = newSourceAmount.isLessThan(sourceBalanceRaw)\n ? newSourceAmount.toFixed(0)\n : sourceBalanceRaw;\n }\n\n log('All attempts failed', targetTokenAddress);\n\n throw new Error(ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM);\n}\n\n/**\n * Fetch a single bridge quote.\n *\n * @param quoteRequest - Quote request parameters.\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns The bridge quote.\n */\nasync function getSingleBridgeQuote(\n quoteRequest: BridgeQuoteRequest,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<TransactionPayBridgeQuote> {\n const {\n from,\n slippage,\n sourceChainId,\n sourceTokenAddress,\n sourceTokenAmount,\n targetChainId,\n targetTokenAddress,\n } = quoteRequest;\n\n const { type } = transaction;\n const featureId = FEATURE_ID_BY_TRANSACTION_TYPE.get(type as TransactionType);\n\n const bridgeRequest: GenericQuoteRequest = {\n destChainId: targetChainId,\n destTokenAddress: toChecksumHexAddress(targetTokenAddress),\n destWalletAddress: from,\n gasIncluded: false,\n gasIncluded7702: false,\n insufficientBal: false,\n slippage: slippage * 100,\n srcChainId: sourceChainId,\n srcTokenAddress: toChecksumHexAddress(sourceTokenAddress),\n srcTokenAmount: sourceTokenAmount,\n walletAddress: from,\n };\n\n const quotes = await messenger.call(\n 'BridgeController:fetchQuotes',\n bridgeRequest,\n undefined,\n featureId,\n );\n\n if (!quotes.length) {\n throw new Error(ERROR_MESSAGE_NO_QUOTES);\n }\n\n const result = getBestQuote(quotes, quoteRequest);\n\n return {\n ...result,\n request: quoteRequest,\n };\n}\n\n/**\n * Select the best quote from a list of quotes.\n *\n * @param quotes - List of quotes.\n * @param request - Original quote request.\n * @returns The best quote.\n */\nfunction getBestQuote(\n quotes: QuoteResponse[],\n request: BridgeQuoteRequest,\n): QuoteResponse {\n const fastestQuotes = orderBy(\n quotes,\n (quote) => quote.estimatedProcessingTimeInSeconds,\n 'asc',\n ).slice(0, 3);\n\n const quotesOverMinimumTarget = fastestQuotes.filter((quote) =>\n new BigNumber(quote.quote.minDestTokenAmount).isGreaterThanOrEqualTo(\n request.targetAmountMinimum,\n ),\n );\n\n log('Finding best quote', {\n allQuotes: quotes,\n fastestQuotes,\n quotesOverMinimumTarget,\n });\n\n if (!quotesOverMinimumTarget.length) {\n throw new Error(ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM);\n }\n\n const cheapestQuote = orderBy(\n quotesOverMinimumTarget,\n (quote) => BigNumber(quote.quote.minDestTokenAmount).toNumber(),\n 'desc',\n )[0];\n\n return cheapestQuote;\n}\n\n/**\n * Get the final bridge quote requests.\n * Subtracts subsequent source amounts from the available balance.\n *\n * @param requests - List of bridge quote requests.\n * @param messenger - Controller messenger.\n * @returns The final bridge quote requests.\n */\nfunction getFinalRequests(\n requests: QuoteRequest[],\n messenger: TransactionPayControllerMessenger,\n): BridgeQuoteRequest[] {\n const featureFlags = getFeatureFlags(messenger);\n\n return requests\n .map((request) => ({ ...request, ...featureFlags }))\n .map((request, index) => {\n const isFirstRequest = index === 0;\n const attemptsMax = isFirstRequest ? request.attemptsMax : 1;\n\n const sourceBalanceRaw = requests\n .reduce((acc, value, j) => {\n const isSameSource =\n value.sourceTokenAddress.toLowerCase() ===\n request.sourceTokenAddress.toLowerCase() &&\n value.sourceChainId === request.sourceChainId;\n\n if (isFirstRequest && j > index && isSameSource) {\n return acc.minus(value.sourceTokenAmount);\n }\n\n return acc;\n }, new BigNumber(request.sourceBalanceRaw))\n .toFixed(0);\n\n return {\n ...request,\n attemptsMax,\n sourceBalanceRaw,\n };\n });\n}\n\n/**\n * Get feature flags for bridge quotes.\n *\n * @param messenger - Controller messenger.\n * @returns Feature flags.\n */\nfunction getFeatureFlags(messenger: TransactionPayControllerMessenger) {\n const featureFlags = messenger.call('RemoteFeatureFlagController:getState')\n .remoteFeatureFlags.confirmations_pay as Record<string, number> | undefined;\n\n return {\n attemptsMax: featureFlags?.attemptsMax ?? ATTEMPTS_MAX_DEFAULT,\n bufferInitial: featureFlags?.bufferInitial ?? BUFFER_INITIAL_DEFAULT,\n bufferStep: featureFlags?.bufferStep ?? BUFFER_STEP_DEFAULT,\n bufferSubsequent:\n featureFlags?.bufferSubsequent ?? BUFFER_SUBSEQUENT_DEFAULT,\n slippage: featureFlags?.slippage ?? SLIPPAGE_DEFAULT,\n };\n}\n\n/**\n * Convert a bridge specific quote response to a normalized transaction pay quote.\n *\n * @param quote - Bridge quote response.\n * @param request - Request\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns Normalized transaction pay quote.\n */\nfunction normalizeQuote(\n quote: TransactionPayBridgeQuote,\n request: BridgeQuoteRequest,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): TransactionPayQuote<TransactionPayBridgeQuote> {\n const sourceFiatRate = getTokenFiatRate(\n messenger,\n request.sourceTokenAddress,\n request.sourceChainId,\n );\n\n if (sourceFiatRate === undefined) {\n throw new Error(\n `Fiat rate not found for source token - Chain ID: ${request.sourceChainId}, Address: ${request.sourceTokenAddress}`,\n );\n }\n\n const targetFiatRate = getTokenFiatRate(\n messenger,\n request.targetTokenAddress,\n request.targetChainId,\n );\n\n if (targetFiatRate === undefined) {\n throw new Error(\n `Fiat rate not found for target token - Chain ID: ${request.targetChainId}, Address: ${request.targetTokenAddress}`,\n );\n }\n\n const targetAmountMinimumFiat = calculateFiatValue(\n quote.quote.minDestTokenAmount,\n quote.quote.destAsset.decimals,\n targetFiatRate.fiatRate,\n targetFiatRate.usdRate,\n );\n\n const sourceAmountFiat = calculateFiatValue(\n quote.quote.srcTokenAmount,\n quote.quote.srcAsset.decimals,\n sourceFiatRate.fiatRate,\n sourceFiatRate.usdRate,\n );\n\n const targetAmountGoal = calculateFiatValue(\n request.targetAmountMinimum,\n quote.quote.destAsset.decimals,\n targetFiatRate.fiatRate,\n targetFiatRate.usdRate,\n );\n\n const targetNetwork = calculateTransactionGasCost(transaction, messenger);\n const sourceNetwork = calculateSourceNetworkFee(quote, messenger);\n\n return {\n estimatedDuration: quote.estimatedProcessingTimeInSeconds,\n dust: {\n fiat: new BigNumber(targetAmountMinimumFiat.fiat)\n .minus(targetAmountGoal.fiat)\n .toString(10),\n usd: new BigNumber(targetAmountMinimumFiat.usd)\n .minus(targetAmountGoal.usd)\n .toString(10),\n },\n fees: {\n provider: {\n fiat: new BigNumber(sourceAmountFiat.fiat)\n .minus(targetAmountMinimumFiat.fiat)\n .toString(10),\n usd: new BigNumber(sourceAmountFiat.usd)\n .minus(targetAmountMinimumFiat.usd)\n .toString(10),\n },\n sourceNetwork,\n targetNetwork,\n },\n original: quote,\n request,\n strategy: TransactionPayStrategy.Bridge,\n };\n}\n\n/**\n * Calculate fiat value from amount and fiat rates.\n *\n * @param amount - Amount to convert.\n * @param decimals - Token decimals.\n * @param fiatRateFiat - Fiat rate.\n * @param fiatRateUsd - USD rate.\n * @returns Fiat value.\n */\nfunction calculateFiatValue(\n amount: string,\n decimals: number,\n fiatRateFiat: string,\n fiatRateUsd: string,\n): FiatValue {\n const amountHuman = new BigNumber(amount).shiftedBy(-decimals);\n const usd = amountHuman.multipliedBy(fiatRateUsd).toString(10);\n const fiat = amountHuman.multipliedBy(fiatRateFiat).toString(10);\n\n return { fiat, usd };\n}\n\n/**\n * Calculate the source network fee for a bridge quote.\n *\n * @param quote - Bridge quote response.\n * @param messenger - Controller messenger.\n * @returns Estimated gas cost for the source network.\n */\nfunction calculateSourceNetworkFee(\n quote: TransactionPayBridgeQuote,\n messenger: TransactionPayControllerMessenger,\n): FiatValue {\n const { approval, trade } = quote;\n\n const approvalCost = approval\n ? calculateTransactionCost(approval as TxData, messenger)\n : { fiat: '0', usd: '0' };\n\n const tradeCost = calculateTransactionCost(trade as TxData, messenger);\n\n return {\n fiat: new BigNumber(approvalCost.fiat).plus(tradeCost.fiat).toString(10),\n usd: new BigNumber(approvalCost.usd).plus(tradeCost.usd).toString(10),\n };\n}\n\n/**\n * Calculate the source gas cost for a transaction.\n *\n * @param transaction - Transaction parameters.\n * @param messenger - Controller messenger\n * @returns Estimated gas cost for a bridge transaction.\n */\nfunction calculateTransactionCost(\n transaction: TxData,\n messenger: TransactionPayControllerMessenger,\n): FiatValue {\n const { effectiveGas, gasLimit } = transaction;\n\n return calculateGasCost({\n ...transaction,\n gas: effectiveGas || gasLimit || '0x0',\n messenger,\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bridge-quotes.mjs","sourceRoot":"","sources":["../../../src/strategy/bridge/bridge-quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n FeatureId,\n type GenericQuoteRequest,\n} from '@metamask/bridge-controller';\nimport type { TxData } from '@metamask/bridge-controller';\nimport type { QuoteResponse } from '@metamask/bridge-controller';\nimport { toChecksumHexAddress, toHex } from '@metamask/controller-utils';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type { BatchTransaction } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport { orderBy } from 'lodash';\n\nimport type {\n BridgeFeatureFlags,\n TransactionPayBridgeQuote,\n BridgeQuoteRequest,\n} from './types';\nimport { TransactionPayStrategy } from '../..';\nimport { projectLogger } from '../../logger';\nimport type {\n Amount,\n PayStrategyGetBatchRequest,\n PayStrategyGetQuotesRequest,\n PayStrategyGetRefreshIntervalRequest,\n QuoteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { calculateGasCost, calculateTransactionGasCost } from '../../utils/gas';\nimport { getTokenFiatRate } from '../../utils/token';\n\nconst ERROR_MESSAGE_NO_QUOTES = 'No quotes found';\nconst ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM = 'All quotes under minimum';\nconst ATTEMPTS_MAX_DEFAULT = 5;\nconst BUFFER_INITIAL_DEFAULT = 0.04;\nconst BUFFER_STEP_DEFAULT = 0.04;\nconst BUFFER_SUBSEQUENT_DEFAULT = 0.05;\nconst SLIPPAGE_DEFAULT = 0.005;\n\nconst FEATURE_ID_BY_TRANSACTION_TYPE = new Map<TransactionType, FeatureId>([\n [TransactionType.perpsDeposit, FeatureId.PERPS],\n]);\n\nconst log = createModuleLogger(projectLogger, 'bridge-strategy');\n\n/**\n * Fetch bridge quotes for multiple requests.\n *\n * @param request - Request object.\n * @returns An array of bridge quotes.\n */\nexport async function getBridgeQuotes(\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<TransactionPayBridgeQuote>[]> {\n log('Fetching quotes', request);\n\n const { requests, messenger, transaction } = request;\n\n try {\n const finalRequests = getFinalRequests(requests, messenger);\n\n const quotes = await Promise.all(\n finalRequests.map((r, index) =>\n getSufficientSingleBridgeQuote(r, index, request),\n ),\n );\n\n return quotes.map((quote, index) =>\n normalizeQuote(quote, finalRequests[index], messenger, transaction),\n );\n } catch (error) {\n log('Error fetching quotes', { error });\n throw new Error(`Failed to fetch bridge quotes: ${String(error)}`);\n }\n}\n\n/**\n * Get bridge batch transactions if needed by the quotes.\n *\n * @param request - Request object.\n * @returns Array of batch transactions.\n */\nexport async function getBridgeBatchTransactions(\n request: PayStrategyGetBatchRequest<TransactionPayBridgeQuote>,\n): Promise<BatchTransaction[]> {\n const { quotes } = request;\n const firstQuote = quotes[0]?.original?.quote;\n\n if (firstQuote?.srcChainId !== firstQuote?.destChainId) {\n log('No batch transactions needed for bridge quotes');\n return [];\n }\n\n return quotes\n .map((q) => q.original)\n .flatMap((quote) => {\n const result = [];\n\n if (quote.approval) {\n result.push({\n ...getBatchTransaction(quote.approval as TxData),\n type: TransactionType.swapApproval,\n });\n }\n\n result.push({\n ...getBatchTransaction(quote.trade as TxData),\n type: TransactionType.swap,\n });\n\n return result;\n });\n}\n\n/**\n * Get the refresh interval for bridge quotes.\n *\n * @param request - Request object.\n * @returns Refresh interval in milliseconds.\n */\nexport function getBridgeRefreshInterval(\n request: PayStrategyGetRefreshIntervalRequest,\n): number | undefined {\n const { chainId, messenger } = request;\n\n const bridgeFeatureFlags = messenger.call(\n 'RemoteFeatureFlagController:getState',\n ).remoteFeatureFlags.bridgeConfigV2 as BridgeFeatureFlags | undefined;\n\n const chainInterval =\n bridgeFeatureFlags?.chains?.[parseInt(chainId, 16)]?.refreshRate;\n\n const globalInterval = bridgeFeatureFlags?.refreshRate;\n\n return chainInterval ?? globalInterval;\n}\n\n/**\n * Get a fresh quote for a previously fetched bridge quote to avoid expiration.\n *\n * @param quote - Original quote.\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns Fresh quote response.\n */\nexport async function refreshQuote(\n quote: TransactionPayQuote<TransactionPayBridgeQuote>,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<TransactionPayBridgeQuote> {\n const newQuote = await getSingleBridgeQuote(\n { ...quote.original.request, attemptsMax: 1 },\n messenger,\n transaction,\n );\n\n log('Refreshed quote', { old: quote, new: newQuote });\n\n return newQuote;\n}\n\n/**\n * Convert a quote trade or approval to a batch transaction.\n *\n * @param transaction - Quote trade or approval.\n * @returns Batch transaction.\n */\nfunction getBatchTransaction(transaction: TxData): BatchTransaction {\n const data = transaction.data as Hex;\n const gas = transaction.gasLimit ? toHex(transaction.gasLimit) : undefined;\n const to = transaction.to as Hex;\n const value = transaction.value as Hex;\n\n return {\n data,\n gas,\n isAfter: false,\n to,\n value,\n };\n}\n\n/**\n * Retry fetching a single bridge quote until it meets the minimum target amount.\n *\n * @param quoteRequest - Original quote request.\n * @param index - Index of the request in the array.\n * @param request - Full quotes request.\n * @returns The sufficient bridge quote.\n */\nasync function getSufficientSingleBridgeQuote(\n quoteRequest: BridgeQuoteRequest,\n index: number,\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayBridgeQuote> {\n const {\n attemptsMax,\n bufferInitial,\n bufferStep,\n bufferSubsequent,\n sourceBalanceRaw,\n sourceTokenAmount,\n targetAmountMinimum,\n targetTokenAddress,\n } = quoteRequest;\n\n const sourceAmountValue = new BigNumber(sourceTokenAmount);\n const buffer = index === 0 ? bufferInitial : bufferSubsequent;\n const originalSourceAmount = sourceAmountValue.div(1 + buffer);\n const start = Date.now();\n\n let currentSourceAmount = sourceTokenAmount;\n\n for (let i = 0; i < attemptsMax; i++) {\n const currentRequest = {\n ...quoteRequest,\n sourceTokenAmount: currentSourceAmount,\n };\n\n try {\n log('Attempt', {\n attempt: i + 1,\n attemptsMax,\n bufferInitial,\n bufferStep,\n currentSourceAmount,\n target: targetTokenAddress,\n });\n\n const result = await getSingleBridgeQuote(\n currentRequest,\n request.messenger,\n request.transaction,\n );\n\n const dust = new BigNumber(result.quote.minDestTokenAmount)\n .minus(targetAmountMinimum)\n .toString(10);\n\n log('Found valid quote', {\n attempt: i + 1,\n target: targetTokenAddress,\n targetAmount: result.quote.minDestTokenAmount,\n goalAmount: targetAmountMinimum,\n dust,\n quote: result,\n });\n\n return {\n ...result,\n metrics: {\n attempts: i + 1,\n buffer: buffer + bufferStep * i,\n latency: Date.now() - start,\n },\n };\n } catch (error) {\n const errorMessage = (error as { message: string }).message;\n\n if (errorMessage !== ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM) {\n throw error;\n }\n }\n\n if (\n new BigNumber(currentSourceAmount).isGreaterThanOrEqualTo(\n sourceBalanceRaw,\n )\n ) {\n log('Reached balance limit', {\n targetTokenAddress,\n sourceBalanceRaw,\n currentSourceAmount,\n attempt: i + 1,\n });\n\n break;\n }\n\n const newSourceAmount = originalSourceAmount.multipliedBy(\n 1 + buffer + bufferStep * (i + 1),\n );\n\n currentSourceAmount = newSourceAmount.isLessThan(sourceBalanceRaw)\n ? newSourceAmount.toFixed(0)\n : sourceBalanceRaw;\n }\n\n log('All attempts failed', targetTokenAddress);\n\n throw new Error(ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM);\n}\n\n/**\n * Fetch a single bridge quote.\n *\n * @param quoteRequest - Quote request parameters.\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns The bridge quote.\n */\nasync function getSingleBridgeQuote(\n quoteRequest: BridgeQuoteRequest,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<TransactionPayBridgeQuote> {\n const {\n from,\n slippage,\n sourceChainId,\n sourceTokenAddress,\n sourceTokenAmount,\n targetChainId,\n targetTokenAddress,\n } = quoteRequest;\n\n const { type } = transaction;\n const featureId = FEATURE_ID_BY_TRANSACTION_TYPE.get(type as TransactionType);\n\n const bridgeRequest: GenericQuoteRequest = {\n destChainId: targetChainId,\n destTokenAddress: toChecksumHexAddress(targetTokenAddress),\n destWalletAddress: from,\n gasIncluded: false,\n gasIncluded7702: false,\n insufficientBal: false,\n slippage: slippage * 100,\n srcChainId: sourceChainId,\n srcTokenAddress: toChecksumHexAddress(sourceTokenAddress),\n srcTokenAmount: sourceTokenAmount,\n walletAddress: from,\n };\n\n const quotes = await messenger.call(\n 'BridgeController:fetchQuotes',\n bridgeRequest,\n undefined,\n featureId,\n );\n\n if (!quotes.length) {\n throw new Error(ERROR_MESSAGE_NO_QUOTES);\n }\n\n const result = getBestQuote(quotes, quoteRequest);\n\n return {\n ...result,\n request: quoteRequest,\n };\n}\n\n/**\n * Select the best quote from a list of quotes.\n *\n * @param quotes - List of quotes.\n * @param request - Original quote request.\n * @returns The best quote.\n */\nfunction getBestQuote(\n quotes: QuoteResponse[],\n request: BridgeQuoteRequest,\n): QuoteResponse {\n const fastestQuotes = orderBy(\n quotes,\n (quote) => quote.estimatedProcessingTimeInSeconds,\n 'asc',\n ).slice(0, 3);\n\n const quotesOverMinimumTarget = fastestQuotes.filter((quote) =>\n new BigNumber(quote.quote.minDestTokenAmount).isGreaterThanOrEqualTo(\n request.targetAmountMinimum,\n ),\n );\n\n log('Finding best quote', {\n allQuotes: quotes,\n fastestQuotes,\n quotesOverMinimumTarget,\n });\n\n if (!quotesOverMinimumTarget.length) {\n throw new Error(ERROR_MESSAGE_ALL_QUOTES_UNDER_MINIMUM);\n }\n\n const cheapestQuote = orderBy(\n quotesOverMinimumTarget,\n (quote) => BigNumber(quote.quote.minDestTokenAmount).toNumber(),\n 'desc',\n )[0];\n\n return cheapestQuote;\n}\n\n/**\n * Get the final bridge quote requests.\n * Subtracts subsequent source amounts from the available balance.\n *\n * @param requests - List of bridge quote requests.\n * @param messenger - Controller messenger.\n * @returns The final bridge quote requests.\n */\nfunction getFinalRequests(\n requests: QuoteRequest[],\n messenger: TransactionPayControllerMessenger,\n): BridgeQuoteRequest[] {\n const featureFlags = getFeatureFlags(messenger);\n\n return requests\n .map((request) => ({ ...request, ...featureFlags }))\n .map((request, index) => {\n const isFirstRequest = index === 0;\n const attemptsMax = isFirstRequest ? request.attemptsMax : 1;\n\n const sourceBalanceRaw = requests\n .reduce((acc, value, j) => {\n const isSameSource =\n value.sourceTokenAddress.toLowerCase() ===\n request.sourceTokenAddress.toLowerCase() &&\n value.sourceChainId === request.sourceChainId;\n\n if (isFirstRequest && j > index && isSameSource) {\n return acc.minus(value.sourceTokenAmount);\n }\n\n return acc;\n }, new BigNumber(request.sourceBalanceRaw))\n .toFixed(0);\n\n return {\n ...request,\n attemptsMax,\n sourceBalanceRaw,\n };\n });\n}\n\n/**\n * Get feature flags for bridge quotes.\n *\n * @param messenger - Controller messenger.\n * @returns Feature flags.\n */\nfunction getFeatureFlags(messenger: TransactionPayControllerMessenger) {\n const featureFlags = messenger.call('RemoteFeatureFlagController:getState')\n .remoteFeatureFlags.confirmations_pay as Record<string, number> | undefined;\n\n return {\n attemptsMax: featureFlags?.attemptsMax ?? ATTEMPTS_MAX_DEFAULT,\n bufferInitial: featureFlags?.bufferInitial ?? BUFFER_INITIAL_DEFAULT,\n bufferStep: featureFlags?.bufferStep ?? BUFFER_STEP_DEFAULT,\n bufferSubsequent:\n featureFlags?.bufferSubsequent ?? BUFFER_SUBSEQUENT_DEFAULT,\n slippage: featureFlags?.slippage ?? SLIPPAGE_DEFAULT,\n };\n}\n\n/**\n * Convert a bridge specific quote response to a normalized transaction pay quote.\n *\n * @param quote - Bridge quote response.\n * @param request - Request\n * @param messenger - Controller messenger.\n * @param transaction - Transaction metadata.\n * @returns Normalized transaction pay quote.\n */\nfunction normalizeQuote(\n quote: TransactionPayBridgeQuote,\n request: BridgeQuoteRequest,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): TransactionPayQuote<TransactionPayBridgeQuote> {\n const sourceFiatRate = getTokenFiatRate(\n messenger,\n request.sourceTokenAddress,\n request.sourceChainId,\n );\n\n if (sourceFiatRate === undefined) {\n throw new Error(\n `Fiat rate not found for source token - Chain ID: ${request.sourceChainId}, Address: ${request.sourceTokenAddress}`,\n );\n }\n\n const targetFiatRate = getTokenFiatRate(\n messenger,\n request.targetTokenAddress,\n request.targetChainId,\n );\n\n if (targetFiatRate === undefined) {\n throw new Error(\n `Fiat rate not found for target token - Chain ID: ${request.targetChainId}, Address: ${request.targetTokenAddress}`,\n );\n }\n\n const targetAmountMinimumFiat = calculateAmount(\n quote.quote.minDestTokenAmount,\n quote.quote.destAsset.decimals,\n targetFiatRate.fiatRate,\n targetFiatRate.usdRate,\n );\n\n const sourceAmount = calculateAmount(\n quote.quote.srcTokenAmount,\n quote.quote.srcAsset.decimals,\n sourceFiatRate.fiatRate,\n sourceFiatRate.usdRate,\n );\n\n const targetAmount = calculateAmount(\n request.targetAmountMinimum,\n quote.quote.destAsset.decimals,\n targetFiatRate.fiatRate,\n targetFiatRate.usdRate,\n );\n\n const targetNetwork = calculateTransactionGasCost(transaction, messenger);\n\n const sourceNetwork = {\n estimate: calculateSourceNetworkFee(quote, messenger),\n max: calculateSourceNetworkFee(quote, messenger, { isMax: true }),\n };\n\n return {\n estimatedDuration: quote.estimatedProcessingTimeInSeconds,\n dust: {\n fiat: new BigNumber(targetAmountMinimumFiat.fiat)\n .minus(targetAmount.fiat)\n .toString(10),\n usd: new BigNumber(targetAmountMinimumFiat.usd)\n .minus(targetAmount.usd)\n .toString(10),\n },\n fees: {\n provider: {\n fiat: new BigNumber(sourceAmount.fiat)\n .minus(targetAmountMinimumFiat.fiat)\n .toString(10),\n usd: new BigNumber(sourceAmount.usd)\n .minus(targetAmountMinimumFiat.usd)\n .toString(10),\n },\n sourceNetwork,\n targetNetwork,\n },\n original: quote,\n request,\n sourceAmount,\n strategy: TransactionPayStrategy.Bridge,\n };\n}\n\n/**\n * Calculate amount from raw value and fiat rates.\n *\n * @param raw - Amount to convert.\n * @param decimals - Token decimals.\n * @param fiatRateFiat - Fiat rate.\n * @param fiatRateUsd - USD rate.\n * @returns Amount object.\n */\nfunction calculateAmount(\n raw: string,\n decimals: number,\n fiatRateFiat: string,\n fiatRateUsd: string,\n): Amount {\n const humanValue = new BigNumber(raw).shiftedBy(-decimals);\n const human = humanValue.toString(10);\n\n const usd = humanValue.multipliedBy(fiatRateUsd).toString(10);\n const fiat = humanValue.multipliedBy(fiatRateFiat).toString(10);\n\n return { fiat, human, raw, usd };\n}\n\n/**\n * Calculate the source network fee for a bridge quote.\n *\n * @param quote - Bridge quote response.\n * @param messenger - Controller messenger.\n * @param options - Calculation options.\n * @param options.isMax - Whether to calculate the maximum cost.\n * @returns Estimated gas cost for the source network.\n */\nfunction calculateSourceNetworkFee(\n quote: TransactionPayBridgeQuote,\n messenger: TransactionPayControllerMessenger,\n { isMax = false } = {},\n): Amount {\n const { approval, trade } = quote;\n\n const approvalCost = approval\n ? calculateTransactionCost(approval as TxData, messenger, { isMax })\n : { fiat: '0', human: '0', raw: '0', usd: '0' };\n\n const tradeCost = calculateTransactionCost(trade as TxData, messenger, {\n isMax,\n });\n\n return {\n fiat: new BigNumber(approvalCost.fiat).plus(tradeCost.fiat).toString(10),\n human: new BigNumber(approvalCost.human).plus(tradeCost.human).toString(10),\n raw: new BigNumber(approvalCost.raw).plus(tradeCost.raw).toString(10),\n usd: new BigNumber(approvalCost.usd).plus(tradeCost.usd).toString(10),\n };\n}\n\n/**\n * Calculate the source gas cost for a transaction.\n *\n * @param transaction - Transaction parameters.\n * @param messenger - Controller messenger\n * @param options - Calculation options.\n * @param options.isMax - Whether to calculate the maximum cost.\n * @returns Estimated gas cost for a bridge transaction.\n */\nfunction calculateTransactionCost(\n transaction: TxData,\n messenger: TransactionPayControllerMessenger,\n { isMax }: { isMax: boolean },\n): Amount {\n const { effectiveGas: effectiveGasOriginal, gasLimit } = transaction;\n const effectiveGas = isMax ? undefined : effectiveGasOriginal;\n\n return calculateGasCost({\n ...transaction,\n gas: effectiveGas || gasLimit || '0x0',\n messenger,\n isMax,\n });\n}\n"]}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RELAY_POLLING_INTERVAL = exports.RELAY_FALLBACK_GAS_LIMIT = exports.RELAY_URL_QUOTE = exports.RELAY_URL_BASE = exports.CHAIN_ID_HYPERCORE =
|
|
4
|
-
exports.ARBITRUM_USDC_ADDRESS = '0xaf88d065e77c8cC2239327C5EDb3A432268e5831';
|
|
5
|
-
exports.CHAIN_ID_ARBITRUM = '0xa4b1';
|
|
6
|
-
exports.CHAIN_ID_POLYGON = '0x89';
|
|
3
|
+
exports.RELAY_POLLING_INTERVAL = exports.RELAY_FALLBACK_GAS_LIMIT = exports.RELAY_URL_QUOTE = exports.RELAY_URL_BASE = exports.CHAIN_ID_HYPERCORE = void 0;
|
|
7
4
|
exports.CHAIN_ID_HYPERCORE = '0x539';
|
|
8
5
|
exports.RELAY_URL_BASE = 'https://api.relay.link';
|
|
9
6
|
exports.RELAY_URL_QUOTE = `${exports.RELAY_URL_BASE}/quote`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,
|
|
1
|
+
{"version":3,"file":"constants.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,kBAAkB,GAAG,OAAO,CAAC;AAC7B,QAAA,cAAc,GAAG,wBAAwB,CAAC;AAC1C,QAAA,eAAe,GAAG,GAAG,sBAAc,QAAQ,CAAC;AAC5C,QAAA,wBAAwB,GAAG,MAAM,CAAC;AAClC,QAAA,sBAAsB,GAAG,IAAI,CAAC,CAAC,WAAW","sourcesContent":["export const CHAIN_ID_HYPERCORE = '0x539';\nexport const RELAY_URL_BASE = 'https://api.relay.link';\nexport const RELAY_URL_QUOTE = `${RELAY_URL_BASE}/quote`;\nexport const RELAY_FALLBACK_GAS_LIMIT = 900000;\nexport const RELAY_POLLING_INTERVAL = 1000; // 1 Second\n"]}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
export declare const ARBITRUM_USDC_ADDRESS = "0xaf88d065e77c8cC2239327C5EDb3A432268e5831";
|
|
2
|
-
export declare const CHAIN_ID_ARBITRUM = "0xa4b1";
|
|
3
|
-
export declare const CHAIN_ID_POLYGON = "0x89";
|
|
4
1
|
export declare const CHAIN_ID_HYPERCORE = "0x539";
|
|
5
2
|
export declare const RELAY_URL_BASE = "https://api.relay.link";
|
|
6
3
|
export declare const RELAY_URL_QUOTE = "https://api.relay.link/quote";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"constants.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAC1C,eAAO,MAAM,cAAc,2BAA2B,CAAC;AACvD,eAAO,MAAM,eAAe,iCAA4B,CAAC;AACzD,eAAO,MAAM,wBAAwB,SAAS,CAAC;AAC/C,eAAO,MAAM,sBAAsB,OAAO,CAAC"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
export declare const ARBITRUM_USDC_ADDRESS = "0xaf88d065e77c8cC2239327C5EDb3A432268e5831";
|
|
2
|
-
export declare const CHAIN_ID_ARBITRUM = "0xa4b1";
|
|
3
|
-
export declare const CHAIN_ID_POLYGON = "0x89";
|
|
4
1
|
export declare const CHAIN_ID_HYPERCORE = "0x539";
|
|
5
2
|
export declare const RELAY_URL_BASE = "https://api.relay.link";
|
|
6
3
|
export declare const RELAY_URL_QUOTE = "https://api.relay.link/quote";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAC1C,eAAO,MAAM,cAAc,2BAA2B,CAAC;AACvD,eAAO,MAAM,eAAe,iCAA4B,CAAC;AACzD,eAAO,MAAM,wBAAwB,SAAS,CAAC;AAC/C,eAAO,MAAM,sBAAsB,OAAO,CAAC"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
export const ARBITRUM_USDC_ADDRESS = '0xaf88d065e77c8cC2239327C5EDb3A432268e5831';
|
|
2
|
-
export const CHAIN_ID_ARBITRUM = '0xa4b1';
|
|
3
|
-
export const CHAIN_ID_POLYGON = '0x89';
|
|
4
1
|
export const CHAIN_ID_HYPERCORE = '0x539';
|
|
5
2
|
export const RELAY_URL_BASE = 'https://api.relay.link';
|
|
6
3
|
export const RELAY_URL_QUOTE = `${RELAY_URL_BASE}/quote`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAC1C,MAAM,CAAC,MAAM,cAAc,GAAG,wBAAwB,CAAC;AACvD,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,cAAc,QAAQ,CAAC;AACzD,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAC/C,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,CAAC,WAAW","sourcesContent":["export const CHAIN_ID_HYPERCORE = '0x539';\nexport const RELAY_URL_BASE = 'https://api.relay.link';\nexport const RELAY_URL_QUOTE = `${RELAY_URL_BASE}/quote`;\nexport const RELAY_FALLBACK_GAS_LIMIT = 900000;\nexport const RELAY_POLLING_INTERVAL = 1000; // 1 Second\n"]}
|
|
@@ -124,10 +124,10 @@ async function processTransactions(transaction, request, requestBody, messenger)
|
|
|
124
124
|
* @returns Normalized request.
|
|
125
125
|
*/
|
|
126
126
|
function normalizeRequest(request) {
|
|
127
|
-
const isHyperliquidDeposit = request.targetChainId ===
|
|
127
|
+
const isHyperliquidDeposit = request.targetChainId === constants_2.CHAIN_ID_ARBITRUM &&
|
|
128
128
|
request.targetTokenAddress.toLowerCase() ===
|
|
129
|
-
|
|
130
|
-
const isPolygonNativeSource = request.sourceChainId ===
|
|
129
|
+
constants_2.ARBITRUM_USDC_ADDRESS.toLowerCase();
|
|
130
|
+
const isPolygonNativeSource = request.sourceChainId === constants_2.CHAIN_ID_POLYGON &&
|
|
131
131
|
request.sourceTokenAddress === (0, token_1.getNativeToken)(request.sourceChainId);
|
|
132
132
|
const requestOutput = {
|
|
133
133
|
...request,
|
|
@@ -162,15 +162,21 @@ function normalizeRequest(request) {
|
|
|
162
162
|
*/
|
|
163
163
|
function normalizeQuote(quote, request, fullRequest) {
|
|
164
164
|
const { messenger } = fullRequest;
|
|
165
|
-
const { details
|
|
165
|
+
const { details } = quote;
|
|
166
|
+
const { currencyIn } = details;
|
|
166
167
|
const { usdToFiatRate } = getFiatRates(messenger, request);
|
|
167
168
|
const dust = getFiatValueFromUsd(calculateDustUsd(quote, request), usdToFiatRate);
|
|
168
|
-
const provider = getFiatValueFromUsd(
|
|
169
|
+
const provider = getFiatValueFromUsd(calculateProviderFee(quote), usdToFiatRate);
|
|
169
170
|
const sourceNetwork = calculateSourceNetworkCost(quote, messenger);
|
|
170
171
|
const targetNetwork = {
|
|
171
172
|
usd: '0',
|
|
172
173
|
fiat: '0',
|
|
173
174
|
};
|
|
175
|
+
const sourceAmount = {
|
|
176
|
+
human: currencyIn.amountFormatted,
|
|
177
|
+
raw: currencyIn.amount,
|
|
178
|
+
...getFiatValueFromUsd(new bignumber_js_1.BigNumber(currencyIn.amountUsd), usdToFiatRate),
|
|
179
|
+
};
|
|
174
180
|
return {
|
|
175
181
|
dust,
|
|
176
182
|
estimatedDuration: details.timeEstimate,
|
|
@@ -181,6 +187,7 @@ function normalizeQuote(quote, request, fullRequest) {
|
|
|
181
187
|
},
|
|
182
188
|
original: quote,
|
|
183
189
|
request,
|
|
190
|
+
sourceAmount,
|
|
184
191
|
strategy: __1.TransactionPayStrategy.Relay,
|
|
185
192
|
};
|
|
186
193
|
}
|
|
@@ -222,7 +229,7 @@ function getFiatValueFromUsd(usdValue, usdToFiatRate) {
|
|
|
222
229
|
*/
|
|
223
230
|
function getFiatRates(messenger, request) {
|
|
224
231
|
const { sourceChainId, sourceTokenAddress } = request;
|
|
225
|
-
const finalSourceTokenAddress = sourceChainId ===
|
|
232
|
+
const finalSourceTokenAddress = sourceChainId === constants_2.CHAIN_ID_POLYGON &&
|
|
226
233
|
sourceTokenAddress === constants_2.NATIVE_TOKEN_ADDRESS
|
|
227
234
|
? (0, token_1.getNativeToken)(sourceChainId)
|
|
228
235
|
: sourceTokenAddress;
|
|
@@ -257,12 +264,20 @@ function getFeatureFlags(messenger) {
|
|
|
257
264
|
*/
|
|
258
265
|
function calculateSourceNetworkCost(quote, messenger) {
|
|
259
266
|
const allParams = quote.steps[0].items.map((i) => i.data);
|
|
267
|
+
const { chainId } = allParams[0];
|
|
260
268
|
const totalGasLimit = calculateSourceNetworkGasLimit(allParams);
|
|
261
|
-
|
|
262
|
-
chainId
|
|
269
|
+
const estimate = (0, gas_1.calculateGasCost)({
|
|
270
|
+
chainId,
|
|
263
271
|
gas: totalGasLimit,
|
|
264
272
|
messenger,
|
|
265
273
|
});
|
|
274
|
+
const max = (0, gas_1.calculateGasCost)({
|
|
275
|
+
chainId,
|
|
276
|
+
gas: totalGasLimit,
|
|
277
|
+
messenger,
|
|
278
|
+
isMax: true,
|
|
279
|
+
});
|
|
280
|
+
return { estimate, max };
|
|
266
281
|
}
|
|
267
282
|
/**
|
|
268
283
|
* Calculate the total gas limit for the source network transactions.
|
|
@@ -279,4 +294,15 @@ function calculateSourceNetworkGasLimit(params) {
|
|
|
279
294
|
// or `TransactionController:estimateGasBatch` based on params length.
|
|
280
295
|
return params.reduce((total, p) => total + new bignumber_js_1.BigNumber(p.gas ?? constants_1.RELAY_FALLBACK_GAS_LIMIT).toNumber(), 0);
|
|
281
296
|
}
|
|
297
|
+
/**
|
|
298
|
+
* Calculate the provider fee for a Relay quote.
|
|
299
|
+
*
|
|
300
|
+
* @param quote - Relay quote.
|
|
301
|
+
* @returns - Provider fee in USD.
|
|
302
|
+
*/
|
|
303
|
+
function calculateProviderFee(quote) {
|
|
304
|
+
const relayerFee = new bignumber_js_1.BigNumber(quote.fees.relayer.amountUsd);
|
|
305
|
+
const valueLoss = new bignumber_js_1.BigNumber(quote.details.currencyIn.amountUsd).minus(quote.details.currencyOut.amountUsd);
|
|
306
|
+
return relayerFee.gt(valueLoss) ? relayerFee : valueLoss;
|
|
307
|
+
}
|
|
282
308
|
//# sourceMappingURL=relay-quotes.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-quotes.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface } from '@ethersproject/abi';\nimport { successfulFetch } from '@metamask/controller-utils';\nimport type { Json } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport {\n ARBITRUM_USDC_ADDRESS,\n CHAIN_ID_ARBITRUM,\n CHAIN_ID_HYPERCORE,\n CHAIN_ID_POLYGON,\n RELAY_FALLBACK_GAS_LIMIT,\n RELAY_URL_QUOTE,\n} from './constants';\nimport type { RelayQuote } from './types';\nimport { TransactionPayStrategy } from '../..';\nimport type { TransactionMeta } from '../../../../transaction-controller/src';\nimport { NATIVE_TOKEN_ADDRESS } from '../../constants';\nimport { projectLogger } from '../../logger';\nimport type {\n FiatValue,\n PayStrategyGetQuotesRequest,\n QuoteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { calculateGasCost } from '../../utils/gas';\nimport { getNativeToken, getTokenFiatRate } from '../../utils/token';\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\n\n/**\n * Fetches Relay quotes.\n *\n * @param request - Request object.\n * @returns Array of quotes.\n */\nexport async function getRelayQuotes(\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>[]> {\n const { requests } = request;\n\n log('Fetching quotes', requests);\n\n try {\n const normalizedRequests = requests\n // Ignore gas fee token requests\n .filter((r) => r.targetAmountMinimum !== '0')\n .map((r) => normalizeRequest(r));\n\n log('Normalized requests', normalizedRequests);\n\n return await Promise.all(\n normalizedRequests.map((r) => getSingleQuote(r, request)),\n );\n } catch (error) {\n log('Error fetching quotes', { error });\n throw new Error(`Failed to fetch Relay quotes: ${String(error)}`);\n }\n}\n\n/**\n * Fetches a single Relay quote.\n *\n * @param request - Quote request.\n * @param fullRequest - Full quotes request.\n * @returns Single quote.\n */\nasync function getSingleQuote(\n request: QuoteRequest,\n fullRequest: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>> {\n const { messenger, transaction } = fullRequest;\n\n try {\n const body = {\n amount: request.targetAmountMinimum,\n destinationChainId: Number(request.targetChainId),\n destinationCurrency: request.targetTokenAddress,\n originChainId: Number(request.sourceChainId),\n originCurrency: request.sourceTokenAddress,\n recipient: request.from,\n tradeType: 'EXPECTED_OUTPUT',\n user: request.from,\n };\n\n await processTransactions(transaction, request, body, messenger);\n\n const url = getFeatureFlags(messenger).relayQuoteUrl;\n\n log('Request body', { body, url });\n\n const response = await successfulFetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n const quote = (await response.json()) as RelayQuote;\n\n log('Fetched relay quote', quote);\n\n return normalizeQuote(quote, request, fullRequest);\n } catch (e) {\n log('Error fetching relay quote', e);\n throw e;\n }\n}\n\n/**\n * Add tranasction data to request body if needed.\n *\n * @param transaction - Transaction metadata.\n * @param request - Quote request.\n * @param requestBody - Request body to populate.\n * @param messenger - Controller messenger.\n */\nasync function processTransactions(\n transaction: TransactionMeta,\n request: QuoteRequest,\n requestBody: Record<string, Json | undefined>,\n messenger: TransactionPayControllerMessenger,\n) {\n const { data, value } = transaction.txParams;\n\n /* istanbul ignore next */\n const hasNoParams = (!data || data === '0x') && (!value || value === '0x0');\n\n const skipDelegation =\n hasNoParams || request.targetChainId === CHAIN_ID_HYPERCORE;\n\n if (skipDelegation) {\n log('Skipping delegation as no transaction data');\n return;\n }\n\n const delegation = await messenger.call(\n 'TransactionPayController:getDelegationTransaction',\n { transaction },\n );\n\n const normalizedAuthorizationList = delegation.authorizationList?.map(\n (a) => ({\n ...a,\n chainId: Number(a.chainId),\n nonce: Number(a.nonce),\n yParity: Number(a.yParity),\n }),\n );\n\n const tokenTransferData = new Interface([\n 'function transfer(address to, uint256 amount)',\n ]).encodeFunctionData('transfer', [\n request.from,\n request.targetAmountMinimum,\n ]);\n\n requestBody.authorizationList = normalizedAuthorizationList;\n requestBody.tradeType = 'EXACT_OUTPUT';\n\n requestBody.txs = [\n {\n to: request.targetTokenAddress,\n data: tokenTransferData,\n value: '0x0',\n },\n {\n to: delegation.to,\n data: delegation.data,\n value: delegation.value,\n },\n ];\n}\n\n/**\n * Normalizes requests for Relay.\n *\n * @param request - Quote request to normalize.\n * @returns Normalized request.\n */\nfunction normalizeRequest(request: QuoteRequest) {\n const isHyperliquidDeposit =\n request.targetChainId === CHAIN_ID_ARBITRUM &&\n request.targetTokenAddress.toLowerCase() ===\n ARBITRUM_USDC_ADDRESS.toLowerCase();\n\n const isPolygonNativeSource =\n request.sourceChainId === CHAIN_ID_POLYGON &&\n request.sourceTokenAddress === getNativeToken(request.sourceChainId);\n\n const requestOutput: QuoteRequest = {\n ...request,\n sourceTokenAddress: isPolygonNativeSource\n ? NATIVE_TOKEN_ADDRESS\n : request.sourceTokenAddress,\n targetChainId: isHyperliquidDeposit\n ? CHAIN_ID_HYPERCORE\n : request.targetChainId,\n targetTokenAddress: isHyperliquidDeposit\n ? '0x00000000000000000000000000000000'\n : request.targetTokenAddress,\n targetAmountMinimum: isHyperliquidDeposit\n ? new BigNumber(request.targetAmountMinimum).shiftedBy(2).toString(10)\n : request.targetAmountMinimum,\n };\n\n if (isHyperliquidDeposit) {\n log('Converting Arbitrum Hyperliquid deposit to direct deposit', {\n originalRequest: request,\n normalizedRequest: requestOutput,\n });\n }\n\n return requestOutput;\n}\n\n/**\n * Normalizes a Relay quote into a TransactionPayQuote.\n *\n * @param quote - Relay quote.\n * @param request - Original quote request.\n * @param fullRequest - Full quotes request.\n * @returns Normalized quote.\n */\nfunction normalizeQuote(\n quote: RelayQuote,\n request: QuoteRequest,\n fullRequest: PayStrategyGetQuotesRequest,\n): TransactionPayQuote<RelayQuote> {\n const { messenger } = fullRequest;\n const { details, fees } = quote;\n\n const { usdToFiatRate } = getFiatRates(messenger, request);\n\n const dust = getFiatValueFromUsd(\n calculateDustUsd(quote, request),\n usdToFiatRate,\n );\n\n const provider = getFiatValueFromUsd(\n new BigNumber(fees.relayer.amountUsd),\n usdToFiatRate,\n );\n\n const sourceNetwork = calculateSourceNetworkCost(quote, messenger);\n\n const targetNetwork = {\n usd: '0',\n fiat: '0',\n };\n\n return {\n dust,\n estimatedDuration: details.timeEstimate,\n fees: {\n provider,\n sourceNetwork,\n targetNetwork,\n },\n original: quote,\n request,\n strategy: TransactionPayStrategy.Relay,\n };\n}\n\n/**\n * Calculate dust USD value.\n *\n * @param quote - Relay quote.\n * @param request - Quote request.\n * @returns Dust value in USD and fiat.\n */\nfunction calculateDustUsd(quote: RelayQuote, request: QuoteRequest) {\n const { currencyOut } = quote.details;\n const { amountUsd, amountFormatted, minimumAmount } = currencyOut;\n const { decimals: targetDecimals } = currencyOut.currency;\n\n const targetUsdRate = new BigNumber(amountUsd).dividedBy(amountFormatted);\n\n const dustRaw = new BigNumber(minimumAmount).minus(\n request.targetAmountMinimum,\n );\n\n return dustRaw.shiftedBy(-targetDecimals).multipliedBy(targetUsdRate);\n}\n\n/**\n * Converts USD value to fiat value.\n *\n * @param usdValue - USD value.\n * @param usdToFiatRate - USD to fiat rate.\n * @returns Fiat value.\n */\nfunction getFiatValueFromUsd(\n usdValue: BigNumber,\n usdToFiatRate: BigNumber,\n): FiatValue {\n const fiatValue = usdValue.multipliedBy(usdToFiatRate);\n\n return {\n usd: usdValue.toString(10),\n fiat: fiatValue.toString(10),\n };\n}\n\n/**\n * Calculates USD to fiat rate.\n *\n * @param messenger - Controller messenger.\n * @param request - Quote request.\n * @returns USD to fiat rate.\n */\nfunction getFiatRates(\n messenger: TransactionPayControllerMessenger,\n request: QuoteRequest,\n) {\n const { sourceChainId, sourceTokenAddress } = request;\n\n const finalSourceTokenAddress =\n sourceChainId === CHAIN_ID_POLYGON &&\n sourceTokenAddress === NATIVE_TOKEN_ADDRESS\n ? getNativeToken(sourceChainId)\n : sourceTokenAddress;\n\n const sourceFiatRate = getTokenFiatRate(\n messenger,\n finalSourceTokenAddress,\n sourceChainId,\n );\n\n if (!sourceFiatRate) {\n throw new Error('Source token fiat rate not found');\n }\n\n const usdToFiatRate = new BigNumber(sourceFiatRate.fiatRate).dividedBy(\n sourceFiatRate.usdRate,\n );\n\n return { sourceFiatRate, usdToFiatRate };\n}\n\n/**\n * Gets feature flags for Relay quotes.\n *\n * @param messenger - Controller messenger.\n * @returns Feature flags.\n */\nfunction getFeatureFlags(messenger: TransactionPayControllerMessenger) {\n const featureFlagState = messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n\n const featureFlags = featureFlagState.remoteFeatureFlags\n ?.confirmations_pay as Record<string, string> | undefined;\n\n const relayQuoteUrl = featureFlags?.relayQuoteUrl ?? RELAY_URL_QUOTE;\n\n return {\n relayQuoteUrl,\n };\n}\n\n/**\n * Calculates source network cost from a Relay quote.\n *\n * @param quote - Relay quote.\n * @param messenger - Controller messenger.\n * @returns Total source network cost in USD and fiat.\n */\nfunction calculateSourceNetworkCost(\n quote: RelayQuote,\n messenger: TransactionPayControllerMessenger,\n) {\n const allParams = quote.steps[0].items.map((i) => i.data);\n const totalGasLimit = calculateSourceNetworkGasLimit(allParams);\n\n return calculateGasCost({\n chainId: allParams[0].chainId,\n gas: totalGasLimit,\n messenger,\n });\n}\n\n/**\n * Calculate the total gas limit for the source network transactions.\n *\n * @param params - Array of transaction parameters.\n * @returns - Total gas limit.\n */\nfunction calculateSourceNetworkGasLimit(\n params: RelayQuote['steps'][0]['items'][0]['data'][],\n): number {\n const allParamsHasGas = params.every((p) => p.gas !== undefined);\n\n if (allParamsHasGas) {\n return params.reduce(\n (total, p) => total + new BigNumber(p.gas as string).toNumber(),\n 0,\n );\n }\n\n // In future, call `TransactionController:estimateGas`\n // or `TransactionController:estimateGasBatch` based on params length.\n\n return params.reduce(\n (total, p) =>\n total + new BigNumber(p.gas ?? RELAY_FALLBACK_GAS_LIMIT).toNumber(),\n 0,\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"relay-quotes.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-quotes.ts"],"names":[],"mappings":";;;AAAA,4CAA+C;AAC/C,iEAA6D;AAE7D,2CAAqD;AACrD,+CAAyC;AAEzC,+CAIqB;AAErB,uCAA+C;AAE/C,mDAKyB;AACzB,6CAA6C;AAS7C,6CAAmD;AACnD,iDAAqE;AAErE,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,gBAAgB,CAAC,CAAC;AAEhE;;;;;GAKG;AACI,KAAK,UAAU,cAAc,CAClC,OAAoC;IAEpC,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE7B,GAAG,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IAEjC,IAAI,CAAC;QACH,MAAM,kBAAkB,GAAG,QAAQ;YACjC,gCAAgC;aAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB,KAAK,GAAG,CAAC;aAC5C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnC,GAAG,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,CAAC;QAE/C,OAAO,MAAM,OAAO,CAAC,GAAG,CACtB,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAC1D,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAtBD,wCAsBC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,cAAc,CAC3B,OAAqB,EACrB,WAAwC;IAExC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG;YACX,MAAM,EAAE,OAAO,CAAC,mBAAmB;YACnC,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC;YACjD,mBAAmB,EAAE,OAAO,CAAC,kBAAkB;YAC/C,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC;YAC5C,cAAc,EAAE,OAAO,CAAC,kBAAkB;YAC1C,SAAS,EAAE,OAAO,CAAC,IAAI;YACvB,SAAS,EAAE,iBAAiB;YAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC;QAEF,MAAM,mBAAmB,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QAEjE,MAAM,GAAG,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC;QAErD,GAAG,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAEnC,MAAM,QAAQ,GAAG,MAAM,IAAA,kCAAe,EAAC,GAAG,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAe,CAAC;QAEpD,GAAG,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAElC,OAAO,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,4BAA4B,EAAE,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,mBAAmB,CAChC,WAA4B,EAC5B,OAAqB,EACrB,WAA6C,EAC7C,SAA4C;IAE5C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC;IAE7C,0BAA0B;IAC1B,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC;IAE5E,MAAM,cAAc,GAClB,WAAW,IAAI,OAAO,CAAC,aAAa,KAAK,8BAAkB,CAAC;IAE9D,IAAI,cAAc,EAAE,CAAC;QACnB,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,IAAI,CACrC,mDAAmD,EACnD,EAAE,WAAW,EAAE,CAChB,CAAC;IAEF,MAAM,2BAA2B,GAAG,UAAU,CAAC,iBAAiB,EAAE,GAAG,CACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACN,GAAG,CAAC;QACJ,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;KAC3B,CAAC,CACH,CAAC;IAEF,MAAM,iBAAiB,GAAG,IAAI,eAAS,CAAC;QACtC,+CAA+C;KAChD,CAAC,CAAC,kBAAkB,CAAC,UAAU,EAAE;QAChC,OAAO,CAAC,IAAI;QACZ,OAAO,CAAC,mBAAmB;KAC5B,CAAC,CAAC;IAEH,WAAW,CAAC,iBAAiB,GAAG,2BAA2B,CAAC;IAC5D,WAAW,CAAC,SAAS,GAAG,cAAc,CAAC;IAEvC,WAAW,CAAC,GAAG,GAAG;QAChB;YACE,EAAE,EAAE,OAAO,CAAC,kBAAkB;YAC9B,IAAI,EAAE,iBAAiB;YACvB,KAAK,EAAE,KAAK;SACb;QACD;YACE,EAAE,EAAE,UAAU,CAAC,EAAE;YACjB,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,KAAK,EAAE,UAAU,CAAC,KAAK;SACxB;KACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,OAAqB;IAC7C,MAAM,oBAAoB,GACxB,OAAO,CAAC,aAAa,KAAK,6BAAiB;QAC3C,OAAO,CAAC,kBAAkB,CAAC,WAAW,EAAE;YACtC,iCAAqB,CAAC,WAAW,EAAE,CAAC;IAExC,MAAM,qBAAqB,GACzB,OAAO,CAAC,aAAa,KAAK,4BAAgB;QAC1C,OAAO,CAAC,kBAAkB,KAAK,IAAA,sBAAc,EAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAEvE,MAAM,aAAa,GAAiB;QAClC,GAAG,OAAO;QACV,kBAAkB,EAAE,qBAAqB;YACvC,CAAC,CAAC,gCAAoB;YACtB,CAAC,CAAC,OAAO,CAAC,kBAAkB;QAC9B,aAAa,EAAE,oBAAoB;YACjC,CAAC,CAAC,8BAAkB;YACpB,CAAC,CAAC,OAAO,CAAC,aAAa;QACzB,kBAAkB,EAAE,oBAAoB;YACtC,CAAC,CAAC,oCAAoC;YACtC,CAAC,CAAC,OAAO,CAAC,kBAAkB;QAC9B,mBAAmB,EAAE,oBAAoB;YACvC,CAAC,CAAC,IAAI,wBAAS,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtE,CAAC,CAAC,OAAO,CAAC,mBAAmB;KAChC,CAAC;IAEF,IAAI,oBAAoB,EAAE,CAAC;QACzB,GAAG,CAAC,2DAA2D,EAAE;YAC/D,eAAe,EAAE,OAAO;YACxB,iBAAiB,EAAE,aAAa;SACjC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,cAAc,CACrB,KAAiB,EACjB,OAAqB,EACrB,WAAwC;IAExC,MAAM,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC;IAClC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC1B,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAE/B,MAAM,EAAE,aAAa,EAAE,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAE3D,MAAM,IAAI,GAAG,mBAAmB,CAC9B,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,EAChC,aAAa,CACd,CAAC;IAEF,MAAM,QAAQ,GAAG,mBAAmB,CAClC,oBAAoB,CAAC,KAAK,CAAC,EAC3B,aAAa,CACd,CAAC;IAEF,MAAM,aAAa,GAAG,0BAA0B,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAEnE,MAAM,aAAa,GAAG;QACpB,GAAG,EAAE,GAAG;QACR,IAAI,EAAE,GAAG;KACV,CAAC;IAEF,MAAM,YAAY,GAAW;QAC3B,KAAK,EAAE,UAAU,CAAC,eAAe;QACjC,GAAG,EAAE,UAAU,CAAC,MAAM;QACtB,GAAG,mBAAmB,CAAC,IAAI,wBAAS,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC;KAC3E,CAAC;IAEF,OAAO;QACL,IAAI;QACJ,iBAAiB,EAAE,OAAO,CAAC,YAAY;QACvC,IAAI,EAAE;YACJ,QAAQ;YACR,aAAa;YACb,aAAa;SACd;QACD,QAAQ,EAAE,KAAK;QACf,OAAO;QACP,YAAY;QACZ,QAAQ,EAAE,0BAAsB,CAAC,KAAK;KACvC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,KAAiB,EAAE,OAAqB;IAChE,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC;IACtC,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,GAAG,WAAW,CAAC;IAClE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC;IAE1D,MAAM,aAAa,GAAG,IAAI,wBAAS,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAE1E,MAAM,OAAO,GAAG,IAAI,wBAAS,CAAC,aAAa,CAAC,CAAC,KAAK,CAChD,OAAO,CAAC,mBAAmB,CAC5B,CAAC;IAEF,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;AACxE,CAAC;AAED;;;;;;GAMG;AACH,SAAS,mBAAmB,CAC1B,QAAmB,EACnB,aAAwB;IAExB,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;IAEvD,OAAO;QACL,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;KAC7B,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,YAAY,CACnB,SAA4C,EAC5C,OAAqB;IAErB,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC;IAEtD,MAAM,uBAAuB,GAC3B,aAAa,KAAK,4BAAgB;QAClC,kBAAkB,KAAK,gCAAoB;QACzC,CAAC,CAAC,IAAA,sBAAc,EAAC,aAAa,CAAC;QAC/B,CAAC,CAAC,kBAAkB,CAAC;IAEzB,MAAM,cAAc,GAAG,IAAA,wBAAgB,EACrC,SAAS,EACT,uBAAuB,EACvB,aAAa,CACd,CAAC;IAEF,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,wBAAS,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,SAAS,CACpE,cAAc,CAAC,OAAO,CACvB,CAAC;IAEF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CAAC,SAA4C;IACnE,MAAM,gBAAgB,GAAG,SAAS,CAAC,IAAI,CACrC,sCAAsC,CACvC,CAAC;IAEF,MAAM,YAAY,GAAG,gBAAgB,CAAC,kBAAkB;QACtD,EAAE,iBAAuD,CAAC;IAE5D,MAAM,aAAa,GAAG,YAAY,EAAE,aAAa,IAAI,2BAAe,CAAC;IAErE,OAAO;QACL,aAAa;KACd,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,0BAA0B,CACjC,KAAiB,EACjB,SAA4C;IAE5C,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,aAAa,GAAG,8BAA8B,CAAC,SAAS,CAAC,CAAC;IAEhE,MAAM,QAAQ,GAAG,IAAA,sBAAgB,EAAC;QAChC,OAAO;QACP,GAAG,EAAE,aAAa;QAClB,SAAS;KACV,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,IAAA,sBAAgB,EAAC;QAC3B,OAAO;QACP,GAAG,EAAE,aAAa;QAClB,SAAS;QACT,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IAEH,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;GAKG;AACH,SAAS,8BAA8B,CACrC,MAAoD;IAEpD,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;IAEjE,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,wBAAS,CAAC,CAAC,CAAC,GAAa,CAAC,CAAC,QAAQ,EAAE,EAC/D,CAAC,CACF,CAAC;IACJ,CAAC;IAED,sDAAsD;IACtD,sEAAsE;IAEtE,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CACX,KAAK,GAAG,IAAI,wBAAS,CAAC,CAAC,CAAC,GAAG,IAAI,oCAAwB,CAAC,CAAC,QAAQ,EAAE,EACrE,CAAC,CACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,KAAiB;IAC7C,MAAM,UAAU,GAAG,IAAI,wBAAS,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE/D,MAAM,SAAS,GAAG,IAAI,wBAAS,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,KAAK,CACvE,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CACpC,CAAC;IAEF,OAAO,UAAU,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC","sourcesContent":["import { Interface } from '@ethersproject/abi';\nimport { successfulFetch } from '@metamask/controller-utils';\nimport type { Json } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport {\n CHAIN_ID_HYPERCORE,\n RELAY_FALLBACK_GAS_LIMIT,\n RELAY_URL_QUOTE,\n} from './constants';\nimport type { RelayQuote } from './types';\nimport { TransactionPayStrategy } from '../..';\nimport type { TransactionMeta } from '../../../../transaction-controller/src';\nimport {\n ARBITRUM_USDC_ADDRESS,\n CHAIN_ID_ARBITRUM,\n CHAIN_ID_POLYGON,\n NATIVE_TOKEN_ADDRESS,\n} from '../../constants';\nimport { projectLogger } from '../../logger';\nimport type {\n Amount,\n FiatValue,\n PayStrategyGetQuotesRequest,\n QuoteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { calculateGasCost } from '../../utils/gas';\nimport { getNativeToken, getTokenFiatRate } from '../../utils/token';\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\n\n/**\n * Fetches Relay quotes.\n *\n * @param request - Request object.\n * @returns Array of quotes.\n */\nexport async function getRelayQuotes(\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>[]> {\n const { requests } = request;\n\n log('Fetching quotes', requests);\n\n try {\n const normalizedRequests = requests\n // Ignore gas fee token requests\n .filter((r) => r.targetAmountMinimum !== '0')\n .map((r) => normalizeRequest(r));\n\n log('Normalized requests', normalizedRequests);\n\n return await Promise.all(\n normalizedRequests.map((r) => getSingleQuote(r, request)),\n );\n } catch (error) {\n log('Error fetching quotes', { error });\n throw new Error(`Failed to fetch Relay quotes: ${String(error)}`);\n }\n}\n\n/**\n * Fetches a single Relay quote.\n *\n * @param request - Quote request.\n * @param fullRequest - Full quotes request.\n * @returns Single quote.\n */\nasync function getSingleQuote(\n request: QuoteRequest,\n fullRequest: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>> {\n const { messenger, transaction } = fullRequest;\n\n try {\n const body = {\n amount: request.targetAmountMinimum,\n destinationChainId: Number(request.targetChainId),\n destinationCurrency: request.targetTokenAddress,\n originChainId: Number(request.sourceChainId),\n originCurrency: request.sourceTokenAddress,\n recipient: request.from,\n tradeType: 'EXPECTED_OUTPUT',\n user: request.from,\n };\n\n await processTransactions(transaction, request, body, messenger);\n\n const url = getFeatureFlags(messenger).relayQuoteUrl;\n\n log('Request body', { body, url });\n\n const response = await successfulFetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n const quote = (await response.json()) as RelayQuote;\n\n log('Fetched relay quote', quote);\n\n return normalizeQuote(quote, request, fullRequest);\n } catch (e) {\n log('Error fetching relay quote', e);\n throw e;\n }\n}\n\n/**\n * Add tranasction data to request body if needed.\n *\n * @param transaction - Transaction metadata.\n * @param request - Quote request.\n * @param requestBody - Request body to populate.\n * @param messenger - Controller messenger.\n */\nasync function processTransactions(\n transaction: TransactionMeta,\n request: QuoteRequest,\n requestBody: Record<string, Json | undefined>,\n messenger: TransactionPayControllerMessenger,\n) {\n const { data, value } = transaction.txParams;\n\n /* istanbul ignore next */\n const hasNoParams = (!data || data === '0x') && (!value || value === '0x0');\n\n const skipDelegation =\n hasNoParams || request.targetChainId === CHAIN_ID_HYPERCORE;\n\n if (skipDelegation) {\n log('Skipping delegation as no transaction data');\n return;\n }\n\n const delegation = await messenger.call(\n 'TransactionPayController:getDelegationTransaction',\n { transaction },\n );\n\n const normalizedAuthorizationList = delegation.authorizationList?.map(\n (a) => ({\n ...a,\n chainId: Number(a.chainId),\n nonce: Number(a.nonce),\n yParity: Number(a.yParity),\n }),\n );\n\n const tokenTransferData = new Interface([\n 'function transfer(address to, uint256 amount)',\n ]).encodeFunctionData('transfer', [\n request.from,\n request.targetAmountMinimum,\n ]);\n\n requestBody.authorizationList = normalizedAuthorizationList;\n requestBody.tradeType = 'EXACT_OUTPUT';\n\n requestBody.txs = [\n {\n to: request.targetTokenAddress,\n data: tokenTransferData,\n value: '0x0',\n },\n {\n to: delegation.to,\n data: delegation.data,\n value: delegation.value,\n },\n ];\n}\n\n/**\n * Normalizes requests for Relay.\n *\n * @param request - Quote request to normalize.\n * @returns Normalized request.\n */\nfunction normalizeRequest(request: QuoteRequest) {\n const isHyperliquidDeposit =\n request.targetChainId === CHAIN_ID_ARBITRUM &&\n request.targetTokenAddress.toLowerCase() ===\n ARBITRUM_USDC_ADDRESS.toLowerCase();\n\n const isPolygonNativeSource =\n request.sourceChainId === CHAIN_ID_POLYGON &&\n request.sourceTokenAddress === getNativeToken(request.sourceChainId);\n\n const requestOutput: QuoteRequest = {\n ...request,\n sourceTokenAddress: isPolygonNativeSource\n ? NATIVE_TOKEN_ADDRESS\n : request.sourceTokenAddress,\n targetChainId: isHyperliquidDeposit\n ? CHAIN_ID_HYPERCORE\n : request.targetChainId,\n targetTokenAddress: isHyperliquidDeposit\n ? '0x00000000000000000000000000000000'\n : request.targetTokenAddress,\n targetAmountMinimum: isHyperliquidDeposit\n ? new BigNumber(request.targetAmountMinimum).shiftedBy(2).toString(10)\n : request.targetAmountMinimum,\n };\n\n if (isHyperliquidDeposit) {\n log('Converting Arbitrum Hyperliquid deposit to direct deposit', {\n originalRequest: request,\n normalizedRequest: requestOutput,\n });\n }\n\n return requestOutput;\n}\n\n/**\n * Normalizes a Relay quote into a TransactionPayQuote.\n *\n * @param quote - Relay quote.\n * @param request - Original quote request.\n * @param fullRequest - Full quotes request.\n * @returns Normalized quote.\n */\nfunction normalizeQuote(\n quote: RelayQuote,\n request: QuoteRequest,\n fullRequest: PayStrategyGetQuotesRequest,\n): TransactionPayQuote<RelayQuote> {\n const { messenger } = fullRequest;\n const { details } = quote;\n const { currencyIn } = details;\n\n const { usdToFiatRate } = getFiatRates(messenger, request);\n\n const dust = getFiatValueFromUsd(\n calculateDustUsd(quote, request),\n usdToFiatRate,\n );\n\n const provider = getFiatValueFromUsd(\n calculateProviderFee(quote),\n usdToFiatRate,\n );\n\n const sourceNetwork = calculateSourceNetworkCost(quote, messenger);\n\n const targetNetwork = {\n usd: '0',\n fiat: '0',\n };\n\n const sourceAmount: Amount = {\n human: currencyIn.amountFormatted,\n raw: currencyIn.amount,\n ...getFiatValueFromUsd(new BigNumber(currencyIn.amountUsd), usdToFiatRate),\n };\n\n return {\n dust,\n estimatedDuration: details.timeEstimate,\n fees: {\n provider,\n sourceNetwork,\n targetNetwork,\n },\n original: quote,\n request,\n sourceAmount,\n strategy: TransactionPayStrategy.Relay,\n };\n}\n\n/**\n * Calculate dust USD value.\n *\n * @param quote - Relay quote.\n * @param request - Quote request.\n * @returns Dust value in USD and fiat.\n */\nfunction calculateDustUsd(quote: RelayQuote, request: QuoteRequest) {\n const { currencyOut } = quote.details;\n const { amountUsd, amountFormatted, minimumAmount } = currencyOut;\n const { decimals: targetDecimals } = currencyOut.currency;\n\n const targetUsdRate = new BigNumber(amountUsd).dividedBy(amountFormatted);\n\n const dustRaw = new BigNumber(minimumAmount).minus(\n request.targetAmountMinimum,\n );\n\n return dustRaw.shiftedBy(-targetDecimals).multipliedBy(targetUsdRate);\n}\n\n/**\n * Converts USD value to fiat value.\n *\n * @param usdValue - USD value.\n * @param usdToFiatRate - USD to fiat rate.\n * @returns Fiat value.\n */\nfunction getFiatValueFromUsd(\n usdValue: BigNumber,\n usdToFiatRate: BigNumber,\n): FiatValue {\n const fiatValue = usdValue.multipliedBy(usdToFiatRate);\n\n return {\n usd: usdValue.toString(10),\n fiat: fiatValue.toString(10),\n };\n}\n\n/**\n * Calculates USD to fiat rate.\n *\n * @param messenger - Controller messenger.\n * @param request - Quote request.\n * @returns USD to fiat rate.\n */\nfunction getFiatRates(\n messenger: TransactionPayControllerMessenger,\n request: QuoteRequest,\n) {\n const { sourceChainId, sourceTokenAddress } = request;\n\n const finalSourceTokenAddress =\n sourceChainId === CHAIN_ID_POLYGON &&\n sourceTokenAddress === NATIVE_TOKEN_ADDRESS\n ? getNativeToken(sourceChainId)\n : sourceTokenAddress;\n\n const sourceFiatRate = getTokenFiatRate(\n messenger,\n finalSourceTokenAddress,\n sourceChainId,\n );\n\n if (!sourceFiatRate) {\n throw new Error('Source token fiat rate not found');\n }\n\n const usdToFiatRate = new BigNumber(sourceFiatRate.fiatRate).dividedBy(\n sourceFiatRate.usdRate,\n );\n\n return { sourceFiatRate, usdToFiatRate };\n}\n\n/**\n * Gets feature flags for Relay quotes.\n *\n * @param messenger - Controller messenger.\n * @returns Feature flags.\n */\nfunction getFeatureFlags(messenger: TransactionPayControllerMessenger) {\n const featureFlagState = messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n\n const featureFlags = featureFlagState.remoteFeatureFlags\n ?.confirmations_pay as Record<string, string> | undefined;\n\n const relayQuoteUrl = featureFlags?.relayQuoteUrl ?? RELAY_URL_QUOTE;\n\n return {\n relayQuoteUrl,\n };\n}\n\n/**\n * Calculates source network cost from a Relay quote.\n *\n * @param quote - Relay quote.\n * @param messenger - Controller messenger.\n * @returns Total source network cost in USD and fiat.\n */\nfunction calculateSourceNetworkCost(\n quote: RelayQuote,\n messenger: TransactionPayControllerMessenger,\n): TransactionPayQuote<RelayQuote>['fees']['sourceNetwork'] {\n const allParams = quote.steps[0].items.map((i) => i.data);\n const { chainId } = allParams[0];\n const totalGasLimit = calculateSourceNetworkGasLimit(allParams);\n\n const estimate = calculateGasCost({\n chainId,\n gas: totalGasLimit,\n messenger,\n });\n\n const max = calculateGasCost({\n chainId,\n gas: totalGasLimit,\n messenger,\n isMax: true,\n });\n\n return { estimate, max };\n}\n\n/**\n * Calculate the total gas limit for the source network transactions.\n *\n * @param params - Array of transaction parameters.\n * @returns - Total gas limit.\n */\nfunction calculateSourceNetworkGasLimit(\n params: RelayQuote['steps'][0]['items'][0]['data'][],\n): number {\n const allParamsHasGas = params.every((p) => p.gas !== undefined);\n\n if (allParamsHasGas) {\n return params.reduce(\n (total, p) => total + new BigNumber(p.gas as string).toNumber(),\n 0,\n );\n }\n\n // In future, call `TransactionController:estimateGas`\n // or `TransactionController:estimateGasBatch` based on params length.\n\n return params.reduce(\n (total, p) =>\n total + new BigNumber(p.gas ?? RELAY_FALLBACK_GAS_LIMIT).toNumber(),\n 0,\n );\n}\n\n/**\n * Calculate the provider fee for a Relay quote.\n *\n * @param quote - Relay quote.\n * @returns - Provider fee in USD.\n */\nfunction calculateProviderFee(quote: RelayQuote) {\n const relayerFee = new BigNumber(quote.fees.relayer.amountUsd);\n\n const valueLoss = new BigNumber(quote.details.currencyIn.amountUsd).minus(\n quote.details.currencyOut.amountUsd,\n );\n\n return relayerFee.gt(valueLoss) ? relayerFee : valueLoss;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-quotes.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-quotes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"relay-quotes.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-quotes.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAgB;AAU1C,OAAO,KAAK,EAGV,2BAA2B,EAG3B,mBAAmB,EACpB,wBAAoB;AAMrB;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC,CAoB5C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-quotes.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-quotes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"relay-quotes.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-quotes.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAgB;AAU1C,OAAO,KAAK,EAGV,2BAA2B,EAG3B,mBAAmB,EACpB,wBAAoB;AAMrB;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC,CAoB5C"}
|
|
@@ -2,9 +2,9 @@ import { Interface } from "@ethersproject/abi";
|
|
|
2
2
|
import { successfulFetch } from "@metamask/controller-utils";
|
|
3
3
|
import { createModuleLogger } from "@metamask/utils";
|
|
4
4
|
import { BigNumber } from "bignumber.js";
|
|
5
|
-
import {
|
|
5
|
+
import { CHAIN_ID_HYPERCORE, RELAY_FALLBACK_GAS_LIMIT, RELAY_URL_QUOTE } from "./constants.mjs";
|
|
6
6
|
import { TransactionPayStrategy } from "../../index.mjs";
|
|
7
|
-
import { NATIVE_TOKEN_ADDRESS } from "../../constants.mjs";
|
|
7
|
+
import { ARBITRUM_USDC_ADDRESS, CHAIN_ID_ARBITRUM, CHAIN_ID_POLYGON, NATIVE_TOKEN_ADDRESS } from "../../constants.mjs";
|
|
8
8
|
import { projectLogger } from "../../logger.mjs";
|
|
9
9
|
import { calculateGasCost } from "../../utils/gas.mjs";
|
|
10
10
|
import { getNativeToken, getTokenFiatRate } from "../../utils/token.mjs";
|
|
@@ -158,15 +158,21 @@ function normalizeRequest(request) {
|
|
|
158
158
|
*/
|
|
159
159
|
function normalizeQuote(quote, request, fullRequest) {
|
|
160
160
|
const { messenger } = fullRequest;
|
|
161
|
-
const { details
|
|
161
|
+
const { details } = quote;
|
|
162
|
+
const { currencyIn } = details;
|
|
162
163
|
const { usdToFiatRate } = getFiatRates(messenger, request);
|
|
163
164
|
const dust = getFiatValueFromUsd(calculateDustUsd(quote, request), usdToFiatRate);
|
|
164
|
-
const provider = getFiatValueFromUsd(
|
|
165
|
+
const provider = getFiatValueFromUsd(calculateProviderFee(quote), usdToFiatRate);
|
|
165
166
|
const sourceNetwork = calculateSourceNetworkCost(quote, messenger);
|
|
166
167
|
const targetNetwork = {
|
|
167
168
|
usd: '0',
|
|
168
169
|
fiat: '0',
|
|
169
170
|
};
|
|
171
|
+
const sourceAmount = {
|
|
172
|
+
human: currencyIn.amountFormatted,
|
|
173
|
+
raw: currencyIn.amount,
|
|
174
|
+
...getFiatValueFromUsd(new BigNumber(currencyIn.amountUsd), usdToFiatRate),
|
|
175
|
+
};
|
|
170
176
|
return {
|
|
171
177
|
dust,
|
|
172
178
|
estimatedDuration: details.timeEstimate,
|
|
@@ -177,6 +183,7 @@ function normalizeQuote(quote, request, fullRequest) {
|
|
|
177
183
|
},
|
|
178
184
|
original: quote,
|
|
179
185
|
request,
|
|
186
|
+
sourceAmount,
|
|
180
187
|
strategy: TransactionPayStrategy.Relay,
|
|
181
188
|
};
|
|
182
189
|
}
|
|
@@ -253,12 +260,20 @@ function getFeatureFlags(messenger) {
|
|
|
253
260
|
*/
|
|
254
261
|
function calculateSourceNetworkCost(quote, messenger) {
|
|
255
262
|
const allParams = quote.steps[0].items.map((i) => i.data);
|
|
263
|
+
const { chainId } = allParams[0];
|
|
256
264
|
const totalGasLimit = calculateSourceNetworkGasLimit(allParams);
|
|
257
|
-
|
|
258
|
-
chainId
|
|
265
|
+
const estimate = calculateGasCost({
|
|
266
|
+
chainId,
|
|
259
267
|
gas: totalGasLimit,
|
|
260
268
|
messenger,
|
|
261
269
|
});
|
|
270
|
+
const max = calculateGasCost({
|
|
271
|
+
chainId,
|
|
272
|
+
gas: totalGasLimit,
|
|
273
|
+
messenger,
|
|
274
|
+
isMax: true,
|
|
275
|
+
});
|
|
276
|
+
return { estimate, max };
|
|
262
277
|
}
|
|
263
278
|
/**
|
|
264
279
|
* Calculate the total gas limit for the source network transactions.
|
|
@@ -275,4 +290,15 @@ function calculateSourceNetworkGasLimit(params) {
|
|
|
275
290
|
// or `TransactionController:estimateGasBatch` based on params length.
|
|
276
291
|
return params.reduce((total, p) => total + new BigNumber(p.gas ?? RELAY_FALLBACK_GAS_LIMIT).toNumber(), 0);
|
|
277
292
|
}
|
|
293
|
+
/**
|
|
294
|
+
* Calculate the provider fee for a Relay quote.
|
|
295
|
+
*
|
|
296
|
+
* @param quote - Relay quote.
|
|
297
|
+
* @returns - Provider fee in USD.
|
|
298
|
+
*/
|
|
299
|
+
function calculateProviderFee(quote) {
|
|
300
|
+
const relayerFee = new BigNumber(quote.fees.relayer.amountUsd);
|
|
301
|
+
const valueLoss = new BigNumber(quote.details.currencyIn.amountUsd).minus(quote.details.currencyOut.amountUsd);
|
|
302
|
+
return relayerFee.gt(valueLoss) ? relayerFee : valueLoss;
|
|
303
|
+
}
|
|
278
304
|
//# sourceMappingURL=relay-quotes.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-quotes.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface } from '@ethersproject/abi';\nimport { successfulFetch } from '@metamask/controller-utils';\nimport type { Json } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport {\n ARBITRUM_USDC_ADDRESS,\n CHAIN_ID_ARBITRUM,\n CHAIN_ID_HYPERCORE,\n CHAIN_ID_POLYGON,\n RELAY_FALLBACK_GAS_LIMIT,\n RELAY_URL_QUOTE,\n} from './constants';\nimport type { RelayQuote } from './types';\nimport { TransactionPayStrategy } from '../..';\nimport type { TransactionMeta } from '../../../../transaction-controller/src';\nimport { NATIVE_TOKEN_ADDRESS } from '../../constants';\nimport { projectLogger } from '../../logger';\nimport type {\n FiatValue,\n PayStrategyGetQuotesRequest,\n QuoteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { calculateGasCost } from '../../utils/gas';\nimport { getNativeToken, getTokenFiatRate } from '../../utils/token';\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\n\n/**\n * Fetches Relay quotes.\n *\n * @param request - Request object.\n * @returns Array of quotes.\n */\nexport async function getRelayQuotes(\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>[]> {\n const { requests } = request;\n\n log('Fetching quotes', requests);\n\n try {\n const normalizedRequests = requests\n // Ignore gas fee token requests\n .filter((r) => r.targetAmountMinimum !== '0')\n .map((r) => normalizeRequest(r));\n\n log('Normalized requests', normalizedRequests);\n\n return await Promise.all(\n normalizedRequests.map((r) => getSingleQuote(r, request)),\n );\n } catch (error) {\n log('Error fetching quotes', { error });\n throw new Error(`Failed to fetch Relay quotes: ${String(error)}`);\n }\n}\n\n/**\n * Fetches a single Relay quote.\n *\n * @param request - Quote request.\n * @param fullRequest - Full quotes request.\n * @returns Single quote.\n */\nasync function getSingleQuote(\n request: QuoteRequest,\n fullRequest: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>> {\n const { messenger, transaction } = fullRequest;\n\n try {\n const body = {\n amount: request.targetAmountMinimum,\n destinationChainId: Number(request.targetChainId),\n destinationCurrency: request.targetTokenAddress,\n originChainId: Number(request.sourceChainId),\n originCurrency: request.sourceTokenAddress,\n recipient: request.from,\n tradeType: 'EXPECTED_OUTPUT',\n user: request.from,\n };\n\n await processTransactions(transaction, request, body, messenger);\n\n const url = getFeatureFlags(messenger).relayQuoteUrl;\n\n log('Request body', { body, url });\n\n const response = await successfulFetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n const quote = (await response.json()) as RelayQuote;\n\n log('Fetched relay quote', quote);\n\n return normalizeQuote(quote, request, fullRequest);\n } catch (e) {\n log('Error fetching relay quote', e);\n throw e;\n }\n}\n\n/**\n * Add tranasction data to request body if needed.\n *\n * @param transaction - Transaction metadata.\n * @param request - Quote request.\n * @param requestBody - Request body to populate.\n * @param messenger - Controller messenger.\n */\nasync function processTransactions(\n transaction: TransactionMeta,\n request: QuoteRequest,\n requestBody: Record<string, Json | undefined>,\n messenger: TransactionPayControllerMessenger,\n) {\n const { data, value } = transaction.txParams;\n\n /* istanbul ignore next */\n const hasNoParams = (!data || data === '0x') && (!value || value === '0x0');\n\n const skipDelegation =\n hasNoParams || request.targetChainId === CHAIN_ID_HYPERCORE;\n\n if (skipDelegation) {\n log('Skipping delegation as no transaction data');\n return;\n }\n\n const delegation = await messenger.call(\n 'TransactionPayController:getDelegationTransaction',\n { transaction },\n );\n\n const normalizedAuthorizationList = delegation.authorizationList?.map(\n (a) => ({\n ...a,\n chainId: Number(a.chainId),\n nonce: Number(a.nonce),\n yParity: Number(a.yParity),\n }),\n );\n\n const tokenTransferData = new Interface([\n 'function transfer(address to, uint256 amount)',\n ]).encodeFunctionData('transfer', [\n request.from,\n request.targetAmountMinimum,\n ]);\n\n requestBody.authorizationList = normalizedAuthorizationList;\n requestBody.tradeType = 'EXACT_OUTPUT';\n\n requestBody.txs = [\n {\n to: request.targetTokenAddress,\n data: tokenTransferData,\n value: '0x0',\n },\n {\n to: delegation.to,\n data: delegation.data,\n value: delegation.value,\n },\n ];\n}\n\n/**\n * Normalizes requests for Relay.\n *\n * @param request - Quote request to normalize.\n * @returns Normalized request.\n */\nfunction normalizeRequest(request: QuoteRequest) {\n const isHyperliquidDeposit =\n request.targetChainId === CHAIN_ID_ARBITRUM &&\n request.targetTokenAddress.toLowerCase() ===\n ARBITRUM_USDC_ADDRESS.toLowerCase();\n\n const isPolygonNativeSource =\n request.sourceChainId === CHAIN_ID_POLYGON &&\n request.sourceTokenAddress === getNativeToken(request.sourceChainId);\n\n const requestOutput: QuoteRequest = {\n ...request,\n sourceTokenAddress: isPolygonNativeSource\n ? NATIVE_TOKEN_ADDRESS\n : request.sourceTokenAddress,\n targetChainId: isHyperliquidDeposit\n ? CHAIN_ID_HYPERCORE\n : request.targetChainId,\n targetTokenAddress: isHyperliquidDeposit\n ? '0x00000000000000000000000000000000'\n : request.targetTokenAddress,\n targetAmountMinimum: isHyperliquidDeposit\n ? new BigNumber(request.targetAmountMinimum).shiftedBy(2).toString(10)\n : request.targetAmountMinimum,\n };\n\n if (isHyperliquidDeposit) {\n log('Converting Arbitrum Hyperliquid deposit to direct deposit', {\n originalRequest: request,\n normalizedRequest: requestOutput,\n });\n }\n\n return requestOutput;\n}\n\n/**\n * Normalizes a Relay quote into a TransactionPayQuote.\n *\n * @param quote - Relay quote.\n * @param request - Original quote request.\n * @param fullRequest - Full quotes request.\n * @returns Normalized quote.\n */\nfunction normalizeQuote(\n quote: RelayQuote,\n request: QuoteRequest,\n fullRequest: PayStrategyGetQuotesRequest,\n): TransactionPayQuote<RelayQuote> {\n const { messenger } = fullRequest;\n const { details, fees } = quote;\n\n const { usdToFiatRate } = getFiatRates(messenger, request);\n\n const dust = getFiatValueFromUsd(\n calculateDustUsd(quote, request),\n usdToFiatRate,\n );\n\n const provider = getFiatValueFromUsd(\n new BigNumber(fees.relayer.amountUsd),\n usdToFiatRate,\n );\n\n const sourceNetwork = calculateSourceNetworkCost(quote, messenger);\n\n const targetNetwork = {\n usd: '0',\n fiat: '0',\n };\n\n return {\n dust,\n estimatedDuration: details.timeEstimate,\n fees: {\n provider,\n sourceNetwork,\n targetNetwork,\n },\n original: quote,\n request,\n strategy: TransactionPayStrategy.Relay,\n };\n}\n\n/**\n * Calculate dust USD value.\n *\n * @param quote - Relay quote.\n * @param request - Quote request.\n * @returns Dust value in USD and fiat.\n */\nfunction calculateDustUsd(quote: RelayQuote, request: QuoteRequest) {\n const { currencyOut } = quote.details;\n const { amountUsd, amountFormatted, minimumAmount } = currencyOut;\n const { decimals: targetDecimals } = currencyOut.currency;\n\n const targetUsdRate = new BigNumber(amountUsd).dividedBy(amountFormatted);\n\n const dustRaw = new BigNumber(minimumAmount).minus(\n request.targetAmountMinimum,\n );\n\n return dustRaw.shiftedBy(-targetDecimals).multipliedBy(targetUsdRate);\n}\n\n/**\n * Converts USD value to fiat value.\n *\n * @param usdValue - USD value.\n * @param usdToFiatRate - USD to fiat rate.\n * @returns Fiat value.\n */\nfunction getFiatValueFromUsd(\n usdValue: BigNumber,\n usdToFiatRate: BigNumber,\n): FiatValue {\n const fiatValue = usdValue.multipliedBy(usdToFiatRate);\n\n return {\n usd: usdValue.toString(10),\n fiat: fiatValue.toString(10),\n };\n}\n\n/**\n * Calculates USD to fiat rate.\n *\n * @param messenger - Controller messenger.\n * @param request - Quote request.\n * @returns USD to fiat rate.\n */\nfunction getFiatRates(\n messenger: TransactionPayControllerMessenger,\n request: QuoteRequest,\n) {\n const { sourceChainId, sourceTokenAddress } = request;\n\n const finalSourceTokenAddress =\n sourceChainId === CHAIN_ID_POLYGON &&\n sourceTokenAddress === NATIVE_TOKEN_ADDRESS\n ? getNativeToken(sourceChainId)\n : sourceTokenAddress;\n\n const sourceFiatRate = getTokenFiatRate(\n messenger,\n finalSourceTokenAddress,\n sourceChainId,\n );\n\n if (!sourceFiatRate) {\n throw new Error('Source token fiat rate not found');\n }\n\n const usdToFiatRate = new BigNumber(sourceFiatRate.fiatRate).dividedBy(\n sourceFiatRate.usdRate,\n );\n\n return { sourceFiatRate, usdToFiatRate };\n}\n\n/**\n * Gets feature flags for Relay quotes.\n *\n * @param messenger - Controller messenger.\n * @returns Feature flags.\n */\nfunction getFeatureFlags(messenger: TransactionPayControllerMessenger) {\n const featureFlagState = messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n\n const featureFlags = featureFlagState.remoteFeatureFlags\n ?.confirmations_pay as Record<string, string> | undefined;\n\n const relayQuoteUrl = featureFlags?.relayQuoteUrl ?? RELAY_URL_QUOTE;\n\n return {\n relayQuoteUrl,\n };\n}\n\n/**\n * Calculates source network cost from a Relay quote.\n *\n * @param quote - Relay quote.\n * @param messenger - Controller messenger.\n * @returns Total source network cost in USD and fiat.\n */\nfunction calculateSourceNetworkCost(\n quote: RelayQuote,\n messenger: TransactionPayControllerMessenger,\n) {\n const allParams = quote.steps[0].items.map((i) => i.data);\n const totalGasLimit = calculateSourceNetworkGasLimit(allParams);\n\n return calculateGasCost({\n chainId: allParams[0].chainId,\n gas: totalGasLimit,\n messenger,\n });\n}\n\n/**\n * Calculate the total gas limit for the source network transactions.\n *\n * @param params - Array of transaction parameters.\n * @returns - Total gas limit.\n */\nfunction calculateSourceNetworkGasLimit(\n params: RelayQuote['steps'][0]['items'][0]['data'][],\n): number {\n const allParamsHasGas = params.every((p) => p.gas !== undefined);\n\n if (allParamsHasGas) {\n return params.reduce(\n (total, p) => total + new BigNumber(p.gas as string).toNumber(),\n 0,\n );\n }\n\n // In future, call `TransactionController:estimateGas`\n // or `TransactionController:estimateGasBatch` based on params length.\n\n return params.reduce(\n (total, p) =>\n total + new BigNumber(p.gas ?? RELAY_FALLBACK_GAS_LIMIT).toNumber(),\n 0,\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"relay-quotes.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface } from '@ethersproject/abi';\nimport { successfulFetch } from '@metamask/controller-utils';\nimport type { Json } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport {\n CHAIN_ID_HYPERCORE,\n RELAY_FALLBACK_GAS_LIMIT,\n RELAY_URL_QUOTE,\n} from './constants';\nimport type { RelayQuote } from './types';\nimport { TransactionPayStrategy } from '../..';\nimport type { TransactionMeta } from '../../../../transaction-controller/src';\nimport {\n ARBITRUM_USDC_ADDRESS,\n CHAIN_ID_ARBITRUM,\n CHAIN_ID_POLYGON,\n NATIVE_TOKEN_ADDRESS,\n} from '../../constants';\nimport { projectLogger } from '../../logger';\nimport type {\n Amount,\n FiatValue,\n PayStrategyGetQuotesRequest,\n QuoteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { calculateGasCost } from '../../utils/gas';\nimport { getNativeToken, getTokenFiatRate } from '../../utils/token';\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\n\n/**\n * Fetches Relay quotes.\n *\n * @param request - Request object.\n * @returns Array of quotes.\n */\nexport async function getRelayQuotes(\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>[]> {\n const { requests } = request;\n\n log('Fetching quotes', requests);\n\n try {\n const normalizedRequests = requests\n // Ignore gas fee token requests\n .filter((r) => r.targetAmountMinimum !== '0')\n .map((r) => normalizeRequest(r));\n\n log('Normalized requests', normalizedRequests);\n\n return await Promise.all(\n normalizedRequests.map((r) => getSingleQuote(r, request)),\n );\n } catch (error) {\n log('Error fetching quotes', { error });\n throw new Error(`Failed to fetch Relay quotes: ${String(error)}`);\n }\n}\n\n/**\n * Fetches a single Relay quote.\n *\n * @param request - Quote request.\n * @param fullRequest - Full quotes request.\n * @returns Single quote.\n */\nasync function getSingleQuote(\n request: QuoteRequest,\n fullRequest: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>> {\n const { messenger, transaction } = fullRequest;\n\n try {\n const body = {\n amount: request.targetAmountMinimum,\n destinationChainId: Number(request.targetChainId),\n destinationCurrency: request.targetTokenAddress,\n originChainId: Number(request.sourceChainId),\n originCurrency: request.sourceTokenAddress,\n recipient: request.from,\n tradeType: 'EXPECTED_OUTPUT',\n user: request.from,\n };\n\n await processTransactions(transaction, request, body, messenger);\n\n const url = getFeatureFlags(messenger).relayQuoteUrl;\n\n log('Request body', { body, url });\n\n const response = await successfulFetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n const quote = (await response.json()) as RelayQuote;\n\n log('Fetched relay quote', quote);\n\n return normalizeQuote(quote, request, fullRequest);\n } catch (e) {\n log('Error fetching relay quote', e);\n throw e;\n }\n}\n\n/**\n * Add tranasction data to request body if needed.\n *\n * @param transaction - Transaction metadata.\n * @param request - Quote request.\n * @param requestBody - Request body to populate.\n * @param messenger - Controller messenger.\n */\nasync function processTransactions(\n transaction: TransactionMeta,\n request: QuoteRequest,\n requestBody: Record<string, Json | undefined>,\n messenger: TransactionPayControllerMessenger,\n) {\n const { data, value } = transaction.txParams;\n\n /* istanbul ignore next */\n const hasNoParams = (!data || data === '0x') && (!value || value === '0x0');\n\n const skipDelegation =\n hasNoParams || request.targetChainId === CHAIN_ID_HYPERCORE;\n\n if (skipDelegation) {\n log('Skipping delegation as no transaction data');\n return;\n }\n\n const delegation = await messenger.call(\n 'TransactionPayController:getDelegationTransaction',\n { transaction },\n );\n\n const normalizedAuthorizationList = delegation.authorizationList?.map(\n (a) => ({\n ...a,\n chainId: Number(a.chainId),\n nonce: Number(a.nonce),\n yParity: Number(a.yParity),\n }),\n );\n\n const tokenTransferData = new Interface([\n 'function transfer(address to, uint256 amount)',\n ]).encodeFunctionData('transfer', [\n request.from,\n request.targetAmountMinimum,\n ]);\n\n requestBody.authorizationList = normalizedAuthorizationList;\n requestBody.tradeType = 'EXACT_OUTPUT';\n\n requestBody.txs = [\n {\n to: request.targetTokenAddress,\n data: tokenTransferData,\n value: '0x0',\n },\n {\n to: delegation.to,\n data: delegation.data,\n value: delegation.value,\n },\n ];\n}\n\n/**\n * Normalizes requests for Relay.\n *\n * @param request - Quote request to normalize.\n * @returns Normalized request.\n */\nfunction normalizeRequest(request: QuoteRequest) {\n const isHyperliquidDeposit =\n request.targetChainId === CHAIN_ID_ARBITRUM &&\n request.targetTokenAddress.toLowerCase() ===\n ARBITRUM_USDC_ADDRESS.toLowerCase();\n\n const isPolygonNativeSource =\n request.sourceChainId === CHAIN_ID_POLYGON &&\n request.sourceTokenAddress === getNativeToken(request.sourceChainId);\n\n const requestOutput: QuoteRequest = {\n ...request,\n sourceTokenAddress: isPolygonNativeSource\n ? NATIVE_TOKEN_ADDRESS\n : request.sourceTokenAddress,\n targetChainId: isHyperliquidDeposit\n ? CHAIN_ID_HYPERCORE\n : request.targetChainId,\n targetTokenAddress: isHyperliquidDeposit\n ? '0x00000000000000000000000000000000'\n : request.targetTokenAddress,\n targetAmountMinimum: isHyperliquidDeposit\n ? new BigNumber(request.targetAmountMinimum).shiftedBy(2).toString(10)\n : request.targetAmountMinimum,\n };\n\n if (isHyperliquidDeposit) {\n log('Converting Arbitrum Hyperliquid deposit to direct deposit', {\n originalRequest: request,\n normalizedRequest: requestOutput,\n });\n }\n\n return requestOutput;\n}\n\n/**\n * Normalizes a Relay quote into a TransactionPayQuote.\n *\n * @param quote - Relay quote.\n * @param request - Original quote request.\n * @param fullRequest - Full quotes request.\n * @returns Normalized quote.\n */\nfunction normalizeQuote(\n quote: RelayQuote,\n request: QuoteRequest,\n fullRequest: PayStrategyGetQuotesRequest,\n): TransactionPayQuote<RelayQuote> {\n const { messenger } = fullRequest;\n const { details } = quote;\n const { currencyIn } = details;\n\n const { usdToFiatRate } = getFiatRates(messenger, request);\n\n const dust = getFiatValueFromUsd(\n calculateDustUsd(quote, request),\n usdToFiatRate,\n );\n\n const provider = getFiatValueFromUsd(\n calculateProviderFee(quote),\n usdToFiatRate,\n );\n\n const sourceNetwork = calculateSourceNetworkCost(quote, messenger);\n\n const targetNetwork = {\n usd: '0',\n fiat: '0',\n };\n\n const sourceAmount: Amount = {\n human: currencyIn.amountFormatted,\n raw: currencyIn.amount,\n ...getFiatValueFromUsd(new BigNumber(currencyIn.amountUsd), usdToFiatRate),\n };\n\n return {\n dust,\n estimatedDuration: details.timeEstimate,\n fees: {\n provider,\n sourceNetwork,\n targetNetwork,\n },\n original: quote,\n request,\n sourceAmount,\n strategy: TransactionPayStrategy.Relay,\n };\n}\n\n/**\n * Calculate dust USD value.\n *\n * @param quote - Relay quote.\n * @param request - Quote request.\n * @returns Dust value in USD and fiat.\n */\nfunction calculateDustUsd(quote: RelayQuote, request: QuoteRequest) {\n const { currencyOut } = quote.details;\n const { amountUsd, amountFormatted, minimumAmount } = currencyOut;\n const { decimals: targetDecimals } = currencyOut.currency;\n\n const targetUsdRate = new BigNumber(amountUsd).dividedBy(amountFormatted);\n\n const dustRaw = new BigNumber(minimumAmount).minus(\n request.targetAmountMinimum,\n );\n\n return dustRaw.shiftedBy(-targetDecimals).multipliedBy(targetUsdRate);\n}\n\n/**\n * Converts USD value to fiat value.\n *\n * @param usdValue - USD value.\n * @param usdToFiatRate - USD to fiat rate.\n * @returns Fiat value.\n */\nfunction getFiatValueFromUsd(\n usdValue: BigNumber,\n usdToFiatRate: BigNumber,\n): FiatValue {\n const fiatValue = usdValue.multipliedBy(usdToFiatRate);\n\n return {\n usd: usdValue.toString(10),\n fiat: fiatValue.toString(10),\n };\n}\n\n/**\n * Calculates USD to fiat rate.\n *\n * @param messenger - Controller messenger.\n * @param request - Quote request.\n * @returns USD to fiat rate.\n */\nfunction getFiatRates(\n messenger: TransactionPayControllerMessenger,\n request: QuoteRequest,\n) {\n const { sourceChainId, sourceTokenAddress } = request;\n\n const finalSourceTokenAddress =\n sourceChainId === CHAIN_ID_POLYGON &&\n sourceTokenAddress === NATIVE_TOKEN_ADDRESS\n ? getNativeToken(sourceChainId)\n : sourceTokenAddress;\n\n const sourceFiatRate = getTokenFiatRate(\n messenger,\n finalSourceTokenAddress,\n sourceChainId,\n );\n\n if (!sourceFiatRate) {\n throw new Error('Source token fiat rate not found');\n }\n\n const usdToFiatRate = new BigNumber(sourceFiatRate.fiatRate).dividedBy(\n sourceFiatRate.usdRate,\n );\n\n return { sourceFiatRate, usdToFiatRate };\n}\n\n/**\n * Gets feature flags for Relay quotes.\n *\n * @param messenger - Controller messenger.\n * @returns Feature flags.\n */\nfunction getFeatureFlags(messenger: TransactionPayControllerMessenger) {\n const featureFlagState = messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n\n const featureFlags = featureFlagState.remoteFeatureFlags\n ?.confirmations_pay as Record<string, string> | undefined;\n\n const relayQuoteUrl = featureFlags?.relayQuoteUrl ?? RELAY_URL_QUOTE;\n\n return {\n relayQuoteUrl,\n };\n}\n\n/**\n * Calculates source network cost from a Relay quote.\n *\n * @param quote - Relay quote.\n * @param messenger - Controller messenger.\n * @returns Total source network cost in USD and fiat.\n */\nfunction calculateSourceNetworkCost(\n quote: RelayQuote,\n messenger: TransactionPayControllerMessenger,\n): TransactionPayQuote<RelayQuote>['fees']['sourceNetwork'] {\n const allParams = quote.steps[0].items.map((i) => i.data);\n const { chainId } = allParams[0];\n const totalGasLimit = calculateSourceNetworkGasLimit(allParams);\n\n const estimate = calculateGasCost({\n chainId,\n gas: totalGasLimit,\n messenger,\n });\n\n const max = calculateGasCost({\n chainId,\n gas: totalGasLimit,\n messenger,\n isMax: true,\n });\n\n return { estimate, max };\n}\n\n/**\n * Calculate the total gas limit for the source network transactions.\n *\n * @param params - Array of transaction parameters.\n * @returns - Total gas limit.\n */\nfunction calculateSourceNetworkGasLimit(\n params: RelayQuote['steps'][0]['items'][0]['data'][],\n): number {\n const allParamsHasGas = params.every((p) => p.gas !== undefined);\n\n if (allParamsHasGas) {\n return params.reduce(\n (total, p) => total + new BigNumber(p.gas as string).toNumber(),\n 0,\n );\n }\n\n // In future, call `TransactionController:estimateGas`\n // or `TransactionController:estimateGasBatch` based on params length.\n\n return params.reduce(\n (total, p) =>\n total + new BigNumber(p.gas ?? RELAY_FALLBACK_GAS_LIMIT).toNumber(),\n 0,\n );\n}\n\n/**\n * Calculate the provider fee for a Relay quote.\n *\n * @param quote - Relay quote.\n * @returns - Provider fee in USD.\n */\nfunction calculateProviderFee(quote: RelayQuote) {\n const relayerFee = new BigNumber(quote.fees.relayer.amountUsd);\n\n const valueLoss = new BigNumber(quote.details.currencyIn.amountUsd).minus(\n quote.details.currencyOut.amountUsd,\n );\n\n return relayerFee.gt(valueLoss) ? relayerFee : valueLoss;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Hex } from '@metamask/utils';\n\nexport type RelayQuote = {\n details: {\n currencyIn: {\n amountFormatted: string;\n amountUsd: string;\n currency: {\n chainId: number;\n decimals: number;\n };\n };\n currencyOut: {\n amountFormatted: string;\n amountUsd: string;\n currency: {\n chainId: number;\n decimals: number;\n };\n minimumAmount: string;\n };\n timeEstimate: number;\n };\n fees: {\n relayer: {\n amountUsd: string;\n };\n };\n steps: {\n items: {\n check: {\n endpoint: string;\n method: 'GET' | 'POST';\n };\n data: {\n chainId: number;\n data: Hex;\n from: Hex;\n gas?: string;\n maxFeePerGas: string;\n maxPriorityFeePerGas: string;\n to: Hex;\n value: string;\n };\n status: 'complete' | 'incomplete';\n }[];\n kind: 'transaction';\n }[];\n};\n\nexport type RelayStatus = {\n status:\n | 'refund'\n | 'waiting'\n | 'failure'\n | 'pending'\n | 'submitted'\n | 'success';\n inTxHashes: string[];\n txHashes: string[];\n updatedAt: number;\n originChainId: number;\n destinationChainId: number;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"types.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Hex } from '@metamask/utils';\n\nexport type RelayQuote = {\n details: {\n currencyIn: {\n amount: string;\n amountFormatted: string;\n amountUsd: string;\n currency: {\n chainId: number;\n decimals: number;\n };\n };\n currencyOut: {\n amountFormatted: string;\n amountUsd: string;\n currency: {\n chainId: number;\n decimals: number;\n };\n minimumAmount: string;\n };\n timeEstimate: number;\n };\n fees: {\n relayer: {\n amountUsd: string;\n };\n };\n steps: {\n items: {\n check: {\n endpoint: string;\n method: 'GET' | 'POST';\n };\n data: {\n chainId: number;\n data: Hex;\n from: Hex;\n gas?: string;\n maxFeePerGas: string;\n maxPriorityFeePerGas: string;\n to: Hex;\n value: string;\n };\n status: 'complete' | 'incomplete';\n }[];\n kind: 'transaction';\n }[];\n};\n\nexport type RelayStatus = {\n status:\n | 'refund'\n | 'waiting'\n | 'failure'\n | 'pending'\n | 'submitted'\n | 'success';\n inTxHashes: string[];\n txHashes: string[];\n updatedAt: number;\n originChainId: number;\n destinationChainId: number;\n};\n"]}
|