diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 13635e61..ea863d88 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,10 +34,23 @@ jobs: run: npm run build integration-tests: - name: "Integration Tests" + name: Integration Tests (${{ matrix.name }}) runs-on: ubuntu-latest needs: build + env: + ORACLE_TESTS: "DIDModule|DID Key Operations|OracleModule|ResourceModule" + + strategy: + fail-fast: false + matrix: + include: + - name: esm + test_directory: esm + + - name: cjs + test_directory: cjs + steps: - uses: actions/checkout@v5 @@ -55,8 +68,34 @@ jobs: - name: "Clean install dependencies" run: npm ci - - name: Run Tests - run: npm test + - name: Run oracle independent tests + working-directory: ${{ matrix.test_directory }} + run: npm run test -- --testNamePattern="^(?!${ORACLE_TESTS})" + + - name: Wait for WMA calculation + working-directory: localnet + shell: bash + run: | + set -euo pipefail + + WAIT_TIME=240 # seconds + INTERVAL=20 + + echo "Waiting for WMA to be available..." + + while ! docker compose exec cheqd cheqd-noded q oracle wma CHEQ >/dev/null 2>&1; do + if [ "$WAIT_TIME" -le 0 ]; then + echo "Unable to compute WMA within timeout" + exit 1 + fi + + sleep "$INTERVAL" + WAIT_TIME=$((WAIT_TIME - INTERVAL)) + done + + - name: Run oracle dependent tests + working-directory: ${{ matrix.test_directory }} + run: npm run test -- --testNamePattern="(${ORACLE_TESTS})" import-tests: name: "Import Tests" diff --git a/cjs/tests/modules/did.test.ts b/cjs/tests/modules/did.test.ts index 16e5af5f..d4551a52 100644 --- a/cjs/tests/modules/did.test.ts +++ b/cjs/tests/modules/did.test.ts @@ -526,7 +526,9 @@ describe('DIDModule', () => { assertionMethod: [didPayload.verificationMethod![0].id], // <-- This is the only difference } as DIDDocument; - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateDidDocTx: DeliverTxResponse = await didModule.updateDidDocTx( signInputs, updateDidPayload, @@ -593,7 +595,9 @@ describe('DIDModule', () => { assertionMethod: [didPayload.verificationMethod![0].id], // <-- This is the only difference } as DIDDocument; - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateDidDocTx: DeliverTxResponse = await didModule.updateDidDocTx( signInputs, @@ -658,7 +662,9 @@ describe('DIDModule', () => { assertionMethod: [didPayload.verificationMethod![0].id], // <-- This is the only difference } as DIDDocument; - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateDidDocTx: DeliverTxResponse = await didModule.updateDidDocTx( signInputs, @@ -759,7 +765,9 @@ describe('DIDModule', () => { }, ]; - const updateFee = await didModule.generateUpdateDidDocFees(feePayer); + const updateFee = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); console.warn(`Updated DID payload: ${JSON.stringify(updatedDidPayload)}`); const updateDidDocTx: DeliverTxResponse = await didModule.updateDidDocTx( updateSignInputs, @@ -872,7 +880,9 @@ describe('DIDModule', () => { }, ]; - const updateFee = await didModule.generateUpdateDidDocFees(feePayer); + const updateFee = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); console.warn(`Updated DID payload: ${JSON.stringify(updatedDidPayload)}`); const updateDidDocTx: DeliverTxResponse = await didModule.updateDidDocTx( updateSignInputs, @@ -920,7 +930,9 @@ describe('DIDModule', () => { }, ]; - const finalUpdateFee = await didModule.generateUpdateDidDocFees(feePayer); + const finalUpdateFee = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const finalUpdateDidDocTx: DeliverTxResponse = await didModule.updateDidDocTx( finalSignInputs, finalDidPayload, @@ -1139,7 +1151,9 @@ describe('DIDModule', () => { // Need signatures from both DID A and DID B const combinedSignInputs = [...signInputsA, ...signInputsB]; - const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateTx = await didModuleA.updateDidDocTx( combinedSignInputs, updatedDidPayloadA, @@ -1171,7 +1185,9 @@ describe('DIDModule', () => { // Need signatures from both current controllers (A and B) const combinedSignInputs = [...signInputsA, ...signInputsB]; - const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateTx = await didModuleA.updateDidDocTx( combinedSignInputs, updatedDidPayloadA, @@ -1203,7 +1219,9 @@ describe('DIDModule', () => { // Need signatures from current controller (B) and new controller (C) const combinedSignInputs = [...signInputsB, ...signInputsC]; - const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateTx = await didModuleA.updateDidDocTx( combinedSignInputs, updatedDidPayloadA, @@ -1235,7 +1253,9 @@ describe('DIDModule', () => { // Need signatures from current controller (C) and new controller (B) const combinedSignInputs = [...signInputsB, ...signInputsC]; - const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateTx = await didModuleA.updateDidDocTx( combinedSignInputs, updatedDidPayloadA, @@ -1267,7 +1287,9 @@ describe('DIDModule', () => { // Need signatures from current controllers (B and C) and the DID itself (A) const combinedSignInputs = [...signInputsA, ...signInputsB, ...signInputsC]; - const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateTx = await didModuleA.updateDidDocTx( combinedSignInputs, updatedDidPayloadA, @@ -1298,7 +1320,9 @@ describe('DIDModule', () => { // Only provide signature from DID A, missing signature from DID B const incompleteSignInputs = [...signInputsA]; // Missing signInputsB - const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); // This should fail due to missing signature const updateTx = await didModuleA.updateDidDocTx( @@ -1331,7 +1355,9 @@ describe('DIDModule', () => { // Need signatures from both current controller (A) and new controller (B) const combinedSignInputs = [...signInputsA, ...signInputsB]; - const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateTx = await didModuleA.updateDidDocTx( combinedSignInputs, updatedDidPayloadA, @@ -1974,7 +2000,9 @@ describe('DIDModule', () => { assertionMethod: [didPayload.verificationMethod![0].id], // <-- This is the only difference } as DIDDocument; - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateDidDocTx: DeliverTxResponse = await didModule.updateDidDocTx( signInputs, updateDidPayload, @@ -2075,7 +2103,9 @@ describe('DIDModule', () => { assertionMethod: [didPayload.verificationMethod![0].id], // <-- This is the only difference } as DIDDocument; - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateDidDocTx: DeliverTxResponse = await didModule.updateDidDocTx( signInputs, updateDidPayload, @@ -2176,7 +2206,9 @@ describe('DIDModule', () => { assertionMethod: [didPayload.verificationMethod![0].id], // <-- This is the only difference } as DIDDocument; - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateDidDocTx: DeliverTxResponse = await didModule.updateDidDocTx( signInputs, updateDidPayload, diff --git a/cjs/tests/modules/key-operations.test.ts b/cjs/tests/modules/key-operations.test.ts index fcf4b934..7acdc825 100644 --- a/cjs/tests/modules/key-operations.test.ts +++ b/cjs/tests/modules/key-operations.test.ts @@ -106,7 +106,9 @@ describe('DID Key Operations (Rotation, Replacement, and Combined)', () => { const combinedSignInputs = [...signInputs1, ...signInputs2]; // Both old and new key signatures - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateTx = await didModule.updateDidDocTx( combinedSignInputs, rotatedDidPayload, @@ -261,7 +263,9 @@ describe('DID Key Operations (Rotation, Replacement, and Combined)', () => { expect(combinedSignInputs[0].verificationMethodId).toBe(verificationKeys1.keyId); expect(combinedSignInputs[1].verificationMethodId).toBe(verificationKeys2WithSameDid.keyId); - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateTx = await didModule.updateDidDocTx( combinedSignInputs, replacedDidPayload, @@ -406,7 +410,9 @@ describe('DID Key Operations (Rotation, Replacement, and Combined)', () => { const combinedSignInputs = [...signInputs1, ...signInputs2]; - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateTx = await didModule.updateDidDocTx( combinedSignInputs, expandedDidPayload, @@ -567,7 +573,9 @@ describe('DID Key Operations (Rotation, Replacement, and Combined)', () => { ]; // Step 4: Execute the combined operation - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateTx = await didModule.updateDidDocTx( combinedSignInputs, updatedDidPayload, @@ -1003,7 +1011,9 @@ describe('DID Key Operations (Rotation, Replacement, and Combined)', () => { }, ]; - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); await expect( didModule.updateDidDocTx(invalidSignInputs, updatedDidPayload, feePayer, feeUpdate) @@ -1096,7 +1106,9 @@ describe('DID Key Operations (Rotation, Replacement, and Combined)', () => { }, ]; - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); await expect( didModule.updateDidDocTx(invalidSignInputs, updatedDidPayload, feePayer, feeUpdate) diff --git a/cjs/tests/testutils.test.ts b/cjs/tests/testutils.test.ts index 287ed711..e75478c3 100644 --- a/cjs/tests/testutils.test.ts +++ b/cjs/tests/testutils.test.ts @@ -13,7 +13,7 @@ export const faucet = { export const localnet = { network: CheqdNetwork.Testnet, testnetRpcUrl: 'https://rpc.cheqd.network:443', - rpcUrl: 'https://rpc-devnet.cheqd.network:443', + rpcUrl: 'http://localhost:26657', gasPrice: GasPrice.fromString(`5000${faucet.minimalDenom}`), }; diff --git a/esm/tests/modules/did.test.ts b/esm/tests/modules/did.test.ts index c9f75889..56694bba 100644 --- a/esm/tests/modules/did.test.ts +++ b/esm/tests/modules/did.test.ts @@ -526,7 +526,9 @@ describe('DIDModule', () => { assertionMethod: [didPayload.verificationMethod![0].id], // <-- This is the only difference } as DIDDocument; - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateDidDocTx: DeliverTxResponse = await didModule.updateDidDocTx( signInputs, updateDidPayload, @@ -593,7 +595,9 @@ describe('DIDModule', () => { assertionMethod: [didPayload.verificationMethod![0].id], // <-- This is the only difference } as DIDDocument; - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateDidDocTx: DeliverTxResponse = await didModule.updateDidDocTx( signInputs, @@ -658,7 +662,9 @@ describe('DIDModule', () => { assertionMethod: [didPayload.verificationMethod![0].id], // <-- This is the only difference } as DIDDocument; - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateDidDocTx: DeliverTxResponse = await didModule.updateDidDocTx( signInputs, @@ -758,7 +764,9 @@ describe('DIDModule', () => { }, ]; - const updateFee = await didModule.generateUpdateDidDocFees(feePayer); + const updateFee = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); console.warn(`Updated DID payload: ${JSON.stringify(updatedDidPayload)}`); const updateDidDocTx: DeliverTxResponse = await didModule.updateDidDocTx( updateSignInputs, @@ -870,7 +878,9 @@ describe('DIDModule', () => { }, ]; - const updateFee = await didModule.generateUpdateDidDocFees(feePayer); + const updateFee = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); console.warn(`Updated DID payload: ${JSON.stringify(updatedDidPayload)}`); const updateDidDocTx: DeliverTxResponse = await didModule.updateDidDocTx( updateSignInputs, @@ -918,7 +928,9 @@ describe('DIDModule', () => { }, ]; - const finalUpdateFee = await didModule.generateUpdateDidDocFees(feePayer); + const finalUpdateFee = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const finalUpdateDidDocTx: DeliverTxResponse = await didModule.updateDidDocTx( finalSignInputs, finalDidPayload, @@ -1137,7 +1149,9 @@ describe('DIDModule', () => { // Need signatures from both DID A and DID B const combinedSignInputs = [...signInputsA, ...signInputsB]; - const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateTx = await didModuleA.updateDidDocTx( combinedSignInputs, updatedDidPayloadA, @@ -1169,7 +1183,9 @@ describe('DIDModule', () => { // Need signatures from both current controllers (A and B) const combinedSignInputs = [...signInputsA, ...signInputsB]; - const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateTx = await didModuleA.updateDidDocTx( combinedSignInputs, updatedDidPayloadA, @@ -1201,7 +1217,9 @@ describe('DIDModule', () => { // Need signatures from current controller (B) and new controller (C) const combinedSignInputs = [...signInputsB, ...signInputsC]; - const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateTx = await didModuleA.updateDidDocTx( combinedSignInputs, updatedDidPayloadA, @@ -1233,7 +1251,9 @@ describe('DIDModule', () => { // Need signatures from current controller (C) and new controller (B) const combinedSignInputs = [...signInputsB, ...signInputsC]; - const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateTx = await didModuleA.updateDidDocTx( combinedSignInputs, updatedDidPayloadA, @@ -1265,7 +1285,9 @@ describe('DIDModule', () => { // Need signatures from current controllers (B and C) and the DID itself (A) const combinedSignInputs = [...signInputsA, ...signInputsB, ...signInputsC]; - const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateTx = await didModuleA.updateDidDocTx( combinedSignInputs, updatedDidPayloadA, @@ -1296,7 +1318,9 @@ describe('DIDModule', () => { // Only provide signature from DID A, missing signature from DID B const incompleteSignInputs = [...signInputsA]; // Missing signInputsB - const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); // This should fail due to missing signature const updateTx = await didModuleA.updateDidDocTx( @@ -1329,7 +1353,9 @@ describe('DIDModule', () => { // Need signatures from both current controller (A) and new controller (B) const combinedSignInputs = [...signInputsA, ...signInputsB]; - const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModuleA.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateTx = await didModuleA.updateDidDocTx( combinedSignInputs, updatedDidPayloadA, @@ -1972,7 +1998,9 @@ describe('DIDModule', () => { assertionMethod: [didPayload.verificationMethod![0].id], // <-- This is the only difference } as DIDDocument; - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateDidDocTx: DeliverTxResponse = await didModule.updateDidDocTx( signInputs, updateDidPayload, @@ -2073,7 +2101,9 @@ describe('DIDModule', () => { assertionMethod: [didPayload.verificationMethod![0].id], // <-- This is the only difference } as DIDDocument; - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); const updateDidDocTx: DeliverTxResponse = await didModule.updateDidDocTx( signInputs, updateDidPayload, @@ -2174,7 +2204,7 @@ describe('DIDModule', () => { assertionMethod: [didPayload.verificationMethod![0].id], // <-- This is the only difference } as DIDDocument; - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { slippageBps: 1000 }); const updateDidDocTx: DeliverTxResponse = await didModule.updateDidDocTx( signInputs, updateDidPayload, diff --git a/esm/tests/modules/key-operations.test.ts b/esm/tests/modules/key-operations.test.ts index be63a1ef..a50386dc 100644 --- a/esm/tests/modules/key-operations.test.ts +++ b/esm/tests/modules/key-operations.test.ts @@ -106,7 +106,7 @@ describe('DID Key Operations (Rotation, Replacement, and Combined)', () => { const combinedSignInputs = [...signInputs1, ...signInputs2]; // Both old and new key signatures - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { slippageBps: 1000 }); const updateTx = await didModule.updateDidDocTx( combinedSignInputs, rotatedDidPayload, @@ -261,7 +261,7 @@ describe('DID Key Operations (Rotation, Replacement, and Combined)', () => { expect(combinedSignInputs[0].verificationMethodId).toBe(verificationKeys1.keyId); expect(combinedSignInputs[1].verificationMethodId).toBe(verificationKeys2WithSameDid.keyId); - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { slippageBps: 1000 }); const updateTx = await didModule.updateDidDocTx( combinedSignInputs, replacedDidPayload, @@ -406,7 +406,7 @@ describe('DID Key Operations (Rotation, Replacement, and Combined)', () => { const combinedSignInputs = [...signInputs1, ...signInputs2]; - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { slippageBps: 1000 }); const updateTx = await didModule.updateDidDocTx( combinedSignInputs, expandedDidPayload, @@ -567,7 +567,7 @@ describe('DID Key Operations (Rotation, Replacement, and Combined)', () => { ]; // Step 4: Execute the combined operation - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { slippageBps: 1000 }); const updateTx = await didModule.updateDidDocTx( combinedSignInputs, updatedDidPayload, @@ -1003,7 +1003,7 @@ describe('DID Key Operations (Rotation, Replacement, and Combined)', () => { }, ]; - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { slippageBps: 1000 }); await expect( didModule.updateDidDocTx(invalidSignInputs, updatedDidPayload, feePayer, feeUpdate) @@ -1096,7 +1096,9 @@ describe('DID Key Operations (Rotation, Replacement, and Combined)', () => { }, ]; - const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer); + const feeUpdate = await didModule.generateUpdateDidDocFees(feePayer, undefined, { + slippageBps: 1000, + }); await expect( didModule.updateDidDocTx(invalidSignInputs, updatedDidPayload, feePayer, feeUpdate) diff --git a/esm/tests/modules/resource.test.ts b/esm/tests/modules/resource.test.ts index ea31ccc7..8eb9b737 100644 --- a/esm/tests/modules/resource.test.ts +++ b/esm/tests/modules/resource.test.ts @@ -105,7 +105,13 @@ describe('ResourceModule', () => { const feePayer = (await wallet.getAccounts())[0].address; const fee = await didModule.generateCreateDidDocFees(feePayer); - const didTx: DeliverTxResponse = await didModule.createDidDocTx(signInputs, didPayload, feePayer, fee); + const didTx: DeliverTxResponse = await didModule.createDidDocTx( + signInputs, + didPayload, + feePayer, + fee, + undefined + ); console.warn(`Using payload: ${JSON.stringify(didPayload)}`); console.warn(`DID Tx: ${JSON.stringify(didTx)}`); @@ -189,7 +195,13 @@ describe('ResourceModule', () => { const feePayer = (await wallet.getAccounts())[0].address; const fee = await didModule.generateCreateDidDocFees(feePayer); - const didTx: DeliverTxResponse = await didModule.createDidDocTx(signInputs, didPayload, feePayer, fee); + const didTx: DeliverTxResponse = await didModule.createDidDocTx( + signInputs, + didPayload, + feePayer, + fee, + undefined + ); console.warn(`Using payload: ${JSON.stringify(didPayload)}`); console.warn(`DID Tx: ${JSON.stringify(didTx)}`); @@ -273,7 +285,13 @@ describe('ResourceModule', () => { const feePayer = (await wallet.getAccounts())[0].address; const fee = await didModule.generateCreateDidDocFees(feePayer); - const didTx: DeliverTxResponse = await didModule.createDidDocTx(signInputs, didPayload, feePayer, fee); + const didTx: DeliverTxResponse = await didModule.createDidDocTx( + signInputs, + didPayload, + feePayer, + fee, + undefined + ); console.warn(`Using payload: ${JSON.stringify(didPayload)}`); console.warn(`DID Tx: ${JSON.stringify(didTx)}`); @@ -614,7 +632,13 @@ describe('ResourceModule', () => { const feePayer = (await wallet.getAccounts())[0].address; const fee = await didModule.generateCreateDidDocFees(feePayer); - const didTx: DeliverTxResponse = await didModule.createDidDocTx(signInputs, didPayload, feePayer, fee); + const didTx: DeliverTxResponse = await didModule.createDidDocTx( + signInputs, + didPayload, + feePayer, + fee, + undefined + ); console.warn(`Using payload: ${JSON.stringify(didPayload)}`); console.warn(`DID Tx: ${JSON.stringify(didTx)}`); @@ -722,7 +746,13 @@ describe('ResourceModule', () => { const feePayer = (await wallet.getAccounts())[0].address; const fee = await didModule.generateCreateDidDocFees(feePayer); - const didTx: DeliverTxResponse = await didModule.createDidDocTx(signInputs, didPayload, feePayer, fee); + const didTx: DeliverTxResponse = await didModule.createDidDocTx( + signInputs, + didPayload, + feePayer, + fee, + undefined + ); console.warn(`Using payload: ${JSON.stringify(didPayload)}`); console.warn(`DID Tx: ${JSON.stringify(didTx)}`); @@ -830,7 +860,13 @@ describe('ResourceModule', () => { const feePayer = (await wallet.getAccounts())[0].address; const fee = await didModule.generateCreateDidDocFees(feePayer); - const didTx: DeliverTxResponse = await didModule.createDidDocTx(signInputs, didPayload, feePayer, fee); + const didTx: DeliverTxResponse = await didModule.createDidDocTx( + signInputs, + didPayload, + feePayer, + fee, + undefined + ); console.warn(`Using payload: ${JSON.stringify(didPayload)}`); console.warn(`DID Tx: ${JSON.stringify(didTx)}`); @@ -940,7 +976,13 @@ describe('ResourceModule', () => { const feePayer = (await wallet.getAccounts())[0].address; const fee = await didModule.generateCreateDidDocFees(feePayer); - const didTx: DeliverTxResponse = await didModule.createDidDocTx(signInputs, didPayload, feePayer, fee); + const didTx: DeliverTxResponse = await didModule.createDidDocTx( + signInputs, + didPayload, + feePayer, + fee, + undefined + ); console.warn(`Using payload: ${JSON.stringify(didPayload)}`); console.warn(`DID Tx: ${JSON.stringify(didTx)}`); @@ -1047,7 +1089,13 @@ describe('ResourceModule', () => { const feePayer = (await wallet.getAccounts())[0].address; const fee = await didModule.generateCreateDidDocFees(feePayer); - const didTx: DeliverTxResponse = await didModule.createDidDocTx(signInputs, didPayload, feePayer, fee); + const didTx: DeliverTxResponse = await didModule.createDidDocTx( + signInputs, + didPayload, + feePayer, + fee, + undefined + ); console.warn(`Using payload: ${JSON.stringify(didPayload)}`); console.warn(`DID Tx: ${JSON.stringify(didTx)}`); @@ -1154,7 +1202,13 @@ describe('ResourceModule', () => { const feePayer = (await wallet.getAccounts())[0].address; const fee = await didModule.generateCreateDidDocFees(feePayer); - const didTx: DeliverTxResponse = await didModule.createDidDocTx(signInputs, didPayload, feePayer, fee); + const didTx: DeliverTxResponse = await didModule.createDidDocTx( + signInputs, + didPayload, + feePayer, + fee, + undefined + ); console.warn(`Using payload: ${JSON.stringify(didPayload)}`); console.warn(`DID Tx: ${JSON.stringify(didTx)}`); @@ -1263,7 +1317,13 @@ describe('ResourceModule', () => { const feePayer = (await wallet.getAccounts())[0].address; const fee = await didModule.generateCreateDidDocFees(feePayer); - const didTx: DeliverTxResponse = await didModule.createDidDocTx(signInputs, didPayload, feePayer, fee); + const didTx: DeliverTxResponse = await didModule.createDidDocTx( + signInputs, + didPayload, + feePayer, + fee, + undefined + ); console.warn(`Using payload: ${JSON.stringify(didPayload)}`); console.warn(`DID Tx: ${JSON.stringify(didTx)}`); @@ -1454,7 +1514,13 @@ describe('ResourceModule', () => { const feePayer = (await wallet.getAccounts())[0].address; const fee = await didModule.generateCreateDidDocFees(feePayer); - const didTx: DeliverTxResponse = await didModule.createDidDocTx(signInputs, didPayload, feePayer, fee); + const didTx: DeliverTxResponse = await didModule.createDidDocTx( + signInputs, + didPayload, + feePayer, + fee, + undefined + ); console.warn(`Using payload: ${JSON.stringify(didPayload)}`); console.warn(`DID Tx: ${JSON.stringify(didTx)}`); @@ -1484,9 +1550,7 @@ describe('ResourceModule', () => { }, ]; - const feeResourceJson = await resourceModule.generateCreateResourceJsonFees(feePayer, undefined, { - slippageBps: 1000, - }); + const feeResourceJson = await resourceModule.generateCreateResourceJsonFees(feePayer); const resourceTx = await resourceModule.createLinkedResourceTx( resourceSignInputs, resourcePayload, @@ -1619,7 +1683,13 @@ describe('ResourceModule', () => { const feePayer = (await wallet.getAccounts())[0].address; const fee = await didModule.generateCreateDidDocFees(feePayer); - const didTx: DeliverTxResponse = await didModule.createDidDocTx(signInputs, didPayload, feePayer, fee); + const didTx: DeliverTxResponse = await didModule.createDidDocTx( + signInputs, + didPayload, + feePayer, + fee, + undefined + ); console.warn(`Using payload: ${JSON.stringify(didPayload)}`); console.warn(`DID Tx: ${JSON.stringify(didTx)}`); diff --git a/esm/tests/testutils.test.ts b/esm/tests/testutils.test.ts index 3ba57fcb..c2a534ea 100644 --- a/esm/tests/testutils.test.ts +++ b/esm/tests/testutils.test.ts @@ -12,7 +12,7 @@ export const faucet = { export const localnet = { network: CheqdNetwork.Testnet, testnetRpcUrl: 'https://rpc.cheqd.network:443', - rpcUrl: 'https://rpc-devnet.cheqd.network:443', + rpcUrl: 'http://localhost:26657', gasPrice: GasPrice.fromString(`5000${faucet.minimalDenom}`), }; diff --git a/localnet/init.sh b/localnet/init.sh index d88d3a7d..f875757c 100644 --- a/localnet/init.sh +++ b/localnet/init.sh @@ -14,10 +14,8 @@ CHAIN_ID="cheqd" # Node cheqd-noded init node0 --chain-id "$CHAIN_ID" -NODE_0_VAL_PUBKEY=$(cheqd-noded tendermint show-validator) +cheqd-noded keys add validator --keyring-backend test -# User -echo 'sketch mountain erode window enact net enrich smoke claim kangaroo another visual write meat latin bacon pulp similar forum guilt father state erase bright' | cheqd-noded keys add cheqd-user --keyring-backend test --recover CONFIG_TOML="$HOME/.cheqdnode/config/config.toml" @@ -29,23 +27,30 @@ sed -i $SED_EXT 's/timeout_prevote = "1s"/timeout_prevote = "500ms"/g' "${CONFIG sed -i $SED_EXT 's/timeout_precommit = "1s"/timeout_precommit = "500ms"/g' "${CONFIG_TOML}" sed -i $SED_EXT 's/timeout_commit = "5s"/timeout_commit = "2s"/g' "${CONFIG_TOML}" sed -i $SED_EXT 's/log_level = "info"/log_level = "debug"/g' "${CONFIG_TOML}" -sed -i $SED_EXT 's/"voting_period": "172800s"/"voting_period": "12s"/' "$HOME/.cheqdnode/config/genesis.json" -sed -i $SED_EXT 's/"expedited_voting_period": "86400s"/"expedited_voting_period": "10s"/' "$HOME/.cheqdnode/config/genesis.json" +sed -i $SED_EXT 's|enable = \"\"|enable = \"true\"|g' "$HOME/.cheqdnode/config/app.toml" # shellcheck disable=SC2086 sed -i $SED_EXT 's|laddr = "tcp://127.0.0.1:26657"|laddr = "tcp://0.0.0.0:26657"|g' "$HOME/.cheqdnode/config/config.toml" sed -i $SED_EXT 's|address = "localhost:9090"|address = "0.0.0.0:9090"|g' "$HOME/.cheqdnode/config/app.toml" -sed -i $SED_EXT 's|log_level = "error"|log_level = "info"|g' "$HOME/.cheqdnode/config/config.toml" +sed -i $SED_EXT 's|log_level = "error"|log_level = "error"|g' "$HOME/.cheqdnode/config/config.toml" + +cheqd-noded genesis add-genesis-account validator 100000000000000000ncheq --keyring-backend test +cheqd-noded genesis gentx validator 5000000000000000ncheq --chain-id $CHAIN_ID --keyring-backend test +cheqd-noded genesis collect-gentxs + # Genesis GENESIS="$HOME/.cheqdnode/config/genesis.json" sed -i $SED_EXT 's/"stake"/"ncheq"/' "$GENESIS" - -cheqd-noded genesis add-genesis-account cheqd-user 1000000000000000000ncheq --keyring-backend test -cheqd-noded genesis gentx cheqd-user 10000000000000000ncheq --chain-id $CHAIN_ID --pubkey "$NODE_0_VAL_PUBKEY" --keyring-backend test - -cheqd-noded genesis collect-gentxs -cheqd-noded genesis validate-genesis +sed -i $SED_EXT 's/"vote_extensions_enable_height"[[:space:]]*:[[:space:]]*"0"/"vote_extensions_enable_height": "1"/' "$GENESIS" +sed -i $SED_EXT "/\"fee_params\"/,/\"burn_factor\"/ s/\"ncheq\"/\"usd\"/g" "$GENESIS" +sed -i $SED_EXT "/\"create_did\":/,/\"update_did\":/ { s/\"min_amount\": \"50000000000\"/\"min_amount\": \"2000000000000000000\"/g; s/\"max_amount\": \"100000000000\"/\"max_amount\": \"2000000000000000000\"/g }" "$GENESIS" +sed -i $SED_EXT "/\"update_did\":/,/\"deactivate_did\":/ { s/\"min_amount\": \"25000000000\"/\"min_amount\": \"1000000000000000000\"/g }" "$GENESIS" && +sed -i $SED_EXT "/\"deactivate_did\":/,/\"burn_factor\":/ { s/\"min_amount\": \"10000000000\"/\"min_amount\": \"400000000000000000\"/g; s/\"max_amount\": \"20000000000\"/\"max_amount\": \"400000000000000000\"/g }" "$GENESIS" +sed -i $SED_EXT "/\"image\":/,/\"json\":/ { s/\"min_amount\": \"20000000000\"/\"min_amount\": \"100000000000000000\"/g; s/\"max_amount\": \"30000000000\"/\"max_amount\": \"100000000000000000\"/g }" "$GENESIS" +sed -i $SED_EXT "/\"json\":/,/\"default\":/ { s/\"min_amount\": \"3500000000\"/\"min_amount\": \"400000000000000000\"/g; s/\"max_amount\": \"60000000000\"/\"max_amount\": \"400000000000000000\"/g }" "$GENESIS" +sed -i $SED_EXT "/\"default\":/,/\"burn_factor\":/ { s/\"min_amount\": \"6000000000\"/\"min_amount\": \"200000000000000000\"/g; s/\"max_amount\": \"20000000000\"/\"max_amount\": \"200000000000000000\"/g }" "$GENESIS" +sed -i $SED_EXT "s/\"burn_factor\": \"0.500000000000000000\"/\"burn_factor\": \"0.990000000000000000\"/g" "$GENESIS" # set default output format to json cheqd-noded config set client output json diff --git a/localnet/price-feeder.toml b/localnet/price-feeder.toml new file mode 100644 index 00000000..fb5aaecc --- /dev/null +++ b/localnet/price-feeder.toml @@ -0,0 +1,36 @@ +gas_adjustment = 1 +provider_timeout = "1000000s" + +[server] +listen_addr = "0.0.0.0:7171" +read_timeout = "20s" +verbose_cors = true +write_timeout = "20s" + +[rpc] +grpc_endpoint = "localhost:9090" +rpc_timeout = "100ms" +tmrpc_endpoint = "http://localhost:26657" + +[telemetry] +enable-hostname = true +enable-hostname-label = true +enable-service-label = true +# This will not be enabled if default telemetry is already enabled in the cheqd app config +# and the pricefeeder is not running as a separate process (i.e., it is running within the app binary). +# Pricefeeder metrics will still be recorded regardless. +enabled = true +global-labels = [["chain_id", "cheqd"]] +# This service-name will not be used if default telemetry is already enabled in the cheqd app config +# and the pricefeeder is not running as a separate process (i.e., it is running within the app binary). +service-name = "price-feeder" +prometheus-retention-time = 100 + +[[provider_endpoints]] +name = "mexc" +rest = "http://localhost:8080" +websocket = "localhost:8080" + + +## The application currently uses two providers: MEXC and Coinbase. +## You can update the rest and websocket endpoints for these providers as needed. diff --git a/localnet/setup.sh b/localnet/setup.sh index 03b1ed76..f6edb562 100644 --- a/localnet/setup.sh +++ b/localnet/setup.sh @@ -32,6 +32,7 @@ function assert_network_running_comet_v38_or_above() { info "Cleanup" docker compose down --volumes --remove-orphans + # get latest cheqd-node beta image version, where 'develop' is included in the tag # NOTE: switch logic to use `latest` tag to avoid circular dependency issues, if developing on SDK against stable network. Beta `cheqd-node` releases are to be used for testing transient features. # NOTE: Transient features are features that are not yet ready for production use, but are being tested in a beta environment. These features may change or be removed in future releases. @@ -51,7 +52,7 @@ fi # set beta tag as the image version in environment variable # temporarily bypass latest beta; use specific version for stability in tests # CHEQD_NODE_BETA_IMAGE="ghcr.io/cheqd/cheqd-node:${BETA_TAG}" -CHEQD_NODE_BETA_IMAGE="ghcr.io/cheqd/cheqd-node:4.1.6" +CHEQD_NODE_BETA_IMAGE="ghcr.io/cheqd/cheqd-node:4.2.0" echo "Using cheqd-node beta image: $CHEQD_NODE_BETA_IMAGE" @@ -65,7 +66,9 @@ info "Running cheqd network" docker compose up -d cheqd docker compose cp ./ cheqd:/cheqd docker compose exec cheqd bash /cheqd/init.sh -docker compose exec -d cheqd cheqd-noded start +docker compose exec cheqd cp /cheqd/price-feeder.toml /home/cheqd/.cheqdnode +docker compose exec -d cheqd node-start + info "Waiting for chains" # TODO: Get rid of this @@ -74,3 +77,6 @@ sleep 20 info "Checking statuses" CHEQD_STATUS=$(docker compose exec cheqd cheqd-noded status 2>&1) assert_network_running_comet_v38_or_above "${CHEQD_STATUS}" + +# Transfer funds to test account +docker compose exec -d cheqd cheqd-noded tx bank send validator cheqd1rnr5jrt4exl0samwj0yegv99jeskl0hsxmcz96 10000000000000000ncheq --from validator --gas auto --gas-adjustment=1.8 --fees 10000000000ncheq --chain-id cheqd --keyring-backend test -y && sleep 2