@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,1175 @@
1
+ import { FolksHubLoan } from "../../chains/evm/hub/modules/index.js";
2
+ import {
3
+ assertLoanTypeSupported,
4
+ getHubChain,
5
+ getHubTokenData,
6
+ getHubTokensData,
7
+ } from "../../chains/evm/hub/utils/chain.js";
8
+ import { FolksEvmLoan } from "../../chains/evm/spoke/modules/index.js";
9
+ import { ChainType } from "../../common/types/chain.js";
10
+ import { MessageDirection } from "../../common/types/gmp.js";
11
+ import { Action } from "../../common/types/message.js";
12
+ import { TokenType } from "../../common/types/token.js";
13
+ import { assertAdapterSupportsDataMessage, assertAdapterSupportsTokenMessage } from "../../common/utils/adapter.js";
14
+ import { convertFromGenericAddress } from "../../common/utils/address.js";
15
+ import {
16
+ assertHubChainSelected,
17
+ assertSpokeChainSupportFolksToken,
18
+ assertSpokeChainSupported,
19
+ getFolksChain,
20
+ getSignerGenericAddress,
21
+ getSpokeChain,
22
+ getSpokeTokenData,
23
+ } from "../../common/utils/chain.js";
24
+ import { buildMessageToSend, estimateAdapterReceiveGasLimit } from "../../common/utils/messages.js";
25
+ import { exhaustiveCheck } from "../../utils/exhaustive-check.js";
26
+ import { FolksCore } from "../core/folks-core.js";
27
+
28
+ import type { LoanChange, LoanManagerUserLoan, LoanTypeInfo, UserLoanInfo } from "../../chains/evm/hub/types/loan.js";
29
+ import type { OraclePrices } from "../../chains/evm/hub/types/oracle.js";
30
+ import type { PoolInfo } from "../../chains/evm/hub/types/pool.js";
31
+ import type { TokenRateLimit } from "../../chains/evm/spoke/types/pool.js";
32
+ import type { FolksChainId } from "../../common/types/chain.js";
33
+ import type { AccountId, LoanId, LoanName } from "../../common/types/lending.js";
34
+ import type {
35
+ BorrowMessageData,
36
+ CreateLoanAndDepositMessageData,
37
+ CreateLoanMessageData,
38
+ DeleteLoanMessageData,
39
+ DepositExtraArgs,
40
+ DepositMessageData,
41
+ LiquidateMessageData,
42
+ MessageAdapters,
43
+ MessageBuilderParams,
44
+ OptionalFeeParams,
45
+ RepayExtraArgs,
46
+ RepayMessageData,
47
+ RepayWithCollateralMessageData,
48
+ SendTokenExtraArgs,
49
+ SendTokenMessageData,
50
+ SwitchBorrowTypeMessageData,
51
+ WithdrawMessageData,
52
+ } from "../../common/types/message.js";
53
+ import type {
54
+ LoanTypeId,
55
+ PrepareBorrowCall,
56
+ PrepareCreateLoanAndDepositCall,
57
+ PrepareCreateLoanCall,
58
+ PrepareDepositCall,
59
+ PrepareLiquidateCall,
60
+ PrepareRepayCall,
61
+ PrepareRepayWithCollateralCall,
62
+ PrepareSwitchBorrowTypeCall,
63
+ PrepareWithdrawCall,
64
+ } from "../../common/types/module.js";
65
+ import type { FolksTokenId } from "../../common/types/token.js";
66
+
67
+ export const prepare = {
68
+ async createLoan(
69
+ accountId: AccountId,
70
+ loanId: LoanId,
71
+ loanTypeId: LoanTypeId,
72
+ loanName: LoanName,
73
+ adapters: MessageAdapters,
74
+ ) {
75
+ const folksChain = FolksCore.getSelectedFolksChain();
76
+
77
+ assertAdapterSupportsDataMessage(folksChain.folksChainId, adapters.adapterId);
78
+ const spokeChain = getSpokeChain(folksChain.folksChainId, folksChain.network);
79
+ const hubChain = getHubChain(folksChain.network);
80
+
81
+ const userAddress = getSignerGenericAddress({
82
+ signer: FolksCore.getFolksSigner().signer,
83
+ chainType: folksChain.chainType,
84
+ });
85
+
86
+ const data: CreateLoanMessageData = {
87
+ loanId,
88
+ loanTypeId,
89
+ loanName,
90
+ };
91
+ const messageBuilderParams: MessageBuilderParams = {
92
+ userAddress,
93
+ accountId,
94
+ adapters,
95
+ action: Action.CreateLoan,
96
+ sender: spokeChain.spokeCommonAddress,
97
+ destinationChainId: hubChain.folksChainId,
98
+ handler: hubChain.hubAddress,
99
+ data,
100
+ extraArgs: "0x",
101
+ };
102
+ const feeParams: OptionalFeeParams = {};
103
+
104
+ feeParams.gasLimit = await estimateAdapterReceiveGasLimit(
105
+ folksChain.folksChainId,
106
+ hubChain.folksChainId,
107
+ FolksCore.getHubProvider(),
108
+ folksChain.network,
109
+ MessageDirection.SpokeToHub,
110
+ messageBuilderParams,
111
+ );
112
+
113
+ const messageToSend = buildMessageToSend(folksChain.chainType, messageBuilderParams, feeParams);
114
+
115
+ switch (folksChain.chainType) {
116
+ case ChainType.EVM:
117
+ return await FolksEvmLoan.prepare.createLoan(
118
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
119
+ convertFromGenericAddress(userAddress, folksChain.chainType),
120
+ messageToSend,
121
+ accountId,
122
+ loanId,
123
+ loanTypeId,
124
+ loanName,
125
+ spokeChain,
126
+ );
127
+ default:
128
+ return exhaustiveCheck(folksChain.chainType);
129
+ }
130
+ },
131
+
132
+ async deleteLoan(accountId: AccountId, loanId: LoanId, adapters: MessageAdapters) {
133
+ const folksChain = FolksCore.getSelectedFolksChain();
134
+
135
+ assertAdapterSupportsDataMessage(folksChain.folksChainId, adapters.adapterId);
136
+ const spokeChain = getSpokeChain(folksChain.folksChainId, folksChain.network);
137
+ const hubChain = getHubChain(folksChain.network);
138
+
139
+ const userAddress = getSignerGenericAddress({
140
+ signer: FolksCore.getFolksSigner().signer,
141
+ chainType: folksChain.chainType,
142
+ });
143
+
144
+ const data: DeleteLoanMessageData = {
145
+ accountId,
146
+ loanId,
147
+ };
148
+ const messageBuilderParams: MessageBuilderParams = {
149
+ userAddress,
150
+ accountId,
151
+ adapters,
152
+ action: Action.DeleteLoan,
153
+ sender: spokeChain.spokeCommonAddress,
154
+ destinationChainId: hubChain.folksChainId,
155
+ handler: hubChain.hubAddress,
156
+ data,
157
+ extraArgs: "0x",
158
+ };
159
+ const feeParams: OptionalFeeParams = {};
160
+
161
+ feeParams.gasLimit = await estimateAdapterReceiveGasLimit(
162
+ folksChain.folksChainId,
163
+ hubChain.folksChainId,
164
+ FolksCore.getHubProvider(),
165
+ folksChain.network,
166
+ MessageDirection.SpokeToHub,
167
+ messageBuilderParams,
168
+ );
169
+
170
+ const messageToSend = buildMessageToSend(folksChain.chainType, messageBuilderParams, feeParams);
171
+
172
+ switch (folksChain.chainType) {
173
+ case ChainType.EVM:
174
+ return await FolksEvmLoan.prepare.deleteLoan(
175
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
176
+ convertFromGenericAddress(userAddress, folksChain.chainType),
177
+ messageToSend,
178
+ accountId,
179
+ loanId,
180
+ spokeChain,
181
+ );
182
+ default:
183
+ return exhaustiveCheck(folksChain.chainType);
184
+ }
185
+ },
186
+
187
+ async createLoanAndDeposit(
188
+ accountId: AccountId,
189
+ loanId: LoanId,
190
+ loanTypeId: LoanTypeId,
191
+ loanName: LoanName,
192
+ folksTokenId: FolksTokenId,
193
+ amount: bigint,
194
+ adapters: MessageAdapters,
195
+ ) {
196
+ const folksChain = FolksCore.getSelectedFolksChain();
197
+
198
+ assertSpokeChainSupportFolksToken(folksChain.folksChainId, folksTokenId, folksChain.network);
199
+ assertLoanTypeSupported(loanTypeId, folksTokenId, folksChain.network);
200
+ const spokeChain = getSpokeChain(folksChain.folksChainId, folksChain.network);
201
+ const hubChain = getHubChain(folksChain.network);
202
+
203
+ const spokeTokenData = getSpokeTokenData(spokeChain, folksTokenId);
204
+ const hubTokenData = getHubTokenData(folksTokenId, folksChain.network);
205
+
206
+ if (spokeTokenData.token.type === TokenType.CIRCLE)
207
+ assertAdapterSupportsTokenMessage(folksChain.folksChainId, adapters.adapterId);
208
+ else assertAdapterSupportsDataMessage(folksChain.folksChainId, adapters.adapterId);
209
+
210
+ const userAddress = getSignerGenericAddress({
211
+ signer: FolksCore.getFolksSigner().signer,
212
+ chainType: folksChain.chainType,
213
+ });
214
+
215
+ const data: CreateLoanAndDepositMessageData = {
216
+ loanId,
217
+ poolId: hubTokenData.poolId,
218
+ amount,
219
+ loanTypeId,
220
+ loanName,
221
+ };
222
+ const extraArgs: DepositExtraArgs = {
223
+ token: spokeTokenData.token,
224
+ recipient: hubTokenData.poolAddress,
225
+ amount,
226
+ };
227
+ const messageBuilderParams: MessageBuilderParams = {
228
+ userAddress,
229
+ accountId,
230
+ adapters,
231
+ action: Action.CreateLoanAndDeposit,
232
+ sender: getSpokeTokenData(spokeChain, folksTokenId).spokeAddress,
233
+ destinationChainId: hubChain.folksChainId,
234
+ handler: hubChain.hubAddress,
235
+ data,
236
+ extraArgs,
237
+ };
238
+ const feeParams: OptionalFeeParams = {};
239
+
240
+ feeParams.gasLimit = await estimateAdapterReceiveGasLimit(
241
+ folksChain.folksChainId,
242
+ hubChain.folksChainId,
243
+ FolksCore.getHubProvider(),
244
+ folksChain.network,
245
+ MessageDirection.SpokeToHub,
246
+ messageBuilderParams,
247
+ );
248
+
249
+ const messageToSend = buildMessageToSend(folksChain.chainType, messageBuilderParams, feeParams);
250
+
251
+ switch (folksChain.chainType) {
252
+ case ChainType.EVM:
253
+ return await FolksEvmLoan.prepare.createLoanAndDeposit(
254
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
255
+ convertFromGenericAddress(userAddress, folksChain.chainType),
256
+ messageToSend,
257
+ accountId,
258
+ loanId,
259
+ loanTypeId,
260
+ loanName,
261
+ amount,
262
+ spokeChain,
263
+ spokeTokenData,
264
+ );
265
+ default:
266
+ return exhaustiveCheck(folksChain.chainType);
267
+ }
268
+ },
269
+
270
+ async deposit(
271
+ accountId: AccountId,
272
+ loanId: LoanId,
273
+ loanTypeId: LoanTypeId,
274
+ folksTokenId: FolksTokenId,
275
+ amount: bigint,
276
+ adapters: MessageAdapters,
277
+ ) {
278
+ const folksChain = FolksCore.getSelectedFolksChain();
279
+
280
+ assertSpokeChainSupportFolksToken(folksChain.folksChainId, folksTokenId, folksChain.network);
281
+ assertLoanTypeSupported(loanTypeId, folksTokenId, folksChain.network);
282
+ const spokeChain = getSpokeChain(folksChain.folksChainId, folksChain.network);
283
+ const hubChain = getHubChain(folksChain.network);
284
+
285
+ const spokeTokenData = getSpokeTokenData(spokeChain, folksTokenId);
286
+ const hubTokenData = getHubTokenData(folksTokenId, folksChain.network);
287
+
288
+ if (spokeTokenData.token.type === TokenType.CIRCLE)
289
+ assertAdapterSupportsTokenMessage(folksChain.folksChainId, adapters.adapterId);
290
+ else assertAdapterSupportsDataMessage(folksChain.folksChainId, adapters.adapterId);
291
+
292
+ const userAddress = getSignerGenericAddress({
293
+ signer: FolksCore.getFolksSigner().signer,
294
+ chainType: folksChain.chainType,
295
+ });
296
+
297
+ const data: DepositMessageData = {
298
+ loanId,
299
+ poolId: hubTokenData.poolId,
300
+ amount,
301
+ };
302
+ const extraArgs: DepositExtraArgs = {
303
+ token: spokeTokenData.token,
304
+ recipient: hubTokenData.poolAddress,
305
+ amount,
306
+ };
307
+ const messageBuilderParams: MessageBuilderParams = {
308
+ userAddress,
309
+ accountId,
310
+ adapters,
311
+ action: Action.Deposit,
312
+ sender: getSpokeTokenData(spokeChain, folksTokenId).spokeAddress,
313
+ destinationChainId: hubChain.folksChainId,
314
+ handler: hubChain.hubAddress,
315
+ data,
316
+ extraArgs,
317
+ };
318
+ const feeParams: OptionalFeeParams = {};
319
+
320
+ feeParams.gasLimit = await estimateAdapterReceiveGasLimit(
321
+ folksChain.folksChainId,
322
+ hubChain.folksChainId,
323
+ FolksCore.getHubProvider(),
324
+ folksChain.network,
325
+ MessageDirection.SpokeToHub,
326
+ messageBuilderParams,
327
+ );
328
+
329
+ const messageToSend = buildMessageToSend(folksChain.chainType, messageBuilderParams, feeParams);
330
+
331
+ switch (folksChain.chainType) {
332
+ case ChainType.EVM:
333
+ return await FolksEvmLoan.prepare.deposit(
334
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
335
+ convertFromGenericAddress(userAddress, folksChain.chainType),
336
+ messageToSend,
337
+ accountId,
338
+ loanId,
339
+ amount,
340
+ spokeChain,
341
+ spokeTokenData,
342
+ );
343
+ default:
344
+ return exhaustiveCheck(folksChain.chainType);
345
+ }
346
+ },
347
+
348
+ async withdraw(
349
+ accountId: AccountId,
350
+ loanId: LoanId,
351
+ folksTokenId: FolksTokenId,
352
+ amount: bigint,
353
+ isFAmount: boolean,
354
+ receiverFolksChainId: FolksChainId,
355
+ adapters: MessageAdapters,
356
+ ) {
357
+ const folksChain = FolksCore.getSelectedFolksChain();
358
+ const network = folksChain.network;
359
+ const receiverFolksChain = getFolksChain(receiverFolksChainId, network);
360
+
361
+ const spokeChain = getSpokeChain(folksChain.folksChainId, network);
362
+ const receiverSpokeChain = getSpokeChain(receiverFolksChainId, network);
363
+ const receiverSpokeTokenData = getSpokeTokenData(receiverSpokeChain, folksTokenId);
364
+
365
+ assertAdapterSupportsDataMessage(folksChain.folksChainId, adapters.adapterId);
366
+ if (receiverSpokeTokenData.token.type === TokenType.CIRCLE)
367
+ assertAdapterSupportsTokenMessage(receiverFolksChainId, adapters.returnAdapterId);
368
+ else assertAdapterSupportsDataMessage(receiverFolksChainId, adapters.returnAdapterId);
369
+
370
+ assertSpokeChainSupportFolksToken(receiverFolksChainId, folksTokenId, network);
371
+
372
+ const hubChain = getHubChain(network);
373
+ const hubTokenData = getHubTokenData(folksTokenId, network);
374
+
375
+ const userAddress = getSignerGenericAddress({
376
+ signer: FolksCore.getFolksSigner().signer,
377
+ chainType: folksChain.chainType,
378
+ });
379
+
380
+ const feeParams: OptionalFeeParams = {};
381
+
382
+ const returnData: SendTokenMessageData = {
383
+ folksTokenId,
384
+ amount,
385
+ };
386
+ const returnExtraArgs: SendTokenExtraArgs = {
387
+ token: receiverSpokeTokenData.token,
388
+ recipient: receiverSpokeTokenData.spokeAddress,
389
+ amount,
390
+ };
391
+ const returnMessageBuilderParams: MessageBuilderParams = {
392
+ userAddress,
393
+ accountId,
394
+ adapters,
395
+ action: Action.SendToken,
396
+ sender: hubChain.hubAddress,
397
+ destinationChainId: receiverFolksChainId,
398
+ handler: receiverSpokeTokenData.spokeAddress,
399
+ data: returnData,
400
+ extraArgs: returnExtraArgs,
401
+ };
402
+ feeParams.returnGasLimit = await estimateAdapterReceiveGasLimit(
403
+ hubChain.folksChainId,
404
+ receiverFolksChain.folksChainId,
405
+ FolksCore.getEVMProvider(receiverFolksChain.folksChainId),
406
+ folksChain.network,
407
+ MessageDirection.HubToSpoke,
408
+ returnMessageBuilderParams,
409
+ );
410
+
411
+ const data: WithdrawMessageData = {
412
+ loanId,
413
+ poolId: hubTokenData.poolId,
414
+ receiverFolksChainId,
415
+ amount,
416
+ isFAmount,
417
+ };
418
+ const messageBuilderParams: MessageBuilderParams = {
419
+ userAddress,
420
+ accountId,
421
+ adapters,
422
+ action: Action.Withdraw,
423
+ sender: spokeChain.spokeCommonAddress,
424
+ destinationChainId: hubChain.folksChainId,
425
+ handler: hubChain.hubAddress,
426
+ data,
427
+ extraArgs: "0x",
428
+ };
429
+ feeParams.receiverValue = await FolksHubLoan.getSendTokenAdapterFees(
430
+ FolksCore.getHubProvider(),
431
+ network,
432
+ accountId,
433
+ folksTokenId,
434
+ amount,
435
+ receiverFolksChainId,
436
+ adapters,
437
+ feeParams,
438
+ );
439
+ feeParams.gasLimit = await estimateAdapterReceiveGasLimit(
440
+ folksChain.folksChainId,
441
+ hubChain.folksChainId,
442
+ FolksCore.getHubProvider(),
443
+ folksChain.network,
444
+ MessageDirection.SpokeToHub,
445
+ messageBuilderParams,
446
+ );
447
+
448
+ const messageToSend = buildMessageToSend(folksChain.chainType, messageBuilderParams, feeParams);
449
+
450
+ switch (folksChain.chainType) {
451
+ case ChainType.EVM:
452
+ return await FolksEvmLoan.prepare.withdraw(
453
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
454
+ convertFromGenericAddress(userAddress, folksChain.chainType),
455
+ messageToSend,
456
+ network,
457
+ accountId,
458
+ loanId,
459
+ folksTokenId,
460
+ amount,
461
+ isFAmount,
462
+ receiverFolksChainId,
463
+ spokeChain,
464
+ );
465
+ default:
466
+ return exhaustiveCheck(folksChain.chainType);
467
+ }
468
+ },
469
+
470
+ async borrow(
471
+ accountId: AccountId,
472
+ loanId: LoanId,
473
+ folksTokenId: FolksTokenId,
474
+ amount: bigint,
475
+ maxStableRate: bigint,
476
+ receiverFolksChainId: FolksChainId,
477
+ adapters: MessageAdapters,
478
+ ) {
479
+ const folksChain = FolksCore.getSelectedFolksChain();
480
+ const network = folksChain.network;
481
+ const receiverFolksChain = getFolksChain(receiverFolksChainId, network);
482
+
483
+ const spokeChain = getSpokeChain(folksChain.folksChainId, network);
484
+ const receiverSpokeChain = getSpokeChain(receiverFolksChainId, network);
485
+ const receiverSpokeTokenData = getSpokeTokenData(receiverSpokeChain, folksTokenId);
486
+
487
+ assertAdapterSupportsDataMessage(folksChain.folksChainId, adapters.adapterId);
488
+ if (receiverSpokeTokenData.token.type === TokenType.CIRCLE)
489
+ assertAdapterSupportsTokenMessage(receiverFolksChainId, adapters.returnAdapterId);
490
+ else assertAdapterSupportsDataMessage(receiverFolksChainId, adapters.returnAdapterId);
491
+ assertSpokeChainSupportFolksToken(receiverFolksChainId, folksTokenId, network);
492
+
493
+ const hubChain = getHubChain(network);
494
+ const hubTokenData = getHubTokenData(folksTokenId, network);
495
+
496
+ const userAddress = getSignerGenericAddress({
497
+ signer: FolksCore.getFolksSigner().signer,
498
+ chainType: folksChain.chainType,
499
+ });
500
+
501
+ const feeParams: OptionalFeeParams = {};
502
+
503
+ const returnData: SendTokenMessageData = {
504
+ folksTokenId,
505
+ amount,
506
+ };
507
+ const returnExtraArgs: SendTokenExtraArgs = {
508
+ token: receiverSpokeTokenData.token,
509
+ recipient: receiverSpokeTokenData.spokeAddress,
510
+ amount,
511
+ };
512
+ const returnMessageBuilderParams: MessageBuilderParams = {
513
+ userAddress,
514
+ accountId,
515
+ adapters,
516
+ action: Action.SendToken,
517
+ sender: hubChain.hubAddress,
518
+ destinationChainId: receiverFolksChainId,
519
+ handler: receiverSpokeTokenData.spokeAddress,
520
+ data: returnData,
521
+ extraArgs: returnExtraArgs,
522
+ };
523
+ feeParams.returnGasLimit = await estimateAdapterReceiveGasLimit(
524
+ hubChain.folksChainId,
525
+ receiverFolksChain.folksChainId,
526
+ FolksCore.getEVMProvider(receiverFolksChain.folksChainId),
527
+ folksChain.network,
528
+ MessageDirection.HubToSpoke,
529
+ returnMessageBuilderParams,
530
+ );
531
+
532
+ const data: BorrowMessageData = {
533
+ loanId,
534
+ poolId: hubTokenData.poolId,
535
+ receiverFolksChainId,
536
+ amount,
537
+ maxStableRate,
538
+ };
539
+ const messageBuilderParams: MessageBuilderParams = {
540
+ userAddress,
541
+ accountId,
542
+ adapters,
543
+ action: Action.Borrow,
544
+ sender: spokeChain.spokeCommonAddress,
545
+ destinationChainId: hubChain.folksChainId,
546
+ handler: hubChain.hubAddress,
547
+ data,
548
+ extraArgs: "0x",
549
+ };
550
+ feeParams.receiverValue = await FolksHubLoan.getSendTokenAdapterFees(
551
+ FolksCore.getHubProvider(),
552
+ network,
553
+ accountId,
554
+ folksTokenId,
555
+ amount,
556
+ receiverFolksChainId,
557
+ adapters,
558
+ feeParams,
559
+ );
560
+ feeParams.gasLimit = await estimateAdapterReceiveGasLimit(
561
+ folksChain.folksChainId,
562
+ hubChain.folksChainId,
563
+ FolksCore.getHubProvider(),
564
+ folksChain.network,
565
+ MessageDirection.SpokeToHub,
566
+ messageBuilderParams,
567
+ );
568
+
569
+ const messageToSend = buildMessageToSend(folksChain.chainType, messageBuilderParams, feeParams);
570
+
571
+ switch (folksChain.chainType) {
572
+ case ChainType.EVM:
573
+ return await FolksEvmLoan.prepare.borrow(
574
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
575
+ convertFromGenericAddress(userAddress, folksChain.chainType),
576
+ messageToSend,
577
+ network,
578
+ accountId,
579
+ loanId,
580
+ folksTokenId,
581
+ amount,
582
+ maxStableRate,
583
+ receiverFolksChainId,
584
+ spokeChain,
585
+ );
586
+ default:
587
+ return exhaustiveCheck(folksChain.chainType);
588
+ }
589
+ },
590
+
591
+ async repay(
592
+ accountId: AccountId,
593
+ loanId: LoanId,
594
+ loanTypeId: LoanTypeId,
595
+ folksTokenId: FolksTokenId,
596
+ amount: bigint,
597
+ maxOverRepayment: bigint,
598
+ adapters: MessageAdapters,
599
+ ): Promise<PrepareRepayCall> {
600
+ const folksChain = FolksCore.getSelectedFolksChain();
601
+
602
+ assertSpokeChainSupportFolksToken(folksChain.folksChainId, folksTokenId, folksChain.network);
603
+ assertLoanTypeSupported(loanTypeId, folksTokenId, folksChain.network);
604
+ const spokeChain = getSpokeChain(folksChain.folksChainId, folksChain.network);
605
+ const hubChain = getHubChain(folksChain.network);
606
+
607
+ const spokeTokenData = getSpokeTokenData(spokeChain, folksTokenId);
608
+ const hubTokenData = getHubTokenData(folksTokenId, folksChain.network);
609
+
610
+ if (spokeTokenData.token.type === TokenType.CIRCLE)
611
+ assertAdapterSupportsTokenMessage(folksChain.folksChainId, adapters.adapterId);
612
+ else assertAdapterSupportsDataMessage(folksChain.folksChainId, adapters.adapterId);
613
+
614
+ const userAddress = getSignerGenericAddress({
615
+ signer: FolksCore.getFolksSigner().signer,
616
+ chainType: folksChain.chainType,
617
+ });
618
+
619
+ const data: RepayMessageData = {
620
+ loanId,
621
+ poolId: hubTokenData.poolId,
622
+ amount,
623
+ maxOverRepayment,
624
+ };
625
+ const extraArgs: RepayExtraArgs = {
626
+ token: spokeTokenData.token,
627
+ recipient: hubTokenData.poolAddress,
628
+ amount,
629
+ };
630
+ const messageBuilderParams: MessageBuilderParams = {
631
+ userAddress,
632
+ accountId,
633
+ adapters,
634
+ action: Action.Repay,
635
+ sender: getSpokeTokenData(spokeChain, folksTokenId).spokeAddress,
636
+ destinationChainId: hubChain.folksChainId,
637
+ handler: hubChain.hubAddress,
638
+ data,
639
+ extraArgs,
640
+ };
641
+ const feeParams: OptionalFeeParams = {};
642
+
643
+ feeParams.gasLimit = await estimateAdapterReceiveGasLimit(
644
+ folksChain.folksChainId,
645
+ hubChain.folksChainId,
646
+ FolksCore.getHubProvider(),
647
+ folksChain.network,
648
+ MessageDirection.SpokeToHub,
649
+ messageBuilderParams,
650
+ );
651
+
652
+ const messageToSend = buildMessageToSend(folksChain.chainType, messageBuilderParams, feeParams);
653
+
654
+ switch (folksChain.chainType) {
655
+ case ChainType.EVM:
656
+ return await FolksEvmLoan.prepare.repay(
657
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
658
+ convertFromGenericAddress(userAddress, folksChain.chainType),
659
+ messageToSend,
660
+ accountId,
661
+ loanId,
662
+ amount,
663
+ maxOverRepayment,
664
+ spokeChain,
665
+ spokeTokenData,
666
+ );
667
+ default:
668
+ return exhaustiveCheck(folksChain.chainType);
669
+ }
670
+ },
671
+
672
+ async repayWithCollateral(
673
+ accountId: AccountId,
674
+ loanId: LoanId,
675
+ folksTokenId: FolksTokenId,
676
+ amount: bigint,
677
+ adapters: MessageAdapters,
678
+ ) {
679
+ const folksChain = FolksCore.getSelectedFolksChain();
680
+ const network = folksChain.network;
681
+
682
+ assertAdapterSupportsDataMessage(folksChain.folksChainId, adapters.adapterId);
683
+
684
+ const hubChain = getHubChain(network);
685
+ const hubTokenData = getHubTokenData(folksTokenId, network);
686
+
687
+ const spokeChain = getSpokeChain(folksChain.folksChainId, network);
688
+
689
+ const userAddress = getSignerGenericAddress({
690
+ signer: FolksCore.getFolksSigner().signer,
691
+ chainType: folksChain.chainType,
692
+ });
693
+
694
+ const data: RepayWithCollateralMessageData = {
695
+ loanId,
696
+ poolId: hubTokenData.poolId,
697
+ amount,
698
+ };
699
+ const messageBuilderParams: MessageBuilderParams = {
700
+ userAddress,
701
+ accountId,
702
+ adapters,
703
+ action: Action.RepayWithCollateral,
704
+ sender: spokeChain.spokeCommonAddress,
705
+ destinationChainId: hubChain.folksChainId,
706
+ handler: hubChain.hubAddress,
707
+ data,
708
+ extraArgs: "0x",
709
+ };
710
+ const feeParams: OptionalFeeParams = {};
711
+
712
+ feeParams.gasLimit = await estimateAdapterReceiveGasLimit(
713
+ folksChain.folksChainId,
714
+ hubChain.folksChainId,
715
+ FolksCore.getHubProvider(),
716
+ folksChain.network,
717
+ MessageDirection.SpokeToHub,
718
+ messageBuilderParams,
719
+ );
720
+
721
+ const messageToSend = buildMessageToSend(folksChain.chainType, messageBuilderParams, feeParams);
722
+
723
+ switch (folksChain.chainType) {
724
+ case ChainType.EVM:
725
+ return await FolksEvmLoan.prepare.repayWithCollateral(
726
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
727
+ convertFromGenericAddress(userAddress, folksChain.chainType),
728
+ messageToSend,
729
+ network,
730
+ accountId,
731
+ loanId,
732
+ folksTokenId,
733
+ amount,
734
+ spokeChain,
735
+ );
736
+ default:
737
+ return exhaustiveCheck(folksChain.chainType);
738
+ }
739
+ },
740
+
741
+ async switchBorrowType(
742
+ accountId: AccountId,
743
+ loanId: LoanId,
744
+ folksTokenId: FolksTokenId,
745
+ maxStableRate: bigint,
746
+ adapters: MessageAdapters,
747
+ ) {
748
+ const folksChain = FolksCore.getSelectedFolksChain();
749
+ const network = folksChain.network;
750
+
751
+ assertAdapterSupportsDataMessage(folksChain.folksChainId, adapters.adapterId);
752
+
753
+ const hubChain = getHubChain(network);
754
+ const hubTokenData = getHubTokenData(folksTokenId, network);
755
+
756
+ const spokeChain = getSpokeChain(folksChain.folksChainId, network);
757
+
758
+ const userAddress = getSignerGenericAddress({
759
+ signer: FolksCore.getFolksSigner().signer,
760
+ chainType: folksChain.chainType,
761
+ });
762
+
763
+ const data: SwitchBorrowTypeMessageData = {
764
+ loanId,
765
+ poolId: hubTokenData.poolId,
766
+ maxStableRate,
767
+ };
768
+ const messageBuilderParams: MessageBuilderParams = {
769
+ userAddress,
770
+ accountId,
771
+ adapters,
772
+ action: Action.SwitchBorrowType,
773
+ sender: spokeChain.spokeCommonAddress,
774
+ destinationChainId: hubChain.folksChainId,
775
+ handler: hubChain.hubAddress,
776
+ data,
777
+ extraArgs: "0x",
778
+ };
779
+ const feeParams: OptionalFeeParams = {};
780
+
781
+ feeParams.gasLimit = await estimateAdapterReceiveGasLimit(
782
+ folksChain.folksChainId,
783
+ hubChain.folksChainId,
784
+ FolksCore.getHubProvider(),
785
+ folksChain.network,
786
+ MessageDirection.SpokeToHub,
787
+ messageBuilderParams,
788
+ );
789
+
790
+ const messageToSend = buildMessageToSend(folksChain.chainType, messageBuilderParams, feeParams);
791
+
792
+ switch (folksChain.chainType) {
793
+ case ChainType.EVM:
794
+ return await FolksEvmLoan.prepare.switchBorrowType(
795
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
796
+ convertFromGenericAddress(userAddress, folksChain.chainType),
797
+ messageToSend,
798
+ network,
799
+ accountId,
800
+ loanId,
801
+ folksTokenId,
802
+ maxStableRate,
803
+ spokeChain,
804
+ );
805
+ default:
806
+ return exhaustiveCheck(folksChain.chainType);
807
+ }
808
+ },
809
+
810
+ async liquidate(
811
+ accountId: AccountId,
812
+ liquidatorLoanId: LoanId,
813
+ violatorLoanId: LoanId,
814
+ folksTokenIdToLiq: FolksTokenId,
815
+ folksTokenIdToSeize: FolksTokenId,
816
+ repayingAmount: bigint,
817
+ minSeizedAmount: bigint,
818
+ ) {
819
+ const folksChain = FolksCore.getSelectedFolksChain();
820
+ assertHubChainSelected(folksChain.folksChainId, folksChain.network);
821
+ const hubChain = getHubChain(folksChain.network);
822
+
823
+ const hubTokenToLiquidateData = getHubTokenData(folksTokenIdToLiq, folksChain.network);
824
+ const hubTokenToSeizeData = getHubTokenData(folksTokenIdToSeize, folksChain.network);
825
+
826
+ const userAddress = getSignerGenericAddress({
827
+ signer: FolksCore.getFolksSigner().signer,
828
+ chainType: folksChain.chainType,
829
+ });
830
+
831
+ const data: LiquidateMessageData = {
832
+ liquidatorLoanId,
833
+ violatorLoanId,
834
+ colPoolId: hubTokenToSeizeData.poolId,
835
+ borPoolId: hubTokenToLiquidateData.poolId,
836
+ repayingAmount,
837
+ minSeizedAmount,
838
+ };
839
+
840
+ return await FolksHubLoan.prepare.liquidate(
841
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
842
+ convertFromGenericAddress(userAddress, folksChain.chainType),
843
+ data,
844
+ accountId,
845
+ hubChain,
846
+ );
847
+ },
848
+ };
849
+
850
+ export const write = {
851
+ async createLoan(
852
+ accountId: AccountId,
853
+ loanId: LoanId,
854
+ loanTypeId: LoanTypeId,
855
+ loanName: LoanName,
856
+ prepareCall: PrepareCreateLoanCall,
857
+ ) {
858
+ const folksChain = FolksCore.getSelectedFolksChain();
859
+
860
+ assertSpokeChainSupported(folksChain.folksChainId, folksChain.network);
861
+
862
+ switch (folksChain.chainType) {
863
+ case ChainType.EVM:
864
+ return await FolksEvmLoan.write.createLoan(
865
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
866
+ FolksCore.getSigner<ChainType.EVM>(),
867
+ accountId,
868
+ loanId,
869
+ loanTypeId,
870
+ loanName,
871
+ prepareCall,
872
+ );
873
+ default:
874
+ return exhaustiveCheck(folksChain.chainType);
875
+ }
876
+ },
877
+
878
+ async deleteLoan(accountId: AccountId, loanId: LoanId, prepareCall: PrepareCreateLoanCall) {
879
+ const folksChain = FolksCore.getSelectedFolksChain();
880
+
881
+ assertSpokeChainSupported(folksChain.folksChainId, folksChain.network);
882
+
883
+ switch (folksChain.chainType) {
884
+ case ChainType.EVM:
885
+ return await FolksEvmLoan.write.deleteLoan(
886
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
887
+ FolksCore.getSigner<ChainType.EVM>(),
888
+ accountId,
889
+ loanId,
890
+ prepareCall,
891
+ );
892
+ default:
893
+ return exhaustiveCheck(folksChain.chainType);
894
+ }
895
+ },
896
+
897
+ async createLoanAndDeposit(
898
+ accountId: AccountId,
899
+ loanId: LoanId,
900
+ loanTypeId: LoanTypeId,
901
+ loanName: LoanName,
902
+ amount: bigint,
903
+ includeApproval: boolean,
904
+ prepareCall: PrepareCreateLoanAndDepositCall,
905
+ ) {
906
+ const folksChain = FolksCore.getSelectedFolksChain();
907
+
908
+ assertSpokeChainSupported(folksChain.folksChainId, folksChain.network);
909
+
910
+ switch (folksChain.chainType) {
911
+ case ChainType.EVM:
912
+ return await FolksEvmLoan.write.createLoanAndDeposit(
913
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
914
+ FolksCore.getSigner<ChainType.EVM>(),
915
+ accountId,
916
+ loanId,
917
+ loanTypeId,
918
+ loanName,
919
+ amount,
920
+ includeApproval,
921
+ prepareCall,
922
+ );
923
+ default:
924
+ return exhaustiveCheck(folksChain.chainType);
925
+ }
926
+ },
927
+
928
+ async deposit(
929
+ accountId: AccountId,
930
+ loanId: LoanId,
931
+ amount: bigint,
932
+ includeApproval: boolean,
933
+ prepareCall: PrepareDepositCall,
934
+ ) {
935
+ const folksChain = FolksCore.getSelectedFolksChain();
936
+
937
+ assertSpokeChainSupported(folksChain.folksChainId, folksChain.network);
938
+
939
+ switch (folksChain.chainType) {
940
+ case ChainType.EVM:
941
+ return await FolksEvmLoan.write.deposit(
942
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
943
+ FolksCore.getSigner<ChainType.EVM>(),
944
+ accountId,
945
+ loanId,
946
+ amount,
947
+ includeApproval,
948
+ prepareCall,
949
+ );
950
+ default:
951
+ return exhaustiveCheck(folksChain.chainType);
952
+ }
953
+ },
954
+
955
+ async withdraw(
956
+ accountId: AccountId,
957
+ loanId: LoanId,
958
+ folksTokenId: FolksTokenId,
959
+ amount: bigint,
960
+ isFAmount: boolean,
961
+ receiverFolksChainId: FolksChainId,
962
+ prepareCall: PrepareWithdrawCall,
963
+ ) {
964
+ const folksChain = FolksCore.getSelectedFolksChain();
965
+
966
+ const { poolId } = getHubTokenData(folksTokenId, folksChain.network);
967
+
968
+ switch (folksChain.chainType) {
969
+ case ChainType.EVM:
970
+ return await FolksEvmLoan.write.withdraw(
971
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
972
+ FolksCore.getSigner<ChainType.EVM>(),
973
+ accountId,
974
+ loanId,
975
+ poolId,
976
+ amount,
977
+ isFAmount,
978
+ receiverFolksChainId,
979
+ prepareCall,
980
+ );
981
+ default:
982
+ return exhaustiveCheck(folksChain.chainType);
983
+ }
984
+ },
985
+
986
+ async borrow(
987
+ accountId: AccountId,
988
+ loanId: LoanId,
989
+ folksTokenId: FolksTokenId,
990
+ amount: bigint,
991
+ maxStableRate: bigint,
992
+ receiverFolksChainId: FolksChainId,
993
+ prepareCall: PrepareBorrowCall,
994
+ ) {
995
+ const folksChain = FolksCore.getSelectedFolksChain();
996
+
997
+ const { poolId } = getHubTokenData(folksTokenId, folksChain.network);
998
+
999
+ switch (folksChain.chainType) {
1000
+ case ChainType.EVM:
1001
+ return await FolksEvmLoan.write.borrow(
1002
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
1003
+ FolksCore.getSigner<ChainType.EVM>(),
1004
+ accountId,
1005
+ loanId,
1006
+ poolId,
1007
+ amount,
1008
+ maxStableRate,
1009
+ receiverFolksChainId,
1010
+ prepareCall,
1011
+ );
1012
+ default:
1013
+ return exhaustiveCheck(folksChain.chainType);
1014
+ }
1015
+ },
1016
+
1017
+ async repay(
1018
+ accountId: AccountId,
1019
+ loanId: LoanId,
1020
+ amount: bigint,
1021
+ maxOverRepayment: bigint,
1022
+ includeApproval: boolean,
1023
+ prepareCall: PrepareRepayCall,
1024
+ ) {
1025
+ const folksChain = FolksCore.getSelectedFolksChain();
1026
+
1027
+ assertSpokeChainSupported(folksChain.folksChainId, folksChain.network);
1028
+
1029
+ switch (folksChain.chainType) {
1030
+ case ChainType.EVM:
1031
+ return await FolksEvmLoan.write.repay(
1032
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
1033
+ FolksCore.getSigner<ChainType.EVM>(),
1034
+ accountId,
1035
+ loanId,
1036
+ amount,
1037
+ maxOverRepayment,
1038
+ includeApproval,
1039
+ prepareCall,
1040
+ );
1041
+ default:
1042
+ return exhaustiveCheck(folksChain.chainType);
1043
+ }
1044
+ },
1045
+
1046
+ async repayWithCollateral(
1047
+ accountId: AccountId,
1048
+ loanId: LoanId,
1049
+ folksTokenId: FolksTokenId,
1050
+ amount: bigint,
1051
+ prepareCall: PrepareRepayWithCollateralCall,
1052
+ ) {
1053
+ const folksChain = FolksCore.getSelectedFolksChain();
1054
+
1055
+ const { poolId } = getHubTokenData(folksTokenId, folksChain.network);
1056
+
1057
+ switch (folksChain.chainType) {
1058
+ case ChainType.EVM:
1059
+ return await FolksEvmLoan.write.repayWithCollateral(
1060
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
1061
+ FolksCore.getSigner<ChainType.EVM>(),
1062
+ accountId,
1063
+ loanId,
1064
+ poolId,
1065
+ amount,
1066
+ prepareCall,
1067
+ );
1068
+ default:
1069
+ return exhaustiveCheck(folksChain.chainType);
1070
+ }
1071
+ },
1072
+
1073
+ async switchBorrowType(
1074
+ accountId: AccountId,
1075
+ loanId: LoanId,
1076
+ folksTokenId: FolksTokenId,
1077
+ maxStableRate: bigint,
1078
+ prepareCall: PrepareSwitchBorrowTypeCall,
1079
+ ) {
1080
+ const folksChain = FolksCore.getSelectedFolksChain();
1081
+
1082
+ const { poolId } = getHubTokenData(folksTokenId, folksChain.network);
1083
+
1084
+ switch (folksChain.chainType) {
1085
+ case ChainType.EVM:
1086
+ return await FolksEvmLoan.write.switchBorrowType(
1087
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
1088
+ FolksCore.getSigner<ChainType.EVM>(),
1089
+ accountId,
1090
+ loanId,
1091
+ poolId,
1092
+ maxStableRate,
1093
+ prepareCall,
1094
+ );
1095
+ default:
1096
+ return exhaustiveCheck(folksChain.chainType);
1097
+ }
1098
+ },
1099
+
1100
+ async liquidate(accountId: AccountId, prepareCall: PrepareLiquidateCall) {
1101
+ const folksChain = FolksCore.getSelectedFolksChain();
1102
+
1103
+ assertHubChainSelected(folksChain.folksChainId, folksChain.network);
1104
+
1105
+ return await FolksHubLoan.write.liquidate(
1106
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
1107
+ FolksCore.getSigner<ChainType.EVM>(),
1108
+ accountId,
1109
+ prepareCall,
1110
+ );
1111
+ },
1112
+ };
1113
+
1114
+ export const read = {
1115
+ async rateLimit(folksTokenId: FolksTokenId, folksChainId: FolksChainId): Promise<TokenRateLimit> {
1116
+ const network = FolksCore.getSelectedNetwork();
1117
+ const folksChain = getFolksChain(folksChainId, network);
1118
+
1119
+ assertSpokeChainSupportFolksToken(folksChain.folksChainId, folksTokenId, folksChain.network);
1120
+ const spokeChain = getSpokeChain(folksChain.folksChainId, folksChain.network);
1121
+ const spokeTokenData = getSpokeTokenData(spokeChain, folksTokenId);
1122
+
1123
+ switch (folksChain.chainType) {
1124
+ case ChainType.EVM:
1125
+ return await FolksEvmLoan.read.rateLimitInfo(
1126
+ FolksCore.getProvider<ChainType.EVM>(folksChain.folksChainId),
1127
+ spokeTokenData,
1128
+ );
1129
+ default:
1130
+ return exhaustiveCheck(folksChain.chainType);
1131
+ }
1132
+ },
1133
+
1134
+ async loanTypeInfo(loanTypeId: LoanTypeId): Promise<LoanTypeInfo> {
1135
+ const network = FolksCore.getSelectedNetwork();
1136
+
1137
+ // filter for all tokens supported in loan type
1138
+ const tokensData = Object.values(getHubTokensData(network)).filter((tokenData) =>
1139
+ tokenData.supportedLoanTypes.has(loanTypeId),
1140
+ );
1141
+
1142
+ return await FolksHubLoan.getLoanTypeInfo(FolksCore.getHubProvider(), network, loanTypeId, tokensData);
1143
+ },
1144
+
1145
+ async userLoansIds(
1146
+ accountId: AccountId,
1147
+ loanTypeIdsFilter?: Array<LoanTypeId>,
1148
+ ): Promise<Map<LoanTypeId, Array<LoanId>>> {
1149
+ const network = FolksCore.getSelectedNetwork();
1150
+ // get active user loans ids
1151
+ return await FolksHubLoan.getUserLoanIds(FolksCore.getHubProvider(), network, accountId, loanTypeIdsFilter);
1152
+ },
1153
+
1154
+ async userLoans(loanIds: Array<LoanId>): Promise<Map<LoanId, LoanManagerUserLoan>> {
1155
+ const network = FolksCore.getSelectedNetwork();
1156
+ // get user loans
1157
+ return await FolksHubLoan.getUserLoans(FolksCore.getHubProvider(), network, loanIds);
1158
+ },
1159
+ };
1160
+
1161
+ export const util = {
1162
+ userLoansInfo(
1163
+ userLoansMap: Map<LoanId, LoanManagerUserLoan>,
1164
+ poolsInfo: Partial<Record<FolksTokenId, PoolInfo>>,
1165
+ loanTypesInfo: Partial<Record<LoanTypeId, LoanTypeInfo>>,
1166
+ oraclePrices: OraclePrices,
1167
+ ): Record<LoanId, UserLoanInfo> {
1168
+ // get info of each user loan
1169
+ return FolksHubLoan.getUserLoansInfo(userLoansMap, poolsInfo, loanTypesInfo, oraclePrices);
1170
+ },
1171
+
1172
+ simulateLoanChanges(loan: LoanManagerUserLoan, changes: Array<LoanChange>): LoanManagerUserLoan {
1173
+ return FolksHubLoan.simulateLoanChanges(loan, changes);
1174
+ },
1175
+ };