UNPKG

@bandprotocol/bandchain.js

Version:

Library for interacting with BandChain in browser and Node.js environments

1,061 lines (971 loc) 47.8 kB
import { Client, Coin } from '../../src' import { grpc } from '@improbable-eng/grpc-web' import { QueryClient, ServiceError, UnaryResponse, } from '../../codegen/oracle/v1/query_pb_service' import { QueryDataSourceRequest, QueryDataSourceResponse, QueryOracleScriptRequest, QueryOracleScriptResponse, QueryReportersRequest, QueryReportersResponse, QueryRequestPriceRequest, QueryRequestPriceResponse, QueryRequestSearchRequest, QueryRequestSearchResponse, QueryRequestResponse, } from '../../codegen/oracle/v1/query_pb' import { DataSource, OracleScript, PriceResult, Request, RawRequest, Report, RawReport, Result, } from '../../codegen/oracle/v1/oracle_pb' import { ServiceClient } from '../../codegen/cosmos/base/tendermint/v1beta1/query_pb_service' import { GetLatestBlockRequest, GetLatestBlockResponse, } from '../../codegen/cosmos/base/tendermint/v1beta1/query_pb' import { BlockID, Header } from '../../codegen/tendermint/types/types_pb' import { Block } from '../../codegen/tendermint/types/block_pb' import { QueryClient as AuthQueryClient } from '../../codegen/cosmos/auth/v1beta1/query_pb_service' import { QueryClient as QueryAllBalances } from '../../codegen/cosmos/bank/v1beta1/query_pb_service' import { QueryAllBalancesRequest, QueryAllBalancesResponse, } from '../../codegen/cosmos/bank/v1beta1/query_pb' import { QueryAccountRequest, QueryAccountResponse, } from '../../codegen/cosmos/auth/v1beta1/query_pb' import { ServiceClient as TxServiceClient } from '../../codegen/cosmos/tx/v1beta1/service_pb_service' import { GetTxRequest, GetTxResponse, } from '../../codegen/cosmos/tx/v1beta1/service_pb' import { Tx, TxBody, AuthInfo, SignerInfo, } from '../../codegen/cosmos/tx/v1beta1/tx_pb' import { Any } from 'google-protobuf/google/protobuf/any_pb' import { ABCIMessageLog } from '../../codegen/cosmos/base/abci/v1beta1/abci_pb' import { TxResponse } from '../../codegen/cosmos/base/abci/v1beta1/abci_pb' import { StringEvent } from '../../codegen/cosmos/base/abci/v1beta1/abci_pb' import { Attribute } from '../../codegen/cosmos/base/abci/v1beta1/abci_pb' import { SignMode } from '../../codegen/cosmos/tx/signing/v1beta1/signing_pb' import { ModeInfo, Fee } from '../../codegen/cosmos/tx/v1beta1/tx_pb' jest.mock('../../codegen/oracle/v1/query_pb_service') jest.mock('../../codegen/cosmos/base/tendermint/v1beta1/query_pb_service') jest.mock('../../codegen/cosmos/auth/v1beta1/query_pb_service') jest.mock('../../codegen/cosmos/tx/v1beta1/service_pb_service') jest.mock('../../codegen/cosmos/bank/v1beta1/query_pb_service') const STATIC_DATE = 1625578450000 Date.now = jest.fn(() => STATIC_DATE) const MockedQueryClient = jest.mocked(QueryClient) const MockedAuthQueryClient = jest.mocked(AuthQueryClient) const MockedServiceClient = jest.mocked(ServiceClient) const MockedTxService = jest.mocked(TxServiceClient) const MockedQueryAllBalances = jest.mocked(QueryAllBalances) const TEST_GRPC = 'http://localhost:8080' beforeEach(() => { MockedQueryClient.mockClear() MockedServiceClient.mockClear() MockedAuthQueryClient.mockClear() MockedTxService.mockClear() MockedQueryAllBalances.mockClear() }) describe('Client get data', () => { it('get data source by ID success', async () => { expect(MockedQueryClient).not.toHaveBeenCalled() const client = new Client(TEST_GRPC) expect(MockedQueryClient).toHaveBeenCalledTimes(1) const mockedGRPCClient = jest.mocked(MockedQueryClient.mock.instances[0]) type ExpectedDataSourceSignature = ( requestMessage: QueryDataSourceRequest, metadata: grpc.Metadata, callback: ( error: ServiceError | null, responseMessage: QueryDataSourceResponse | null, ) => void, ) => UnaryResponse const mockedDataSource = jest.mocked( mockedGRPCClient.dataSource as ExpectedDataSourceSignature, ) mockedDataSource.mockImplementationOnce( (_req, _metadata, callback): UnaryResponse => { const dataSource = new DataSource() dataSource.setName('CoinGecko Cryptocurrency Price') dataSource.setDescription( 'Retrieves current price of a cryptocurrency from https://www.coingecko.com', ) dataSource.setOwner('band1m5lq9u533qaya4q3nfyl6ulzqkpkhge9q8tpzs') dataSource.setFilename( 'c56de9061a78ac96748c83e8a22330accf6ee8ebb499c8525613149a70ec49d0', ) const response = new QueryDataSourceResponse() response.setDataSource(dataSource) callback(null, response) return { cancel: function () {} } }, ) const expected = { owner: 'band1m5lq9u533qaya4q3nfyl6ulzqkpkhge9q8tpzs', name: 'CoinGecko Cryptocurrency Price', description: 'Retrieves current price of a cryptocurrency from https://www.coingecko.com', filename: 'c56de9061a78ac96748c83e8a22330accf6ee8ebb499c8525613149a70ec49d0', feeList: [], treasury: '', } const response = await client.getDataSource(1) expect(mockedDataSource).toHaveBeenCalledTimes(1) expect(response).toEqual(expected) }) }) describe('get oracle script by ID', () => { it('get oracle script by ID success', async () => { expect(MockedQueryClient).not.toHaveBeenCalled() const client = new Client(TEST_GRPC) expect(MockedQueryClient).toHaveBeenCalledTimes(1) const mockedGRPCClient = jest.mocked(MockedQueryClient.mock.instances[0]) type ExpectedOracleScriptSignature = ( requestMessage: QueryOracleScriptRequest, metadata: grpc.Metadata, callback: ( error: ServiceError | null, responseMessage: QueryOracleScriptResponse | null, ) => void, ) => UnaryResponse const mockedOracleScript = jest.mocked( mockedGRPCClient.oracleScript as ExpectedOracleScriptSignature, ) mockedOracleScript.mockImplementationOnce( (_req, _metadata, callback): UnaryResponse => { const oracleScript = new OracleScript() oracleScript.setOwner('band17f6n25na5kume99j4qdfzlf7jnpu9u2neqqvt8') oracleScript.setName('OS 03') oracleScript.setDescription('TBD') oracleScript.setFilename( '2bf80fa07dc9585305818939853833f140fdb7e7bab824a628dc2ebc2094f482', ) oracleScript.setSchema( '{base_symbol:string,quote_symbol:string,multiplier:u64}/{px:u64}', ) oracleScript.setSourceCodeUrl( 'https://ipfs.io/ipfs/QmcXZKevdv2QCAkzKF69YzSK6w7KziEugaVyyjuLF1RM6u', ) const response = new QueryOracleScriptResponse() response.setOracleScript(oracleScript) callback(null, response) return { cancel: function () {} } }, ) const expected = { owner: 'band17f6n25na5kume99j4qdfzlf7jnpu9u2neqqvt8', name: 'OS 03', description: 'TBD', filename: '2bf80fa07dc9585305818939853833f140fdb7e7bab824a628dc2ebc2094f482', schema: '{base_symbol:string,quote_symbol:string,multiplier:u64}/{px:u64}', sourceCodeUrl: 'https://ipfs.io/ipfs/QmcXZKevdv2QCAkzKF69YzSK6w7KziEugaVyyjuLF1RM6u', } const response = await client.getOracleScript(1) expect(mockedOracleScript).toHaveBeenCalledTimes(1) expect(response).toEqual(expected) }) }) describe('get latest block', () => { it('get latest block success', async () => { expect(MockedServiceClient).not.toHaveBeenCalled() const client = new Client(TEST_GRPC) expect(MockedServiceClient).toHaveBeenCalledTimes(1) const mockedServiceClient = jest.mocked( MockedServiceClient.mock.instances[0], ) type ExpectedLatestBlockSignature = ( requestMessage: GetLatestBlockRequest, metadata: grpc.Metadata, callback: ( error: ServiceError | null, responseMessage: GetLatestBlockResponse | null, ) => void, ) => UnaryResponse const mockedLatestBlock = jest.mocked( mockedServiceClient.getLatestBlock as ExpectedLatestBlockSignature, ) mockedLatestBlock.mockImplementationOnce( (_req, _metadata, callback): UnaryResponse => { const response = new GetLatestBlockResponse() const blockId = new BlockID() blockId.setHash( '391E99908373F8590C928E0619956DA3D87EB654445DA4F25A185C9718561D53', ) response.setBlockId(blockId) const block = new Block() const header = new Header() header.setChainId('bandchain') header.setHeight(1032007) header.setLastCommitHash( '17B2CE4ABA910E85847537F1323DB95C9F16C20C60E9B9BBB04C633C3125BD92', ) header.setDataHash( 'EFE5E3F549554FEE8EB9B393740C250D74580427A96A175ABB105806039CFFE2', ) header.setValidatorsHash( 'E3F0EA129867E1AB4D7D6A97C23771D4D89B9E4DFE0A5B11E03B681244E00151', ) header.setNextValidatorsHash( 'E3F0EA129867E1AB4D7D6A97C23771D4D89B9E4DFE0A5B11E03B681244E00151', ) header.setConsensusHash( '0EAA6F4F4B8BD1CC222D93BBD391D07F074DE6BE5A52C6964875BB355B7D0B45', ) header.setAppHash( '6E2B1ECE9D912D86C25182E8B7419583ABCE978BFC66DC2556BB0D06A8D528EF', ) header.setLastResultsHash('') header.setEvidenceHash('') header.setProposerAddress('BDB6A0728C8DFE2124536F16F2BA428FE767A8F9') block.setHeader(header) response.setBlock(block) callback(null, response) return { cancel: function () {} } }, ) const expected = { blockId: { hash: '391E99908373F8590C928E0619956DA3D87EB654445DA4F25A185C9718561D53', }, block: { header: { chainId: 'bandchain', height: 1032007, lastCommitHash: '17B2CE4ABA910E85847537F1323DB95C9F16C20C60E9B9BBB04C633C3125BD92', dataHash: 'EFE5E3F549554FEE8EB9B393740C250D74580427A96A175ABB105806039CFFE2', validatorsHash: 'E3F0EA129867E1AB4D7D6A97C23771D4D89B9E4DFE0A5B11E03B681244E00151', nextValidatorsHash: 'E3F0EA129867E1AB4D7D6A97C23771D4D89B9E4DFE0A5B11E03B681244E00151', consensusHash: '0EAA6F4F4B8BD1CC222D93BBD391D07F074DE6BE5A52C6964875BB355B7D0B45', appHash: '6E2B1ECE9D912D86C25182E8B7419583ABCE978BFC66DC2556BB0D06A8D528EF', lastResultsHash: '', evidenceHash: '', proposerAddress: 'BDB6A0728C8DFE2124536F16F2BA428FE767A8F9', }, }, } const response = await client.getLatestBlock() expect(mockedLatestBlock).toHaveBeenCalledTimes(1) expect(response).toEqual(expected) }) }) describe('get reporters', () => { it('get reporters success', async () => { expect(MockedQueryClient).not.toHaveBeenCalled() const client = new Client(TEST_GRPC) expect(MockedQueryClient).toHaveBeenCalledTimes(1) const mockedGRPCClient = jest.mocked(MockedQueryClient.mock.instances[0]) type ExpectedReportersSignature = ( requestMessage: QueryReportersRequest, metadata: grpc.Metadata, callback: ( error: ServiceError | null, responseMessage: QueryReportersResponse | null, ) => void, ) => UnaryResponse const mockedReporters = jest.mocked( mockedGRPCClient.reporters as ExpectedReportersSignature, ) mockedReporters.mockImplementationOnce( (_req, _metadata, callback): UnaryResponse => { const reporters = [ 'band17n5rmujk78nkgss7tjecg4nfzn6geg4cvaqt5h', 'band1wc6r20m8qg7p3lze55kzen5uwssdvwr7wl5w4q', 'band1wm0lw8wzt094xdyxx4ukx432q9vcwdl9zmwa4x', 'band10ptt5622ezszsvrcum07ehng3merea9x5jetv2', 'band10lyra24wxsme03pe47du6xfurtsqzs99mn5r94', 'band1ek7hfydf3xgz3k6nnsy2zrg0xxuzkvhzrykrn5', ] const response = new QueryReportersResponse() response.setReporterList(reporters) callback(null, response) return { cancel: function () {} } }, ) const expected = [ 'band17n5rmujk78nkgss7tjecg4nfzn6geg4cvaqt5h', 'band1wc6r20m8qg7p3lze55kzen5uwssdvwr7wl5w4q', 'band1wm0lw8wzt094xdyxx4ukx432q9vcwdl9zmwa4x', 'band10ptt5622ezszsvrcum07ehng3merea9x5jetv2', 'band10lyra24wxsme03pe47du6xfurtsqzs99mn5r94', 'band1ek7hfydf3xgz3k6nnsy2zrg0xxuzkvhzrykrn5', ] const response = await client.getReporters( 'bandvaloper17n5rmujk78nkgss7tjecg4nfzn6geg4cqtyg3u', ) expect(mockedReporters).toHaveBeenCalledTimes(1) expect(response).toEqual(expected) }) }) describe('get request id by transaction hash', () => { it('success, with report tx', async () => { expect(MockedTxService).not.toHaveBeenCalled() const client = new Client(TEST_GRPC) expect(MockedTxService).toHaveBeenCalledTimes(1) const mockedTxServices = jest.mocked(MockedTxService.mock.instances[0]) type ExpectedGetTxSignature = ( requestMessage: GetTxRequest, metadata: grpc.Metadata, callback: ( error: ServiceError | null, responseMessage: GetTxResponse | null, ) => void, ) => UnaryResponse const mockedTxRequest = jest.mocked( mockedTxServices.getTx as ExpectedGetTxSignature, ) mockedTxRequest.mockImplementationOnce( (_req, _metadata, callback): UnaryResponse => { const response = new GetTxResponse() const tx = new Tx() const txBody = new TxBody() const anyMsgList = new Any() anyMsgList.setTypeUrl('/oracle.v1.MsgReportData') anyMsgList.setValue( 'CKiHARKGAQgBGoEBMDQzYTYxNzkzNjBiZjhhZDljMTJlMmM0YzQ0YjU0NzM1MDE1OTQzZTMxMWIwMGFhN2U3ODc5YmJmZjI5ZjY2NGVkOTIwNDVhYjQ3NDYzNDI4YTI1OWFmZjEzNGRjMDU1YjlkOTc5MGRhN2UyMWJmZTg0NzY0NjYyNGNhNWRiMjMKGjJiYW5kdmFsb3BlcjFkOTZ1MHFsdmRwNnZ4M2o2cjMzbHVqcjkzZjdnZHl5NmVyYzgzOSIrYmFuZDFnMmh5N3FwNXJ0OGc0cjhwMzh3M3E1bWFtZ3VnZ2wycGp1d3Zrdw==', ) txBody.setMessagesList([anyMsgList]) txBody.setMemo('yoda:2.0.3/exec:lambda:2.0.0') txBody.setTimeoutHeight(0) const authInfo = new AuthInfo() const signerInfo = new SignerInfo() const anyPublicKey = new Any() anyPublicKey.setTypeUrl('/cosmos.crypto.secp256k1.PubKey') anyPublicKey.setValue( 'CiEDMjXNir3uQ0slLlvp19D16YMl6myAW26009DGAh4dLiw=', ) signerInfo.setPublicKey(anyPublicKey) const modeInfo = new ModeInfo() const modeSingle = new ModeInfo.Single() modeSingle.setMode(SignMode.SIGN_MODE_DIRECT) modeInfo.setSingle(modeSingle) signerInfo.setModeInfo(modeInfo) signerInfo.setSequence(3363) authInfo.setSignerInfosList([signerInfo]) const fee = new Fee() fee.setGasLimit(76153) authInfo.setFee(fee) tx.setSignaturesList([ 'nAWQjUQ8B9PjfGhkW0OoUGzwIcFat7ODpJfCkmrpPGEjJAoAfo4FMe7p2+EeL4azogppzU0jc37hGKm8rMSqg==', ]) const txResponse = new TxResponse() txResponse.setHeight(206077) txResponse.setTxhash( 'FF88A361014A8CC2283961D632F2A00BB9CC8C168D8AE7F307F50E5D8A3945D2', ) txResponse.setCodespace('') txResponse.setCode(0) txResponse.setData('0A080A067265706F7274') txResponse.setRawLog( '[{"events":[{"type":"message","attributes":[{"key":"action","value":"report"}]},{"type":"report","attributes":[{"key":"id","value":"17320"},{"key":"validator","value":"bandvaloper1d96u0qlvdp6vx3j6r33lujr93f7gdyy6erc839"}]}]}]', ) const abciMessageLog1 = new ABCIMessageLog() abciMessageLog1.setMsgIndex(0) abciMessageLog1.setLog('') const stringEvent1 = new StringEvent() stringEvent1.setType('message') const attribute1 = new Attribute() attribute1.setKey('action') attribute1.setValue('report') stringEvent1.setAttributesList([attribute1]) const stringEvent2 = new StringEvent() stringEvent2.setType('report') const attribute2 = new Attribute() attribute2.setKey('id') attribute2.setValue('17320') const attribute3 = new Attribute() attribute3.setKey('validator') attribute3.setValue( 'bandvaloper1d96u0qlvdp6vx3j6r33lujr93f7gdyy6erc839', ) stringEvent2.setAttributesList([attribute2, attribute3]) abciMessageLog1.setEventsList([stringEvent1, stringEvent2]) txResponse.setLogsList([abciMessageLog1]) txResponse.setInfo('') txResponse.setGasWanted(76153) txResponse.setGasUsed(66833) const anyTx = new Any() anyTx.setTypeUrl('/cosmos.tx.v1beta1.Tx') anyTx.setValue( 'CqwCCosCChgvb3JhY2xlLnYxLk1zZ1JlcG9ydERhdGES7gEIqIcBEoYBCAEagQEwNDNhNjE3OTM2MGJmOGFkOWMxMmUyYzRjNDRiNTQ3MzUwMTU5NDNlMzExYjAwYWE3ZTc4NzliYmZmMjlmNjY0ZWQ5MjA0NWFiNDc0NjM0MjhhMjU5YWZmMTM0ZGMwNTViOWQ5NzkwZGE3ZTIxYmZlODQ3NjQ2NjI0Y2E1ZGIyMwoaMmJhbmR2YWxvcGVyMWQ5NnUwcWx2ZHA2dngzajZyMzNsdWpyOTNmN2dkeXk2ZXJjODM5IitiYW5kMWcyaHk3cXA1cnQ4ZzRyOHAzOHczcTVtYW1ndWdnbDJwanV3dmt3Ehx5b2RhOjIuMC4zL2V4ZWM6bGFtYmRhOjIuMC4wElkKUQpGCh8vY29zbW9zLmNyeXB0by5zZWNwMjU2azEuUHViS2V5EiMKIQMyNc2Kve5DSyUuW+nX0PXpgyXqbIBbbrTT0MYCHh0uLBIECgIIARijGhIEEPnSBBpAnAWQjUQ8B9PjfGhkW0OoUGzwIcFat7ODpJfCkmrpPGEjJAoAfo+4FMe7p2+EeL4azogppzU0jc37hGKm8rMSqg==', ) txResponse.setTx(anyTx) txResponse.setTimestamp('2021-06-29T05:01:48Z') response.setTxResponse(txResponse) callback(null, response) return { cancel: function () {} } }, ) const response = await client.getRequestIdByTxHash( '90ED70061C1A24B1141F81BADEDAB19570D0B9B255412BF5D680A9BC93539115', ) // const value = [expected.txResponse.logsList[0].eventsList[1].attributesList[0].value] expect(mockedTxRequest).toHaveBeenCalledTimes(1) expect(response).toEqual([17320]) }) it('success, with request tx (multiple id)', async () => { expect(MockedTxService).not.toHaveBeenCalled() const client = new Client(TEST_GRPC) expect(MockedTxService).toHaveBeenCalledTimes(1) const mockedTxServices = jest.mocked(MockedTxService.mock.instances[0]) type ExpectedGetTxSignature = ( requestMessage: GetTxRequest, metadata: grpc.Metadata, callback: ( error: ServiceError | null, responseMessage: GetTxResponse | null, ) => void, ) => UnaryResponse const mockedTxRequest = jest.mocked( mockedTxServices.getTx as ExpectedGetTxSignature, ) mockedTxRequest.mockImplementationOnce( (_req, _metadata, callback): UnaryResponse => { const response = new GetTxResponse() const tx = new Tx() const txBody = new TxBody() const anyMsgList = new Any() anyMsgList.setTypeUrl('/oracle.v1.MsgReportData') anyMsgList.setValue( 'CKiHARKGAQgBGoEBMDQzYTYxNzkzNjBiZjhhZDljMTJlMmM0YzQ0YjU0NzM1MDE1OTQzZTMxMWIwMGFhN2U3ODc5YmJmZjI5ZjY2NGVkOTIwNDVhYjQ3NDYzNDI4YTI1OWFmZjEzNGRjMDU1YjlkOTc5MGRhN2UyMWJmZTg0NzY0NjYyNGNhNWRiMjMKGjJiYW5kdmFsb3BlcjFkOTZ1MHFsdmRwNnZ4M2o2cjMzbHVqcjkzZjdnZHl5NmVyYzgzOSIrYmFuZDFnMmh5N3FwNXJ0OGc0cjhwMzh3M3E1bWFtZ3VnZ2wycGp1d3Zrdw==', ) txBody.setMessagesList([anyMsgList]) txBody.setMemo('yoda:2.0.3/exec:lambda:2.0.0') txBody.setTimeoutHeight(0) const authInfo = new AuthInfo() const signerInfo = new SignerInfo() const anyPublicKey = new Any() anyPublicKey.setTypeUrl('/cosmos.crypto.secp256k1.PubKey') anyPublicKey.setValue( 'CiEDMjXNir3uQ0slLlvp19D16YMl6myAW26009DGAh4dLiw=', ) signerInfo.setPublicKey(anyPublicKey) const modeInfo = new ModeInfo() const modeSingle = new ModeInfo.Single() modeSingle.setMode(SignMode.SIGN_MODE_DIRECT) modeInfo.setSingle(modeSingle) signerInfo.setModeInfo(modeInfo) signerInfo.setSequence(3363) authInfo.setSignerInfosList([signerInfo]) const fee = new Fee() fee.setGasLimit(76153) authInfo.setFee(fee) tx.setSignaturesList([ 'nAWQjUQ8B9PjfGhkW0OoUGzwIcFat7ODpJfCkmrpPGEjJAoAfo4FMe7p2+EeL4azogppzU0jc37hGKm8rMSqg==', ]) const txResponse = new TxResponse() txResponse.setHeight(206077) txResponse.setTxhash( 'FF88A361014A8CC2283961D632F2A00BB9CC8C168D8AE7F307F50E5D8A3945D2', ) txResponse.setCodespace('') txResponse.setCode(0) txResponse.setData('0A080A067265706F7274') txResponse.setRawLog( "[{'events':[{'type':'message','attributes':[{'key':'action','value':'request'}]},{'type':'raw_request','attributes':[{'key':'data_source_id','value':'82'},{'key':'data_source_hash','value':'2252604858d2f0b67b8c5745d555e7a27b10a11fa32332c7da3a61d873f76d98'},{'key':'external_id','value':'1'},{'key':'calldata','value':'BDE15735EDFA21E8C4484866C865177D13E88C5BD0B016CB3F5835613189B263 631805938'},{'key':'fee'}]},{'type':'request','attributes':[{'key':'id','value':'37625'},{'key':'client_id','value':'from_pyband_mumu_0'},{'key':'oracle_script_id','value':'47'},{'key':'calldata','value':'00000040424445313537333545444641323145384334343834383636433836353137374431334538384335424430423031364342334635383335363133313839423236330000000025a897f2'},{'key':'ask_count','value':'12'},{'key':'min_count','value':'11'},{'key':'gas_used','value':'33112'},{'key':'total_fees'},{'key':'validator','value':'bandvaloper1p46uhvdk8vr829v747v85hst3mur2dzlhfemmz'},{'key':'validator','value':'bandvaloper1l2hchtyawk9tk43zzjrzr2lcd0zyxngcjdsshe'},{'key':'validator','value':'bandvaloper1t9vedyzsxewe6lhpf9vm47em2hly23xm6uqtec'},{'key':'validator','value':'bandvaloper19eu9g3gka6rxlevkjlvjq7s6c498tejnwxjwxx'},{'key':'validator','value':'bandvaloper1d96u0qlvdp6vx3j6r33lujr93f7gdyy6erc839'},{'key':'validator','value':'bandvaloper1a570h9e3rtvfhm030ta5hvel7e7e4lh4pgv8wj'},{'key':'validator','value':'bandvaloper1ldtwjzsplhxzhrg3k5hhr8v0qterv05vpdxp9f'},{'key':'validator','value':'bandvaloper1274qgg28xkz6f3upx05ftr9zepgmtfgts392dy'},{'key':'validator','value':'bandvaloper1e9sa38742tzhmandc4gkqve9zy8zc0yremaa3j'},{'key':'validator','value':'bandvaloper1qa4k43m4avza36kkal0vmsvccnpyyp6ltyp2l5'},{'key':'validator','value':'bandvaloper1zl5925n5u24njn9axpygz8lhjl5a8v4cpkzx5g'},{'key':'validator','value':'bandvaloper1t659auvvukjtfn2h3hfp7usw0dqg6auhkwa9fs'}]}]},{'msg_index':1,'events':[{'type':'message','attributes':[{'key':'action','value':'request'}]},{'type':'raw_request','attributes':[{'key':'data_source_id','value':'82'},{'key':'data_source_hash','value':'2252604858d2f0b67b8c5745d555e7a27b10a11fa32332c7da3a61d873f76d98'},{'key':'external_id','value':'1'},{'key':'calldata','value':'BDE15735EDFA21E8C4484866C865177D13E88C5BD0B016CB3F5835613189B263 625726585'},{'key':'fee'}]},{'type':'request','attributes':[{'key':'id','value':'37626'},{'key':'client_id','value':'from_pyband_mumu_1'},{'key':'oracle_script_id','value':'47'},{'key':'calldata','value':'000000404244453135373335454446413231453843343438343836364338363531373744313345383843354244304230313643423346353833353631333138394232363300000000254bd479'},{'key':'ask_count','value':'12'},{'key':'min_count','value':'11'},{'key':'gas_used','value':'33112'},{'key':'total_fees'},{'key':'validator','value':'bandvaloper19eu9g3gka6rxlevkjlvjq7s6c498tejnwxjwxx'},{'key':'validator','value':'bandvaloper1p46uhvdk8vr829v747v85hst3mur2dzlhfemmz'},{'key':'validator','value':'bandvaloper1t9vedyzsxewe6lhpf9vm47em2hly23xm6uqtec'},{'key':'validator','value':'bandvaloper1274qgg28xkz6f3upx05ftr9zepgmtfgts392dy'},{'key':'validator','value':'bandvaloper1e9sa38742tzhmandc4gkqve9zy8zc0yremaa3j'},{'key':'validator','value':'bandvaloper1zl5925n5u24njn9axpygz8lhjl5a8v4cpkzx5g'},{'key':'validator','value':'bandvaloper1qa4k43m4avza36kkal0vmsvccnpyyp6ltyp2l5'},{'key':'validator','value':'bandvaloper1a570h9e3rtvfhm030ta5hvel7e7e4lh4pgv8wj'},{'key':'validator','value':'bandvaloper1d96u0qlvdp6vx3j6r33lujr93f7gdyy6erc839'},{'key':'validator','value':'bandvaloper1l2hchtyawk9tk43zzjrzr2lcd0zyxngcjdsshe'},{'key':'validator','value':'bandvaloper1ldtwjzsplhxzhrg3k5hhr8v0qterv05vpdxp9f'},{'key':'validator','value':'bandvaloper1t659auvvukjtfn2h3hfp7usw0dqg6auhkwa9fs'}]}]},{'msg_index':2,'events':[{'type':'message','attributes':[{'key':'action','value':'request'}]},{'type':'raw_request','attributes':[{'key':'data_source_id','value':'82'},{'key':'data_source_hash','value':'2252604858d2f0b67b8c5745d555e7a27b10a11fa32332c7da3a61d873f76d98'},{'key':'external_id','value':'1'},{'key':'calldata','value':'BDE15735EDFA21E8C4484866C865177D13E88C5BD0B016CB3F5835613189B263 410494784'},{'key':'fee'}]},{'type':'request','attributes':[{'key':'id','value':'37627'},{'key':'client_id','value':'from_pyband_mumu_2'},{'key':'oracle_script_id','value':'47'},{'key':'calldata','value':'0000004042444531353733354544464132314538433434383438363643383635313737443133453838433542443042303136434233463538333536313331383942323633000000001877a740'},{'key':'ask_count','value':'12'},{'key':'min_count','value':'11'},{'key':'gas_used','value':'33112'},{'key':'total_fees'},{'key':'validator','value':'bandvaloper1zl5925n5u24njn9axpygz8lhjl5a8v4cpkzx5g'},{'key':'validator','value':'bandvaloper1p46uhvdk8vr829v747v85hst3mur2dzlhfemmz'},{'key':'validator','value':'bandvaloper1qa4k43m4avza36kkal0vmsvccnpyyp6ltyp2l5'},{'key':'validator','value':'bandvaloper19eu9g3gka6rxlevkjlvjq7s6c498tejnwxjwxx'},{'key':'validator','value':'bandvaloper1274qgg28xkz6f3upx05ftr9zepgmtfgts392dy'},{'key':'validator','value':'bandvaloper1e9sa38742tzhmandc4gkqve9zy8zc0yremaa3j'},{'key':'validator','value':'bandvaloper1ldtwjzsplhxzhrg3k5hhr8v0qterv05vpdxp9f'},{'key':'validator','value':'bandvaloper1t9vedyzsxewe6lhpf9vm47em2hly23xm6uqtec'},{'key':'validator','value':'bandvaloper1a570h9e3rtvfhm030ta5hvel7e7e4lh4pgv8wj'},{'key':'validator','value':'bandvaloper1d96u0qlvdp6vx3j6r33lujr93f7gdyy6erc839'},{'key':'validator','value':'bandvaloper1l2hchtyawk9tk43zzjrzr2lcd0zyxngcjdsshe'},{'key':'validator','value':'bandvaloper1t659auvvukjtfn2h3hfp7usw0dqg6auhkwa9fs'}]}]},{'msg_index':3,'events':[{'type':'message','attributes':[{'key':'action','value':'request'}]},{'type':'raw_request','attributes':[{'key':'data_source_id','value':'82'},{'key':'data_source_hash','value':'2252604858d2f0b67b8c5745d555e7a27b10a11fa32332c7da3a61d873f76d98'},{'key':'external_id','value':'1'},{'key':'calldata','value':'BDE15735EDFA21E8C4484866C865177D13E88C5BD0B016CB3F5835613189B263 97304188'},{'key':'fee'}]},{'type':'request','attributes':[{'key':'id','value':'37628'},{'key':'client_id','value':'from_pyband_mumu_3'},{'key':'oracle_script_id','value':'47'},{'key':'calldata','value':'00000040424445313537333545444641323145384334343834383636433836353137374431334538384335424430423031364342334635383335363133313839423236330000000005ccbe7c'},{'key':'ask_count','value':'12'},{'key':'min_count','value':'11'},{'key':'gas_used','value':'33063'},{'key':'total_fees'},{'key':'validator','value':'bandvaloper1p46uhvdk8vr829v747v85hst3mur2dzlhfemmz'},{'key':'validator','value':'bandvaloper1a570h9e3rtvfhm030ta5hvel7e7e4lh4pgv8wj'},{'key':'validator','value':'bandvaloper1qa4k43m4avza36kkal0vmsvccnpyyp6ltyp2l5'},{'key':'validator','value':'bandvaloper1274qgg28xkz6f3upx05ftr9zepgmtfgts392dy'},{'key':'validator','value':'bandvaloper1t9vedyzsxewe6lhpf9vm47em2hly23xm6uqtec'},{'key':'validator','value':'bandvaloper1zl5925n5u24njn9axpygz8lhjl5a8v4cpkzx5g'},{'key':'validator','value':'bandvaloper1ldtwjzsplhxzhrg3k5hhr8v0qterv05vpdxp9f'},{'key':'validator','value':'bandvaloper19eu9g3gka6rxlevkjlvjq7s6c498tejnwxjwxx'},{'key':'validator','value':'bandvaloper1l2hchtyawk9tk43zzjrzr2lcd0zyxngcjdsshe'},{'key':'validator','value':'bandvaloper1d96u0qlvdp6vx3j6r33lujr93f7gdyy6erc839'},{'key':'validator','value':'bandvaloper1e9sa38742tzhmandc4gkqve9zy8zc0yremaa3j'},{'key':'validator','value':'bandvaloper1t659auvvukjtfn2h3hfp7usw0dqg6auhkwa9fs'}]}]},{'msg_index':4,'events':[{'type':'message','attributes':[{'key':'action','value':'request'}]},{'type':'raw_request','attributes':[{'key':'data_source_id','value':'82'},{'key':'data_source_hash','value':'2252604858d2f0b67b8c5745d555e7a27b10a11fa32332c7da3a61d873f76d98'},{'key':'external_id','value':'1'},{'key':'calldata','value':'BDE15735EDFA21E8C4484866C865177D13E88C5BD0B016CB3F5835613189B263 539917272'},{'key':'fee'}]},{'type':'request','attributes':[{'key':'id','value':'37629'},{'key':'client_id','value':'from_pyband_mumu_4'},{'key':'oracle_script_id','value':'47'},{'key':'calldata','value':'000000404244453135373335454446413231453843343438343836364338363531373744313345383843354244304230313643423346353833353631333138394232363300000000202e7bd8'},{'key':'ask_count','value':'12'},{'key':'min_count','value':'11'},{'key':'gas_used','value':'33112'},{'key':'total_fees'},{'key':'validator','value':'bandvaloper19eu9g3gka6rxlevkjlvjq7s6c498tejnwxjwxx'},{'key':'validator','value':'bandvaloper1274qgg28xkz6f3upx05ftr9zepgmtfgts392dy'},{'key':'validator','value':'bandvaloper1ldtwjzsplhxzhrg3k5hhr8v0qterv05vpdxp9f'},{'key':'validator','value':'bandvaloper1p46uhvdk8vr829v747v85hst3mur2dzlhfemmz'},{'key':'validator','value':'bandvaloper1l2hchtyawk9tk43zzjrzr2lcd0zyxngcjdsshe'},{'key':'validator','value':'bandvaloper1e9sa38742tzhmandc4gkqve9zy8zc0yremaa3j'},{'key':'validator','value':'bandvaloper1zl5925n5u24njn9axpygz8lhjl5a8v4cpkzx5g'},{'key':'validator','value':'bandvaloper1t659auvvukjtfn2h3hfp7usw0dqg6auhkwa9fs'},{'key':'validator','value':'bandvaloper1t9vedyzsxewe6lhpf9vm47em2hly23xm6uqtec'},{'key':'validator','value':'bandvaloper1a570h9e3rtvfhm030ta5hvel7e7e4lh4pgv8wj'},{'key':'validator','value':'bandvaloper1d96u0qlvdp6vx3j6r33lujr93f7gdyy6erc839'},{'key':'validator','value':'bandvaloper1qa4k43m4avza36kkal0vmsvccnpyyp6ltyp2l5'}]}]}]", ) const abciMessageLog1 = new ABCIMessageLog() abciMessageLog1.setMsgIndex(0) abciMessageLog1.setLog('') const stringEvent1 = new StringEvent() stringEvent1.setType('message') const attribute1 = new Attribute() attribute1.setKey('action') attribute1.setValue('request') stringEvent1.setAttributesList([attribute1]) const stringEvent2 = new StringEvent() stringEvent2.setType('request') const attribute2 = new Attribute() attribute2.setKey('id') attribute2.setValue('17320') const attribute3 = new Attribute() attribute3.setKey('validator') attribute3.setValue( 'bandvaloper1d96u0qlvdp6vx3j6r33lujr93f7gdyy6erc839', ) stringEvent1.setAttributesList([attribute1]) stringEvent2.setAttributesList([attribute2, attribute3]) abciMessageLog1.setEventsList([stringEvent1, stringEvent2]) const abciMessageLog2 = new ABCIMessageLog() abciMessageLog2.setMsgIndex(0) abciMessageLog2.setLog('') abciMessageLog2.setEventsList([stringEvent1, stringEvent2]) txResponse.setLogsList([abciMessageLog1, abciMessageLog2]) txResponse.setInfo('') txResponse.setGasWanted(76153) txResponse.setGasUsed(66833) const anyTx = new Any() anyTx.setTypeUrl('/cosmos.tx.v1beta1.Tx') anyTx.setValue( 'CqwCCosCChgvb3JhY2xlLnYxLk1zZ1JlcG9ydERhdGES7gEIqIcBEoYBCAEagQEwNDNhNjE3OTM2MGJmOGFkOWMxMmUyYzRjNDRiNTQ3MzUwMTU5NDNlMzExYjAwYWE3ZTc4NzliYmZmMjlmNjY0ZWQ5MjA0NWFiNDc0NjM0MjhhMjU5YWZmMTM0ZGMwNTViOWQ5NzkwZGE3ZTIxYmZlODQ3NjQ2NjI0Y2E1ZGIyMwoaMmJhbmR2YWxvcGVyMWQ5NnUwcWx2ZHA2dngzajZyMzNsdWpyOTNmN2dkeXk2ZXJjODM5IitiYW5kMWcyaHk3cXA1cnQ4ZzRyOHAzOHczcTVtYW1ndWdnbDJwanV3dmt3Ehx5b2RhOjIuMC4zL2V4ZWM6bGFtYmRhOjIuMC4wElkKUQpGCh8vY29zbW9zLmNyeXB0by5zZWNwMjU2azEuUHViS2V5EiMKIQMyNc2Kve5DSyUuW+nX0PXpgyXqbIBbbrTT0MYCHh0uLBIECgIIARijGhIEEPnSBBpAnAWQjUQ8B9PjfGhkW0OoUGzwIcFat7ODpJfCkmrpPGEjJAoAfo+4FMe7p2+EeL4azogppzU0jc37hGKm8rMSqg==', ) txResponse.setTx(anyTx) txResponse.setTimestamp('2021-06-29T05:01:48Z') response.setTxResponse(txResponse) callback(null, response) return { cancel: function () {} } }, ) const response = await client.getRequestIdByTxHash( '90ED70061C1A24B1141F81BADEDAB19570D0B9B255412BF5D680A9BC93539115', ) expect(mockedTxRequest).toHaveBeenCalledTimes(1) expect(response).toEqual([17320, 17320]) }) }) describe('get chain ID', () => { it('get chain ID success', async () => { expect(MockedServiceClient).not.toHaveBeenCalled() const client = new Client(TEST_GRPC) expect(MockedServiceClient).toHaveBeenCalledTimes(1) const mockedServiceClient = jest.mocked( MockedServiceClient.mock.instances[0], ) type ExpectedLatestBlockSignature = ( requestMessage: GetLatestBlockRequest, metadata: grpc.Metadata, callback: ( error: ServiceError | null, responseMessage: GetLatestBlockResponse | null, ) => void, ) => UnaryResponse const mockedLatestBlock = jest.mocked( mockedServiceClient.getLatestBlock as ExpectedLatestBlockSignature, ) mockedLatestBlock.mockImplementationOnce( (_req, _metadata, callback): UnaryResponse => { const response = new GetLatestBlockResponse() const blockId = new BlockID() blockId.setHash( '391E99908373F8590C928E0619956DA3D87EB654445DA4F25A185C9718561D53', ) response.setBlockId(blockId) const block = new Block() const header = new Header() header.setChainId('bandchain') header.setHeight(1032007) header.setLastCommitHash( '17B2CE4ABA910E85847537F1323DB95C9F16C20C60E9B9BBB04C633C3125BD92', ) header.setDataHash( 'EFE5E3F549554FEE8EB9B393740C250D74580427A96A175ABB105806039CFFE2', ) header.setValidatorsHash( 'E3F0EA129867E1AB4D7D6A97C23771D4D89B9E4DFE0A5B11E03B681244E00151', ) header.setNextValidatorsHash( 'E3F0EA129867E1AB4D7D6A97C23771D4D89B9E4DFE0A5B11E03B681244E00151', ) header.setConsensusHash( '0EAA6F4F4B8BD1CC222D93BBD391D07F074DE6BE5A52C6964875BB355B7D0B45', ) header.setAppHash( '6E2B1ECE9D912D86C25182E8B7419583ABCE978BFC66DC2556BB0D06A8D528EF', ) header.setLastResultsHash('') header.setEvidenceHash('') header.setProposerAddress('BDB6A0728C8DFE2124536F16F2BA428FE767A8F9') block.setHeader(header) response.setBlock(block) callback(null, response) return { cancel: function () {} } }, ) const expected = { blockId: { hash: '391E99908373F8590C928E0619956DA3D87EB654445DA4F25A185C9718561D53', }, block: { header: { chainId: 'bandchain', height: 1032007, lastCommitHash: '17B2CE4ABA910E85847537F1323DB95C9F16C20C60E9B9BBB04C633C3125BD92', dataHash: 'EFE5E3F549554FEE8EB9B393740C250D74580427A96A175ABB105806039CFFE2', validatorsHash: 'E3F0EA129867E1AB4D7D6A97C23771D4D89B9E4DFE0A5B11E03B681244E00151', nextValidatorsHash: 'E3F0EA129867E1AB4D7D6A97C23771D4D89B9E4DFE0A5B11E03B681244E00151', consensusHash: '0EAA6F4F4B8BD1CC222D93BBD391D07F074DE6BE5A52C6964875BB355B7D0B45', appHash: '6E2B1ECE9D912D86C25182E8B7419583ABCE978BFC66DC2556BB0D06A8D528EF', lastResultsHash: '', evidenceHash: '', proposerAddress: 'BDB6A0728C8DFE2124536F16F2BA428FE767A8F9', }, }, } const response = await client.getChainId() expect(mockedLatestBlock).toHaveBeenCalledTimes(1) expect(response).toEqual(expected.block.header.chainId) }) }) describe('get account', () => { it('get account success', async () => { expect(MockedAuthQueryClient).not.toHaveBeenCalled() const client = new Client(TEST_GRPC) expect(MockedAuthQueryClient).toHaveBeenCalledTimes(1) const mockedAuthQueryClient = jest.mocked( MockedAuthQueryClient.mock.instances[0], ) type ExpectedAccountSignature = ( requestMessage: QueryAccountRequest, metadata: grpc.Metadata, callback: ( error: ServiceError | null, responseMessage: QueryAccountResponse | null, ) => void, ) => UnaryResponse const mockedAccount = jest.mocked( mockedAuthQueryClient.account as ExpectedAccountSignature, ) mockedAccount.mockImplementationOnce( (_req, _metadata, callback): UnaryResponse => { const response = new QueryAccountResponse() const responseAny = new Any() responseAny.setTypeUrl('/cosmos.auth.v1beta1.BaseAccount') responseAny.setValue( 'CitiYW5kMThlNTVkOXh5cmd5ZzN0azcyem1nN3M5MnV1OHNkOTVqemdqNzNhEkYKHy9jb3Ntb3MuY3J5cHRvLnNlY3AyNTZrMS5QdWJLZXkSIwohA34LssDx+mbLpJWchWA9HjHB5b4Q42L0uy97A8YtF8sXGFkgtks=', ) response.setAccount(responseAny) callback(null, response) return { cancel: function () {} } }, ) const expected = { address: 'band18e55d9xyrgyg3tk72zmg7s92uu8sd95jzgj73a', pubKey: { typeUrl: '/cosmos.crypto.secp256k1.PubKey', value: 'CiEDfguywPH6ZsuklZyFYD0eMcHlvhDjYvS7L3sDxi0Xyxc=', }, accountNumber: 89, sequence: 9654, } const response = await client.getAccount( 'band1jrhuqrymzt4mnvgw8cvy3s9zhx3jj0dq30qpte', ) expect(mockedAccount).toHaveBeenCalledTimes(1) expect(response).toEqual(expected) }) }) describe('get reference data', () => { it('reference data success', async () => { expect(MockedQueryClient).not.toHaveBeenCalled() const client = new Client(TEST_GRPC) expect(MockedQueryClient).toHaveBeenCalledTimes(1) const mockedQueryClient = jest.mocked(MockedQueryClient.mock.instances[0]) type ExpectedGetReferenceData = ( requestMessage: QueryRequestPriceRequest, metadata: grpc.Metadata, callback: ( error: ServiceError | null, responseMessage: QueryRequestPriceResponse | null, ) => void, ) => UnaryResponse const mockGetReferenceData = jest.mocked( mockedQueryClient.requestPrice as ExpectedGetReferenceData, ) mockGetReferenceData.mockImplementationOnce( (_req, _metadata, callback): UnaryResponse => { const priceData1 = new PriceResult() priceData1.setSymbol('ETH') priceData1.setMultiplier(1000000) priceData1.setPx(3000000) priceData1.setRequestId(60536) priceData1.setResolveTime(1625537833) const priceData2 = new PriceResult() priceData2.setSymbol('BTC') priceData2.setMultiplier(1000000) priceData2.setPx(2000000) priceData2.setRequestId(60537) priceData2.setResolveTime(1625537834) const response = new QueryRequestPriceResponse() response.setPriceResultsList([priceData1, priceData2]) callback(null, response) return { cancel: function () {} } }, ) const expected = [ { pair: 'ETH/USD', rate: 3, updatedAt: { base: 1625537833, quote: STATIC_DATE / 1000, }, requestId: { base: 60536, quote: 0, }, }, { pair: 'ETH/BTC', rate: 1.5, updatedAt: { base: 1625537833, quote: 1625537834, }, requestId: { base: 60536, quote: 60537, }, }, ] const response = await client.getReferenceData(['ETH/USD', 'ETH/BTC'], 3, 4) expect(mockGetReferenceData).toHaveBeenCalledTimes(1) expect(response).toEqual(expected) }) }) describe('get latest request', () => { it('latest request success', async () => { expect(MockedQueryClient).not.toHaveBeenCalled() const client = new Client(TEST_GRPC) expect(MockedQueryClient).toHaveBeenCalledTimes(1) const mockedQueryClient = jest.mocked(MockedQueryClient.mock.instances[0]) type ExpectedLatestRequest = ( requestMessage: QueryRequestSearchRequest, metadata: grpc.Metadata, callback: ( error: ServiceError | null, responseMessage: QueryRequestSearchResponse | null, ) => void, ) => UnaryResponse const mockGetLatestRequest = jest.mocked( mockedQueryClient.requestSearch as ExpectedLatestRequest, ) mockGetLatestRequest.mockImplementationOnce( (_req, _metadata, callback): UnaryResponse => { const request = new Request() request.setOracleScriptId(43) request.setCalldata('AAAAAgAAAARCVENCAAAABEJFVEgAAAAAO5rKAA==') request.setRequestedValidatorsList([ 'bandvaloper1d96u0qlvdp6vx3j6r33lujr93f7gdyy6erc839', 'bandvaloper1a570h9e3rtvfhm030ta5hvel7e7e4lh4pgv8wj', 'bandvaloper1zl5925n5u24njn9axpygz8lhjl5a8v4cpkzx5g', 'bandvaloper17n5rmujk78nkgss7tjecg4nfzn6geg4cqtyg3u', 'bandvaloper1e9sa38742tzhmandc4gkqve9zy8zc0yremaa3j', 'bandvaloper1l2hchtyawk9tk43zzjrzr2lcd0zyxngcjdsshe', ]) request.setMinCount(3) request.setRequestHeight(431790) request.setRequestTime(1625547173) request.setClientId('linear') const rawReq1 = new RawRequest() rawReq1.setExternalId(0) rawReq1.setDataSourceId(74) rawReq1.setCalldata( 'aHR0cHM6Ly91cy1ycGMuYmFuZGNoYWluLm9yZy9vcmFjbGUvcmVxdWVzdF9wcmljZXMgQlRDIEVUSA==', ) const rawReq2 = new RawRequest() rawReq2.setExternalId(0) rawReq2.setDataSourceId(74) rawReq2.setCalldata( 'aHR0cHM6Ly91cy1ycGMuYmFuZGNoYWluLm9yZy9vcmFjbGUvcmVxdWVzdF9wcmljZXMgQlRDIEVUSA==', ) request.setRawRequestsList([rawReq1, rawReq2]) request.setExecuteGas(1000000) const report1 = new Report() report1.setValidator( 'bandvaloper1zl5925n5u24njn9axpygz8lhjl5a8v4cpkzx5g', ) report1.setInBeforeResolve(true) const rawRep1 = new RawReport() rawReq1.setExternalId(0) rawRep1.setExitCode(0) rawRep1.setData('MzQ2NzQuNTQgMjMxMy45OQo=') const rawRep2 = new RawReport() rawReq2.setExternalId(0) rawRep2.setExitCode(0) rawRep2.setData('MzQ2NzQuNTQgMjMxMy45OQo=') report1.setRawReportsList([rawRep1, rawRep2]) const report2 = new Report() report2.setValidator( 'bandvaloper1d96u0qlvdp6vx3j6r33lujr93f7gdyy6erc839', ) report2.setInBeforeResolve(true) report2.setRawReportsList([rawRep1, rawRep2]) const result = new Result() result.setClientId('linear') result.setOracleScriptId(43) result.setCalldata('AAAAAgAAAARCVENCAAAABEJFVEgAAAAAO5rKAA==') result.setAskCount(6) result.setMinCount(3) result.setRequestId(64783) result.setAnsCount(6) result.setRequestTime(1625547173) result.setResolveTime(1625547179) result.setResolveStatus(1) result.setResult('AAAAAgAAH4lLo7MAAAACGsSNTYA==') const reqResponse = new QueryRequestResponse() reqResponse.setRequest(request) reqResponse.setReportsList([report1, report2]) reqResponse.setResult(result) const response = new QueryRequestSearchResponse() response.setRequest(reqResponse) callback(null, response) return { cancel: function () {} } }, ) const expected = { request: { oracleScriptId: 43, calldata: 'AAAAAgAAAARCVENCAAAABEJFVEgAAAAAO5rKAA==', requestedValidatorsList: [ 'bandvaloper1d96u0qlvdp6vx3j6r33lujr93f7gdyy6erc839', 'bandvaloper1a570h9e3rtvfhm030ta5hvel7e7e4lh4pgv8wj', 'bandvaloper1zl5925n5u24njn9axpygz8lhjl5a8v4cpkzx5g', 'bandvaloper17n5rmujk78nkgss7tjecg4nfzn6geg4cqtyg3u', 'bandvaloper1e9sa38742tzhmandc4gkqve9zy8zc0yremaa3j', 'bandvaloper1l2hchtyawk9tk43zzjrzr2lcd0zyxngcjdsshe', ], minCount: 3, requestHeight: 431790, requestTime: 1625547173, clientId: 'linear', rawRequestsList: [ { externalId: 0, dataSourceId: 74, calldata: 'aHR0cHM6Ly91cy1ycGMuYmFuZGNoYWluLm9yZy9vcmFjbGUvcmVxdWVzdF9wcmljZXMgQlRDIEVUSA==', }, { externalId: 0, dataSourceId: 74, calldata: 'aHR0cHM6Ly91cy1ycGMuYmFuZGNoYWluLm9yZy9vcmFjbGUvcmVxdWVzdF9wcmljZXMgQlRDIEVUSA==', }, ], executeGas: 1000000, ibcChannel: undefined, }, reportsList: [ { validator: 'bandvaloper1zl5925n5u24njn9axpygz8lhjl5a8v4cpkzx5g', inBeforeResolve: true, rawReportsList: [ { externalId: 0, exitCode: 0, data: 'MzQ2NzQuNTQgMjMxMy45OQo=', }, { externalId: 0, exitCode: 0, data: 'MzQ2NzQuNTQgMjMxMy45OQo=', }, ], }, { validator: 'bandvaloper1d96u0qlvdp6vx3j6r33lujr93f7gdyy6erc839', inBeforeResolve: true, rawReportsList: [ { externalId: 0, exitCode: 0, data: 'MzQ2NzQuNTQgMjMxMy45OQo=', }, { externalId: 0, exitCode: 0, data: 'MzQ2NzQuNTQgMjMxMy45OQo=', }, ], }, ], result: { clientId: 'linear', oracleScriptId: 43, calldata: 'AAAAAgAAAARCVENCAAAABEJFVEgAAAAAO5rKAA==', askCount: 6, minCount: 3, requestId: 64783, ansCount: 6, requestTime: 1625547173, resolveTime: 1625547179, resolveStatus: 1, result: 'AAAAAgAAH4lLo7MAAAACGsSNTYA==', }, signing: undefined, } const response = await client.getLatestRequest( 43, '0000000200000004425443420000000442455448000000003b9aca00', 3, 6, ) expect(mockGetLatestRequest).toHaveBeenCalledTimes(1) expect(response).toEqual(expected) }) }) describe('get all balances', () => { it('get all balances success', async () => { expect(MockedQueryAllBalances).not.toHaveBeenCalled() const client = new Client(TEST_GRPC) expect(MockedQueryAllBalances).toHaveBeenCalledTimes(1) const mockedQueyAllBalances = jest.mocked( MockedQueryAllBalances.mock.instances[0], ) type ExpectedAddressSignature = ( requestMessage: QueryAllBalancesRequest, metadata: grpc.Metadata, callback: ( error: ServiceError | null, responseMessage: QueryAllBalancesResponse | null, ) => void, ) => UnaryResponse const mockedAddress = jest.mocked( mockedQueyAllBalances.allBalances as ExpectedAddressSignature, ) mockedAddress.mockImplementationOnce( (_req, _metadata, callback): UnaryResponse => { const response = new QueryAllBalancesResponse() const responseCoin = new Coin() responseCoin.setDenom('uband') responseCoin.setAmount('401150982') response.setBalancesList([responseCoin]) callback(null, response) return { cancel: function () {} } }, ) const expected = [ { denom: 'uband', amount: '401150982', }, ] const response = await client.getAllBalances( 'band1jrhuqrymzt4mnvgw8cvy3s9zhx3jj0dq30qpte', ) expect(mockedAddress).toHaveBeenCalledTimes(1) expect(response).toEqual(expected) }) })