Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,13 @@ handler({
testGasCost: false,
urlNetwork: "https://ocean.defichain.com/",
envNetwork: EnvironmentNetwork.MainNet,
contractAddress: /* YOUR STATE RELAYER PROXY ADDRESS */,
signer: /* signer object */,
gasUpdateDEX: /* gas limit for dex update transaction */,
gasUpdateMaster: /* gas limit for master node update transaction */,
gasUpdateVault: /* gas limit for vault update transaction */
contractAddress: "" /* YOUR STATE RELAYER PROXY ADDRESS */,
signer: "" /* signer object */,
enableOracleUpdate: false /* enable or disable oracle info update */
gasUpdateDEX: "" /* gas limit for dex update transaction */,
gasUpdateMaster: "" /* gas limit for master node update transaction */,
gasUpdateVault: "" /* gas limit for vault update transaction */,
gasUpdateOracle: "" /* gas limit for oracle update transaction */,
})
```

Expand Down
35 changes: 30 additions & 5 deletions bot/StateRelayerBot.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import { ApiPagedResponse } from '@defichain/whale-api-client';
import { PoolPairData } from '@defichain/whale-api-client/dist/api/poolpairs';
import { PriceTicker } from '@defichain/whale-api-client/dist/api/prices';
import { getWhaleClient } from '@waveshq/walletkit-bot';
import { ethers } from 'ethers';

import { StateRelayer__factory } from '../generated';
import { tranformPairData, transformDataMasternode, transformDataVault } from './utils/transformData';
import { tranformPairData, transformDataMasternode, transformDataVault, transformOracleData } from './utils/transformData';
import { DataStore, MasterNodeData, StateRelayerHandlerProps, VaultData } from './utils/types';

const DENOMINATION = 'USDT';
const PAGESIZE = 50;

export async function handler(props: StateRelayerHandlerProps): Promise<DFCData | undefined> {
const { urlNetwork, envNetwork, signer, contractAddress } = props;
const { urlNetwork, envNetwork, signer, contractAddress, enableOracleUpdate } = props;
const stateRelayerContract = StateRelayer__factory.connect(contractAddress, signer);
const dataStore = {} as DataStore;
try {
Expand Down Expand Up @@ -87,22 +88,44 @@ export async function handler(props: StateRelayerHandlerProps): Promise<DFCData
inputForDexUpdate.total24HVolume,
{ nonce, gasLimit: props.gasUpdateDEX },
);
console.log('Hash of dex update transaction', dexInfoTx.hash);

// Update Master Node information
const masterDataTx = await stateRelayerContract.updateMasterNodeInformation(dataMasterNode, {
nonce: nonce + 1,
gasLimit: props.gasUpdateMaster,
});
console.log('Hash of master update transaction', masterDataTx.hash);

// Update Vault general information
const vaultTx = await stateRelayerContract.updateVaultGeneralInformation(dataVault, {
nonce: nonce + 2,
gasLimit: props.gasUpdateVault,
});

console.log('Hash of dex update transaction', dexInfoTx.hash);
console.log('Hash of master update transaction', masterDataTx.hash);
console.log('Hash of vault update transaction', vaultTx.hash);

let oracleInfoTx;
if (enableOracleUpdate) {
// Data for Oracles
let rawPriceData: Array<PriceTicker> = [];
let pagedPriceData: ApiPagedResponse<PriceTicker> = await client.prices.list(PAGESIZE);
rawPriceData = rawPriceData.concat(pagedPriceData);
while (pagedPriceData.hasNext) {
pagedPriceData = await client.paginate(pagedPriceData);
rawPriceData = rawPriceData.concat(pagedPriceData);
}

const inputForOracleUpdate = transformOracleData(rawPriceData)
// Update Oracle information
oracleInfoTx = await stateRelayerContract.updateOracleInfo(
inputForOracleUpdate.oracle,
inputForOracleUpdate.oracleInfo,
{ nonce: nonce + 3, gasLimit: props.gasUpdateOracle },
);
console.log('Hash of oracle update transaction', oracleInfoTx.hash);

}

if (!props.testGasCost) {
return {
dataStore,
Expand All @@ -117,6 +140,7 @@ export async function handler(props: StateRelayerHandlerProps): Promise<DFCData
dexInfoTxReceipt: (await dexInfoTx.wait()) || undefined,
masterDataTxReceipt: (await masterDataTx.wait()) || undefined,
vaultTxReceipt: (await vaultTx.wait()) || undefined,
oracleInfoTxReceipt: (await oracleInfoTx?.wait()) || undefined,
};
} catch (e) {
console.error((e as Error).message);
Expand All @@ -131,4 +155,5 @@ interface DFCData {
dexInfoTxReceipt?: ethers.ContractTransactionReceipt;
masterDataTxReceipt?: ethers.ContractTransactionReceipt;
vaultTxReceipt?: ethers.ContractTransactionReceipt;
oracleInfoTxReceipt?: ethers.ContractTransactionReceipt;
}
18 changes: 17 additions & 1 deletion bot/test-i9n/StateRelayerBot.unit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@ import { ethers } from 'ethers';
import { HardhatNetwork, HardhatNetworkContainer, StartedHardhatNetworkContainer } from '../../containers';
import { StateRelayer, StateRelayer__factory, StateRelayerProxy__factory } from '../../generated';
import { handler } from '../StateRelayerBot';
import { tranformPairData } from '../utils/transformData';
import { tranformPairData, transformOracleData } from '../utils/transformData';
import {
expectedMasterNodeData,
expectedVaultData,
mockedDexPricesData,
mockedPoolPairData,
mockedPriceData,
mockedStatsData,
} from './mockData/oceanMockedData';

Expand All @@ -23,6 +24,9 @@ jest.mock('@defichain/whale-api-client', () => ({
list: () => mockedPoolPairData,
listDexPrices: () => mockedDexPricesData,
},
prices: {
list: () => mockedPriceData
}
})),
}));

Expand Down Expand Up @@ -59,6 +63,7 @@ describe('State Relayer Bot Tests', () => {
]),
],
});

proxy = StateRelayer__factory.connect((await stateRelayerProxy?.getAddress()) || '', bot);
});

Expand All @@ -69,6 +74,7 @@ describe('State Relayer Bot Tests', () => {
test('Successfully set the dexInfo data', async () => {
const output = await handler({
testGasCost: false,
enableOracleUpdate: true,
envNetwork: EnvironmentNetwork.LocalPlayground,
urlNetwork: '',
contractAddress: await proxy.getAddress(),
Expand Down Expand Up @@ -103,6 +109,16 @@ describe('State Relayer Bot Tests', () => {
expect(dex[2]).toStrictEqual(expectedDexInfo.totalValueLocked);
expect(dex[1]).toStrictEqual(expectedDexInfo.total24HVolume);

// Checking the oracle info
const testOceanData = await client.prices.list(200);
const dTSLA = await proxy.getOraclePairInfo('TSLA-USD');
const expectedOracleInfo = transformOracleData(testOceanData);
const lastTSLAUSDInfo = expectedOracleInfo.oracleInfo[expectedOracleInfo.oracle.indexOf('TSLA-USD')];
// for sure both two sides have the same type as bigint
expect(dTSLA[1].price).toStrictEqual(lastTSLAUSDInfo.price);
expect(dTSLA[1].oraclesActive).toStrictEqual(lastTSLAUSDInfo.oraclesActive);
expect(dTSLA[1].oraclesTotal).toStrictEqual(lastTSLAUSDInfo.oraclesTotal);

// Checking MasterNode information
const receivedMasterNodeData = await proxy.getMasterNodeInfo();
expect(receivedMasterNodeData[1].totalValueLockedInMasterNodes).toStrictEqual(
Expand Down
Loading