@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,105 @@
1
+ import { getEvmSignerAccount } from "../../common/utils/chain.js";
2
+ import { getBridgeRouterHubContract } from "../utils/contract.js";
3
+
4
+ import type { EvmAddress } from "../../../../common/types/address.js";
5
+ import type { MessageId, ReverseMessageExtraAgrs } from "../../../../common/types/gmp.js";
6
+ import type { AdapterType } from "../../../../common/types/message.js";
7
+ import type { PrepareRetryMessageCall, PrepareReverseMessageCall } from "../../common/types/module.js";
8
+ import type { HubChain } from "../types/chain.js";
9
+ import type { Client, EstimateGasParameters, WalletClient } from "viem";
10
+
11
+ export const prepare = {
12
+ async retryMessage(
13
+ provider: Client,
14
+ sender: EvmAddress,
15
+ adapterId: AdapterType,
16
+ messageId: MessageId,
17
+ value: bigint,
18
+ hubChain: HubChain,
19
+ transactionOptions: EstimateGasParameters = {
20
+ account: sender,
21
+ },
22
+ ): Promise<PrepareRetryMessageCall> {
23
+ const bridgeRouter = getBridgeRouterHubContract(provider, hubChain.bridgeRouterAddress);
24
+
25
+ const gasLimit = await bridgeRouter.estimateGas.retryMessage([adapterId, messageId], {
26
+ ...transactionOptions,
27
+ value,
28
+ });
29
+
30
+ return {
31
+ gasLimit,
32
+ msgValue: value,
33
+ isHub: true,
34
+ bridgeRouterAddress: hubChain.bridgeRouterAddress,
35
+ };
36
+ },
37
+
38
+ async reverseMessage(
39
+ provider: Client,
40
+ sender: EvmAddress,
41
+ adapterId: AdapterType,
42
+ messageId: MessageId,
43
+ extraArgs: ReverseMessageExtraAgrs,
44
+ value: bigint,
45
+ hubChain: HubChain,
46
+ transactionOptions: EstimateGasParameters = {
47
+ account: sender,
48
+ },
49
+ ): Promise<PrepareRetryMessageCall> {
50
+ const bridgeRouter = getBridgeRouterHubContract(provider, hubChain.bridgeRouterAddress);
51
+
52
+ const gasLimit = await bridgeRouter.estimateGas.reverseMessage([adapterId, messageId, extraArgs], {
53
+ ...transactionOptions,
54
+ value,
55
+ });
56
+
57
+ return {
58
+ gasLimit,
59
+ msgValue: value,
60
+ isHub: true,
61
+ bridgeRouterAddress: hubChain.bridgeRouterAddress,
62
+ };
63
+ },
64
+ };
65
+
66
+ export const write = {
67
+ async retryMessage(
68
+ provider: Client,
69
+ signer: WalletClient,
70
+ adapterId: AdapterType,
71
+ messageId: MessageId,
72
+ prepareCall: PrepareRetryMessageCall,
73
+ ) {
74
+ const { gasLimit, msgValue, bridgeRouterAddress } = prepareCall;
75
+
76
+ const bridgeRouter = getBridgeRouterHubContract(provider, bridgeRouterAddress, signer);
77
+
78
+ return await bridgeRouter.write.retryMessage([adapterId, messageId], {
79
+ account: getEvmSignerAccount(signer),
80
+ chain: signer.chain,
81
+ gas: gasLimit,
82
+ msgValue,
83
+ });
84
+ },
85
+
86
+ async reverseMessage(
87
+ provider: Client,
88
+ signer: WalletClient,
89
+ adapterId: AdapterType,
90
+ messageId: MessageId,
91
+ extraArgs: ReverseMessageExtraAgrs,
92
+ prepareCall: PrepareReverseMessageCall,
93
+ ) {
94
+ const { gasLimit, msgValue, bridgeRouterAddress } = prepareCall;
95
+
96
+ const bridgeRouter = getBridgeRouterHubContract(provider, bridgeRouterAddress, signer);
97
+
98
+ return await bridgeRouter.write.reverseMessage([adapterId, messageId, extraArgs], {
99
+ account: getEvmSignerAccount(signer),
100
+ chain: signer.chain,
101
+ gas: gasLimit,
102
+ msgValue,
103
+ });
104
+ },
105
+ };
@@ -0,0 +1,603 @@
1
+ import * as dn from "dnum";
2
+ import { multicall } from "viem/actions";
3
+
4
+ import { UINT256_LENGTH } from "../../../../common/constants/bytes.js";
5
+ import { FINALITY } from "../../../../common/constants/message.js";
6
+ import { Action } from "../../../../common/types/message.js";
7
+ import { getRandomGenericAddress } from "../../../../common/utils/address.js";
8
+ import { convertNumberToBytes } from "../../../../common/utils/bytes.js";
9
+ import { getSpokeChain, getSpokeTokenData } from "../../../../common/utils/chain.js";
10
+ import {
11
+ calcBorrowAssetLoanValue,
12
+ calcBorrowBalance,
13
+ calcBorrowInterestIndex,
14
+ calcBorrowUtilisationRatio,
15
+ calcCollateralAssetLoanValue,
16
+ calcLiquidationMargin,
17
+ calcLtvRatio,
18
+ calcRewardIndex,
19
+ toUnderlyingAmount,
20
+ } from "../../../../common/utils/formulae.js";
21
+ import { bigIntMin, compoundEverySecond } from "../../../../common/utils/math-lib.js";
22
+ import { exhaustiveCheck } from "../../../../utils/exhaustive-check.js";
23
+ import { defaultEventParams } from "../../common/constants/contract.js";
24
+ import { getEvmSignerAccount } from "../../common/utils/chain.js";
25
+ import {
26
+ buildEvmMessageData,
27
+ buildMessageParams,
28
+ buildMessagePayload,
29
+ buildSendTokenExtraArgsWhenRemoving,
30
+ } from "../../common/utils/message.js";
31
+ import { LoanChangeType } from "../types/loan.js";
32
+ import { getHubChain, getHubTokenData } from "../utils/chain.js";
33
+ import { getBridgeRouterHubContract, getHubContract, getLoanManagerContract } from "../utils/contract.js";
34
+ import { fetchUserLoanIds } from "../utils/events.js";
35
+ import { initLoanBorrowInterests, updateLoanBorrowInterests } from "../utils/loan.js";
36
+
37
+ import type { EvmAddress } from "../../../../common/types/address.js";
38
+ import type { FolksChainId, NetworkType } from "../../../../common/types/chain.js";
39
+ import type { AccountId, LoanId } from "../../../../common/types/lending.js";
40
+ import type {
41
+ MessageAdapters,
42
+ MessageToSend,
43
+ OptionalFeeParams,
44
+ AdapterType,
45
+ LiquidateMessageData,
46
+ LiquidateMessageDataParams,
47
+ } from "../../../../common/types/message.js";
48
+ import type { LoanTypeId } from "../../../../common/types/module.js";
49
+ import type { FolksTokenId } from "../../../../common/types/token.js";
50
+ import type { PrepareLiquidateCall } from "../../common/types/module.js";
51
+ import type { LoanManagerAbi } from "../constants/abi/loan-manager-abi.js";
52
+ import type { HubChain } from "../types/chain.js";
53
+ import type {
54
+ LoanChange,
55
+ LoanManagerUserLoan,
56
+ LoanPoolInfo,
57
+ LoanTypeInfo,
58
+ UserLoanInfo,
59
+ UserLoanInfoBorrow,
60
+ UserLoanInfoCollateral,
61
+ } from "../types/loan.js";
62
+ import type { OraclePrices } from "../types/oracle.js";
63
+ import type { PoolInfo } from "../types/pool.js";
64
+ import type { HubTokenData } from "../types/token.js";
65
+ import type { Dnum } from "dnum";
66
+ import type {
67
+ Client,
68
+ ContractFunctionParameters,
69
+ EstimateGasParameters,
70
+ ReadContractReturnType,
71
+ WalletClient,
72
+ } from "viem";
73
+
74
+ export const prepare = {
75
+ async liquidate(
76
+ provider: Client,
77
+ sender: EvmAddress,
78
+ data: LiquidateMessageData,
79
+ accountId: AccountId,
80
+ hubChain: HubChain,
81
+ transactionOptions: EstimateGasParameters = {
82
+ account: sender,
83
+ },
84
+ ): Promise<PrepareLiquidateCall> {
85
+ const hub = getHubContract(provider, hubChain.hubAddress);
86
+
87
+ const liquidateMessageDataParams: LiquidateMessageDataParams = {
88
+ action: Action.Liquidate,
89
+ data,
90
+ extraArgs: "0x",
91
+ };
92
+
93
+ const messageData = buildEvmMessageData(liquidateMessageDataParams);
94
+
95
+ const gasLimit = await hub.estimateGas.directOperation([Action.Liquidate, accountId, messageData], {
96
+ ...transactionOptions,
97
+ value: undefined,
98
+ });
99
+
100
+ return {
101
+ gasLimit,
102
+ hubAddress: hubChain.hubAddress,
103
+ messageData,
104
+ };
105
+ },
106
+ };
107
+
108
+ export const write = {
109
+ async liquidate(provider: Client, signer: WalletClient, accountId: AccountId, prepareCall: PrepareLiquidateCall) {
110
+ const { gasLimit, messageData, hubAddress } = prepareCall;
111
+
112
+ const hub = getHubContract(provider, hubAddress, signer);
113
+
114
+ return await hub.write.directOperation([Action.Liquidate, accountId, messageData], {
115
+ account: getEvmSignerAccount(signer),
116
+ chain: signer.chain,
117
+ gas: gasLimit,
118
+ });
119
+ },
120
+ };
121
+
122
+ export async function getSendTokenAdapterFees(
123
+ provider: Client,
124
+ network: NetworkType,
125
+ accountId: AccountId,
126
+ folksTokenId: FolksTokenId,
127
+ amount: bigint,
128
+ receiverFolksChainId: FolksChainId,
129
+ adapters: MessageAdapters,
130
+ feeParams: OptionalFeeParams = {},
131
+ ): Promise<bigint> {
132
+ const hubChain = getHubChain(network);
133
+ const hubTokenData = getHubTokenData(folksTokenId, network);
134
+ const hubBridgeRouter = getBridgeRouterHubContract(provider, hubChain.bridgeRouterAddress);
135
+
136
+ const spokeChain = getSpokeChain(receiverFolksChainId, network);
137
+ const spokeTokenData = getSpokeTokenData(spokeChain, folksTokenId);
138
+
139
+ // construct return message
140
+ const returnParams = buildMessageParams({
141
+ adapters: {
142
+ adapterId: adapters.returnAdapterId,
143
+ returnAdapterId: 0 as AdapterType,
144
+ },
145
+ gasLimit: feeParams.returnGasLimit,
146
+ });
147
+ const returnMessage: MessageToSend = {
148
+ params: returnParams,
149
+ sender: hubChain.hubAddress,
150
+ destinationChainId: receiverFolksChainId,
151
+ handler: getRandomGenericAddress(),
152
+ payload: buildMessagePayload(
153
+ Action.SendToken,
154
+ accountId,
155
+ getRandomGenericAddress(),
156
+ convertNumberToBytes(amount, UINT256_LENGTH),
157
+ ),
158
+ finalityLevel: FINALITY.FINALISED,
159
+ extraArgs: buildSendTokenExtraArgsWhenRemoving(spokeTokenData.spokeAddress, hubTokenData.token, amount),
160
+ };
161
+
162
+ // get return adapter fee
163
+ return await hubBridgeRouter.read.getSendFee([returnMessage]);
164
+ }
165
+
166
+ export async function getLoanTypeInfo(
167
+ provider: Client,
168
+ network: NetworkType,
169
+ loanTypeId: LoanTypeId,
170
+ tokens: Array<HubTokenData>,
171
+ ): Promise<LoanTypeInfo> {
172
+ const hubChain = getHubChain(network);
173
+ const loanManager = getLoanManagerContract(provider, hubChain.loanManagerAddress);
174
+
175
+ const getLoanPools: Array<ContractFunctionParameters> = tokens.map((token) => ({
176
+ address: loanManager.address,
177
+ abi: loanManager.abi,
178
+ functionName: "getLoanPool",
179
+ args: [loanTypeId, token.poolId],
180
+ }));
181
+
182
+ const [deprecated, loanTargetHealth, ...loanPools] = (await multicall(provider, {
183
+ contracts: [
184
+ {
185
+ address: loanManager.address,
186
+ abi: loanManager.abi,
187
+ functionName: "isLoanTypeDeprecated",
188
+ args: [loanTypeId],
189
+ },
190
+ {
191
+ address: loanManager.address,
192
+ abi: loanManager.abi,
193
+ functionName: "getLoanTypeLoanTargetHealth",
194
+ args: [loanTypeId],
195
+ },
196
+ ...getLoanPools,
197
+ ],
198
+ allowFailure: false,
199
+ })) as [
200
+ ReadContractReturnType<typeof LoanManagerAbi, "isLoanTypeDeprecated">,
201
+ ReadContractReturnType<typeof LoanManagerAbi, "getLoanTypeLoanTargetHealth">,
202
+ ...Array<ReadContractReturnType<typeof LoanManagerAbi, "getLoanPool">>,
203
+ ];
204
+
205
+ const pools: Partial<Record<FolksTokenId, LoanPoolInfo>> = {};
206
+ for (const [
207
+ i,
208
+ {
209
+ collateralUsed,
210
+ borrowUsed,
211
+ collateralCap,
212
+ borrowCap,
213
+ collateralFactor,
214
+ borrowFactor,
215
+ liquidationBonus,
216
+ liquidationFee,
217
+ isDeprecated,
218
+ reward,
219
+ },
220
+ ] of loanPools.entries()) {
221
+ const token = tokens[i];
222
+
223
+ const {
224
+ lastUpdateTimestamp,
225
+ minimumAmount,
226
+ collateralSpeed,
227
+ borrowSpeed,
228
+ collateralRewardIndex: oldCollateralRewardIndex,
229
+ borrowRewardIndex: oldBorrowRewardIndex,
230
+ } = reward;
231
+
232
+ pools[token.folksTokenId] = {
233
+ folksTokenId: token.folksTokenId,
234
+ poolId: token.poolId,
235
+ collateralUsed,
236
+ borrowUsed,
237
+ collateralCap,
238
+ borrowCap,
239
+ collateralFactor: [BigInt(collateralFactor), 4],
240
+ borrowFactor: [BigInt(borrowFactor), 4],
241
+ liquidationBonus: [BigInt(liquidationBonus), 4],
242
+ liquidationFee: [BigInt(liquidationFee), 4],
243
+ isDeprecated,
244
+ reward: {
245
+ minimumAmount,
246
+ collateralSpeed: [BigInt(collateralSpeed), 18],
247
+ borrowSpeed: [BigInt(borrowSpeed), 18],
248
+ collateralRewardIndex: calcRewardIndex(
249
+ collateralUsed,
250
+ minimumAmount,
251
+ [BigInt(oldCollateralRewardIndex), 18],
252
+ [BigInt(collateralSpeed), 18],
253
+ lastUpdateTimestamp,
254
+ ),
255
+ borrowRewardIndex: calcRewardIndex(
256
+ borrowUsed,
257
+ minimumAmount,
258
+ [BigInt(oldBorrowRewardIndex), 18],
259
+ [BigInt(borrowSpeed), 18],
260
+ lastUpdateTimestamp,
261
+ ),
262
+ },
263
+ };
264
+ }
265
+
266
+ return {
267
+ loanTypeId,
268
+ deprecated,
269
+ loanTargetHealth: [BigInt(loanTargetHealth), 4],
270
+ pools,
271
+ };
272
+ }
273
+
274
+ export async function getUserLoanIds(
275
+ provider: Client,
276
+ network: NetworkType,
277
+ accountId: AccountId,
278
+ loanTypeIdsFilter?: Array<LoanTypeId>,
279
+ ): Promise<Map<LoanTypeId, Array<LoanId>>> {
280
+ const hubChain = getHubChain(network);
281
+ const loanManager = getLoanManagerContract(provider, hubChain.loanManagerAddress);
282
+
283
+ return fetchUserLoanIds({
284
+ loanManager,
285
+ accountId,
286
+ loanTypeIds: loanTypeIdsFilter,
287
+ eventParams: defaultEventParams,
288
+ });
289
+ }
290
+
291
+ export async function getUserLoans(
292
+ provider: Client,
293
+ network: NetworkType,
294
+ loanIds: Array<LoanId>,
295
+ ): Promise<Map<LoanId, LoanManagerUserLoan>> {
296
+ const hubChain = getHubChain(network);
297
+ const loanManager = getLoanManagerContract(provider, hubChain.loanManagerAddress);
298
+
299
+ const getUserLoansCall: Array<ContractFunctionParameters> = loanIds.map((loanId) => ({
300
+ address: loanManager.address,
301
+ abi: loanManager.abi,
302
+ functionName: "getUserLoan",
303
+ args: [loanId],
304
+ }));
305
+
306
+ const userLoans: Array<LoanManagerUserLoan> = (await multicall(provider, {
307
+ contracts: getUserLoansCall,
308
+ allowFailure: false,
309
+ })) as Array<LoanManagerUserLoan>;
310
+
311
+ return new Map(loanIds.map((loanId, i) => [loanId, userLoans[i]]));
312
+ }
313
+
314
+ export function getUserLoansInfo(
315
+ userLoansMap: Map<LoanId, LoanManagerUserLoan>,
316
+ poolsInfo: Partial<Record<FolksTokenId, PoolInfo>>,
317
+ loanTypesInfo: Partial<Record<LoanTypeId, LoanTypeInfo>>,
318
+ oraclePrices: OraclePrices,
319
+ ): Record<LoanId, UserLoanInfo> {
320
+ const poolIdToFolksTokenId = new Map(
321
+ Object.values(poolsInfo).map(({ folksTokenId, poolId }) => [poolId, folksTokenId]),
322
+ );
323
+
324
+ const userLoansInfo: Record<LoanId, UserLoanInfo> = {};
325
+
326
+ for (const [loanId, userLoan] of userLoansMap.entries()) {
327
+ const [accountId, loanTypeId, colPools, borPools, cols, bors] = userLoan;
328
+
329
+ const loanTypeInfo = loanTypesInfo[loanTypeId as LoanTypeId];
330
+ if (!loanTypeInfo) throw new Error(`Unknown loan type id ${loanTypeId}`);
331
+
332
+ // common to collaterals and borrows
333
+ let netRate = dn.from(0, 18);
334
+ let netYield = dn.from(0, 18);
335
+
336
+ // collaterals
337
+ const collaterals: Partial<Record<FolksTokenId, UserLoanInfoCollateral>> = {};
338
+ let totalCollateralBalanceValue: Dnum = dn.from(0, 8);
339
+ let totalEffectiveCollateralBalanceValue: Dnum = dn.from(0, 8);
340
+ for (const [j, { balance: fTokenBalance }] of cols.entries()) {
341
+ const poolId = colPools[j];
342
+
343
+ const folksTokenId = poolIdToFolksTokenId.get(poolId);
344
+ if (!folksTokenId) throw new Error(`Unknown pool id ${poolId}`);
345
+
346
+ const poolInfo = poolsInfo[folksTokenId];
347
+ const loanPoolInfo = loanTypeInfo.pools[folksTokenId];
348
+ const tokenPrice = oraclePrices[folksTokenId];
349
+ if (!poolInfo || !loanPoolInfo || !tokenPrice) throw new Error(`Unknown folks token id ${folksTokenId}`);
350
+
351
+ const { tokenDecimals, depositData } = poolInfo;
352
+ const { interestRate, interestIndex, interestYield } = depositData;
353
+ const { collateralFactor } = loanPoolInfo;
354
+
355
+ const tokenBalance = toUnderlyingAmount(fTokenBalance, interestIndex);
356
+ const balanceValue = calcCollateralAssetLoanValue(tokenBalance, tokenPrice, tokenDecimals, dn.from(1, 4));
357
+ const effectiveBalanceValue = calcCollateralAssetLoanValue(
358
+ tokenBalance,
359
+ tokenPrice,
360
+ tokenDecimals,
361
+ collateralFactor,
362
+ );
363
+
364
+ totalCollateralBalanceValue = dn.add(totalCollateralBalanceValue, balanceValue);
365
+ totalEffectiveCollateralBalanceValue = dn.add(totalEffectiveCollateralBalanceValue, effectiveBalanceValue);
366
+ netRate = dn.add(netRate, dn.mul(balanceValue, interestRate));
367
+ netYield = dn.add(netYield, dn.mul(balanceValue, interestYield));
368
+
369
+ collaterals[folksTokenId] = {
370
+ folksTokenId,
371
+ poolId,
372
+ tokenDecimals,
373
+ tokenPrice,
374
+ collateralFactor,
375
+ fTokenBalance,
376
+ tokenBalance,
377
+ balanceValue,
378
+ effectiveBalanceValue,
379
+ interestRate,
380
+ interestYield,
381
+ };
382
+ }
383
+
384
+ // borrows
385
+ const borrows: Partial<Record<FolksTokenId, UserLoanInfoBorrow>> = {};
386
+ let totalBorrowedAmountValue: Dnum = dn.from(0, 8);
387
+ let totalBorrowBalanceValue: Dnum = dn.from(0, 8);
388
+ let totalEffectiveBorrowBalanceValue: Dnum = dn.from(0, 8);
389
+ for (const [
390
+ j,
391
+ {
392
+ amount: borrowedAmount,
393
+ balance: oldBorrowBalance,
394
+ lastInterestIndex: lii,
395
+ stableInterestRate: sbir,
396
+ lastStableUpdateTimestamp,
397
+ },
398
+ ] of bors.entries()) {
399
+ const poolId = borPools[j];
400
+
401
+ const lastBorrowInterestIndex: Dnum = [lii, 18];
402
+ const stableBorrowInterestRate: Dnum = [sbir, 18];
403
+
404
+ const folksTokenId = poolIdToFolksTokenId.get(poolId);
405
+ if (!folksTokenId) throw new Error(`Unknown pool id ${poolId}`);
406
+
407
+ const poolInfo = poolsInfo[folksTokenId];
408
+ const loanPoolInfo = loanTypeInfo.pools[folksTokenId];
409
+ const tokenPrice = oraclePrices[folksTokenId];
410
+ if (!poolInfo || !loanPoolInfo || !tokenPrice) throw new Error(`Unknown folks token id ${folksTokenId}`);
411
+
412
+ const { tokenDecimals, variableBorrowData } = poolInfo;
413
+ const { interestRate: variableBorrowInterestRate, interestIndex: variableBorrowInterestIndex } =
414
+ variableBorrowData;
415
+ const { borrowFactor } = loanPoolInfo;
416
+
417
+ const isStable = lastStableUpdateTimestamp > 0n;
418
+ const bororwInterestIndex = isStable
419
+ ? calcBorrowInterestIndex(stableBorrowInterestRate, lastBorrowInterestIndex, lastStableUpdateTimestamp)
420
+ : variableBorrowInterestIndex;
421
+ const borrowedAmountValue = calcBorrowAssetLoanValue(borrowedAmount, tokenPrice, tokenDecimals, dn.from(1, 4));
422
+ const borrowBalance = calcBorrowBalance(oldBorrowBalance, bororwInterestIndex, lastBorrowInterestIndex);
423
+ const borrowBalanceValue = calcBorrowAssetLoanValue(borrowBalance, tokenPrice, tokenDecimals, dn.from(1, 4));
424
+ const effectiveBorrowBalanceValue = calcBorrowAssetLoanValue(
425
+ borrowBalance,
426
+ tokenPrice,
427
+ tokenDecimals,
428
+ borrowFactor,
429
+ );
430
+ const accruedInterest = borrowBalance - borrowedAmount;
431
+ const accruedInterestValue = dn.sub(borrowBalanceValue, borrowedAmountValue);
432
+ const interestRate = isStable ? stableBorrowInterestRate : variableBorrowInterestRate;
433
+ const interestYield = compoundEverySecond(interestRate);
434
+
435
+ totalBorrowedAmountValue = dn.add(totalBorrowedAmountValue, borrowedAmountValue);
436
+ totalBorrowBalanceValue = dn.add(totalBorrowBalanceValue, borrowBalanceValue);
437
+ totalEffectiveBorrowBalanceValue = dn.add(totalEffectiveBorrowBalanceValue, effectiveBorrowBalanceValue);
438
+ netRate = dn.sub(netRate, dn.mul(borrowBalanceValue, interestRate));
439
+ netYield = dn.sub(netYield, dn.mul(borrowBalanceValue, interestYield));
440
+
441
+ borrows[folksTokenId] = {
442
+ folksTokenId,
443
+ poolId,
444
+ tokenDecimals,
445
+ tokenPrice,
446
+ isStable,
447
+ borrowFactor,
448
+ borrowedAmount,
449
+ borrowedAmountValue,
450
+ borrowBalance,
451
+ borrowBalanceValue,
452
+ effectiveBorrowBalanceValue,
453
+ accruedInterest,
454
+ accruedInterestValue,
455
+ interestRate,
456
+ interestYield,
457
+ };
458
+ }
459
+
460
+ if (dn.greaterThan(totalCollateralBalanceValue, 0)) {
461
+ netRate = dn.div(netRate, totalCollateralBalanceValue);
462
+ netYield = dn.div(netRate, totalCollateralBalanceValue);
463
+ }
464
+
465
+ const loanToValueRatio = calcLtvRatio(totalBorrowBalanceValue, totalCollateralBalanceValue);
466
+ const borrowUtilisationRatio = calcBorrowUtilisationRatio(
467
+ totalEffectiveBorrowBalanceValue,
468
+ totalEffectiveCollateralBalanceValue,
469
+ );
470
+ const liquidationMargin = calcLiquidationMargin(
471
+ totalEffectiveBorrowBalanceValue,
472
+ totalEffectiveCollateralBalanceValue,
473
+ );
474
+
475
+ userLoansInfo[loanId] = {
476
+ loanId,
477
+ loanTypeId,
478
+ accountId: accountId as AccountId,
479
+ collaterals,
480
+ borrows,
481
+ netRate,
482
+ netYield,
483
+ totalCollateralBalanceValue,
484
+ totalBorrowedAmountValue,
485
+ totalBorrowBalanceValue,
486
+ totalEffectiveCollateralBalanceValue,
487
+ totalEffectiveBorrowBalanceValue,
488
+ loanToValueRatio,
489
+ borrowUtilisationRatio,
490
+ liquidationMargin,
491
+ };
492
+ }
493
+
494
+ return userLoansInfo;
495
+ }
496
+
497
+ export function simulateLoanChanges(loan: LoanManagerUserLoan, changes: Array<LoanChange>): LoanManagerUserLoan {
498
+ const [accountId, loanType, oldColPools, oldBorPools, oldCollaterals, oldBorrows] = loan;
499
+
500
+ // make copy which can update
501
+ const colPools = [...structuredClone(oldColPools)];
502
+ const borPools = [...structuredClone(oldBorPools)];
503
+ const collaterals = [...structuredClone(oldCollaterals)];
504
+ const borrows = [...structuredClone(oldBorrows)];
505
+
506
+ // simulate changes
507
+ for (const change of changes) {
508
+ const { type: changeType, poolInfo } = change;
509
+ switch (changeType) {
510
+ case LoanChangeType.AddCollateral: {
511
+ const colIndex = colPools.findIndex((poolId) => poolId === poolInfo.poolId);
512
+ const { fTokenAmount } = change;
513
+
514
+ if (colIndex === -1) {
515
+ // new collateral
516
+ colPools.push(poolInfo.poolId);
517
+ collaterals.push({ balance: fTokenAmount, rewardIndex: 0n });
518
+ } else {
519
+ // existing collateral
520
+ collaterals[colIndex].balance += fTokenAmount;
521
+ }
522
+ break;
523
+ }
524
+ case LoanChangeType.ReduceCollateral: {
525
+ const colIndex = colPools.findIndex((poolId) => poolId === poolInfo.poolId);
526
+ if (colIndex === -1) throw Error(`Cannot find collateral for pool ${poolInfo.poolId}`);
527
+ const { fTokenAmount } = change;
528
+
529
+ const collateral = collaterals[colIndex];
530
+ collateral.balance -= fTokenAmount;
531
+ if (collateral.balance < 0) throw Error(`Insufficient collateral for pool ${poolInfo.poolId}`);
532
+ if (collateral.balance === 0n) {
533
+ colPools.splice(colIndex, 1);
534
+ collaterals.splice(colIndex, 1);
535
+ }
536
+ break;
537
+ }
538
+
539
+ case LoanChangeType.Borrow: {
540
+ const borIndex = borPools.findIndex((poolId) => poolId === poolInfo.poolId);
541
+ const { tokenAmount, isStable } = change;
542
+
543
+ if (borIndex === -1) {
544
+ // new borrow
545
+ borPools.push(poolInfo.poolId);
546
+ const borrow = initLoanBorrowInterests(isStable, poolInfo);
547
+ borrow.amount = tokenAmount;
548
+ borrow.balance = tokenAmount;
549
+ borrows.push(borrow);
550
+ } else {
551
+ // existing borrow
552
+ const borrow = borrows[borIndex];
553
+ if (isStable !== borrow.stableInterestRate > 0)
554
+ throw Error(`Borrow type mismatch for pool ${poolInfo.poolId}`);
555
+
556
+ updateLoanBorrowInterests(borrow, tokenAmount, poolInfo, true);
557
+ borrow.amount += tokenAmount;
558
+ borrow.balance += tokenAmount;
559
+ }
560
+ break;
561
+ }
562
+ case LoanChangeType.Repay: {
563
+ const borIndex = borPools.findIndex((poolId) => poolId === poolInfo.poolId);
564
+ if (borIndex === -1) throw Error(`Cannot find borrow for pool ${poolInfo.poolId}`);
565
+ const { tokenAmount } = change;
566
+
567
+ const borrow = borrows[borIndex];
568
+ updateLoanBorrowInterests(borrow, tokenAmount, poolInfo, false);
569
+ const balance = borrow.balance;
570
+ const interest = balance - borrow.amount;
571
+ const excessPaid = tokenAmount > balance ? tokenAmount - balance : 0n;
572
+ const interestPaid = bigIntMin(tokenAmount, interest);
573
+ const principalPaid = tokenAmount - interestPaid - excessPaid;
574
+ borrow.amount -= principalPaid;
575
+ borrow.balance -= principalPaid + interestPaid;
576
+ if (borrow.balance === 0n) {
577
+ borPools.splice(borIndex, 1);
578
+ borrows.splice(borIndex, 1);
579
+ }
580
+ break;
581
+ }
582
+ case LoanChangeType.SwitchBorrowType: {
583
+ const borIndex = borPools.findIndex((poolId) => poolId === poolInfo.poolId);
584
+ if (borIndex === -1) throw Error(`Cannot find borrow for pool ${poolInfo.poolId}`);
585
+ const { isSwitchingToStable } = change;
586
+ if (isSwitchingToStable === borrows[borIndex].stableInterestRate > 0)
587
+ throw Error(`Borrow type mismatch for pool ${poolInfo.poolId}`);
588
+
589
+ const { amount, balance } = updateLoanBorrowInterests(borrows[borIndex], 0n, poolInfo, false);
590
+ const borrow = initLoanBorrowInterests(isSwitchingToStable, poolInfo);
591
+ borrow.amount = amount;
592
+ borrow.balance = balance;
593
+ borrows[borIndex] = borrow;
594
+ break;
595
+ }
596
+ default:
597
+ exhaustiveCheck(changeType);
598
+ break;
599
+ }
600
+ }
601
+
602
+ return [accountId, loanType, colPools, borPools, collaterals, borrows];
603
+ }