1
+ const iota = require ( '../helper/chain/iota' ) ;
2
+
3
+ const VAULT_MAP = {
4
+ IOTA : {
5
+ priceAggregater : {
6
+ objectId : "0x052c40b4e8f16df5238457f3a7b3b0eeaa49c6bc8acc22f6a7790ab32495b2c6" ,
7
+ mutable : false ,
8
+ initialSharedVersion : 22329880 ,
9
+ } ,
10
+ vault : {
11
+ objectId : "0xaf306be8419cf059642acdba3b4e79a5ae893101ae62c8331cefede779ef48d5" ,
12
+ mutable : true ,
13
+ initialSharedVersion : 22329895 ,
14
+ } ,
15
+ pythPriceId : "0xc7b72e5d860034288c9335d4d325da4272fe50c92ab72249d58f6cbba30e4c44" ,
16
+ } ,
17
+ stIOTA : {
18
+ priceAggregater : {
19
+ objectId : "0x8c730f64aa369eed69ddf7eea39c78bf0afd3f9fbb4ee0dfe457f6dea5a0f4ed" ,
20
+ mutable : false ,
21
+ initialSharedVersion : 22329881 ,
22
+ } ,
23
+ vault : {
24
+ objectId : "0xc9cb494657425f350af0948b8509efdd621626922e9337fd65eb161ec33de259" ,
25
+ mutable : true ,
26
+ initialSharedVersion : 22329896 ,
27
+ } ,
28
+ } ,
29
+ } ;
30
+
31
+ const formatUnits = ( value , decimals ) => {
32
+ let display = value . toString ( ) ;
33
+ const negative = display . startsWith ( "-" ) ;
34
+ if ( negative ) display = display . slice ( 1 ) ;
35
+ display = display . padStart ( decimals , "0" ) ;
36
+ const integer = display . slice ( 0 , display . length - decimals ) ;
37
+ let fraction = display . slice ( display . length - decimals ) ;
38
+ fraction = fraction . replace ( / ( 0 + ) $ / , "" ) ;
39
+ return `${ negative ? "-" : "" } ${ integer || "0" } ${ fraction ? `.${ fraction } ` : "" } ` ;
40
+ } ;
41
+
42
+ const formatBigInt = ( value , decimals = 9 ) => {
43
+ const formatted = formatUnits ( BigInt ( value ) , decimals ) ;
44
+ return Number ( formatted ) ;
45
+ } ;
46
+
47
+ function getIotaObjectData ( resp ) {
48
+ return resp . data ;
49
+ }
50
+
51
+ function isIotaObjectDataWithContent (
52
+ data ,
53
+ ) {
54
+ return data . content !== undefined ;
55
+ }
56
+
57
+ function getMoveObject ( data ) {
58
+ const obj = "data" in data ? getIotaObjectData ( data ) : data ;
59
+ if ( ! obj || ! isIotaObjectDataWithContent ( obj ) || obj . content . dataType !== "moveObject" ) {
60
+ return undefined ;
61
+ }
62
+ return obj . content ;
63
+ }
64
+
65
+ function getObjectFields ( resp ) {
66
+ if ( "fields" in resp ) {
67
+ return resp . fields ;
68
+ }
69
+ return getMoveObject ( resp ) ?. fields ;
70
+ }
71
+
72
+ const parseVaultObject = ( coinSymbol , fields ) => {
73
+ return {
74
+ token : coinSymbol ,
75
+ positionTableSize : fields . position_table . fields . size ,
76
+ collateralDecimal : Number ( fields . decimal ) ,
77
+ collateralBalance : fields . balance ,
78
+ supply : fields . limited_supply . fields . supply ,
79
+ maxSupply : fields . limited_supply . fields . limit ,
80
+ interestRate : formatBigInt ( fields . interest_rate . fields . value , 18 ) ,
81
+ minCollateralRatio : formatBigInt ( fields . min_collateral_ratio . fields . value ) ,
82
+ } ;
83
+ } ;
84
+
85
+ async function getAllVaults ( ) {
86
+ const vaultObjectIds = Object . values ( VAULT_MAP ) . map ( ( v ) => v . vault . objectId ) ;
87
+
88
+ const vaultResults = await iota . getObjects ( vaultObjectIds ) ;
89
+ const vaults = vaultResults . reduce ( ( acc , res ) => {
90
+ const fields = getObjectFields ( res ) ;
91
+ const token = Object . keys ( VAULT_MAP ) . find (
92
+ ( key ) => VAULT_MAP [ key ] . vault . objectId === res ?. fields . id . id ,
93
+ ) ;
94
+ if ( ! token ) return acc ;
95
+ const vault = parseVaultObject ( token , fields ) ;
96
+ acc [ vault . token ] = vault ;
97
+ return acc ;
98
+ } , { } ) ;
99
+
100
+ return vaults ;
101
+ }
102
+
103
+ module . exports = {
104
+ VAULT_MAP ,
105
+ formatUnits,
106
+ formatBigInt,
107
+ getIotaObjectData,
108
+ getMoveObject,
109
+ getObjectFields,
110
+ parseVaultObject,
111
+ getAllVaults,
112
+ } ;
0 commit comments