Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[REVIEW] Feat/rpc mock #236

Open
wants to merge 29 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
0998fbd
feat: use @swc/test to reduce test time
ducphamle2 Mar 31, 2024
54d635a
chore: parseTxToMsgsAndEvents use stored json not fetch from real api
ducphamle2 Mar 31, 2024
cfa6b44
test: switch back to ts-jest
ducphamle2 Mar 31, 2024
0f84a22
test ts-jest test time
ducphamle2 Mar 31, 2024
6c1860f
change to swc jest
ducphamle2 Mar 31, 2024
18b0ad8
merge main
ducphamle2 Apr 1, 2024
42edfcf
optimize: use @swc/test full reduce test time
ducphamle2 Apr 3, 2024
2209bf9
chore: re-enable nx reset to remove cache
ducphamle2 Apr 3, 2024
c49ed41
comment nx reset
ducphamle2 Apr 3, 2024
b8bcf74
feat: add example unit tests using http mock
ducphamle2 Apr 4, 2024
8967283
wip: add jest mock for test checkBalanceChannelIbc
ducphamle2 Apr 4, 2024
14ed3b2
feat: use mockttp for mocking json rpc & add util func for mock jsonrpc
ducphamle2 Apr 8, 2024
354c052
chore: add mockttp stop
ducphamle2 Apr 8, 2024
1d39d68
chore: add test-mock-rpc-getAccount
ducphamle2 Apr 8, 2024
7171461
chore: refactor code
ducphamle2 Apr 8, 2024
dba53bf
fix: use generate mnemonic to pass jsonrpc mock test cases cicd
ducphamle2 Apr 8, 2024
ea619a8
Merge branch 'main' of https://github.com/oraichain/oraidex-sdk into …
ducphamle2 Apr 26, 2024
37da768
feat: add mock for broadcast async
ducphamle2 Apr 26, 2024
d5ac6e9
Merge branch 'main' of github.com:oraichain/oraidex-sdk into feat/rpc…
haunv3 May 2, 2024
44f4324
add unit test universal swap
haunv3 May 2, 2024
d550dfc
add test mock func swap in oraichain
haunv3 May 6, 2024
dff9f44
add test mock func swapAndTransferToOtherNetworks
haunv3 May 6, 2024
46818ba
add testcase swapCosmosToOtherNetwork
haunv3 May 6, 2024
b035545
unit test transferToGravity
haunv3 May 6, 2024
d9f9252
add testcase func swap evm
haunv3 May 6, 2024
634c115
Merge branch 'main' of https://github.com/oraichain/oraidex-sdk into …
ducphamle2 May 7, 2024
7827f04
Merge branch 'feat/rpc-mock' of https://github.com/oraichain/oraidex-…
ducphamle2 May 7, 2024
ef0df9f
add test case handler universal swap
haunv3 May 8, 2024
318c27c
Merge branch 'feat/rpc-mock' of github.com:oraichain/oraidex-sdk into…
haunv3 May 8, 2024
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
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
{
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit"
},
"editor.formatOnSave": true,
"editor.formatOnPaste": false,
"prettier.useEditorConfig": false,
Expand Down
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"scripts": {
"postinstall": "patch-package",
"test": "yarn build && jest",
"test-coverage": "yarn build && jest --coverage",
"docs": "typedoc --entryPointStrategy expand --name 'Oraidex SDK' --readme none --tsconfig packages/contracts-sdk/tsconfig.json packages/contracts-sdk/src",
"clean": "lerna clean --yes && lerna exec -- rimraf build/ dist/ cache/",
"build": "lerna run build --concurrency 1",
Expand Down Expand Up @@ -51,6 +52,7 @@
"husky": "^9.0.11",
"jest": "^29.7.0",
"lerna": "^8.1.2",
"mockttp": "^3.10.2",
"nx": "18.1.2",
"patch-package": "^8.0.0",
"rimraf": "^5.0.5",
Expand Down
21 changes: 11 additions & 10 deletions packages/oraidex-common/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
export * from "./token";
export * from "./network";
export * from "./ibc-info";
export * from "./helper";
export * from "./axios-request";
export * from "./bigdecimal";
export * from "./config/chainInfosWithIcon";
export * from "./constant";
export * from "./helper";
export * from "./ibc-info";
export * from "./interface";
export * from "./network";
export * from "./pairs";
export * from "./wallet";
export * from "./typechain-types";
export * from "./testing";
export * from "./token";
export * from "./tx";
export * from "./bigdecimal";
export * from "./interface";
export * from "./config/chainInfosWithIcon";
export * from "./axios-request";
export * from "./typechain-types";
export * from "./wallet";
1 change: 1 addition & 0 deletions packages/oraidex-common/src/testing/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "./jsonrpc-mock-common";
150 changes: 150 additions & 0 deletions packages/oraidex-common/src/testing/jsonrpc-mock-common.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
import { fromHex, fromUtf8, toBase64, toUtf8 } from "@cosmjs/encoding";
import { QuerySmartContractStateRequest, QuerySmartContractStateResponse } from "cosmjs-types/cosmwasm/wasm/v1/query";
import * as mockttp from "mockttp";

export const buildAbciQueryResponse = (expectedResult: any) => {
return {
response: {
code: 0,
log: "",
info: "",
index: "0",
key: null,
value: expectedResult,
proofOps: null,
height: "1",
codespace: ""
}
};
};

export const buildCosmWasmAbciQueryResponse = (expectedResult: any) => {
return buildAbciQueryResponse(
toBase64(QuerySmartContractStateResponse.encode({ data: toUtf8(JSON.stringify(expectedResult)) }).finish())
);
};

export const mockAccountInfo = buildAbciQueryResponse(
"Cp8BCiAvY29zbW9zLmF1dGgudjFiZXRhMS5CYXNlQWNjb3VudBJ7CitvcmFpMWc0aDY0eWp0MGZ2enY1djJqOHR5Zm5wZTVrbW5ldGVqdmZnczdnEkYKHy9jb3Ntb3MuY3J5cHRvLnNlY3AyNTZrMS5QdWJLZXkSIwohA/7NDxzUr4iFC8PmBZllh5P6RdDtLgnvL32OVolC+2tGGKwQIN0R"
);

export const mockSimulate = buildAbciQueryResponse(
"CgQQp6kDEroJCiAKHgocL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBLEBVt7ImV2ZW50cyI6W3sidHlwZSI6ImNvaW5fcmVjZWl2ZWQiLCJhdHRyaWJ1dGVzIjpbeyJrZXkiOiJyZWNlaXZlciIsInZhbHVlIjoib3JhaTFnNGg2NHlqdDBmdnp2NXYyajh0eWZucGU1a21uZXRlanZmZ3M3ZyJ9LHsia2V5IjoiYW1vdW50IiwidmFsdWUiOiIxb3JhaSJ9XX0seyJ0eXBlIjoiY29pbl9zcGVudCIsImF0dHJpYnV0ZXMiOlt7ImtleSI6InNwZW5kZXIiLCJ2YWx1ZSI6Im9yYWkxZzRoNjR5anQwZnZ6djV2Mmo4dHlmbnBlNWttbmV0ZWp2ZmdzN2cifSx7ImtleSI6ImFtb3VudCIsInZhbHVlIjoiMW9yYWkifV19LHsidHlwZSI6Im1lc3NhZ2UiLCJhdHRyaWJ1dGVzIjpbeyJrZXkiOiJhY3Rpb24iLCJ2YWx1ZSI6Ii9jb3Ntb3MuYmFuay52MWJldGExLk1zZ1NlbmQifSx7ImtleSI6InNlbmRlciIsInZhbHVlIjoib3JhaTFnNGg2NHlqdDBmdnp2NXYyajh0eWZucGU1a21uZXRlanZmZ3M3ZyJ9LHsia2V5IjoibW9kdWxlIiwidmFsdWUiOiJiYW5rIn1dfSx7InR5cGUiOiJ0cmFuc2ZlciIsImF0dHJpYnV0ZXMiOlt7ImtleSI6InJlY2lwaWVudCIsInZhbHVlIjoib3JhaTFnNGg2NHlqdDBmdnp2NXYyajh0eWZucGU1a21uZXRlanZmZ3M3ZyJ9LHsia2V5Ijoic2VuZGVyIiwidmFsdWUiOiJvcmFpMWc0aDY0eWp0MGZ2enY1djJqOHR5Zm5wZTVrbW5ldGVqdmZnczdnIn0seyJrZXkiOiJhbW91bnQiLCJ2YWx1ZSI6IjFvcmFpIn1dfV19XRoxCgdtZXNzYWdlEiYKBmFjdGlvbhIcL2Nvc21vcy5iYW5rLnYxYmV0YTEuTXNnU2VuZBpVCgpjb2luX3NwZW50EjYKB3NwZW5kZXISK29yYWkxZzRoNjR5anQwZnZ6djV2Mmo4dHlmbnBlNWttbmV0ZWp2ZmdzN2cSDwoGYW1vdW50EgUxb3JhaRpZCg1jb2luX3JlY2VpdmVkEjcKCHJlY2VpdmVyEitvcmFpMWc0aDY0eWp0MGZ2enY1djJqOHR5Zm5wZTVrbW5ldGVqdmZnczdnEg8KBmFtb3VudBIFMW9yYWkajAEKCHRyYW5zZmVyEjgKCXJlY2lwaWVudBIrb3JhaTFnNGg2NHlqdDBmdnp2NXYyajh0eWZucGU1a21uZXRlanZmZ3M3ZxI1CgZzZW5kZXISK29yYWkxZzRoNjR5anQwZnZ6djV2Mmo4dHlmbnBlNWttbmV0ZWp2ZmdzN2cSDwoGYW1vdW50EgUxb3JhaRpACgdtZXNzYWdlEjUKBnNlbmRlchIrb3JhaTFnNGg2NHlqdDBmdnp2NXYyajh0eWZucGU1a21uZXRlanZmZ3M3ZxoZCgdtZXNzYWdlEg4KBm1vZHVsZRIEYmFuaw=="
);

export const mockStatus = {
node_info: {
protocol_version: { p2p: "8", block: "11", app: "0" },
id: "6ffa64f7e7d78421d43eafa800fb11df3ce9c176",
listen_addr: "tcp://0.0.0.0:26656",
network: "Oraichain",
version: "0.34.29",
channels: "40202122233038606100",
moniker: "mainnet-sentry6",
other: { tx_index: "on", rpc_address: "tcp://0.0.0.0:26657" }
},
sync_info: {
latest_block_hash: "FB98CF714E844680D2F933B630364FFCB665A1525E75AF4E2AE56BC3E10780E2",
latest_app_hash: "5BED49716F7A9CC54BCDF6F02BBD055546260DEE45F90C4E22665945FF46A1ED",
latest_block_height: "17608708",
latest_block_time: "2024-04-03T19:24:02.1973058Z",
earliest_block_hash: "9C3C6F0A72142BCCE9D52883522D86D7ACDD4B5DB12059C2070AD0847268CE63",
earliest_app_hash: "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
earliest_block_height: "1",
earliest_block_time: "2021-02-23T17:06:00.124468946Z",
catching_up: false
},
validator_info: {
address: "DB71D3EE07AB06B394915C186C48939887FBDF03",
pub_key: { type: "tendermint/PubKeyEd25519", value: "QJxO4ljISgXoTU5e48pip/bff80xwLw+RxaDdjM05G0=" },
voting_power: "0"
}
};

export const mockResponse = {
code: 0,
data: "",
log: "[]",
codespace: "",
hash: "2F59A5318ED6350976244EAD25CB78ACFEBC1B9C9A96809269A793EDFB529065"
};

export const mockTxSearch = {
txs: [
{
hash: "2F59A5318ED6350976244EAD25CB78ACFEBC1B9C9A96809269A793EDFB529065",
height: "1",
index: 0,
tx_result: {
code: 0,
data: "",
log: "",
info: "",
gas_wanted: "76215",
gas_used: "68664",
events: [],
codespace: ""
},
timestamp: "2024-04-03T19:24:03Z",
tx: "CogBCoUBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEmUKK29yYWkxZzRoNjR5anQwZnZ6djV2Mmo4dHlmbnBlNWttbmV0ZWp2ZmdzN2cSK29yYWkxZzRoNjR5anQwZnZ6djV2Mmo4dHlmbnBlNWttbmV0ZWp2ZmdzN2caCQoEb3JhaRIBMRJlClEKRgofL2Nvc21vcy5jcnlwdG8uc2VjcDI1NmsxLlB1YktleRIjCiED/s0PHNSviIULw+YFmWWHk/pF0O0uCe8vfY5WiUL7a0YSBAoCCAEY3RESEAoKCgRvcmFpEgI3NxC30wQaQBfHtIpbY6nu7qqMlhqtIgRK4ID/uoJ2vzPPBapPZNUuRUeTjoisSNSi4eUh26+edx5aiY3dbV+vlVdeaptOxkA="
}
],
total_count: "1"
};

export const mockJsonRpcServer = async () => {
const mockServer = mockttp.getLocal();
await mockServer.start();
await mockServer
.forJsonRpcRequest({
method: "abci_query",
params: { path: "/cosmos.auth.v1beta1.Query/Account" }
})
.thenSendJsonRpcResult(mockAccountInfo);

await mockServer
.forJsonRpcRequest({
method: "status"
})
.thenSendJsonRpcResult(mockStatus);

await mockServer
.forJsonRpcRequest({
method: "abci_query",
params: { path: "/cosmos.tx.v1beta1.Service/Simulate" }
})
.thenSendJsonRpcResult(mockSimulate);

await mockServer
.forJsonRpcRequest({
method: "broadcast_tx_sync"
})
.thenSendJsonRpcResult(mockResponse);

await mockServer
.forJsonRpcRequest({
method: "broadcast_tx_async"
})
.thenSendJsonRpcResult(mockResponse);

await mockServer
.forJsonRpcRequest({
method: "tx_search"
})
.thenSendJsonRpcResult(mockTxSearch);

return mockServer;
};

export const matchCosmWasmQueryRequest = async (
request: mockttp.CompletedRequest,
wasmQueryFilter: (queryData: any, queryRequest: QuerySmartContractStateRequest) => boolean
): Promise<boolean> => {
const bodyJson: any = await request.body.getJson();
if (bodyJson.method !== "abci_query") return false;
if (!bodyJson.params.path) return false;
if (bodyJson.params.path !== "/cosmwasm.wasm.v1.Query/SmartContractState") return false;
const queryRequest = QuerySmartContractStateRequest.decode(fromHex(bodyJson.params.data));
const queryData = JSON.parse(fromUtf8(queryRequest.queryData));
return wasmQueryFilter(queryData, queryRequest);
};
17 changes: 8 additions & 9 deletions packages/oraidex-common/src/wallet.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
import { OfflineSigner } from "@cosmjs/proto-signing";
import { CosmosChainId, EvmChainId, NetworkChainId, Networks } from "./network";
import { SigningCosmWasmClient } from "@cosmjs/cosmwasm-stargate";
import { EncodeObject, OfflineSigner } from "@cosmjs/proto-signing";
import { SigningStargateClient, SigningStargateClientOptions } from "@cosmjs/stargate";
import { ethToTronAddress, tronToEthAddress } from "./helper";
import { TokenItemType } from "./token";
import { ethers } from "ethers";
import { IERC20Upgradeable__factory } from "./typechain-types";
import { JsonRpcSigner } from "@ethersproject/providers";
import { TronWeb } from "./tronweb";
import { EncodeObject } from "@cosmjs/proto-signing";
import { Tendermint37Client } from "@cosmjs/tendermint-rpc";
import { JsonRpcSigner } from "@ethersproject/providers";
import { Stargate } from "@injectivelabs/sdk-ts";
import { ethers } from "ethers";
import { BROADCAST_POLL_INTERVAL } from "./constant";
import { ethToTronAddress, tronToEthAddress } from "./helper";
import { CosmosChainId, EvmChainId, NetworkChainId, Networks } from "./network";
import { TokenItemType } from "./token";
import { TronWeb } from "./tronweb";
import { IERC20Upgradeable__factory } from "./typechain-types";

export interface EvmResponse {
transactionHash: string;
Expand Down
Loading
Loading