@folks-finance/xchain-sdk 0.0.1

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 (346) hide show
  1. package/README.md +1 -0
  2. package/dist/chains/evm/common/constants/abi/ccip-data-adapter-abi.d.ts +796 -0
  3. package/dist/chains/evm/common/constants/abi/ccip-data-adapter-abi.js +614 -0
  4. package/dist/chains/evm/common/constants/abi/ccip-data-adapter-abi.js.map +1 -0
  5. package/dist/chains/evm/common/constants/abi/erc-20-abi.d.ts +235 -0
  6. package/dist/chains/evm/common/constants/abi/erc-20-abi.js +157 -0
  7. package/dist/chains/evm/common/constants/abi/erc-20-abi.js.map +1 -0
  8. package/dist/chains/evm/common/constants/abi/wormhole-data-adapter-abi.d.ts +807 -0
  9. package/dist/chains/evm/common/constants/abi/wormhole-data-adapter-abi.js +621 -0
  10. package/dist/chains/evm/common/constants/abi/wormhole-data-adapter-abi.js.map +1 -0
  11. package/dist/chains/evm/common/constants/chain.d.ts +2349 -0
  12. package/dist/chains/evm/common/constants/chain.js +45 -0
  13. package/dist/chains/evm/common/constants/chain.js.map +1 -0
  14. package/dist/chains/evm/common/constants/contract.d.ts +2 -0
  15. package/dist/chains/evm/common/constants/contract.js +6 -0
  16. package/dist/chains/evm/common/constants/contract.js.map +1 -0
  17. package/dist/chains/evm/common/constants/tokens.d.ts +6 -0
  18. package/dist/chains/evm/common/constants/tokens.js +33 -0
  19. package/dist/chains/evm/common/constants/tokens.js.map +1 -0
  20. package/dist/chains/evm/common/types/chain.d.ts +10 -0
  21. package/dist/chains/evm/common/types/chain.js +2 -0
  22. package/dist/chains/evm/common/types/chain.js.map +1 -0
  23. package/dist/chains/evm/common/types/contract.d.ts +8 -0
  24. package/dist/chains/evm/common/types/contract.js +2 -0
  25. package/dist/chains/evm/common/types/contract.js.map +1 -0
  26. package/dist/chains/evm/common/types/gmp.d.ts +14 -0
  27. package/dist/chains/evm/common/types/gmp.js +2 -0
  28. package/dist/chains/evm/common/types/gmp.js.map +1 -0
  29. package/dist/chains/evm/common/types/index.d.ts +3 -0
  30. package/dist/chains/evm/common/types/index.js +4 -0
  31. package/dist/chains/evm/common/types/index.js.map +1 -0
  32. package/dist/chains/evm/common/types/module.d.ts +66 -0
  33. package/dist/chains/evm/common/types/module.js +2 -0
  34. package/dist/chains/evm/common/types/module.js.map +1 -0
  35. package/dist/chains/evm/common/types/tokens.d.ts +28 -0
  36. package/dist/chains/evm/common/types/tokens.js +2 -0
  37. package/dist/chains/evm/common/types/tokens.js.map +1 -0
  38. package/dist/chains/evm/common/utils/chain.d.ts +6 -0
  39. package/dist/chains/evm/common/utils/chain.js +16 -0
  40. package/dist/chains/evm/common/utils/chain.js.map +1 -0
  41. package/dist/chains/evm/common/utils/contract.d.ts +6006 -0
  42. package/dist/chains/evm/common/utils/contract.js +54 -0
  43. package/dist/chains/evm/common/utils/contract.js.map +1 -0
  44. package/dist/chains/evm/common/utils/gmp.d.ts +4 -0
  45. package/dist/chains/evm/common/utils/gmp.js +13 -0
  46. package/dist/chains/evm/common/utils/gmp.js.map +1 -0
  47. package/dist/chains/evm/common/utils/message.d.ts +22 -0
  48. package/dist/chains/evm/common/utils/message.js +398 -0
  49. package/dist/chains/evm/common/utils/message.js.map +1 -0
  50. package/dist/chains/evm/common/utils/provider.d.ts +5 -0
  51. package/dist/chains/evm/common/utils/provider.js +24 -0
  52. package/dist/chains/evm/common/utils/provider.js.map +1 -0
  53. package/dist/chains/evm/common/utils/tokens.d.ts +10 -0
  54. package/dist/chains/evm/common/utils/tokens.js +37 -0
  55. package/dist/chains/evm/common/utils/tokens.js.map +1 -0
  56. package/dist/chains/evm/hub/constants/abi/account-manager-abi.d.ts +907 -0
  57. package/dist/chains/evm/hub/constants/abi/account-manager-abi.js +686 -0
  58. package/dist/chains/evm/hub/constants/abi/account-manager-abi.js.map +1 -0
  59. package/dist/chains/evm/hub/constants/abi/bridge-router-hub-abi.d.ts +969 -0
  60. package/dist/chains/evm/hub/constants/abi/bridge-router-hub-abi.js +764 -0
  61. package/dist/chains/evm/hub/constants/abi/bridge-router-hub-abi.js.map +1 -0
  62. package/dist/chains/evm/hub/constants/abi/hub-abi.d.ts +285 -0
  63. package/dist/chains/evm/hub/constants/abi/hub-abi.js +187 -0
  64. package/dist/chains/evm/hub/constants/abi/hub-abi.js.map +1 -0
  65. package/dist/chains/evm/hub/constants/abi/hub-pool-abi.d.ts +1742 -0
  66. package/dist/chains/evm/hub/constants/abi/hub-pool-abi.js +1346 -0
  67. package/dist/chains/evm/hub/constants/abi/hub-pool-abi.js.map +1 -0
  68. package/dist/chains/evm/hub/constants/abi/loan-manager-abi.d.ts +1559 -0
  69. package/dist/chains/evm/hub/constants/abi/loan-manager-abi.js +1040 -0
  70. package/dist/chains/evm/hub/constants/abi/loan-manager-abi.js.map +1 -0
  71. package/dist/chains/evm/hub/constants/abi/oracle-manager-abi.d.ts +495 -0
  72. package/dist/chains/evm/hub/constants/abi/oracle-manager-abi.js +389 -0
  73. package/dist/chains/evm/hub/constants/abi/oracle-manager-abi.js.map +1 -0
  74. package/dist/chains/evm/hub/constants/chain.d.ts +3 -0
  75. package/dist/chains/evm/hub/constants/chain.js +96 -0
  76. package/dist/chains/evm/hub/constants/chain.js.map +1 -0
  77. package/dist/chains/evm/hub/modules/folks-hub-account.d.ts +15 -0
  78. package/dist/chains/evm/hub/modules/folks-hub-account.js +98 -0
  79. package/dist/chains/evm/hub/modules/folks-hub-account.js.map +1 -0
  80. package/dist/chains/evm/hub/modules/folks-hub-gmp.d.ts +14 -0
  81. package/dist/chains/evm/hub/modules/folks-hub-gmp.js +57 -0
  82. package/dist/chains/evm/hub/modules/folks-hub-gmp.js.map +1 -0
  83. package/dist/chains/evm/hub/modules/folks-hub-loan.d.ts +25 -0
  84. package/dist/chains/evm/hub/modules/folks-hub-loan.js +397 -0
  85. package/dist/chains/evm/hub/modules/folks-hub-loan.js.map +1 -0
  86. package/dist/chains/evm/hub/modules/folks-hub-oracle.d.ts +5 -0
  87. package/dist/chains/evm/hub/modules/folks-hub-oracle.js +24 -0
  88. package/dist/chains/evm/hub/modules/folks-hub-oracle.js.map +1 -0
  89. package/dist/chains/evm/hub/modules/folks-hub-pool.d.ts +5 -0
  90. package/dist/chains/evm/hub/modules/folks-hub-pool.js +114 -0
  91. package/dist/chains/evm/hub/modules/folks-hub-pool.js.map +1 -0
  92. package/dist/chains/evm/hub/modules/index.d.ts +5 -0
  93. package/dist/chains/evm/hub/modules/index.js +6 -0
  94. package/dist/chains/evm/hub/modules/index.js.map +1 -0
  95. package/dist/chains/evm/hub/types/account.d.ts +23 -0
  96. package/dist/chains/evm/hub/types/account.js +2 -0
  97. package/dist/chains/evm/hub/types/account.js.map +1 -0
  98. package/dist/chains/evm/hub/types/chain.d.ts +15 -0
  99. package/dist/chains/evm/hub/types/chain.js +2 -0
  100. package/dist/chains/evm/hub/types/chain.js.map +1 -0
  101. package/dist/chains/evm/hub/types/loan.d.ts +126 -0
  102. package/dist/chains/evm/hub/types/loan.js +9 -0
  103. package/dist/chains/evm/hub/types/loan.js.map +1 -0
  104. package/dist/chains/evm/hub/types/oracle.d.ts +4 -0
  105. package/dist/chains/evm/hub/types/oracle.js +2 -0
  106. package/dist/chains/evm/hub/types/oracle.js.map +1 -0
  107. package/dist/chains/evm/hub/types/pool.d.ts +60 -0
  108. package/dist/chains/evm/hub/types/pool.js +2 -0
  109. package/dist/chains/evm/hub/types/pool.js.map +1 -0
  110. package/dist/chains/evm/hub/types/token.d.ts +9 -0
  111. package/dist/chains/evm/hub/types/token.js +2 -0
  112. package/dist/chains/evm/hub/types/token.js.map +1 -0
  113. package/dist/chains/evm/hub/utils/chain.d.ts +13 -0
  114. package/dist/chains/evm/hub/utils/chain.js +29 -0
  115. package/dist/chains/evm/hub/utils/chain.js.map +1 -0
  116. package/dist/chains/evm/hub/utils/contract.d.ts +17 -0
  117. package/dist/chains/evm/hub/utils/contract.js +52 -0
  118. package/dist/chains/evm/hub/utils/contract.js.map +1 -0
  119. package/dist/chains/evm/hub/utils/events.d.ts +24 -0
  120. package/dist/chains/evm/hub/utils/events.js +97 -0
  121. package/dist/chains/evm/hub/utils/events.js.map +1 -0
  122. package/dist/chains/evm/hub/utils/loan.d.ts +4 -0
  123. package/dist/chains/evm/hub/utils/loan.js +36 -0
  124. package/dist/chains/evm/hub/utils/loan.js.map +1 -0
  125. package/dist/chains/evm/spoke/constants/abi/bridge-router-spoke-abi.d.ts +951 -0
  126. package/dist/chains/evm/spoke/constants/abi/bridge-router-spoke-abi.js +754 -0
  127. package/dist/chains/evm/spoke/constants/abi/bridge-router-spoke-abi.js.map +1 -0
  128. package/dist/chains/evm/spoke/constants/abi/spoke-common-abi.d.ts +1101 -0
  129. package/dist/chains/evm/spoke/constants/abi/spoke-common-abi.js +710 -0
  130. package/dist/chains/evm/spoke/constants/abi/spoke-common-abi.js.map +1 -0
  131. package/dist/chains/evm/spoke/constants/abi/spoke-token-abi.d.ts +882 -0
  132. package/dist/chains/evm/spoke/constants/abi/spoke-token-abi.js +643 -0
  133. package/dist/chains/evm/spoke/constants/abi/spoke-token-abi.js.map +1 -0
  134. package/dist/chains/evm/spoke/modules/folks-evm-account.d.ts +18 -0
  135. package/dist/chains/evm/spoke/modules/folks-evm-account.js +119 -0
  136. package/dist/chains/evm/spoke/modules/folks-evm-account.js.map +1 -0
  137. package/dist/chains/evm/spoke/modules/folks-evm-gmp.d.ts +14 -0
  138. package/dist/chains/evm/spoke/modules/folks-evm-gmp.js +57 -0
  139. package/dist/chains/evm/spoke/modules/folks-evm-gmp.js.map +1 -0
  140. package/dist/chains/evm/spoke/modules/folks-evm-loan.d.ts +39 -0
  141. package/dist/chains/evm/spoke/modules/folks-evm-loan.js +396 -0
  142. package/dist/chains/evm/spoke/modules/folks-evm-loan.js.map +1 -0
  143. package/dist/chains/evm/spoke/modules/index.d.ts +3 -0
  144. package/dist/chains/evm/spoke/modules/index.js +4 -0
  145. package/dist/chains/evm/spoke/modules/index.js.map +1 -0
  146. package/dist/chains/evm/spoke/types/pool.d.ts +7 -0
  147. package/dist/chains/evm/spoke/types/pool.js +2 -0
  148. package/dist/chains/evm/spoke/types/pool.js.map +1 -0
  149. package/dist/chains/evm/spoke/utils/contract.d.ts +12 -0
  150. package/dist/chains/evm/spoke/utils/contract.js +28 -0
  151. package/dist/chains/evm/spoke/utils/contract.js.map +1 -0
  152. package/dist/common/constants/adapter.d.ts +4 -0
  153. package/dist/common/constants/adapter.js +5 -0
  154. package/dist/common/constants/adapter.js.map +1 -0
  155. package/dist/common/constants/bytes.d.ts +5 -0
  156. package/dist/common/constants/bytes.js +6 -0
  157. package/dist/common/constants/bytes.js.map +1 -0
  158. package/dist/common/constants/chain.d.ts +15 -0
  159. package/dist/common/constants/chain.js +152 -0
  160. package/dist/common/constants/chain.js.map +1 -0
  161. package/dist/common/constants/gmp.d.ts +4 -0
  162. package/dist/common/constants/gmp.js +32 -0
  163. package/dist/common/constants/gmp.js.map +1 -0
  164. package/dist/common/constants/lending.d.ts +1 -0
  165. package/dist/common/constants/lending.js +3 -0
  166. package/dist/common/constants/lending.js.map +1 -0
  167. package/dist/common/constants/message.d.ts +4 -0
  168. package/dist/common/constants/message.js +5 -0
  169. package/dist/common/constants/message.js.map +1 -0
  170. package/dist/common/constants/pool.d.ts +8 -0
  171. package/dist/common/constants/pool.js +10 -0
  172. package/dist/common/constants/pool.js.map +1 -0
  173. package/dist/common/constants/token.d.ts +2 -0
  174. package/dist/common/constants/token.js +3 -0
  175. package/dist/common/constants/token.js.map +1 -0
  176. package/dist/common/types/adapter.d.ts +30 -0
  177. package/dist/common/types/adapter.js +7 -0
  178. package/dist/common/types/adapter.js.map +1 -0
  179. package/dist/common/types/address.d.ts +9 -0
  180. package/dist/common/types/address.js +2 -0
  181. package/dist/common/types/address.js.map +1 -0
  182. package/dist/common/types/brand.d.ts +6 -0
  183. package/dist/common/types/brand.js +2 -0
  184. package/dist/common/types/brand.js.map +1 -0
  185. package/dist/common/types/chain.d.ts +29 -0
  186. package/dist/common/types/chain.js +10 -0
  187. package/dist/common/types/chain.js.map +1 -0
  188. package/dist/common/types/core.d.ts +28 -0
  189. package/dist/common/types/core.js +2 -0
  190. package/dist/common/types/core.js.map +1 -0
  191. package/dist/common/types/gmp.d.ts +17 -0
  192. package/dist/common/types/gmp.js +6 -0
  193. package/dist/common/types/gmp.js.map +1 -0
  194. package/dist/common/types/lending.d.ts +4 -0
  195. package/dist/common/types/lending.js +2 -0
  196. package/dist/common/types/lending.js.map +1 -0
  197. package/dist/common/types/message.d.ts +239 -0
  198. package/dist/common/types/message.js +33 -0
  199. package/dist/common/types/message.js.map +1 -0
  200. package/dist/common/types/module.d.ts +21 -0
  201. package/dist/common/types/module.js +6 -0
  202. package/dist/common/types/module.js.map +1 -0
  203. package/dist/common/types/token.d.ts +42 -0
  204. package/dist/common/types/token.js +15 -0
  205. package/dist/common/types/token.js.map +1 -0
  206. package/dist/common/utils/adapter.d.ts +11 -0
  207. package/dist/common/utils/adapter.js +63 -0
  208. package/dist/common/utils/adapter.js.map +1 -0
  209. package/dist/common/utils/address.d.ts +8 -0
  210. package/dist/common/utils/address.js +35 -0
  211. package/dist/common/utils/address.js.map +1 -0
  212. package/dist/common/utils/bytes.d.ts +9 -0
  213. package/dist/common/utils/bytes.js +34 -0
  214. package/dist/common/utils/bytes.js.map +1 -0
  215. package/dist/common/utils/chain.d.ts +19 -0
  216. package/dist/common/utils/chain.js +74 -0
  217. package/dist/common/utils/chain.js.map +1 -0
  218. package/dist/common/utils/formulae.d.ts +15 -0
  219. package/dist/common/utils/formulae.js +77 -0
  220. package/dist/common/utils/formulae.js.map +1 -0
  221. package/dist/common/utils/gmp.d.ts +4 -0
  222. package/dist/common/utils/gmp.js +14 -0
  223. package/dist/common/utils/gmp.js.map +1 -0
  224. package/dist/common/utils/math-lib.d.ts +9 -0
  225. package/dist/common/utils/math-lib.js +38 -0
  226. package/dist/common/utils/math-lib.js.map +1 -0
  227. package/dist/common/utils/messages.d.ts +7 -0
  228. package/dist/common/utils/messages.js +93 -0
  229. package/dist/common/utils/messages.js.map +1 -0
  230. package/dist/common/utils/token.d.ts +2 -0
  231. package/dist/common/utils/token.js +5 -0
  232. package/dist/common/utils/token.js.map +1 -0
  233. package/dist/index.d.ts +30 -0
  234. package/dist/index.js +38 -0
  235. package/dist/index.js.map +1 -0
  236. package/dist/utils/exhaustive-check.d.ts +1 -0
  237. package/dist/utils/exhaustive-check.js +4 -0
  238. package/dist/utils/exhaustive-check.js.map +1 -0
  239. package/dist/xchain/core/folks-core.d.ts +24 -0
  240. package/dist/xchain/core/folks-core.js +100 -0
  241. package/dist/xchain/core/folks-core.js.map +1 -0
  242. package/dist/xchain/modules/folks-account.d.ts +30 -0
  243. package/dist/xchain/modules/folks-account.js +205 -0
  244. package/dist/xchain/modules/folks-account.js.map +1 -0
  245. package/dist/xchain/modules/folks-gmp.d.ts +12 -0
  246. package/dist/xchain/modules/folks-gmp.js +53 -0
  247. package/dist/xchain/modules/folks-gmp.js.map +1 -0
  248. package/dist/xchain/modules/folks-loan.d.ts +68 -0
  249. package/dist/xchain/modules/folks-loan.js +598 -0
  250. package/dist/xchain/modules/folks-loan.js.map +1 -0
  251. package/dist/xchain/modules/folks-oracle.d.ts +4 -0
  252. package/dist/xchain/modules/folks-oracle.js +11 -0
  253. package/dist/xchain/modules/folks-oracle.js.map +1 -0
  254. package/dist/xchain/modules/folks-pool.d.ts +5 -0
  255. package/dist/xchain/modules/folks-pool.js +8 -0
  256. package/dist/xchain/modules/folks-pool.js.map +1 -0
  257. package/dist/xchain/modules/index.d.ts +5 -0
  258. package/dist/xchain/modules/index.js +6 -0
  259. package/dist/xchain/modules/index.js.map +1 -0
  260. package/package.json +79 -0
  261. package/src/chains/evm/common/constants/abi/ccip-data-adapter-abi.ts +613 -0
  262. package/src/chains/evm/common/constants/abi/erc-20-abi.ts +156 -0
  263. package/src/chains/evm/common/constants/abi/wormhole-data-adapter-abi.ts +620 -0
  264. package/src/chains/evm/common/constants/chain.ts +56 -0
  265. package/src/chains/evm/common/constants/contract.ts +7 -0
  266. package/src/chains/evm/common/constants/tokens.ts +39 -0
  267. package/src/chains/evm/common/types/chain.ts +23 -0
  268. package/src/chains/evm/common/types/contract.ts +7 -0
  269. package/src/chains/evm/common/types/gmp.ts +15 -0
  270. package/src/chains/evm/common/types/index.ts +3 -0
  271. package/src/chains/evm/common/types/module.ts +85 -0
  272. package/src/chains/evm/common/types/tokens.ts +31 -0
  273. package/src/chains/evm/common/utils/chain.ts +20 -0
  274. package/src/chains/evm/common/utils/contract.ts +84 -0
  275. package/src/chains/evm/common/utils/gmp.ts +24 -0
  276. package/src/chains/evm/common/utils/message.ts +496 -0
  277. package/src/chains/evm/common/utils/provider.ts +32 -0
  278. package/src/chains/evm/common/utils/tokens.ts +52 -0
  279. package/src/chains/evm/hub/constants/abi/account-manager-abi.ts +685 -0
  280. package/src/chains/evm/hub/constants/abi/bridge-router-hub-abi.ts +763 -0
  281. package/src/chains/evm/hub/constants/abi/hub-abi.ts +186 -0
  282. package/src/chains/evm/hub/constants/abi/hub-pool-abi.ts +1345 -0
  283. package/src/chains/evm/hub/constants/abi/loan-manager-abi.ts +1039 -0
  284. package/src/chains/evm/hub/constants/abi/oracle-manager-abi.ts +388 -0
  285. package/src/chains/evm/hub/constants/chain.ts +130 -0
  286. package/src/chains/evm/hub/modules/folks-hub-account.ts +137 -0
  287. package/src/chains/evm/hub/modules/folks-hub-gmp.ts +105 -0
  288. package/src/chains/evm/hub/modules/folks-hub-loan.ts +603 -0
  289. package/src/chains/evm/hub/modules/folks-hub-oracle.ts +38 -0
  290. package/src/chains/evm/hub/modules/folks-hub-pool.ts +171 -0
  291. package/src/chains/evm/hub/modules/index.ts +5 -0
  292. package/src/chains/evm/hub/types/account.ts +27 -0
  293. package/src/chains/evm/hub/types/chain.ts +16 -0
  294. package/src/chains/evm/hub/types/loan.ts +147 -0
  295. package/src/chains/evm/hub/types/oracle.ts +6 -0
  296. package/src/chains/evm/hub/types/pool.ts +66 -0
  297. package/src/chains/evm/hub/types/token.ts +10 -0
  298. package/src/chains/evm/hub/utils/chain.ts +41 -0
  299. package/src/chains/evm/hub/utils/contract.ts +98 -0
  300. package/src/chains/evm/hub/utils/events.ts +112 -0
  301. package/src/chains/evm/hub/utils/loan.ts +60 -0
  302. package/src/chains/evm/spoke/constants/abi/bridge-router-spoke-abi.ts +753 -0
  303. package/src/chains/evm/spoke/constants/abi/spoke-common-abi.ts +709 -0
  304. package/src/chains/evm/spoke/constants/abi/spoke-token-abi.ts +642 -0
  305. package/src/chains/evm/spoke/modules/folks-evm-account.ts +228 -0
  306. package/src/chains/evm/spoke/modules/folks-evm-gmp.ts +105 -0
  307. package/src/chains/evm/spoke/modules/folks-evm-loan.ts +721 -0
  308. package/src/chains/evm/spoke/modules/index.ts +3 -0
  309. package/src/chains/evm/spoke/types/pool.ts +7 -0
  310. package/src/chains/evm/spoke/utils/contract.ts +74 -0
  311. package/src/common/constants/adapter.ts +5 -0
  312. package/src/common/constants/bytes.ts +6 -0
  313. package/src/common/constants/chain.ts +227 -0
  314. package/src/common/constants/gmp.ts +38 -0
  315. package/src/common/constants/lending.ts +3 -0
  316. package/src/common/constants/message.ts +4 -0
  317. package/src/common/constants/pool.ts +11 -0
  318. package/src/common/constants/token.ts +3 -0
  319. package/src/common/types/adapter.ts +38 -0
  320. package/src/common/types/address.ts +11 -0
  321. package/src/common/types/brand.ts +3 -0
  322. package/src/common/types/chain.ts +35 -0
  323. package/src/common/types/core.ts +31 -0
  324. package/src/common/types/gmp.ts +22 -0
  325. package/src/common/types/lending.ts +5 -0
  326. package/src/common/types/message.ts +330 -0
  327. package/src/common/types/module.ts +42 -0
  328. package/src/common/types/token.ts +50 -0
  329. package/src/common/utils/adapter.ts +75 -0
  330. package/src/common/utils/address.ts +49 -0
  331. package/src/common/utils/bytes.ts +46 -0
  332. package/src/common/utils/chain.ts +103 -0
  333. package/src/common/utils/formulae.ts +124 -0
  334. package/src/common/utils/gmp.ts +16 -0
  335. package/src/common/utils/math-lib.ts +46 -0
  336. package/src/common/utils/messages.ts +192 -0
  337. package/src/common/utils/token.ts +7 -0
  338. package/src/index.ts +47 -0
  339. package/src/utils/exhaustive-check.ts +3 -0
  340. package/src/xchain/core/folks-core.ts +128 -0
  341. package/src/xchain/modules/folks-account.ts +385 -0
  342. package/src/xchain/modules/folks-gmp.ts +129 -0
  343. package/src/xchain/modules/folks-loan.ts +1175 -0
  344. package/src/xchain/modules/folks-oracle.ts +15 -0
  345. package/src/xchain/modules/folks-pool.ts +11 -0
  346. package/src/xchain/modules/index.ts +5 -0
@@ -0,0 +1,721 @@
1
+ import { multicall, waitForTransactionReceipt } from "viem/actions";
2
+
3
+ import { ChainType } from "../../../../common/types/chain.js";
4
+ import { TokenType } from "../../../../common/types/token.js";
5
+ import { convertFromGenericAddress } from "../../../../common/utils/address.js";
6
+ import { calcNextPeriodReset, calcPeriodNumber } from "../../../../common/utils/formulae.js";
7
+ import { getEvmSignerAccount } from "../../common/utils/chain.js";
8
+ import { sendERC20Approve } from "../../common/utils/contract.js";
9
+ import { getAllowanceStateOverride } from "../../common/utils/tokens.js";
10
+ import { getHubTokenData } from "../../hub/utils/chain.js";
11
+ import { getBridgeRouterSpokeContract, getSpokeCommonContract, getSpokeTokenContract } from "../utils/contract.js";
12
+
13
+ import type { EvmAddress } from "../../../../common/types/address.js";
14
+ import type { FolksChainId, NetworkType, SpokeChain } from "../../../../common/types/chain.js";
15
+ import type { AccountId, LoanId, LoanName } from "../../../../common/types/lending.js";
16
+ import type { MessageToSend } from "../../../../common/types/message.js";
17
+ import type { LoanTypeId } from "../../../../common/types/module.js";
18
+ import type { FolksTokenId, SpokeTokenData } from "../../../../common/types/token.js";
19
+ import type {
20
+ PrepareBorrowCall,
21
+ PrepareCreateLoanAndDepositCall,
22
+ PrepareCreateLoanCall,
23
+ PrepareDeleteLoanCall,
24
+ PrepareDepositCall,
25
+ PrepareRepayCall,
26
+ PrepareRepayWithCollateralCall,
27
+ PrepareSwitchBorrowTypeCall,
28
+ PrepareWithdrawCall,
29
+ } from "../../common/types/module.js";
30
+ import type { TokenRateLimit } from "../types/pool.js";
31
+ import type { Client, EstimateGasParameters, WalletClient } from "viem";
32
+
33
+ export const prepare = {
34
+ async createLoan(
35
+ provider: Client,
36
+ sender: EvmAddress,
37
+ messageToSend: MessageToSend,
38
+ accountId: AccountId,
39
+ loanId: LoanId,
40
+ loanTypeId: LoanTypeId,
41
+ loanName: LoanName,
42
+ spokeChain: SpokeChain,
43
+ transactionOptions: EstimateGasParameters = { account: sender },
44
+ ): Promise<PrepareCreateLoanCall> {
45
+ const spokeCommonAddress = spokeChain.spokeCommonAddress;
46
+
47
+ const spokeCommon = getSpokeCommonContract(provider, spokeCommonAddress);
48
+ const bridgeRouter = getBridgeRouterSpokeContract(provider, spokeChain.bridgeRouterAddress);
49
+
50
+ // get adapter fees
51
+ const msgValue = await bridgeRouter.read.getSendFee([messageToSend]);
52
+
53
+ // get gas limits
54
+ const gasLimit = await spokeCommon.estimateGas.createLoan(
55
+ [messageToSend.params, accountId, loanId, loanTypeId, loanName],
56
+ {
57
+ value: msgValue,
58
+ ...transactionOptions,
59
+ },
60
+ );
61
+
62
+ return {
63
+ msgValue,
64
+ gasLimit,
65
+ messageParams: messageToSend.params,
66
+ spokeCommonAddress,
67
+ };
68
+ },
69
+
70
+ async deleteLoan(
71
+ provider: Client,
72
+ sender: EvmAddress,
73
+ messageToSend: MessageToSend,
74
+ accountId: AccountId,
75
+ loanId: LoanId,
76
+ spokeChain: SpokeChain,
77
+ transactionOptions: EstimateGasParameters = { account: sender },
78
+ ): Promise<PrepareDeleteLoanCall> {
79
+ const spokeCommonAddress = spokeChain.spokeCommonAddress;
80
+
81
+ const spokeCommon = getSpokeCommonContract(provider, spokeCommonAddress);
82
+ const bridgeRouter = getBridgeRouterSpokeContract(provider, spokeChain.bridgeRouterAddress);
83
+
84
+ // get adapter fees
85
+ const msgValue = await bridgeRouter.read.getSendFee([messageToSend]);
86
+
87
+ // get gas limits
88
+ const gasLimit = await spokeCommon.estimateGas.deleteLoan([messageToSend.params, accountId, loanId], {
89
+ value: msgValue,
90
+ ...transactionOptions,
91
+ });
92
+
93
+ return {
94
+ msgValue,
95
+ gasLimit,
96
+ messageParams: messageToSend.params,
97
+ spokeCommonAddress,
98
+ };
99
+ },
100
+
101
+ async createLoanAndDeposit(
102
+ provider: Client,
103
+ sender: EvmAddress,
104
+ messageToSend: MessageToSend,
105
+ accountId: AccountId,
106
+ loanId: LoanId,
107
+ loanTypeId: LoanTypeId,
108
+ loanName: LoanName,
109
+ amount: bigint,
110
+ spokeChain: SpokeChain,
111
+ spokeTokenData: SpokeTokenData,
112
+ transactionOptions: EstimateGasParameters = { account: sender },
113
+ ) {
114
+ const spokeToken = getSpokeTokenContract(provider, spokeTokenData.spokeAddress);
115
+ const bridgeRouter = getBridgeRouterSpokeContract(provider, spokeChain.bridgeRouterAddress);
116
+
117
+ const spender = convertFromGenericAddress(spokeTokenData.spokeAddress, ChainType.EVM);
118
+
119
+ // get state override
120
+ let stateOverride;
121
+ if (spokeTokenData.token.type === TokenType.ERC20 || spokeTokenData.token.type === TokenType.CIRCLE) {
122
+ const erc20Address = convertFromGenericAddress(spokeTokenData.token.address, ChainType.EVM);
123
+ stateOverride = getAllowanceStateOverride([
124
+ {
125
+ erc20Address,
126
+ stateDiff: [
127
+ {
128
+ owner: sender,
129
+ spender,
130
+ folksChainId: spokeChain.folksChainId,
131
+ folksTokenId: spokeTokenData.folksTokenId,
132
+ tokenType: spokeTokenData.token.type,
133
+ amount,
134
+ },
135
+ ],
136
+ },
137
+ ]);
138
+ }
139
+
140
+ // get adapter fees
141
+ const adapterFees = await bridgeRouter.read.getSendFee([messageToSend]);
142
+ const value = spokeTokenData.token.type === TokenType.NATIVE ? amount : BigInt(0);
143
+ const msgValue = adapterFees + value;
144
+
145
+ // get gas limits
146
+ const gasLimit = await spokeToken.estimateGas.createLoanAndDeposit(
147
+ [messageToSend.params, accountId, loanId, amount, loanTypeId, loanName],
148
+ {
149
+ value: msgValue,
150
+ ...transactionOptions,
151
+ stateOverride,
152
+ },
153
+ );
154
+
155
+ return {
156
+ msgValue,
157
+ gasLimit,
158
+ messageParams: messageToSend.params,
159
+ spokeTokenData: spokeTokenData,
160
+ };
161
+ },
162
+
163
+ async deposit(
164
+ provider: Client,
165
+ sender: EvmAddress,
166
+ messageToSend: MessageToSend,
167
+ accountId: AccountId,
168
+ loanId: LoanId,
169
+ amount: bigint,
170
+ spokeChain: SpokeChain,
171
+ spokeTokenData: SpokeTokenData,
172
+ transactionOptions: EstimateGasParameters = { account: sender },
173
+ ): Promise<PrepareDepositCall> {
174
+ const spokeToken = getSpokeTokenContract(provider, spokeTokenData.spokeAddress);
175
+ const bridgeRouter = getBridgeRouterSpokeContract(provider, spokeChain.bridgeRouterAddress);
176
+
177
+ const spender = convertFromGenericAddress(spokeTokenData.spokeAddress, ChainType.EVM);
178
+
179
+ // get state override
180
+ let stateOverride;
181
+ if (spokeTokenData.token.type === TokenType.ERC20 || spokeTokenData.token.type === TokenType.CIRCLE) {
182
+ const erc20Address = convertFromGenericAddress(spokeTokenData.token.address, ChainType.EVM);
183
+ stateOverride = getAllowanceStateOverride([
184
+ {
185
+ erc20Address,
186
+ stateDiff: [
187
+ {
188
+ owner: sender,
189
+ spender,
190
+ folksChainId: spokeChain.folksChainId,
191
+ folksTokenId: spokeTokenData.folksTokenId,
192
+ tokenType: spokeTokenData.token.type,
193
+ amount,
194
+ },
195
+ ],
196
+ },
197
+ ]);
198
+ }
199
+
200
+ // get adapter fees
201
+ const adapterFees = await bridgeRouter.read.getSendFee([messageToSend]);
202
+ const value = spokeTokenData.token.type === TokenType.NATIVE ? amount : BigInt(0);
203
+ const msgValue = adapterFees + value;
204
+
205
+ // get gas limits
206
+ const gasLimit = await spokeToken.estimateGas.deposit([messageToSend.params, accountId, loanId, amount], {
207
+ value: msgValue,
208
+ ...transactionOptions,
209
+ stateOverride,
210
+ });
211
+
212
+ return {
213
+ msgValue,
214
+ gasLimit,
215
+ messageParams: messageToSend.params,
216
+ spokeTokenData: spokeTokenData,
217
+ };
218
+ },
219
+
220
+ async withdraw(
221
+ provider: Client,
222
+ sender: EvmAddress,
223
+ messageToSend: MessageToSend,
224
+ network: NetworkType,
225
+ accountId: AccountId,
226
+ loanId: LoanId,
227
+ folksTokenId: FolksTokenId,
228
+ amount: bigint,
229
+ isFAmount: boolean,
230
+ receiverFolksChainId: FolksChainId,
231
+ spokeChain: SpokeChain,
232
+ transactionOptions: EstimateGasParameters = { account: sender },
233
+ ): Promise<PrepareWithdrawCall> {
234
+ const hubTokenData = getHubTokenData(folksTokenId, network);
235
+
236
+ const spokeCommonAddress = spokeChain.spokeCommonAddress;
237
+ const spokeCommon = getSpokeCommonContract(provider, spokeCommonAddress);
238
+ const spokeBridgeRouter = getBridgeRouterSpokeContract(provider, spokeChain.bridgeRouterAddress);
239
+
240
+ // get adapter fee
241
+ const msgValue = await spokeBridgeRouter.read.getSendFee([messageToSend]);
242
+
243
+ // get gas limits
244
+ const gasLimit = await spokeCommon.estimateGas.withdraw(
245
+ [messageToSend.params, accountId, loanId, hubTokenData.poolId, receiverFolksChainId, amount, isFAmount],
246
+ {
247
+ value: msgValue,
248
+ ...transactionOptions,
249
+ },
250
+ );
251
+
252
+ return {
253
+ msgValue,
254
+ gasLimit,
255
+ messageParams: messageToSend.params,
256
+ spokeCommonAddress,
257
+ };
258
+ },
259
+
260
+ async borrow(
261
+ provider: Client,
262
+ sender: EvmAddress,
263
+ messageToSend: MessageToSend,
264
+ network: NetworkType,
265
+ accountId: AccountId,
266
+ loanId: LoanId,
267
+ folksTokenId: FolksTokenId,
268
+ amount: bigint,
269
+ maxStableRate: bigint,
270
+ receiverFolksChainId: FolksChainId,
271
+ spokeChain: SpokeChain,
272
+ transactionOptions: EstimateGasParameters = { account: sender },
273
+ ): Promise<PrepareBorrowCall> {
274
+ const hubTokenData = getHubTokenData(folksTokenId, network);
275
+
276
+ const spokeCommonAddress = spokeChain.spokeCommonAddress;
277
+ const spokeCommon = getSpokeCommonContract(provider, spokeCommonAddress);
278
+ const spokeBridgeRouter = getBridgeRouterSpokeContract(provider, spokeChain.bridgeRouterAddress);
279
+
280
+ // get adapter fee
281
+ const msgValue = await spokeBridgeRouter.read.getSendFee([messageToSend]);
282
+
283
+ // get gas limits
284
+ const gasLimit = await spokeCommon.estimateGas.borrow(
285
+ [messageToSend.params, accountId, loanId, hubTokenData.poolId, receiverFolksChainId, amount, maxStableRate],
286
+ {
287
+ value: msgValue,
288
+ ...transactionOptions,
289
+ },
290
+ );
291
+
292
+ return {
293
+ msgValue,
294
+ gasLimit,
295
+ messageParams: messageToSend.params,
296
+ spokeCommonAddress,
297
+ };
298
+ },
299
+
300
+ async repay(
301
+ provider: Client,
302
+ sender: EvmAddress,
303
+ messageToSend: MessageToSend,
304
+ accountId: AccountId,
305
+ loanId: LoanId,
306
+ amount: bigint,
307
+ maxOverRepayment: bigint,
308
+ spokeChain: SpokeChain,
309
+ spokeTokenData: SpokeTokenData,
310
+ transactionOptions: EstimateGasParameters = { account: sender },
311
+ ): Promise<PrepareRepayCall> {
312
+ const spokeToken = getSpokeTokenContract(provider, spokeTokenData.spokeAddress);
313
+ const bridgeRouter = getBridgeRouterSpokeContract(provider, spokeChain.bridgeRouterAddress);
314
+
315
+ const spender = convertFromGenericAddress(spokeTokenData.spokeAddress, ChainType.EVM);
316
+
317
+ // get state override
318
+ let stateOverride;
319
+ if (spokeTokenData.token.type === TokenType.ERC20 || spokeTokenData.token.type === TokenType.CIRCLE) {
320
+ const erc20Address = convertFromGenericAddress(spokeTokenData.token.address, ChainType.EVM);
321
+ stateOverride = getAllowanceStateOverride([
322
+ {
323
+ erc20Address,
324
+ stateDiff: [
325
+ {
326
+ owner: sender,
327
+ spender,
328
+ folksChainId: spokeChain.folksChainId,
329
+ folksTokenId: spokeTokenData.folksTokenId,
330
+ tokenType: spokeTokenData.token.type,
331
+ amount,
332
+ },
333
+ ],
334
+ },
335
+ ]);
336
+ }
337
+
338
+ // get adapter fees
339
+ const msgValue = await bridgeRouter.read.getSendFee([messageToSend]);
340
+
341
+ // get gas limits
342
+ const gasLimit = await spokeToken.estimateGas.repay(
343
+ [messageToSend.params, accountId, loanId, amount, maxOverRepayment],
344
+ {
345
+ value: msgValue,
346
+ ...transactionOptions,
347
+ stateOverride,
348
+ },
349
+ );
350
+
351
+ return {
352
+ msgValue,
353
+ gasLimit,
354
+ messageParams: messageToSend.params,
355
+ spokeTokenData: spokeTokenData,
356
+ };
357
+ },
358
+
359
+ async repayWithCollateral(
360
+ provider: Client,
361
+ sender: EvmAddress,
362
+ messageToSend: MessageToSend,
363
+ network: NetworkType,
364
+ accountId: AccountId,
365
+ loanId: LoanId,
366
+ folksTokenId: FolksTokenId,
367
+ amount: bigint,
368
+ spokeChain: SpokeChain,
369
+ transactionOptions: EstimateGasParameters = { account: sender },
370
+ ): Promise<PrepareRepayWithCollateralCall> {
371
+ const hubTokenData = getHubTokenData(folksTokenId, network);
372
+
373
+ const spokeCommonAddress = spokeChain.spokeCommonAddress;
374
+
375
+ const spokeCommon = getSpokeCommonContract(provider, spokeCommonAddress);
376
+ const bridgeRouter = getBridgeRouterSpokeContract(provider, spokeChain.bridgeRouterAddress);
377
+
378
+ // get adapter fees
379
+ const msgValue = await bridgeRouter.read.getSendFee([messageToSend]);
380
+
381
+ // get gas limits
382
+ const gasLimit = await spokeCommon.estimateGas.repayWithCollateral(
383
+ [messageToSend.params, accountId, loanId, hubTokenData.poolId, amount],
384
+ {
385
+ value: msgValue,
386
+ ...transactionOptions,
387
+ },
388
+ );
389
+
390
+ return {
391
+ msgValue,
392
+ gasLimit,
393
+ messageParams: messageToSend.params,
394
+ spokeCommonAddress,
395
+ };
396
+ },
397
+
398
+ async switchBorrowType(
399
+ provider: Client,
400
+ sender: EvmAddress,
401
+ messageToSend: MessageToSend,
402
+ network: NetworkType,
403
+ accountId: AccountId,
404
+ loanId: LoanId,
405
+ folksTokenId: FolksTokenId,
406
+ maxStableRate: bigint,
407
+ spokeChain: SpokeChain,
408
+ transactionOptions: EstimateGasParameters = { account: sender },
409
+ ): Promise<PrepareSwitchBorrowTypeCall> {
410
+ const hubTokenData = getHubTokenData(folksTokenId, network);
411
+
412
+ const spokeCommonAddress = spokeChain.spokeCommonAddress;
413
+
414
+ const spokeCommon = getSpokeCommonContract(provider, spokeCommonAddress);
415
+ const bridgeRouter = getBridgeRouterSpokeContract(provider, spokeChain.bridgeRouterAddress);
416
+
417
+ // get adapter fees
418
+ const msgValue = await bridgeRouter.read.getSendFee([messageToSend]);
419
+
420
+ // get gas limits
421
+ const gasLimit = await spokeCommon.estimateGas.switchBorrowType(
422
+ [messageToSend.params, accountId, loanId, hubTokenData.poolId, maxStableRate],
423
+ {
424
+ value: msgValue,
425
+ ...transactionOptions,
426
+ },
427
+ );
428
+
429
+ return {
430
+ msgValue,
431
+ gasLimit,
432
+ messageParams: messageToSend.params,
433
+ spokeCommonAddress,
434
+ };
435
+ },
436
+ };
437
+
438
+ export const write = {
439
+ async createLoan(
440
+ provider: Client,
441
+ signer: WalletClient,
442
+ accountId: AccountId,
443
+ loanId: LoanId,
444
+ loanTypeId: LoanTypeId,
445
+ loanName: LoanName,
446
+ prepareCall: PrepareCreateLoanCall,
447
+ ) {
448
+ const { msgValue, gasLimit, messageParams, spokeCommonAddress } = prepareCall;
449
+
450
+ const spokeCommon = getSpokeCommonContract(provider, spokeCommonAddress, signer);
451
+
452
+ return await spokeCommon.write.createLoan([messageParams, accountId, loanId, loanTypeId, loanName], {
453
+ account: getEvmSignerAccount(signer),
454
+ chain: signer.chain,
455
+ gas: gasLimit,
456
+ value: msgValue,
457
+ });
458
+ },
459
+
460
+ async deleteLoan(
461
+ provider: Client,
462
+ signer: WalletClient,
463
+ accountId: AccountId,
464
+ loanId: LoanId,
465
+ prepareCall: PrepareDeleteLoanCall,
466
+ ) {
467
+ const { msgValue, gasLimit, messageParams, spokeCommonAddress } = prepareCall;
468
+
469
+ const spokeCommon = getSpokeCommonContract(provider, spokeCommonAddress, signer);
470
+
471
+ return await spokeCommon.write.deleteLoan([messageParams, accountId, loanId], {
472
+ account: getEvmSignerAccount(signer),
473
+ chain: signer.chain,
474
+ gas: gasLimit,
475
+ value: msgValue,
476
+ });
477
+ },
478
+
479
+ async createLoanAndDeposit(
480
+ provider: Client,
481
+ signer: WalletClient,
482
+ accountId: AccountId,
483
+ loanId: LoanId,
484
+ loanTypeId: LoanTypeId,
485
+ loanName: LoanName,
486
+ amount: bigint,
487
+ includeApprove = true,
488
+ prepareCall: PrepareCreateLoanAndDepositCall,
489
+ ) {
490
+ const { msgValue, gasLimit, messageParams, spokeTokenData } = prepareCall;
491
+ const { token } = spokeTokenData;
492
+
493
+ const spokeToken = getSpokeTokenContract(provider, spokeTokenData.spokeAddress, signer);
494
+
495
+ if (includeApprove && (token.type === TokenType.CIRCLE || token.type === TokenType.ERC20)) {
496
+ const approveTxId = await sendERC20Approve(
497
+ provider,
498
+ token.address,
499
+ signer,
500
+ convertFromGenericAddress(spokeTokenData.spokeAddress, ChainType.EVM),
501
+ amount,
502
+ );
503
+ if (approveTxId !== null) await waitForTransactionReceipt(provider, { hash: approveTxId });
504
+ }
505
+
506
+ return await spokeToken.write.createLoanAndDeposit(
507
+ [messageParams, accountId, loanId, amount, loanTypeId, loanName],
508
+ {
509
+ account: getEvmSignerAccount(signer),
510
+ chain: signer.chain,
511
+ gas: gasLimit,
512
+ value: msgValue,
513
+ },
514
+ );
515
+ },
516
+
517
+ async deposit(
518
+ provider: Client,
519
+ signer: WalletClient,
520
+ accountId: AccountId,
521
+ loanId: LoanId,
522
+ amount: bigint,
523
+ includeApprove = true,
524
+ prepareCall: PrepareDepositCall,
525
+ ) {
526
+ const { msgValue, gasLimit, messageParams, spokeTokenData } = prepareCall;
527
+ const { token } = spokeTokenData;
528
+
529
+ const spokeToken = getSpokeTokenContract(provider, spokeTokenData.spokeAddress, signer);
530
+
531
+ if (includeApprove && (token.type === TokenType.CIRCLE || token.type === TokenType.ERC20)) {
532
+ const approveTxId = await sendERC20Approve(
533
+ provider,
534
+ token.address,
535
+ signer,
536
+ convertFromGenericAddress(spokeTokenData.spokeAddress, ChainType.EVM),
537
+ amount,
538
+ );
539
+ if (approveTxId !== null) await waitForTransactionReceipt(provider, { hash: approveTxId });
540
+ }
541
+
542
+ return await spokeToken.write.deposit([messageParams, accountId, loanId, amount], {
543
+ account: getEvmSignerAccount(signer),
544
+ chain: signer.chain,
545
+ gas: gasLimit,
546
+ value: msgValue,
547
+ });
548
+ },
549
+
550
+ async withdraw(
551
+ provider: Client,
552
+ signer: WalletClient,
553
+ accountId: AccountId,
554
+ loanId: LoanId,
555
+ poolId: number,
556
+ amount: bigint,
557
+ isFAmount: boolean,
558
+ receiverChainId: FolksChainId,
559
+ prepareCall: PrepareWithdrawCall,
560
+ ) {
561
+ const { msgValue, gasLimit, messageParams, spokeCommonAddress } = prepareCall;
562
+
563
+ const spokeCommon = getSpokeCommonContract(provider, spokeCommonAddress, signer);
564
+
565
+ return await spokeCommon.write.withdraw(
566
+ [messageParams, accountId, loanId, poolId, receiverChainId, amount, isFAmount],
567
+ {
568
+ account: getEvmSignerAccount(signer),
569
+ chain: signer.chain,
570
+ gas: gasLimit,
571
+ value: msgValue,
572
+ },
573
+ );
574
+ },
575
+
576
+ async borrow(
577
+ provider: Client,
578
+ signer: WalletClient,
579
+ accountId: AccountId,
580
+ loanId: LoanId,
581
+ poolId: number,
582
+ amount: bigint,
583
+ maxStableRate: bigint,
584
+ receiverChainId: FolksChainId,
585
+ prepareCall: PrepareBorrowCall,
586
+ ) {
587
+ const { msgValue, gasLimit, messageParams, spokeCommonAddress } = prepareCall;
588
+
589
+ const spokeCommon = getSpokeCommonContract(provider, spokeCommonAddress, signer);
590
+
591
+ return await spokeCommon.write.borrow(
592
+ [messageParams, accountId, loanId, poolId, receiverChainId, amount, maxStableRate],
593
+ {
594
+ account: getEvmSignerAccount(signer),
595
+ chain: signer.chain,
596
+ gas: gasLimit,
597
+ value: msgValue,
598
+ },
599
+ );
600
+ },
601
+
602
+ async repay(
603
+ provider: Client,
604
+ signer: WalletClient,
605
+ accountId: AccountId,
606
+ loanId: LoanId,
607
+ amount: bigint,
608
+ maxOverRepayment: bigint,
609
+ includeApprove = true,
610
+ prepareCall: PrepareRepayCall,
611
+ ) {
612
+ const { msgValue, gasLimit, messageParams, spokeTokenData } = prepareCall;
613
+ const { token } = spokeTokenData;
614
+
615
+ const spokeToken = getSpokeTokenContract(provider, spokeTokenData.spokeAddress, signer);
616
+
617
+ if (includeApprove && (token.type === TokenType.CIRCLE || token.type === TokenType.ERC20)) {
618
+ const approveTxId = await sendERC20Approve(
619
+ provider,
620
+ token.address,
621
+ signer,
622
+ convertFromGenericAddress(spokeTokenData.spokeAddress, ChainType.EVM),
623
+ amount,
624
+ );
625
+ if (approveTxId !== null) await waitForTransactionReceipt(provider, { hash: approveTxId });
626
+ }
627
+
628
+ return await spokeToken.write.repay([messageParams, accountId, loanId, amount, maxOverRepayment], {
629
+ account: getEvmSignerAccount(signer),
630
+ chain: signer.chain,
631
+ gas: gasLimit,
632
+ value: msgValue,
633
+ });
634
+ },
635
+
636
+ async repayWithCollateral(
637
+ provider: Client,
638
+ signer: WalletClient,
639
+ accountId: AccountId,
640
+ loanId: LoanId,
641
+ poolId: number,
642
+ amount: bigint,
643
+ prepareCall: PrepareRepayWithCollateralCall,
644
+ ) {
645
+ const { msgValue, gasLimit, messageParams, spokeCommonAddress } = prepareCall;
646
+
647
+ const spokeCommon = getSpokeCommonContract(provider, spokeCommonAddress, signer);
648
+
649
+ return await spokeCommon.write.repayWithCollateral([messageParams, accountId, loanId, poolId, amount], {
650
+ account: getEvmSignerAccount(signer),
651
+ chain: signer.chain,
652
+ gas: gasLimit,
653
+ value: msgValue,
654
+ });
655
+ },
656
+
657
+ async switchBorrowType(
658
+ provider: Client,
659
+ signer: WalletClient,
660
+ accountId: AccountId,
661
+ loanId: LoanId,
662
+ poolId: number,
663
+ maxStableRate: bigint,
664
+ prepareCall: PrepareSwitchBorrowTypeCall,
665
+ ) {
666
+ const { msgValue, gasLimit, messageParams, spokeCommonAddress } = prepareCall;
667
+
668
+ const spokeCommon = getSpokeCommonContract(provider, spokeCommonAddress, signer);
669
+
670
+ return await spokeCommon.write.switchBorrowType([messageParams, accountId, loanId, poolId, maxStableRate], {
671
+ account: getEvmSignerAccount(signer),
672
+ chain: signer.chain,
673
+ gas: gasLimit,
674
+ value: msgValue,
675
+ });
676
+ },
677
+ };
678
+
679
+ export const read = {
680
+ async rateLimitInfo(provider: Client, token: SpokeTokenData): Promise<TokenRateLimit> {
681
+ const spokeToken = getSpokeTokenContract(provider, token.spokeAddress);
682
+
683
+ // get rate limit data
684
+ const [bucketConfig, oldPeriodNumber, oldCurrentCapacity] = await multicall(provider, {
685
+ contracts: [
686
+ {
687
+ address: spokeToken.address,
688
+ abi: spokeToken.abi,
689
+ functionName: "bucketConfig",
690
+ },
691
+ {
692
+ address: spokeToken.address,
693
+ abi: spokeToken.abi,
694
+ functionName: "currentPeriodNumber",
695
+ },
696
+ {
697
+ address: spokeToken.address,
698
+ abi: spokeToken.abi,
699
+ functionName: "currentCapacity",
700
+ },
701
+ ],
702
+ allowFailure: false,
703
+ });
704
+
705
+ // TODO consider min limit
706
+ const [periodLength, periodOffset, periodLimit] = bucketConfig;
707
+ const newPeriodNumber = calcPeriodNumber(BigInt(periodOffset), BigInt(periodLength));
708
+ const isNewPeriod = newPeriodNumber !== BigInt(oldPeriodNumber);
709
+ const currentCapacity = isNewPeriod ? periodLimit : oldCurrentCapacity;
710
+ const nextPeriodReset = calcNextPeriodReset(newPeriodNumber, BigInt(periodOffset), BigInt(periodLength));
711
+
712
+ // build rate limit info
713
+ return {
714
+ periodLength: BigInt(periodLength),
715
+ periodOffset: BigInt(periodOffset),
716
+ periodLimit: BigInt(periodLimit),
717
+ currentCapacity,
718
+ nextPeriodReset,
719
+ };
720
+ },
721
+ };