diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b556fd578..06a1444a28 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -391,7 +391,7 @@ importers: version: 8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3) vitest: specifier: ^4.1.0 - version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(esbuild@0.28.1)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jiti@1.21.6)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(vite@8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3)) apps/evm-bridge: dependencies: @@ -705,7 +705,7 @@ importers: version: 4.5.0(rollup@4.59.0)(typescript@5.8.3)(vite@8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3)) vitest: specifier: ^4.1.0 - version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(esbuild@0.28.1)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jiti@1.21.6)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(vite@8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3)) apps/names: dependencies: @@ -880,7 +880,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.0 - version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(esbuild@0.28.1)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jiti@1.21.6)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(vite@8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3)) apps/names-display: dependencies: @@ -926,7 +926,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.0 - version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(esbuild@0.28.1)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jiti@1.21.6)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(vite@8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3)) apps/ui-icons: devDependencies: @@ -1333,7 +1333,7 @@ importers: version: 6.1.1(typescript@5.8.3)(vite@8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3)) vitest: specifier: ^4.1.0 - version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(esbuild@0.28.1)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jiti@1.21.6)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(vite@8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3)) web-ext: specifier: ^9.3.0 version: 9.3.0(body-parser@2.2.2)(express@5.2.1)(jiti@1.21.6) @@ -1680,7 +1680,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.0 - version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(esbuild@0.28.1)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jiti@1.21.6)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(vite@8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3)) sdk/build-scripts: dependencies: @@ -1812,7 +1812,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.0 - version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(esbuild@0.28.1)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jiti@1.21.6)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(vite@8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3)) sdk/examples: dependencies: @@ -1892,7 +1892,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.0 - version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(esbuild@0.28.1)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jiti@1.21.6)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(vite@8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3)) wait-on: specifier: ^8.0.1 version: 8.0.1(debug@4.3.7) @@ -1924,6 +1924,9 @@ importers: ethers: specifier: ^6.13.5 version: 6.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ts-retry-promise: + specifier: ^0.8.1 + version: 0.8.1 tsx: specifier: ^4.8.1 version: 4.21.0 @@ -1932,7 +1935,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.0 - version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(esbuild@0.28.1)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jiti@1.21.6)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(vite@8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3)) zod: specifier: ^3.25.76 version: 3.25.76 @@ -1960,7 +1963,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.0 - version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(esbuild@0.28.1)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jiti@1.21.6)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(vite@8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3)) wait-on: specifier: ^8.0.1 version: 8.0.1(debug@4.3.7) @@ -2000,7 +2003,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.0 - version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(esbuild@0.28.1)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jiti@1.21.6)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(vite@8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3)) sdk/move-bytecode-template: devDependencies: @@ -2015,7 +2018,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.0 - version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(esbuild@0.28.1)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jiti@1.21.6)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(vite@8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3)) wasm-pack: specifier: ^0.13.0 version: 0.13.1 @@ -2052,7 +2055,7 @@ importers: version: 8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3) vitest: specifier: ^4.1.0 - version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(esbuild@0.28.1)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jiti@1.21.6)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(vite@8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3)) sdk/signers: dependencies: @@ -2086,7 +2089,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.0 - version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(esbuild@0.28.1)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jiti@1.21.6)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(vite@8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3)) sdk/typescript: dependencies: @@ -2183,7 +2186,7 @@ importers: version: 8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3) vitest: specifier: ^4.1.0 - version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(esbuild@0.28.1)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jiti@1.21.6)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(vite@8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3)) wait-on: specifier: ^8.0.1 version: 8.0.1(debug@4.3.7) @@ -16852,6 +16855,7 @@ packages: '@vitest/ui': 4.1.4 happy-dom: '*' jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true @@ -36261,7 +36265,7 @@ snapshots: tsx: 4.21.0 yaml: 2.8.3 - vitest@4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(esbuild@0.28.1)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jiti@1.21.6)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3): + vitest@4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.10.12)(happy-dom@20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(msw@2.4.9(typescript@5.8.3))(vite@8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.4 '@vitest/mocker': 4.1.4(msw@2.4.9(typescript@5.8.3))(vite@8.0.8(@types/node@24.10.12)(esbuild@0.28.1)(jiti@1.21.6)(sass@1.79.3)(terser@5.34.0)(tsx@4.21.0)(yaml@2.8.3)) @@ -36289,18 +36293,7 @@ snapshots: happy-dom: 20.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) jsdom: 26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - - '@vitejs/devtools' - - esbuild - - jiti - - less - msw - - sass - - sass-embedded - - stylus - - sugarss - - terser - - tsx - - yaml vscode-uri@3.0.8: {} diff --git a/sdk/isc-sdk/package.json b/sdk/isc-sdk/package.json index 856d6cd3f5..164d9dec3a 100644 --- a/sdk/isc-sdk/package.json +++ b/sdk/isc-sdk/package.json @@ -38,6 +38,7 @@ "@types/node": "^24.0.0", "dotenv": "^16.4.5", "ethers": "^6.13.5", + "ts-retry-promise": "^0.8.1", "tsx": "^4.8.1", "typescript": "^5.5.3", "vitest": "^4.1.0", diff --git a/sdk/isc-sdk/tests/L1ToL2Tokens.spec.ts b/sdk/isc-sdk/tests/L1ToL2Tokens.spec.ts index c5b8666ee0..011efdcb46 100644 --- a/sdk/isc-sdk/tests/L1ToL2Tokens.spec.ts +++ b/sdk/isc-sdk/tests/L1ToL2Tokens.spec.ts @@ -10,13 +10,12 @@ import { } from '../src/index'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { Ed25519Keypair } from '@iota/iota-sdk/keypairs/ed25519'; -import { requestIotaFromFaucet } from '@iota/iota-sdk/faucet'; import { IotaClient } from '@iota/iota-sdk/client'; import { beforeAll, expect, test } from 'vitest'; import { CONFIG } from './config'; import { Wallet } from 'ethers'; import { bcs } from '@iota/iota-sdk/bcs'; -import { checkL2BalanceWithRetries, requestFunds } from './utils'; +import { checkL2BalanceWithRetries, fundFromFaucet, requestFunds } from './utils'; const { L1 } = CONFIG; @@ -32,11 +31,6 @@ test('Send IOTA', async () => { const keypair = new Ed25519Keypair(); const address = keypair.toIotaAddress(); - await requestIotaFromFaucet({ - host: L1.faucetUrl!, - recipient: address, - }); - const wallet = Wallet.createRandom(); // EVM Address @@ -46,6 +40,8 @@ test('Send IOTA', async () => { // We also need to place a little more in the bag to cover the L2 gas const amountToPlace = amountToSend + L2_FROM_L1_GAS_BUDGET; + await fundFromFaucet(client, L1.faucetUrl!, address, amountToPlace); + const iscTx = new IscTransaction(L1); const bag = iscTx.newBag(); @@ -69,7 +65,7 @@ test('Send IOTA', async () => { }); const evmBalance = await checkL2BalanceWithRetries(recipientAddress); - expect(evmBalance?.baseTokens).toEqual(amountToSend.toString()); + expect(evmBalance.baseTokens).toEqual(amountToSend.toString()); }); test('Send Non-IOTA Tokens', async () => { @@ -134,8 +130,8 @@ test('Send Non-IOTA Tokens', async () => { }); const evmBalance = await checkL2BalanceWithRetries(recipientAddress, TOKEN_COIN_TYPE); - expect(evmBalance?.baseTokens).toEqual(amountToSend.toString()); - expect(evmBalance?.nativeTokens).toEqual([ + expect(evmBalance.baseTokens).toEqual(amountToSend.toString()); + expect(evmBalance.nativeTokens).toEqual([ { coinType: TOKEN_COIN_TYPE, balance: tokenAmountToSend.toString(), diff --git a/sdk/isc-sdk/tests/utils.ts b/sdk/isc-sdk/tests/utils.ts index c2daf3e5d1..28c956d086 100644 --- a/sdk/isc-sdk/tests/utils.ts +++ b/sdk/isc-sdk/tests/utils.ts @@ -1,73 +1,104 @@ // Copyright (c) 2026 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import type { IotaClient } from '@iota/iota-sdk/client'; -import { requestIotaFromFaucet } from '@iota/iota-sdk/faucet'; -import { Ed25519Keypair } from '@iota/iota-sdk/keypairs/ed25519'; -import { Transaction } from '@iota/iota-sdk/transactions'; -import type { AssetsResponse } from '../src/index.js'; -import { EvmRpcClient } from '../src/index.js'; -import { CONFIG } from './config.js'; -import { NANOS_PER_IOTA } from '@iota/iota-sdk/utils'; +import type { IotaClient } from "@iota/iota-sdk/client"; +import { requestIotaFromFaucet } from "@iota/iota-sdk/faucet"; +import { Ed25519Keypair } from "@iota/iota-sdk/keypairs/ed25519"; +import { Transaction } from "@iota/iota-sdk/transactions"; +import type { AssetsResponse } from "../src/index.js"; +import { EvmRpcClient } from "../src/index.js"; +import { CONFIG } from "./config.js"; +import { NANOS_PER_IOTA } from "@iota/iota-sdk/utils"; +import { retry } from "ts-retry-promise"; const { L2 } = CONFIG; +const BALANCE_VISIBILITY_TIMEOUT_MS = 60_000; +const AMOUNT_TO_TRANSFER = 1n * NANOS_PER_IOTA; + +async function waitForBalance(client: IotaClient, address: string, minimumBalance: bigint) { + try { + await retry(() => client.getBalance({ owner: address }), { + until: ({ totalBalance }) => BigInt(totalBalance) >= minimumBalance, + retries: "INFINITELY", + timeout: BALANCE_VISIBILITY_TIMEOUT_MS, + delay: 500, + backoff: "LINEAR", + maxBackOff: 8_000, + logger: (msg) => console.warn(`Retrying getting balance for ${address}: ${msg}`), + }); + } catch (error) { + throw new Error(`${address} balance didn't reach ${minimumBalance}.`, { cause: error }); + } +} + +export async function fundFromFaucet( + client: IotaClient, + faucetUrl: string, + address: string, + minimumBalance: bigint, +) { + await requestIotaFromFaucet({ + host: faucetUrl, + recipient: address, + }); + + await waitForBalance(client, address, minimumBalance); +} + export async function requestFunds( - client: IotaClient, - faucetUrl: string, - recipientAddress: string, + client: IotaClient, + faucetUrl: string, + recipientAddress: string, ) { - const keypair = new Ed25519Keypair(); - const address = keypair.toIotaAddress(); + const keypair = new Ed25519Keypair(); + const address = keypair.toIotaAddress(); - await requestIotaFromFaucet({ - host: faucetUrl, - recipient: address, - }); + await fundFromFaucet(client, faucetUrl, address, AMOUNT_TO_TRANSFER); - const transaction = new Transaction(); - const [coin] = transaction.splitCoins(transaction.gas, [1n * NANOS_PER_IOTA]); - transaction.transferObjects([coin], recipientAddress); - transaction.setSender(address); + const transaction = new Transaction(); + const [coin] = transaction.splitCoins(transaction.gas, [AMOUNT_TO_TRANSFER]); + transaction.transferObjects([coin], recipientAddress); + transaction.setSender(address); - await transaction.build({ client }); + await transaction.build({ client }); - await client.signAndExecuteTransaction({ - signer: keypair, - transaction, - }); + const { digest } = await client.signAndExecuteTransaction({ + signer: keypair, + transaction, + }); + + await client.waitForTransaction({ digest, waitMode: "indexed-on-node" }); } export async function checkL2BalanceWithRetries( - address: string, - coinType?: string, - maxRetries = 10, - delay = 2500, -): Promise { - const evmClient = new EvmRpcClient(L2.evmRpcUrl); - let evmBalance: AssetsResponse | null = null; - - for (let attempt = 1; attempt <= maxRetries; attempt++) { - try { - evmBalance = await evmClient.getBalanceBaseToken(address); - } catch (error) { - console.error('Error checking balance:', error); - } finally { - const nativeToken = evmBalance?.nativeTokens?.find((t) => t.coinType === coinType); - const nativeTokenBalance = nativeToken ? nativeToken.balance : '0'; + address: string, + coinType?: string, + timeout = 60_000, + delay = 2500, +): Promise { + const evmClient = new EvmRpcClient(L2.evmRpcUrl); - if ( - (evmBalance?.baseTokens.startsWith('0') || - (coinType && nativeTokenBalance.startsWith('0'))) && - attempt < maxRetries - ) { - console.log( - `Fetching EVM balance attempt ${attempt + 1} out of ${maxRetries} in ${delay} ms`, - ); - await new Promise((resolve) => setTimeout(resolve, delay)); - } - } - } + function hasExpectedBalances(balance: AssetsResponse) { + const nativeToken = balance.nativeTokens?.find((t) => t.coinType === coinType); + const nativeTokenBalance = nativeToken ? nativeToken.balance : "0"; + return balance.baseTokens !== "0" && (!coinType || nativeTokenBalance !== "0"); + } - return evmBalance; + try { + return await retry(() => evmClient.getBalanceBaseToken(address), { + until: hasExpectedBalances, + retries: "INFINITELY", + timeout, + delay, + backoff: "LINEAR", + maxBackOff: 10_000, + logger: (msg) => console.log(`Retrying fetching EVM balance: ${msg}`), + }); + } catch (error) { + throw new Error( + `EVM balance of ${address} did not reach the expected amounts within ${timeout} ms.`, + { cause: error }, + ); + } }