Sub-Adapters 5
Preview and test each sub adapter.
Abracadabra.money - Ethereum (abracadabra-ethereum)
Abracadabra.money - Fantom (abracadabra-fantom)
Abracadabra.money - Avalanche (abracadabra-avalanche)
Abracadabra.money - Binance (abracadabra-bsc)
Abracadabra.money - Arbitrum One (abracadabra-arbitrum-one)
Adapter Code
Check the entire code written for the Adapter.
Source code
Showing TS source. 
1export const name = 'Abracadabra Fees';
2export const version = '0.1.1';
3export const license = 'MIT';
4
5interface NetInfo {
6  subgraph: string;
7  blockchain: string;
8  protocolLaunch: string;
9}
10
11type DataResponse = {
12  startValue: [{
13    accrueInfoFeesEarned: number,
14    accrueInfoFeesWithdrawn: number
15  }]
16  endValue: [{
17    accrueInfoFeesEarned: number,
18    accrueInfoFeesWithdrawn: number
19  }]
20}
21
22const networks: { [network: string]: NetInfo } = {
23  ethereum: {
24    subgraph: 'ap0calyp/abracadabra-mainnet-fees',
25    blockchain: 'Ethereum',
26    protocolLaunch: '2021-06-04',
27  },
28  fantom: {
29    subgraph: 'ap0calyp/abracadabra-fantom-fees',
30    blockchain: 'Fantom',
31    protocolLaunch: '2021-05-27',
32  },
33  avalanche: {
34    subgraph: 'ap0calyp/abracadabra-avalanche-fees',
35    blockchain: 'Avalanche',
36    protocolLaunch: '2021-09-07',
37  },
38  bsc: {
39    subgraph: 'ap0calyp/abracadabra-binancesmartchain-fees',
40    blockchain: 'Binance',
41    protocolLaunch: '2021-11-20',
42  },
43  'arbitrum-one': {
44    subgraph: 'ap0calyp/abracadabra-arbitrum-fees',
45    blockchain: 'Arbitrum One',
46    protocolLaunch: '2021-09-16',
47  }
48}
49
50const graphQuery = 
51`query fees($startBlock: Int!, $endBlock: Int!) {
52    startValue: cauldronFees(block: { number: $startBlock }) {
53    accrueInfoFeesEarned
54    accrueInfoFeesWithdrawn
55    }
56    endValue: cauldronFees(block: { number: $endBlock }) {
57      accrueInfoFeesEarned
58      accrueInfoFeesWithdrawn
59    }
60  }`;
61
62function getFees(data: DataResponse): number {
63    const startFees = data.startValue.reduce((prev, curr) => {
64      return prev + Number(curr.accrueInfoFeesEarned) + Number(curr.accrueInfoFeesWithdrawn)
65    }, 0)
66
67    const endFees = data.endValue.reduce((prev, curr) => {
68      return prev + Number(curr.accrueInfoFeesEarned) + Number(curr.accrueInfoFeesWithdrawn)
69    }, 0)
70    return endFees - startFees;
71}
72
73export function setup(sdk: Context) {
74  const createFeeDataQuery = (subgraph: string, network: string) => async (date: string): Promise<number> => {
75    const tomorrow = sdk.date.offsetDaysFormatted(date, 1);
76    let variables: { startBlock: number, endBlock: number } = null;
77    try {
78      const startBlock = await sdk.chainData.getBlockNumber(date, network);
79      const endBlock = await sdk.chainData.getBlockNumber(tomorrow, network);
80      variables = { startBlock, endBlock };
81    } catch (error) {
82        throw Error(`Cannot locate block for ${date}`);
83    }
84
85    const data = await sdk.graph.query(subgraph, graphQuery, { variables });
86    if (data.startValue.length === 0 || data.endValue.length === 0) {
87      throw new Error(`No Abracadabra data found on ${date} from ${subgraph}`);
88    }
89    return getFees(data);
90  }
91
92  const createFeeRangeQuery = (subgraph: string, network: string) => async (startDate: string, endDate: string): Promise<number> => {
93    let variables: { startBlock: number, endBlock: number } = null;
94    try {
95      const startBlock = await sdk.chainData.getBlockNumber(startDate, network);
96      const endBlock = await sdk.chainData.getBlockNumber(endDate, network);
97      variables = { startBlock, endBlock };
98    } catch (error) {
99        throw Error(`Cannot locate block for ${startDate}`);
100    }
101    
102    const data = await sdk.graph.query(subgraph, graphQuery, { variables });
103
104    if (data.startValue.length === 0 || data.endValue.length === 0) {
105      throw new Error(`No Abracadabra data found between ${startDate} and ${endDate} from ${subgraph}`);
106    }
107
108    return getFees(data);
109
110  }
111
112  const bundle = 'abracadabra';
113
114  const metadata = {
115    category: 'lending',
116    name: 'Abracadabra.money',
117    shortName: 'Abracadabra',
118    description:
119      'Abracadabra.money is a lending platform that uses interest-bearing tokens (ibTKNs) as collateral to borrow a USD pegged stablecoin (Magic Internet Money - MIM), that can be used as any other traditional stablecoin.',
120    feeDescription:
121      'Borrow Fees, interest fees, and some liquidation fees are paid to holders of staked Spell.',
122    source: 'The Graph Protocol',
123    tokenTicker: 'SPELL',
124    tokenCoingecko: 'spell-token',
125    website: 'https://abracadabra.money',
126    icon: sdk.ipfs.getDataURILoader('QmR8XgrW7cGncTjPQJ2LBnoQHBFBRve7mN1PT6yLjrKX6s', 'image/png'),
127    protocolLaunch: '2020-05-27',
128  };
129
130  sdk.registerBundle(bundle, metadata);
131
132  Object.entries(networks).map(([network, { subgraph, blockchain, protocolLaunch }]: [string, NetInfo]) => {
133    sdk.register({
134      id: `${bundle}-${network}`,
135      bundle,
136      queries: {
137        oneDayTotalFees: createFeeDataQuery(subgraph, network),
138        oneDayProtocolFees: createFeeDataQuery(subgraph, network),
139        dateRangeTotalFees: createFeeRangeQuery(subgraph, network),
140        dateRangeProtocolFees: createFeeRangeQuery(subgraph, network),
141      },
142      metadata: {
143        ...metadata,
144        subtitle: blockchain,
145        blockchain,
146        protocolLaunch,
147      },
148    })
149  })
150}
It's something off?
Report it to the discussion board on Discord, we will take care of it.