@dev.sail.money/sailor 0.0.2 → 1.0.0-38

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.
Files changed (199) hide show
  1. package/AGENTS.md +43 -15
  2. package/README.md +217 -126
  3. package/examples/permissions/BoundedApproveAndCallBatch.sol +179 -0
  4. package/examples/permissions/BoundedBet_Limitless_Base.sol +8 -7
  5. package/examples/permissions/BoundedBorrow_AaveV3_Arbitrum.sol +13 -13
  6. package/examples/permissions/BoundedPerp_GMXv2_Arbitrum.sol +50 -39
  7. package/examples/permissions/BoundedStake_Venice_Base.sol +85 -0
  8. package/examples/permissions/BoundedSupply_AaveV3_Arbitrum.sol +82 -0
  9. package/examples/permissions/BoundedSwap_UniswapV3_Base.sol +15 -12
  10. package/examples/permissions/BoundedSwap_UniswapV4_Unichain.sol +14 -8
  11. package/examples/permissions/BoundedTransfer_ERC20_Ethereum.sol +6 -6
  12. package/examples/permissions/BoundedVault_ERC4626_Base.sol +97 -0
  13. package/examples/permissions/README.md +29 -2
  14. package/examples/permissions/SailCalldata.sol +118 -0
  15. package/examples/permissions/interfaces/IBatchPermission.sol +38 -0
  16. package/package.json +17 -12
  17. package/packages/cli/dist/index.cjs +4164 -2508
  18. package/packages/cli/dist/server.cjs +897 -1566
  19. package/packages/sdk/dist/chains.d.ts +12 -0
  20. package/packages/sdk/dist/chains.d.ts.map +1 -0
  21. package/packages/sdk/dist/chains.js +94 -0
  22. package/packages/sdk/dist/chains.js.map +1 -0
  23. package/packages/sdk/dist/deployments.d.ts +14 -7
  24. package/packages/sdk/dist/deployments.d.ts.map +1 -1
  25. package/packages/sdk/dist/deployments.js +132 -141
  26. package/packages/sdk/dist/deployments.js.map +1 -1
  27. package/packages/sdk/dist/index.d.ts +3 -2
  28. package/packages/sdk/dist/index.d.ts.map +1 -1
  29. package/packages/sdk/dist/index.js +3 -2
  30. package/packages/sdk/dist/index.js.map +1 -1
  31. package/packages/sdk/dist/intelligence.d.ts +1 -1
  32. package/packages/sdk/dist/intelligence.js +1 -1
  33. package/packages/sdk/dist/lifi.d.ts +17 -0
  34. package/packages/sdk/dist/lifi.d.ts.map +1 -1
  35. package/packages/sdk/dist/lifi.js +24 -0
  36. package/packages/sdk/dist/lifi.js.map +1 -1
  37. package/packages/sdk/dist/safe.d.ts +83 -0
  38. package/packages/sdk/dist/safe.d.ts.map +1 -1
  39. package/packages/sdk/dist/safe.js +92 -1
  40. package/packages/sdk/dist/safe.js.map +1 -1
  41. package/packages/sdk/dist/templates/ammLiquidity.d.ts +24 -11
  42. package/packages/sdk/dist/templates/ammLiquidity.d.ts.map +1 -1
  43. package/packages/sdk/dist/templates/ammLiquidity.js +39 -31
  44. package/packages/sdk/dist/templates/ammLiquidity.js.map +1 -1
  45. package/packages/sdk/dist/templates/approveAndCallBatch.d.ts +24 -10
  46. package/packages/sdk/dist/templates/approveAndCallBatch.d.ts.map +1 -1
  47. package/packages/sdk/dist/templates/approveAndCallBatch.js +36 -23
  48. package/packages/sdk/dist/templates/approveAndCallBatch.js.map +1 -1
  49. package/packages/sdk/dist/templates/boundedBorrow.d.ts +19 -9
  50. package/packages/sdk/dist/templates/boundedBorrow.d.ts.map +1 -1
  51. package/packages/sdk/dist/templates/boundedBorrow.js +28 -19
  52. package/packages/sdk/dist/templates/boundedBorrow.js.map +1 -1
  53. package/packages/sdk/dist/templates/boundedSwap.d.ts +19 -9
  54. package/packages/sdk/dist/templates/boundedSwap.d.ts.map +1 -1
  55. package/packages/sdk/dist/templates/boundedSwap.js +30 -20
  56. package/packages/sdk/dist/templates/boundedSwap.js.map +1 -1
  57. package/packages/sdk/dist/templates/defiBundle.d.ts +35 -9
  58. package/packages/sdk/dist/templates/defiBundle.d.ts.map +1 -1
  59. package/packages/sdk/dist/templates/defiBundle.js +84 -22
  60. package/packages/sdk/dist/templates/defiBundle.js.map +1 -1
  61. package/packages/sdk/dist/templates/pendle.d.ts +23 -8
  62. package/packages/sdk/dist/templates/pendle.d.ts.map +1 -1
  63. package/packages/sdk/dist/templates/pendle.js +34 -14
  64. package/packages/sdk/dist/templates/pendle.js.map +1 -1
  65. package/packages/sdk/dist/templates/transferTarget.d.ts +11 -3
  66. package/packages/sdk/dist/templates/transferTarget.d.ts.map +1 -1
  67. package/packages/sdk/dist/templates/transferTarget.js +14 -7
  68. package/packages/sdk/dist/templates/transferTarget.js.map +1 -1
  69. package/packages/sdk/dist/types.d.ts +19 -1
  70. package/packages/sdk/dist/types.d.ts.map +1 -1
  71. package/packages/sdk/package.json +28 -0
  72. package/packages/ui/dist/assets/{add-DaJhwIBV.js → add-Dl1etsL9.js} +1 -1
  73. package/packages/ui/dist/assets/{all-wallets-BUxsqWXi.js → all-wallets-C0eHLOGG.js} +1 -1
  74. package/packages/ui/dist/assets/{app-store-DkltwTqE.js → app-store-B-VMDEZ3.js} +1 -1
  75. package/packages/ui/dist/assets/{apple-owVOeaIT.js → apple-DkDXzKns.js} +1 -1
  76. package/packages/ui/dist/assets/{arrow-bottom-D2mmNJve.js → arrow-bottom-DtPzuS76.js} +1 -1
  77. package/packages/ui/dist/assets/{arrow-bottom-circle-CbNYijx-.js → arrow-bottom-circle-D7odSAO8.js} +1 -1
  78. package/packages/ui/dist/assets/{arrow-left-DJB61s4C.js → arrow-left-zJV9tpx0.js} +1 -1
  79. package/packages/ui/dist/assets/{arrow-right-BBrsQ9R4.js → arrow-right-BOREfe7o.js} +1 -1
  80. package/packages/ui/dist/assets/{arrow-top-Cil6bOc8.js → arrow-top-CipQc3Af.js} +1 -1
  81. package/packages/ui/dist/assets/{bank-CbwEmRo3.js → bank-C5s7eoV5.js} +1 -1
  82. package/packages/ui/dist/assets/{basic-CLNfjw3m.js → basic-D2es4Vq8.js} +1 -1
  83. package/packages/ui/dist/assets/{browser-B5TtF4Pb.js → browser-DITQWDC9.js} +1 -1
  84. package/packages/ui/dist/assets/{card-CO7BVB-C.js → card-C3DDkaYK.js} +1 -1
  85. package/packages/ui/dist/assets/{ccip-2W7K3_J3.js → ccip-UBXL3JiN.js} +1 -1
  86. package/packages/ui/dist/assets/{checkmark-bold-D9xGHzPE.js → checkmark-bold-D8yW0_K_.js} +1 -1
  87. package/packages/ui/dist/assets/{checkmark-BEtSHq9m.js → checkmark-ngef3MAl.js} +1 -1
  88. package/packages/ui/dist/assets/{chevron-bottom-BDztht6i.js → chevron-bottom-C56BipDR.js} +1 -1
  89. package/packages/ui/dist/assets/{chevron-left-EV4GFNbc.js → chevron-left-BmIPtPl_.js} +1 -1
  90. package/packages/ui/dist/assets/{chevron-right-B4_bB9oR.js → chevron-right-BnySHQ8h.js} +1 -1
  91. package/packages/ui/dist/assets/{chevron-top-D54xPNzF.js → chevron-top-BDGZnNW3.js} +1 -1
  92. package/packages/ui/dist/assets/{chrome-store-DYUpAJJq.js → chrome-store-BYIqJZVF.js} +1 -1
  93. package/packages/ui/dist/assets/{clock-Ca1T1Soz.js → clock-Bl4mUHAM.js} +1 -1
  94. package/packages/ui/dist/assets/{close-BZqWjurK.js → close-B9rhEX6U.js} +1 -1
  95. package/packages/ui/dist/assets/{coinPlaceholder-e6fl2XDo.js → coinPlaceholder-1cO0FQsl.js} +1 -1
  96. package/packages/ui/dist/assets/{compass-DCLC7zIh.js → compass-7i-VuXu2.js} +1 -1
  97. package/packages/ui/dist/assets/{copy-Th2AaD-O.js → copy-OqqXix2J.js} +1 -1
  98. package/packages/ui/dist/assets/{core-Ckx_cyuH.js → core-tX9kIIDJ.js} +3 -3
  99. package/packages/ui/dist/assets/cursor-BoyeQ9fN.js +3 -0
  100. package/packages/ui/dist/assets/{cursor-transparent-BKHeABKB.js → cursor-transparent-5aoRH67u.js} +1 -1
  101. package/packages/ui/dist/assets/{desktop-CBjY8t6F.js → desktop-BaPXK9R6.js} +1 -1
  102. package/packages/ui/dist/assets/{disconnect-DbSs2cli.js → disconnect-LlK5K1CF.js} +1 -1
  103. package/packages/ui/dist/assets/{discord-ZlLOAUkM.js → discord-BdcQNWY_.js} +1 -1
  104. package/packages/ui/dist/assets/{etherscan-CKUrqWYN.js → etherscan-Bb-WxpO1.js} +1 -1
  105. package/packages/ui/dist/assets/{events-CiKP71cK.js → events-DjdZr6no.js} +1 -1
  106. package/packages/ui/dist/assets/{exclamation-triangle-DA1QzFiO.js → exclamation-triangle-COx4VtPV.js} +1 -1
  107. package/packages/ui/dist/assets/{extension-BVJkmvpJ.js → extension-DF63DTWO.js} +1 -1
  108. package/packages/ui/dist/assets/{external-link-D_bsR7B2.js → external-link-DyghCkQu.js} +1 -1
  109. package/packages/ui/dist/assets/{facebook-CmFmhojx.js → facebook-Dcg4bZMR.js} +1 -1
  110. package/packages/ui/dist/assets/{fallback-Ofl6uSnB.js → fallback-DJIr_fH3.js} +1 -1
  111. package/packages/ui/dist/assets/{farcaster-Co-M3Ss8.js → farcaster-BkmV5HjO.js} +1 -1
  112. package/packages/ui/dist/assets/{filters-B1WwNaFU.js → filters-DLHj1T_P.js} +1 -1
  113. package/packages/ui/dist/assets/{github-CP4fP6gn.js → github-BFDCgKrF.js} +1 -1
  114. package/packages/ui/dist/assets/{google-CsOIXJ6V.js → google-C08SpmIy.js} +1 -1
  115. package/packages/ui/dist/assets/{help-circle-DiMkomdF.js → help-circle-DU1IFmWp.js} +1 -1
  116. package/packages/ui/dist/assets/{id-lmscL5LX.js → id-DtDRGf3L.js} +1 -1
  117. package/packages/ui/dist/assets/{image-B-ubJrY5.js → image-CgCXJEjT.js} +1 -1
  118. package/packages/ui/dist/assets/{index-Dbh5V1Z0.js → index-8chM4S5Y.js} +1 -1
  119. package/packages/ui/dist/assets/{index-BaukYv-x.js → index-B5sCtNuq.js} +1 -1
  120. package/packages/ui/dist/assets/{index-CF0KMmke.js → index-BBfBEazf.js} +3 -3
  121. package/packages/ui/dist/assets/{index-CZR1Qjhs.js → index-BhXPwltt.js} +1 -1
  122. package/packages/ui/dist/assets/index-Cm05Py20.css +1 -0
  123. package/packages/ui/dist/assets/{index-DVgfCzCo.js → index-D37bD6Yt.js} +1 -1
  124. package/packages/ui/dist/assets/index-DZfBh-cg.js +1775 -0
  125. package/packages/ui/dist/assets/{index.es-C78cE5SI.js → index.es-BEcNQEn-.js} +4 -4
  126. package/packages/ui/dist/assets/{info-Cqg57EVo.js → info-ClsdYA4P.js} +1 -1
  127. package/packages/ui/dist/assets/{info-circle-DkeSWNKV.js → info-circle-DJmn4Bsv.js} +1 -1
  128. package/packages/ui/dist/assets/{lightbulb-DNlO4qKh.js → lightbulb-CXSftjXS.js} +1 -1
  129. package/packages/ui/dist/assets/{mail-kVQ8Jb9Y.js → mail-cdYKOl9P.js} +1 -1
  130. package/packages/ui/dist/assets/{metamask-sdk-CBalSvz7.js → metamask-sdk-Co3aIEln.js} +1 -1
  131. package/packages/ui/dist/assets/{mobile-BEteuhF7.js → mobile-DEHYlk8L.js} +1 -1
  132. package/packages/ui/dist/assets/{more-DBWmXQli.js → more-Cq_fo8pI.js} +1 -1
  133. package/packages/ui/dist/assets/{network-placeholder-Dg1uUHiL.js → network-placeholder-_dLCK4xB.js} +1 -1
  134. package/packages/ui/dist/assets/{nftPlaceholder-i3AHSiD9.js → nftPlaceholder-Dz4HKEr4.js} +1 -1
  135. package/packages/ui/dist/assets/{off-BtMm0fi2.js → off-B1k1lhkr.js} +1 -1
  136. package/packages/ui/dist/assets/{parseSignature-Cb5FlWWg.js → parseSignature-Cr0ptV2X.js} +1 -1
  137. package/packages/ui/dist/assets/{play-store-iKKkXa6a.js → play-store-lYqe4eeL.js} +1 -1
  138. package/packages/ui/dist/assets/{plus-CA5NaRtb.js → plus-QMgh1krr.js} +1 -1
  139. package/packages/ui/dist/assets/{qr-code-D2kiqR7h.js → qr-code-ClVHbZWN.js} +1 -1
  140. package/packages/ui/dist/assets/{recycle-horizontal-Dcme7R03.js → recycle-horizontal-CxGYnWid.js} +1 -1
  141. package/packages/ui/dist/assets/{refresh-Dega3sDp.js → refresh-CPysMza_.js} +1 -1
  142. package/packages/ui/dist/assets/{reown-logo-xNkksyWJ.js → reown-logo-OoL_zJd0.js} +1 -1
  143. package/packages/ui/dist/assets/{search-HYl7NO8x.js → search-2GaRbf1I.js} +1 -1
  144. package/packages/ui/dist/assets/{secp256k1-Cxd6_SiH.js → secp256k1-BrB8qSSy.js} +1 -1
  145. package/packages/ui/dist/assets/{send-CJU8CUAo.js → send-CC2UuIfD.js} +1 -1
  146. package/packages/ui/dist/assets/{swapHorizontal-IMUKiUre.js → swapHorizontal-BRqYwsqT.js} +1 -1
  147. package/packages/ui/dist/assets/{swapHorizontalBold-CNYnNJ9-.js → swapHorizontalBold-Bj0GSRq9.js} +1 -1
  148. package/packages/ui/dist/assets/{swapHorizontalMedium-B9VxEYsT.js → swapHorizontalMedium-oLOjpU2A.js} +1 -1
  149. package/packages/ui/dist/assets/{swapHorizontalRoundedBold-Dz33l_Jh.js → swapHorizontalRoundedBold-TJ652QXb.js} +1 -1
  150. package/packages/ui/dist/assets/{swapVertical-CHUmjVJ0.js → swapVertical-e0NLyV3x.js} +1 -1
  151. package/packages/ui/dist/assets/{telegram-kl9S2mbU.js → telegram-WhJHVeoU.js} +1 -1
  152. package/packages/ui/dist/assets/{three-dots-U5lhA1Am.js → three-dots-BlBAOyW-.js} +1 -1
  153. package/packages/ui/dist/assets/{twitch-KTEUWXEp.js → twitch-BH7vWmPc.js} +1 -1
  154. package/packages/ui/dist/assets/{twitterIcon-BHiq8mRg.js → twitterIcon-As0Nkanp.js} +1 -1
  155. package/packages/ui/dist/assets/{verify-CfN-BXNd.js → verify-BEJ0QuLl.js} +1 -1
  156. package/packages/ui/dist/assets/{verify-filled-DwZccetj.js → verify-filled-B8Ww2N7z.js} +1 -1
  157. package/packages/ui/dist/assets/{w3m-modal-CS-PFqPE.js → w3m-modal-5rOSZgOR.js} +1 -1
  158. package/packages/ui/dist/assets/{wallet-DVlGkhOY.js → wallet-CAfC3aml.js} +1 -1
  159. package/packages/ui/dist/assets/{wallet-placeholder-CvR_iEWX.js → wallet-placeholder-4RZI464Z.js} +1 -1
  160. package/packages/ui/dist/assets/{walletconnect-8pZBDvVI.js → walletconnect-BiltKqAe.js} +1 -1
  161. package/packages/ui/dist/assets/{warning-circle-ylLEE0Yp.js → warning-circle-CI4jqpHo.js} +1 -1
  162. package/packages/ui/dist/assets/{x-C_TBsTMj.js → x-FBttjBWO.js} +1 -1
  163. package/packages/ui/dist/index.html +2 -2
  164. package/scripts/check-init.mjs +2 -3
  165. package/templates/custom-mandate/README.md +31 -0
  166. package/templates/custom-mandate/mandates/BoundedCallPermission.sol +8 -2
  167. package/templates/custom-mandate/mandates/SailCalldata.sol +118 -0
  168. package/templates/default/.env.example +20 -0
  169. package/templates/{dca-rebalancer → default}/.github/workflows/agent-tick.yml +8 -7
  170. package/templates/{dca-rebalancer → default}/.sail/config.json +2 -2
  171. package/templates/default/AGENTS.md +171 -0
  172. package/templates/default/README.md +16 -0
  173. package/templates/default/examples/dca/README.md +16 -0
  174. package/templates/default/examples/dca/agent.ts +174 -0
  175. package/templates/{dca-rebalancer/src → default/examples/dca}/mandate.ts +9 -31
  176. package/templates/{dca-rebalancer → default}/package.json +2 -2
  177. package/templates/default/src/agent.ts +37 -0
  178. package/templates/default/src/config.ts +24 -0
  179. package/templates/default/src/mandate.ts +22 -0
  180. package/templates/default/tsconfig.json +17 -0
  181. package/templates/lifi-permissions/README.md +1 -1
  182. package/packages/ui/dist/assets/cursor-DV7rOqbJ.js +0 -3
  183. package/packages/ui/dist/assets/index-CKxgNxS9.css +0 -1
  184. package/packages/ui/dist/assets/index-Q2Yai4Fe.js +0 -2103
  185. package/scripts/postinstall.js +0 -366
  186. package/templates/dca-rebalancer/.env.example +0 -6
  187. package/templates/dca-rebalancer/AGENTS.md +0 -246
  188. package/templates/dca-rebalancer/AGENT_PLAYBOOK.md +0 -110
  189. package/templates/dca-rebalancer/README.md +0 -16
  190. package/templates/dca-rebalancer/src/agent.ts +0 -253
  191. package/templates/dca-rebalancer/src/config.ts +0 -27
  192. package/templates/dca-rebalancer/tsconfig.json +0 -8
  193. /package/templates/{dca-rebalancer → default}/.cursor/rules +0 -0
  194. /package/templates/{dca-rebalancer → default}/.sail/.gitkeep +0 -0
  195. /package/templates/{dca-rebalancer → default}/.sail/README.md +0 -0
  196. /package/templates/{dca-rebalancer → default}/CLAUDE.md +0 -0
  197. /package/templates/{dca-rebalancer → default}/_gitignore +0 -0
  198. /package/templates/{dca-rebalancer → default}/docs/PERMISSION_MODEL.md +0 -0
  199. /package/templates/{dca-rebalancer → default}/ui/README.md +0 -0
@@ -5,7 +5,7 @@
5
5
  * Do not edit manually — run `pnpm build` to regenerate.
6
6
  *
7
7
  * Spec version : 1.2.0
8
- * Generated at : 2026-06-05T10:53:26.868Z
8
+ * Generated at : 2026-06-12T09:09:34.635Z
9
9
  */
10
10
  export const SAIL_INTELLIGENCE_BASE_URL = "https://api.sail.money";
11
11
  export const SAIL_INTELLIGENCE_DOCS_URL = "https://api.sail.money/docs";
@@ -75,6 +75,23 @@ export type FetchLifiQuoteParams = {
75
75
  /** Optional fetch implementation (defaults to global fetch). */
76
76
  fetchFn?: typeof fetch;
77
77
  };
78
+ /**
79
+ * Compute the minimum acceptable output amount for a swap, given a quoted
80
+ * `toAmount` and a slippage tolerance.
81
+ *
82
+ * Use this to enforce slippage protection when building dispatch calldata —
83
+ * pass the result as `amountOutMinimum` (Uniswap) or `minAmount` (LiFi).
84
+ *
85
+ * @param toAmount Expected output in the destination token's base units
86
+ * (from `LifiSwapQuote.toAmount` or a Quoter call).
87
+ * @param slippage Maximum acceptable price movement as a fraction (0.03 = 3%).
88
+ * Defaults to `DEFAULT_SLIPPAGE` (3%).
89
+ *
90
+ * @example
91
+ * const quote = await fetchLifiQuote({ ... });
92
+ * const minOut = minTokenOut(quote.toAmount, 0.005); // 0.5% slippage
93
+ */
94
+ export declare function minTokenOut(toAmount: bigint, slippage?: number): bigint;
78
95
  /**
79
96
  * Fetch an executable LiFi quote for a same-chain swap. Throws with the API's
80
97
  * error body when the quote is unavailable or malformed.
@@ -1 +1 @@
1
- {"version":3,"file":"lifi.d.ts","sourceRoot":"","sources":["../src/lifi.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,OAAO,EAAsB,KAAK,GAAG,EAAY,MAAM,MAAM,CAAC;AAE5E,2BAA2B;AAC3B,eAAO,MAAM,cAAc,8BAA8B,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAIhD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAOrC,2CAA2C;AAC3C,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;EAAY,CAAC;AAE7C,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,CAEnE;AAED,0DAA0D;AAC1D,MAAM,MAAM,aAAa,GAAG;IAC1B,uDAAuD;IACvD,MAAM,EAAE,OAAO,CAAC;IAChB,qBAAqB;IACrB,IAAI,EAAE,GAAG,CAAC;IACV,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC,CAoCzF"}
1
+ {"version":3,"file":"lifi.d.ts","sourceRoot":"","sources":["../src/lifi.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,OAAO,EAAsB,KAAK,GAAG,EAAY,MAAM,MAAM,CAAC;AAE5E,2BAA2B;AAC3B,eAAO,MAAM,cAAc,8BAA8B,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAIhD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAOrC,2CAA2C;AAC3C,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;EAAY,CAAC;AAE7C,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,CAEnE;AAED,0DAA0D;AAC1D,MAAM,MAAM,aAAa,GAAG;IAC1B,uDAAuD;IACvD,MAAM,EAAE,OAAO,CAAC;IAChB,qBAAqB;IACrB,IAAI,EAAE,GAAG,CAAC;IACV,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAyB,GAAG,MAAM,CAMzF;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC,CAoCzF"}
@@ -32,6 +32,30 @@ export const ERC20_ALLOWANCE_ABI = ERC20_ABI;
32
32
  export function encodeApprove(spender, amount) {
33
33
  return encodeFunctionData({ abi: ERC20_ABI, functionName: "approve", args: [spender, amount] });
34
34
  }
35
+ /**
36
+ * Compute the minimum acceptable output amount for a swap, given a quoted
37
+ * `toAmount` and a slippage tolerance.
38
+ *
39
+ * Use this to enforce slippage protection when building dispatch calldata —
40
+ * pass the result as `amountOutMinimum` (Uniswap) or `minAmount` (LiFi).
41
+ *
42
+ * @param toAmount Expected output in the destination token's base units
43
+ * (from `LifiSwapQuote.toAmount` or a Quoter call).
44
+ * @param slippage Maximum acceptable price movement as a fraction (0.03 = 3%).
45
+ * Defaults to `DEFAULT_SLIPPAGE` (3%).
46
+ *
47
+ * @example
48
+ * const quote = await fetchLifiQuote({ ... });
49
+ * const minOut = minTokenOut(quote.toAmount, 0.005); // 0.5% slippage
50
+ */
51
+ export function minTokenOut(toAmount, slippage = DEFAULT_SLIPPAGE) {
52
+ if (slippage < 0 || slippage >= 1)
53
+ throw new Error(`slippage must be in [0, 1) — got ${slippage}`);
54
+ // Scale to 1e6 precision to avoid floating-point truncation on small amounts.
55
+ const scale = 1000000n;
56
+ const keepFraction = BigInt(Math.round((1 - slippage) * 1_000_000));
57
+ return (toAmount * keepFraction) / scale;
58
+ }
35
59
  /**
36
60
  * Fetch an executable LiFi quote for a same-chain swap. Throws with the API's
37
61
  * error body when the quote is unavailable or malformed.
@@ -1 +1 @@
1
- {"version":3,"file":"lifi.js","sourceRoot":"","sources":["../src/lifi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lifi.js","sourceRoot":"","sources":["../src/lifi.ts"],"names":[],"mappings":"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"}
@@ -129,6 +129,89 @@ export declare function buildSafeSetupInitializer(params: {
129
129
  * dependency on the Safe nonce. Layout: r = owner(32) ‖ s = 0(32) ‖ v = 1(1).
130
130
  */
131
131
  export declare function buildApprovedHashSignature(owner: Address): Hex;
132
+ /** ABI for SafeProxyFactory.proxyCreationCode() — pure view returning SafeProxy creation bytecode. */
133
+ export declare const safeProxyFactoryAbi: readonly [{
134
+ readonly type: "function";
135
+ readonly name: "proxyCreationCode";
136
+ readonly stateMutability: "pure";
137
+ readonly inputs: readonly [];
138
+ readonly outputs: readonly [{
139
+ readonly name: "";
140
+ readonly type: "bytes";
141
+ }];
142
+ }];
143
+ /**
144
+ * Compute the CREATE2 address SafeProxyFactory.createProxyWithNonce() assigns.
145
+ *
146
+ * Factory formula (from SafeProxyFactory source):
147
+ * initCode = proxyCreationCode ++ abi.encode(singleton)
148
+ * salt = keccak256(keccak256(initializer) ++ uint256(saltNonce))
149
+ * deployedAddr = CREATE2(factory, salt, keccak256(initCode))
150
+ *
151
+ * `proxyCreationCode` must be read once from the factory via `safeProxyFactoryAbi`;
152
+ * it is identical on every chain since SAFE_V141.proxyFactory is the same address everywhere.
153
+ *
154
+ * This is the LOW-LEVEL factory primitive: `saltNonce` is the value handed to
155
+ * `createProxyWithNonce` verbatim. When the deployer is SailKernel.createAccount,
156
+ * the kernel does NOT use the caller's nonce directly — it binds it to the
157
+ * deployer + principals first. To predict a Sail SMA address, use
158
+ * `computeSailSmaAddress` (which applies `computeKernelBoundSalt`), NOT this
159
+ * function with the raw nonce.
160
+ *
161
+ * NOTE: the `initializer` encodes chain-specific addresses (kernel, safeModuleEnabler)
162
+ * via `buildSafeSetupInitializer`. Different initializers per chain → different CREATE2 salts
163
+ * → different deployed addresses, even with the same `saltNonce`. Cross-chain same-address
164
+ * requires the Sail Protocol to deploy kernel + safeModuleEnabler at identical addresses on
165
+ * every chain (deterministic CREATE2 deployment), or a registerExisting() flow that
166
+ * accepts a plain Safe deployed with a chain-agnostic initializer.
167
+ */
168
+ export declare function computeSafeProxyAddress(params: {
169
+ initializer: Hex;
170
+ saltNonce: bigint;
171
+ proxyCreationCode: Hex;
172
+ }): Address;
173
+ /**
174
+ * Derive the salt SailKernel.createAccount actually passes to the factory.
175
+ *
176
+ * The kernel does NOT forward the caller's `saltNonce` directly — it binds it to
177
+ * the deployer (`msg.sender`) and the account principals to prevent address
178
+ * front-running (SailKernel.sol):
179
+ *
180
+ * boundSalt = uint256(keccak256(abi.encode(
181
+ * saltNonce, msg.sender, permissionSigner, manager, feePolicy)))
182
+ *
183
+ * In the standard onboarding flow `deployer === permissionSigner === owner`
184
+ * (the owner's EOA submits createAccount and is also the Safe's permission
185
+ * signer), while `manager` is the agent wallet and `feePolicy` is the chain's
186
+ * StandardFeePolicy.
187
+ */
188
+ export declare function computeKernelBoundSalt(params: {
189
+ saltNonce: bigint;
190
+ /** `msg.sender` of createAccount — the EOA that deploys (the owner). */
191
+ deployer: Address;
192
+ permissionSigner: Address;
193
+ manager: Address;
194
+ feePolicy: Address;
195
+ }): bigint;
196
+ /**
197
+ * Compute the deterministic SMA (Safe) address that SailKernel.createAccount
198
+ * will deploy for the given owner/manager/feePolicy and salt.
199
+ *
200
+ * This is the address `sailor account predict` should show: it applies the
201
+ * kernel's salt binding (`computeKernelBoundSalt`) before the factory's CREATE2
202
+ * formula (`computeSafeProxyAddress`). Because the bound salt mixes in the
203
+ * deployer, permission signer, manager, and fee policy, the address changes if
204
+ * ANY of those change — not just the `initializer`.
205
+ */
206
+ export declare function computeSailSmaAddress(params: {
207
+ initializer: Hex;
208
+ saltNonce: bigint;
209
+ deployer: Address;
210
+ permissionSigner: Address;
211
+ manager: Address;
212
+ feePolicy: Address;
213
+ proxyCreationCode: Hex;
214
+ }): Address;
132
215
  /** ABI-encode the kernel's `setManager(newManager)` call. */
133
216
  export declare function encodeSetManager(newManager: Address): Hex;
134
217
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"safe.d.ts","sourceRoot":"","sources":["../src/safe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,GAAG,EAAsD,MAAM,MAAM,CAAC;AAalG;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBpB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBhB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;EAQvB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,SAAS;;;;CAIZ,CAAC;AAEX;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,GAAG,CAqBN;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,GAAG,CAK9D;AAED,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,OAAO,GAAG,GAAG,CAMzD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE;IACrD,uEAAuE;IACvE,IAAI,EAAE,OAAO,CAAC;IACd,yCAAyC;IACzC,MAAM,EAAE,OAAO,CAAC;IAChB,kDAAkD;IAClD,UAAU,EAAE,OAAO,CAAC;IACpB,mDAAmD;IACnD,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,CAmB7B"}
1
+ {"version":3,"file":"safe.d.ts","sourceRoot":"","sources":["../src/safe.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,GAAG,EAST,MAAM,MAAM,CAAC;AAad;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBpB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBhB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;EAQvB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,SAAS;;;;CAIZ,CAAC;AAEX;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,GAAG,CAqBN;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,GAAG,CAK9D;AAED,sGAAsG;AACtG,eAAO,MAAM,mBAAmB;;;;;;;;;EAQtB,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,WAAW,EAAE,GAAG,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,GAAG,CAAC;CACxB,GAAG,OAAO,CAgBV;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB,GAAG,MAAM,CAgBT;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,WAAW,EAAE,GAAG,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,EAAE,GAAG,CAAC;CACxB,GAAG,OAAO,CAOV;AAED,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,OAAO,GAAG,GAAG,CAMzD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE;IACrD,uEAAuE;IACvE,IAAI,EAAE,OAAO,CAAC;IACd,yCAAyC;IACzC,MAAM,EAAE,OAAO,CAAC;IAChB,kDAAkD;IAClD,UAAU,EAAE,OAAO,CAAC;IACpB,mDAAmD;IACnD,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,CAmB7B"}
@@ -1,4 +1,4 @@
1
- import { encodeFunctionData, encodePacked, pad, zeroAddress } from "viem";
1
+ import { concat, encodeAbiParameters, encodeFunctionData, encodePacked, getCreate2Address, keccak256, pad, zeroAddress, } from "viem";
2
2
  /** Minimal SailKernel ABI fragment for the manager-rotation call. */
3
3
  const setManagerAbi = [
4
4
  {
@@ -121,6 +121,97 @@ export function buildSafeSetupInitializer(params) {
121
121
  export function buildApprovedHashSignature(owner) {
122
122
  return encodePacked(["bytes32", "bytes32", "uint8"], [pad(owner, { size: 32 }), pad("0x", { size: 32 }), 1]);
123
123
  }
124
+ /** ABI for SafeProxyFactory.proxyCreationCode() — pure view returning SafeProxy creation bytecode. */
125
+ export const safeProxyFactoryAbi = [
126
+ {
127
+ type: "function",
128
+ name: "proxyCreationCode",
129
+ stateMutability: "pure",
130
+ inputs: [],
131
+ outputs: [{ name: "", type: "bytes" }],
132
+ },
133
+ ];
134
+ /**
135
+ * Compute the CREATE2 address SafeProxyFactory.createProxyWithNonce() assigns.
136
+ *
137
+ * Factory formula (from SafeProxyFactory source):
138
+ * initCode = proxyCreationCode ++ abi.encode(singleton)
139
+ * salt = keccak256(keccak256(initializer) ++ uint256(saltNonce))
140
+ * deployedAddr = CREATE2(factory, salt, keccak256(initCode))
141
+ *
142
+ * `proxyCreationCode` must be read once from the factory via `safeProxyFactoryAbi`;
143
+ * it is identical on every chain since SAFE_V141.proxyFactory is the same address everywhere.
144
+ *
145
+ * This is the LOW-LEVEL factory primitive: `saltNonce` is the value handed to
146
+ * `createProxyWithNonce` verbatim. When the deployer is SailKernel.createAccount,
147
+ * the kernel does NOT use the caller's nonce directly — it binds it to the
148
+ * deployer + principals first. To predict a Sail SMA address, use
149
+ * `computeSailSmaAddress` (which applies `computeKernelBoundSalt`), NOT this
150
+ * function with the raw nonce.
151
+ *
152
+ * NOTE: the `initializer` encodes chain-specific addresses (kernel, safeModuleEnabler)
153
+ * via `buildSafeSetupInitializer`. Different initializers per chain → different CREATE2 salts
154
+ * → different deployed addresses, even with the same `saltNonce`. Cross-chain same-address
155
+ * requires the Sail Protocol to deploy kernel + safeModuleEnabler at identical addresses on
156
+ * every chain (deterministic CREATE2 deployment), or a registerExisting() flow that
157
+ * accepts a plain Safe deployed with a chain-agnostic initializer.
158
+ */
159
+ export function computeSafeProxyAddress(params) {
160
+ const { initializer, saltNonce, proxyCreationCode } = params;
161
+ const initCodeHash = keccak256(concat([
162
+ proxyCreationCode,
163
+ encodeAbiParameters([{ type: "address" }], [SAFE_V141.singletonL2]),
164
+ ]));
165
+ const salt = keccak256(encodePacked(["bytes32", "uint256"], [keccak256(initializer), saltNonce]));
166
+ return getCreate2Address({
167
+ from: SAFE_V141.proxyFactory,
168
+ salt,
169
+ bytecodeHash: initCodeHash,
170
+ });
171
+ }
172
+ /**
173
+ * Derive the salt SailKernel.createAccount actually passes to the factory.
174
+ *
175
+ * The kernel does NOT forward the caller's `saltNonce` directly — it binds it to
176
+ * the deployer (`msg.sender`) and the account principals to prevent address
177
+ * front-running (SailKernel.sol):
178
+ *
179
+ * boundSalt = uint256(keccak256(abi.encode(
180
+ * saltNonce, msg.sender, permissionSigner, manager, feePolicy)))
181
+ *
182
+ * In the standard onboarding flow `deployer === permissionSigner === owner`
183
+ * (the owner's EOA submits createAccount and is also the Safe's permission
184
+ * signer), while `manager` is the agent wallet and `feePolicy` is the chain's
185
+ * StandardFeePolicy.
186
+ */
187
+ export function computeKernelBoundSalt(params) {
188
+ const { saltNonce, deployer, permissionSigner, manager, feePolicy } = params;
189
+ return BigInt(keccak256(encodeAbiParameters([
190
+ { type: "uint256" },
191
+ { type: "address" },
192
+ { type: "address" },
193
+ { type: "address" },
194
+ { type: "address" },
195
+ ], [saltNonce, deployer, permissionSigner, manager, feePolicy])));
196
+ }
197
+ /**
198
+ * Compute the deterministic SMA (Safe) address that SailKernel.createAccount
199
+ * will deploy for the given owner/manager/feePolicy and salt.
200
+ *
201
+ * This is the address `sailor account predict` should show: it applies the
202
+ * kernel's salt binding (`computeKernelBoundSalt`) before the factory's CREATE2
203
+ * formula (`computeSafeProxyAddress`). Because the bound salt mixes in the
204
+ * deployer, permission signer, manager, and fee policy, the address changes if
205
+ * ANY of those change — not just the `initializer`.
206
+ */
207
+ export function computeSailSmaAddress(params) {
208
+ const boundSalt = computeKernelBoundSalt(params);
209
+ return computeSafeProxyAddress({
210
+ initializer: params.initializer,
211
+ saltNonce: boundSalt,
212
+ proxyCreationCode: params.proxyCreationCode,
213
+ });
214
+ }
124
215
  /** ABI-encode the kernel's `setManager(newManager)` call. */
125
216
  export function encodeSetManager(newManager) {
126
217
  return encodeFunctionData({
@@ -1 +1 @@
1
- {"version":3,"file":"safe.js","sourceRoot":"","sources":["../src/safe.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,kBAAkB,EAAE,YAAY,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAElG,qEAAqE;AACrE,MAAM,aAAa,GAAG;IACpB;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,YAAY;QAClB,eAAe,EAAE,YAAY;QAC7B,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACjD,OAAO,EAAE,EAAE;KACZ;CACO,CAAC;AAEX;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,iBAAiB;QACvB,eAAe,EAAE,SAAS;QAC1B,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;YAC/B,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;YAClC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE;YAC/B,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE;YACpC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE;YACtC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;YACpC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;YACrC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;YACrC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE;YAC3C,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE;SACtC;QACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KAC7C;CACO,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,OAAO;QACb,eAAe,EAAE,YAAY;QAC7B,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;YACtC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE;YACvC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;YAC/B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE;YAC/B,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE;YAC5C,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE;YACzC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;YACpC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE;SAC7C;QACD,OAAO,EAAE,EAAE;KACZ;CACO,CAAC;AAEX;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,QAAQ;QACd,eAAe,EAAE,YAAY;QAC7B,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC7C,OAAO,EAAE,EAAE;KACZ;CACO,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,YAAY,EAAE,4CAA4C;IAC1D,WAAW,EAAE,4CAA4C;IACzD,eAAe,EAAE,4CAA4C;CACrD,CAAC;AAEX;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAMzC;IACC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;QAC1C,GAAG,EAAE,oBAAoB;QACzB,YAAY,EAAE,QAAQ;QACtB,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;KACtB,CAAC,CAAC;IAEH,OAAO,kBAAkB,CAAC;QACxB,GAAG,EAAE,aAAa;QAClB,YAAY,EAAE,OAAO;QACrB,IAAI,EAAE;YACJ,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,SAAS;YAChB,MAAM,CAAC,iBAAiB,EAAE,0BAA0B;YACpD,gBAAgB,EAAE,uBAAuB;YACzC,CAAC,MAAM,CAAC,eAAe,IAAI,SAAS,CAAC,eAAe,CAAY;YAChE,WAAW,EAAE,eAAe;YAC5B,EAAE,EAAE,UAAU;YACd,WAAW,EAAE,kBAAkB;SAChC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,OAAO,YAAY,CACjB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,EAC/B,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CACvD,CAAC;AACJ,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,gBAAgB,CAAC,UAAmB;IAClD,OAAO,kBAAkB,CAAC;QACxB,GAAG,EAAE,aAAa;QAClB,YAAY,EAAE,YAAY;QAC1B,IAAI,EAAE,CAAC,UAAU,CAAC;KACnB,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,8BAA8B,CAAC,MAS9C;IACC,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,kBAAkB,CAAC;QAC9B,GAAG,EAAE,iBAAiB;QACtB,YAAY,EAAE,iBAAiB;QAC/B,IAAI,EAAE;YACJ,MAAM,CAAC,MAAM,EAAE,KAAK;YACpB,EAAE,EAAE,QAAQ;YACZ,SAAS,EAAE,+BAA+B;YAC1C,CAAC,EAAE,kBAAkB;YACrB,EAAE,EAAE,YAAY;YAChB,EAAE,EAAE,UAAU;YACd,EAAE,EAAE,WAAW;YACf,WAAW,EAAE,WAAW;YACxB,WAAW,EAAE,iBAAiB;YAC9B,0BAA0B,CAAC,MAAM,CAAC,KAAK,CAAC;SACzC;KACF,CAAC,CAAC;IACH,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"safe.js","sourceRoot":"","sources":["../src/safe.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,29 @@
1
1
  import type { Address, PermissionTemplate } from "../types.js";
2
- /** Params for SharedAmmLiquidityPermission. */
2
+ /**
3
+ * Params for SharedAMMLiquidityPermission.
4
+ *
5
+ * Matches the on-chain `_applyConfig` decode exactly:
6
+ * abi.decode(params, (address[], address[], uint128, bool, bool, bool, bool, bool))
7
+ * → allowedTargets, allowedTokens, maxAmountPerTokenPerTx,
8
+ * allowMint, allowIncrease, allowDecrease, allowCollect, allowBurn
9
+ */
3
10
  export type AmmLiquidityParams = {
4
- /** Maximum total liquidity value in USD-equivalent (18-decimal WAD). */
5
- maxLiquidityValueUsd: number;
6
- /** Pool addresses the agent may LP into. */
7
- allowedPools: Address[];
8
- /** Protocol identifiers allowed (e.g. ["uniswapV3", "curveV2", "balancer"]). */
9
- allowedProtocols: string[];
10
- /** Whether single-sided deposits are permitted. */
11
- allowSingleSided: boolean;
12
- /** Maximum price range width in basis points (Uni V3 only). */
13
- maxRangeBps?: number;
11
+ /** Position-manager / router addresses the agent may call (UniV3 NPM, Aerodrome, …). */
12
+ allowedTargets: Address[];
13
+ /** Token addresses the agent may provide as liquidity. */
14
+ allowedTokens: Address[];
15
+ /** Maximum amount of any single token per tx, in that token's base units (uint128). */
16
+ maxAmountPerTokenPerTx: bigint;
17
+ /** Allow mint / open-position (and Aerodrome add-liquidity). */
18
+ allowMint: boolean;
19
+ /** Allow increaseLiquidity. */
20
+ allowIncrease: boolean;
21
+ /** Allow decreaseLiquidity (and Aerodrome remove-liquidity). */
22
+ allowDecrease: boolean;
23
+ /** Allow collect (fee withdrawal). */
24
+ allowCollect: boolean;
25
+ /** Allow burn (close position NFT). */
26
+ allowBurn: boolean;
14
27
  };
15
28
  export declare const ammLiquidityTemplate: PermissionTemplate<AmmLiquidityParams>;
16
29
  //# sourceMappingURL=ammLiquidity.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ammLiquidity.d.ts","sourceRoot":"","sources":["../../src/templates/ammLiquidity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAA2B,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAExF,+CAA+C;AAC/C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,wEAAwE;IACxE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,4CAA4C;IAC5C,YAAY,EAAE,OAAO,EAAE,CAAC;IACxB,gFAAgF;IAChF,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,mDAAmD;IACnD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAUF,eAAO,MAAM,oBAAoB,EAAE,kBAAkB,CAAC,kBAAkB,CAuDvE,CAAC"}
1
+ {"version":3,"file":"ammLiquidity.d.ts","sourceRoot":"","sources":["../../src/templates/ammLiquidity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAA2B,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAExF;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,wFAAwF;IACxF,cAAc,EAAE,OAAO,EAAE,CAAC;IAC1B,0DAA0D;IAC1D,aAAa,EAAE,OAAO,EAAE,CAAC;IACzB,uFAAuF;IACvF,sBAAsB,EAAE,MAAM,CAAC;IAC/B,gEAAgE;IAChE,SAAS,EAAE,OAAO,CAAC;IACnB,+BAA+B;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,gEAAgE;IAChE,aAAa,EAAE,OAAO,CAAC;IACvB,sCAAsC;IACtC,YAAY,EAAE,OAAO,CAAC;IACtB,uCAAuC;IACvC,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAaF,eAAO,MAAM,oBAAoB,EAAE,kBAAkB,CAAC,kBAAkB,CAyDvE,CAAC"}
@@ -1,56 +1,64 @@
1
1
  import { decodeAbiParameters, encodeAbiParameters } from "viem";
2
2
  const ABI = [
3
- { name: "maxLiquidityValueUsd", type: "uint256" },
4
- { name: "allowedPools", type: "address[]" },
5
- { name: "allowedProtocols", type: "string[]" },
6
- { name: "allowSingleSided", type: "bool" },
7
- { name: "maxRangeBps", type: "uint256" },
3
+ { name: "allowedTargets", type: "address[]" },
4
+ { name: "allowedTokens", type: "address[]" },
5
+ { name: "maxAmountPerTokenPerTx", type: "uint128" },
6
+ { name: "allowMint", type: "bool" },
7
+ { name: "allowIncrease", type: "bool" },
8
+ { name: "allowDecrease", type: "bool" },
9
+ { name: "allowCollect", type: "bool" },
10
+ { name: "allowBurn", type: "bool" },
8
11
  ];
9
12
  export const ammLiquidityTemplate = {
10
- name: "SharedAmmLiquidityPermission",
13
+ name: "SharedAMMLiquidityPermission",
11
14
  address: "0x0000000000000000000000000000000000000000",
12
15
  encoder: {
13
16
  encode(params) {
14
17
  return encodeAbiParameters(ABI, [
15
- BigInt(Math.round(params.maxLiquidityValueUsd)),
16
- params.allowedPools,
17
- params.allowedProtocols,
18
- params.allowSingleSided,
19
- BigInt(params.maxRangeBps ?? 0),
18
+ params.allowedTargets,
19
+ params.allowedTokens,
20
+ params.maxAmountPerTokenPerTx,
21
+ params.allowMint,
22
+ params.allowIncrease,
23
+ params.allowDecrease,
24
+ params.allowCollect,
25
+ params.allowBurn,
20
26
  ]);
21
27
  },
22
28
  decode(data) {
23
29
  const decoded = decodeAbiParameters(ABI, data);
24
- const maxRangeBps = Number(decoded[4]);
25
30
  return {
26
- maxLiquidityValueUsd: Number(decoded[0]),
27
- allowedPools: [...decoded[1]],
28
- allowedProtocols: [...decoded[2]],
29
- allowSingleSided: decoded[3],
30
- ...(maxRangeBps > 0 ? { maxRangeBps } : {}),
31
+ allowedTargets: [...decoded[0]],
32
+ allowedTokens: [...decoded[1]],
33
+ maxAmountPerTokenPerTx: decoded[2],
34
+ allowMint: decoded[3],
35
+ allowIncrease: decoded[4],
36
+ allowDecrease: decoded[5],
37
+ allowCollect: decoded[6],
38
+ allowBurn: decoded[7],
31
39
  };
32
40
  },
33
41
  },
34
42
  explainer: {
35
43
  explain(params) {
36
44
  const warnings = [];
37
- if (params.allowSingleSided) {
38
- warnings.push("Single-sided deposits permittedmay result in immediate impermanent loss");
45
+ if (params.allowedTargets.length === 0) {
46
+ warnings.push("No targets specifiedall liquidity operations will be blocked");
39
47
  }
40
- if (params.maxRangeBps !== undefined && params.maxRangeBps > 5000) {
41
- warnings.push(`Wide price range allowed: ±${params.maxRangeBps / 100}%`);
42
- }
43
- const rangeNote = params.maxRangeBps !== undefined
44
- ? `Maximum price range (Uni V3): ±${params.maxRangeBps / 100}%`
45
- : null;
48
+ const ops = [
49
+ params.allowMint && "mint",
50
+ params.allowIncrease && "increase",
51
+ params.allowDecrease && "decrease",
52
+ params.allowCollect && "collect",
53
+ params.allowBurn && "burn",
54
+ ].filter(Boolean);
46
55
  return {
47
- templateName: "SharedAmmLiquidityPermission",
56
+ templateName: "SharedAMMLiquidityPermission",
48
57
  humanReadable: [
49
- `Maximum liquidity value: $${params.maxLiquidityValueUsd.toLocaleString()} USD`,
50
- `Allowed protocols: ${params.allowedProtocols.join(", ")}`,
51
- `Allowed pools (${params.allowedPools.length}): ${params.allowedPools.join(", ")}`,
52
- `Single-sided deposits: ${params.allowSingleSided ? "allowed" : "not allowed"}`,
53
- ...(rangeNote ? [rangeNote] : []),
58
+ `Maximum amount per token per tx: ${params.maxAmountPerTokenPerTx.toString()} (base units)`,
59
+ `Allowed targets (${params.allowedTargets.length}): ${params.allowedTargets.join(", ")}`,
60
+ `Allowed tokens: ${params.allowedTokens.join(", ")}`,
61
+ `Enabled operations: ${ops.length ? ops.join(", ") : "none"}`,
54
62
  ],
55
63
  warnings,
56
64
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ammLiquidity.js","sourceRoot":"","sources":["../../src/templates/ammLiquidity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ammLiquidity.js","sourceRoot":"","sources":["../../src/templates/ammLiquidity.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,28 @@
1
- import type { Address, PermissionTemplate } from "../types.js";
2
- /** Params for SharedApproveAndCallBatchPermission. */
1
+ import type { Address, Hex, PermissionTemplate } from "../types.js";
2
+ /**
3
+ * Params for SharedApproveAndCallBatchPermission.
4
+ *
5
+ * Matches the on-chain `_applyConfig` decode exactly:
6
+ * abi.decode(params, (Config))
7
+ * where Config is the tuple
8
+ * (address[] tokens, address[] spenders, address[] consumingTargets,
9
+ * bytes4[] consumingSelectors, uint256[] maxApprovalAmounts, bool requireAmountMatch)
10
+ *
11
+ * Note: the contract encodes a SINGLE struct, so the blob is one top-level tuple.
12
+ */
3
13
  export type ApproveAndCallBatchParams = {
4
- /** Spender addresses that may receive ERC-20 approvals. */
5
- allowedSpenders: Address[];
6
- /** Token addresses for which approvals may be granted. */
7
- allowedTokens: Address[];
8
- /** Maximum total approval value per batch in USD-equivalent (18-decimal WAD). */
9
- maxApprovalValueUsd: number;
10
- /** Whether infinite (max-uint) approvals are permitted. */
11
- allowInfiniteApprovals: boolean;
14
+ /** Allowlisted ERC-20 tokens that may be approved. Index-parallel with `maxApprovalAmounts`. */
15
+ tokens: Address[];
16
+ /** Allowlisted spenders that may receive the allowance. */
17
+ spenders: Address[];
18
+ /** Allowlisted consuming-call targets (often the same as spenders). */
19
+ consumingTargets: Address[];
20
+ /** Allowlisted selectors for the consuming call (4-byte hex, e.g. "0x095ea7b3"). */
21
+ consumingSelectors: Hex[];
22
+ /** Max approve amount per token, index-parallel with `tokens`. */
23
+ maxApprovalAmounts: bigint[];
24
+ /** When true, the consuming call's leading uint256 arg must equal the approved amount. */
25
+ requireAmountMatch: boolean;
12
26
  };
13
27
  export declare const approveAndCallBatchTemplate: PermissionTemplate<ApproveAndCallBatchParams>;
14
28
  //# sourceMappingURL=approveAndCallBatch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"approveAndCallBatch.d.ts","sourceRoot":"","sources":["../../src/templates/approveAndCallBatch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAA2B,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAExF,sDAAsD;AACtD,MAAM,MAAM,yBAAyB,GAAG;IACtC,2DAA2D;IAC3D,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,0DAA0D;IAC1D,aAAa,EAAE,OAAO,EAAE,CAAC;IACzB,iFAAiF;IACjF,mBAAmB,EAAE,MAAM,CAAC;IAC5B,2DAA2D;IAC3D,sBAAsB,EAAE,OAAO,CAAC;CACjC,CAAC;AASF,eAAO,MAAM,2BAA2B,EAAE,kBAAkB,CAAC,yBAAyB,CAgDrF,CAAC"}
1
+ {"version":3,"file":"approveAndCallBatch.d.ts","sourceRoot":"","sources":["../../src/templates/approveAndCallBatch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAsB,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAExF;;;;;;;;;;GAUG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,gGAAgG;IAChG,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,2DAA2D;IAC3D,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,uEAAuE;IACvE,gBAAgB,EAAE,OAAO,EAAE,CAAC;IAC5B,oFAAoF;IACpF,kBAAkB,EAAE,GAAG,EAAE,CAAC;IAC1B,kEAAkE;IAClE,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,0FAA0F;IAC1F,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAaF,eAAO,MAAM,2BAA2B,EAAE,kBAAkB,CAAC,yBAAyB,CA4DrF,CAAC"}
@@ -1,49 +1,62 @@
1
1
  import { decodeAbiParameters, encodeAbiParameters } from "viem";
2
- const ABI = [
3
- { name: "allowedSpenders", type: "address[]" },
4
- { name: "allowedTokens", type: "address[]" },
5
- { name: "maxApprovalValueUsd", type: "uint256" },
6
- { name: "allowInfiniteApprovals", type: "bool" },
2
+ const CONFIG_COMPONENTS = [
3
+ { name: "tokens", type: "address[]" },
4
+ { name: "spenders", type: "address[]" },
5
+ { name: "consumingTargets", type: "address[]" },
6
+ { name: "consumingSelectors", type: "bytes4[]" },
7
+ { name: "maxApprovalAmounts", type: "uint256[]" },
8
+ { name: "requireAmountMatch", type: "bool" },
7
9
  ];
10
+ const ABI = [{ name: "config", type: "tuple", components: CONFIG_COMPONENTS }];
8
11
  export const approveAndCallBatchTemplate = {
9
12
  name: "SharedApproveAndCallBatchPermission",
10
13
  address: "0x0000000000000000000000000000000000000000",
11
14
  encoder: {
12
15
  encode(params) {
13
16
  return encodeAbiParameters(ABI, [
14
- params.allowedSpenders,
15
- params.allowedTokens,
16
- BigInt(Math.round(params.maxApprovalValueUsd)),
17
- params.allowInfiniteApprovals,
17
+ {
18
+ tokens: params.tokens,
19
+ spenders: params.spenders,
20
+ consumingTargets: params.consumingTargets,
21
+ consumingSelectors: params.consumingSelectors,
22
+ maxApprovalAmounts: params.maxApprovalAmounts,
23
+ requireAmountMatch: params.requireAmountMatch,
24
+ },
18
25
  ]);
19
26
  },
20
27
  decode(data) {
21
- const decoded = decodeAbiParameters(ABI, data);
28
+ const [config] = decodeAbiParameters(ABI, data);
22
29
  return {
23
- allowedSpenders: [...decoded[0]],
24
- allowedTokens: [...decoded[1]],
25
- maxApprovalValueUsd: Number(decoded[2]),
26
- allowInfiniteApprovals: decoded[3],
30
+ tokens: [...config.tokens],
31
+ spenders: [...config.spenders],
32
+ consumingTargets: [...config.consumingTargets],
33
+ consumingSelectors: [...config.consumingSelectors],
34
+ maxApprovalAmounts: [...config.maxApprovalAmounts],
35
+ requireAmountMatch: config.requireAmountMatch,
27
36
  };
28
37
  },
29
38
  },
30
39
  explainer: {
31
40
  explain(params) {
32
41
  const warnings = [];
33
- if (params.allowInfiniteApprovals) {
34
- warnings.push("Infinite approvals enabled spenders may pull tokens beyond the per-batch cap");
42
+ if (params.tokens.length !== params.maxApprovalAmounts.length) {
43
+ warnings.push("tokens and maxApprovalAmounts length mismatch configuration will revert on-chain");
35
44
  }
36
- if (params.allowedSpenders.length === 0) {
37
- warnings.push("No spenders specifiedall approvals will be blocked");
45
+ if (params.spenders.length === 0 || params.tokens.length === 0) {
46
+ warnings.push("Empty token or spender allowlist configuration will revert on-chain");
47
+ }
48
+ if (!params.requireAmountMatch) {
49
+ warnings.push("Amount-match disabled — the consuming call may move less than the approved amount");
38
50
  }
39
51
  return {
40
52
  templateName: "SharedApproveAndCallBatchPermission",
41
53
  humanReadable: [
42
- `ERC-20 approvals restricted to ${params.allowedSpenders.length} approved spender(s)`,
43
- `Allowed tokens: ${params.allowedTokens.join(", ")}`,
44
- `Maximum approval value per batch: $${params.maxApprovalValueUsd.toLocaleString()} USD`,
45
- `Infinite approvals: ${params.allowInfiniteApprovals ? "allowed" : "not allowed"}`,
46
- `Approved spenders: ${params.allowedSpenders.join(", ")}`,
54
+ `Approvable tokens (${params.tokens.length}): ${params.tokens.join(", ")}`,
55
+ `Approved spenders: ${params.spenders.join(", ")}`,
56
+ `Consuming targets: ${params.consumingTargets.join(", ")}`,
57
+ `Consuming selectors: ${params.consumingSelectors.join(", ")}`,
58
+ `Per-token approval caps: ${params.maxApprovalAmounts.map((a) => a.toString()).join(", ")}`,
59
+ `Require amount match: ${params.requireAmountMatch ? "yes" : "no"}`,
47
60
  ],
48
61
  warnings,
49
62
  };