From f639a5cf5f0878483a410e83d957fd83c6c243e2 Mon Sep 17 00:00:00 2001
From: Kozer4 <107694759+Kozer4@users.noreply.github.com>
Date: Tue, 12 Dec 2023 14:01:38 +0200
Subject: [PATCH] Beta (#70)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* feat(sdk): add getPendingStatusInfo method

* fix(tsdoc): add some tsdoc

* feat(sdk): add sdk.utils; with addMemoToTx method

* feat: add support for the Testnet Holesky (#71)

* feat: add support for the Testnet Holesky

* added `getGasBalance`

* feat: memo 28 char max

* fix: gasBalance result (#73)

* feat: add soroban

* fix: /check/ for getGasBalance

* fix: example

* fix: soroban

* fix: sdk.utils.addMemoTx move to sdk.utils.sol.addMemoTx

* fix: sdk.utils.addMemoTx move to sdk.utils.sol.addMemoTx

* feat: BridgeTransaction add isClaimable:?boolean

---------

Co-authored-by: Kozer4 <ako@allbridge.io>
Co-authored-by: Milan Kotykov <mk@allbridge.io>
Co-authored-by: faramo_zayw <faramo_zayw@protonmail.com>
Co-authored-by: faramo_žayw <40602472+faramozzayw@users.noreply.github.com>
---
 .cspell.json                                  |   11 +-
 examples/package.json                         |    3 +-
 examples/pnpm-lock.yaml                       | 1405 ++++++++++-------
 .../bridge/srb/srb-send-full-example.ts       |   88 ++
 package.json                                  |    4 +-
 pnpm-lock.yaml                                |  235 ++-
 scripts/build.ts                              |    7 +
 src/__tests__/index.test.ts                   |    1 +
 .../raw-bridge-transaction-builder.test.ts    |    3 +-
 .../raw-pool-transaction-builder.test.ts      |    6 +-
 src/chains/index.ts                           |   21 +
 src/chains/models.ts                          |   17 +
 src/client/core-api/api-client-caching.ts     |   32 +-
 src/client/core-api/api-client.ts             |   14 +
 src/client/core-api/core-api.model.ts         |   23 +
 .../core-api/core-client-pool-info-caching.ts |   10 +
 src/client/core-api/index.ts                  |   14 +
 src/configs/mainnet.ts                        |    3 +
 src/configs/testnet.ts                        |    3 +
 src/index.ts                                  |  372 ++---
 src/models/index.ts                           |   35 +-
 src/services/bridge/evm/index.ts              |    2 +-
 src/services/bridge/index.ts                  |   36 +-
 src/services/bridge/models/bridge.ts          |   10 +
 .../bridge/raw-bridge-transaction-builder.ts  |   12 +-
 src/services/bridge/sol/jupiter.ts            |   37 +-
 src/services/bridge/srb/index.ts              |  118 ++
 src/services/bridge/utils.ts                  |   15 +-
 src/services/index.ts                         |  502 ++++++
 src/services/liquidity-pool/evm/index.ts      |    2 +-
 src/services/liquidity-pool/index.ts          |   24 +-
 .../raw-pool-transaction-builder.ts           |    9 +-
 src/services/liquidity-pool/srb/index.ts      |   96 ++
 src/services/models/index.ts                  |    8 +-
 src/services/models/srb/bridge.ts             |  259 +++
 src/services/models/srb/method-options.ts     |   58 +
 src/services/models/srb/pool.ts               |  318 ++++
 src/services/models/srb/token-contract.ts     |  309 ++++
 src/services/token/index.ts                   |   15 +-
 src/services/token/srb/index.ts               |   76 +
 src/services/utils/srb/convert.ts             |  109 ++
 src/services/utils/srb/invoke.ts              |   74 +
 src/services/utils/srb/tx-builder.ts          |   76 +
 src/tokens-info/tokens-info.model.ts          |  111 ++
 src/utils/calculation/index.ts                |   20 +-
 src/utils/index.ts                            |   46 +-
 src/utils/sol/index.ts                        |   37 +
 src/utils/sol/utils.ts                        |   23 +
 src/utils/srb/index.ts                        |  136 ++
 src/utils/utils.ts                            |   36 +
 50 files changed, 3826 insertions(+), 1055 deletions(-)
 create mode 100644 examples/src/examples/bridge/srb/srb-send-full-example.ts
 create mode 100644 src/services/bridge/srb/index.ts
 create mode 100644 src/services/index.ts
 create mode 100644 src/services/liquidity-pool/srb/index.ts
 create mode 100644 src/services/models/srb/bridge.ts
 create mode 100644 src/services/models/srb/method-options.ts
 create mode 100644 src/services/models/srb/pool.ts
 create mode 100644 src/services/models/srb/token-contract.ts
 create mode 100644 src/services/token/srb/index.ts
 create mode 100644 src/services/utils/srb/convert.ts
 create mode 100644 src/services/utils/srb/invoke.ts
 create mode 100644 src/services/utils/srb/tx-builder.ts
 create mode 100644 src/utils/sol/index.ts
 create mode 100644 src/utils/sol/utils.ts
 create mode 100644 src/utils/srb/index.ts
 create mode 100644 src/utils/utils.ts

diff --git a/.cspell.json b/.cspell.json
index 9e543a47..660987b2 100644
--- a/.cspell.json
+++ b/.cspell.json
@@ -35,7 +35,16 @@
     "txid",
     "CCTP",
     "cctp",
-    "Soroban"
+    "Soroban",
+    "Holešky",
+    "STLR",
+    "alphanum",
+    "retval",
+    "typeahead",
+    "Timepoint",
+    "Typepoint",
+    "futurenet",
+    "Vals"
   ],
   "flagWords": [],
   "ignorePaths": [
diff --git a/examples/package.json b/examples/package.json
index 6fbf1122..e4896a25 100644
--- a/examples/package.json
+++ b/examples/package.json
@@ -4,7 +4,7 @@
   "main": "index.js",
   "description": "",
   "scripts": {
-    "pnpmi": "rm -rf node_modules && pnpm i",
+    "pnpmi": "cd ../ && pnpm build && cd examples && rm -rf node_modules && pnpm i",
     "compile": "tsc",
     "prettier": "prettier \"src/**/*.ts\" --write",
     "lint": "eslint src --ext .ts",
@@ -20,6 +20,7 @@
     "run:bridge:evm:sendTokens": "ts-node src/examples/bridge/evm/evm-send-tokens.ts",
     "run:bridge:solana:send": "ts-node src/examples/bridge/solana/sol-build-send-tx.ts",
     "run:bridge:solana:swap": "ts-node src/examples/bridge/solana/sol-build-swap-tx.ts",
+    "run:bridge:srb:fullExample": "ts-node src/examples/bridge/srb/srb-send-full-example.ts",
     "run:bridge:trx:approveAndSend": "ts-node src/examples/bridge/trx/trx-build-approve-and-send-tx.ts",
     "run:bridge:trx:approveAndSendWithStables": "ts-node src/examples/bridge/trx/trx-build-approve-and-send-tx-gas-fee-with-stables.ts",
     "run:bridge:trx:swap": "ts-node src/examples/bridge/trx/trx-build-swap-tx.ts",
diff --git a/examples/pnpm-lock.yaml b/examples/pnpm-lock.yaml
index ca220f80..a8bc224a 100644
--- a/examples/pnpm-lock.yaml
+++ b/examples/pnpm-lock.yaml
@@ -1,58 +1,76 @@
-lockfileVersion: 5.4
-
-specifiers:
-  '@allbridge/bridge-core-sdk': file:..
-  '@solana/web3.js': ^1.78.5
-  '@typescript-eslint/eslint-plugin': ^5.62.0
-  '@typescript-eslint/parser': ^5.62.0
-  bs58: ^5.0.0
-  dotenv: ^16.3.1
-  eslint: ^8.49.0
-  eslint-config-prettier: ^8.10.0
-  eslint-plugin-jest: ^27.2.3
-  eslint-plugin-prettier: ^4.2.1
-  prettier: ^2.8.8
-  tronweb: ^4.4.0
-  web3: ^1.9.0
-  web3-core: ^1.9.0
-  web3-eth-contract: ^1.9.0
-  web3-utils: ^1.9.0
+lockfileVersion: '6.0'
+
+settings:
+  autoInstallPeers: true
+  excludeLinksFromLockfile: false
 
 dependencies:
-  '@allbridge/bridge-core-sdk': file:..
-  '@solana/web3.js': 1.78.5
-  tronweb: 4.4.0
-  web3: 1.9.0
-  web3-core: 1.9.0
-  web3-eth-contract: 1.9.0
-  web3-utils: 1.9.0
+  '@allbridge/bridge-core-sdk':
+    specifier: file:..
+    version: file:..
+  '@solana/web3.js':
+    specifier: ^1.78.5
+    version: 1.78.5
+  tronweb:
+    specifier: ^4.4.0
+    version: 4.4.0
+  web3:
+    specifier: ^1.9.0
+    version: 1.9.0
+  web3-core:
+    specifier: ^1.9.0
+    version: 1.9.0
+  web3-eth-contract:
+    specifier: ^1.9.0
+    version: 1.9.0
+  web3-utils:
+    specifier: ^1.9.0
+    version: 1.9.0
 
 devDependencies:
-  '@typescript-eslint/eslint-plugin': 5.62.0_w7hjdv7tbjohv55q5pukdj7xvq
-  '@typescript-eslint/parser': 5.62.0_eslint@8.49.0
-  bs58: 5.0.0
-  dotenv: 16.3.1
-  eslint: 8.49.0
-  eslint-config-prettier: 8.10.0_eslint@8.49.0
-  eslint-plugin-jest: 27.2.3_awyla7akqgxssmr35tmds36qwy
-  eslint-plugin-prettier: 4.2.1_v3du5qq33rbbtywpdhf4lgk4fi
-  prettier: 2.8.8
+  '@typescript-eslint/eslint-plugin':
+    specifier: ^5.62.0
+    version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.49.0)(typescript@5.3.2)
+  '@typescript-eslint/parser':
+    specifier: ^5.62.0
+    version: 5.62.0(eslint@8.49.0)(typescript@5.3.2)
+  bs58:
+    specifier: ^5.0.0
+    version: 5.0.0
+  dotenv:
+    specifier: ^16.3.1
+    version: 16.3.1
+  eslint:
+    specifier: ^8.49.0
+    version: 8.49.0
+  eslint-config-prettier:
+    specifier: ^8.10.0
+    version: 8.10.0(eslint@8.49.0)
+  eslint-plugin-jest:
+    specifier: ^27.2.3
+    version: 27.2.3(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.49.0)(typescript@5.3.2)
+  eslint-plugin-prettier:
+    specifier: ^4.2.1
+    version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.49.0)(prettier@2.8.8)
+  prettier:
+    specifier: ^2.8.8
+    version: 2.8.8
 
 packages:
 
-  /@aashutoshrathi/word-wrap/1.2.6:
+  /@aashutoshrathi/word-wrap@1.2.6:
     resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==}
     engines: {node: '>=0.10.0'}
     dev: true
 
-  /@babel/runtime/7.22.15:
+  /@babel/runtime@7.22.15:
     resolution: {integrity: sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==}
     engines: {node: '>=6.9.0'}
     dependencies:
       regenerator-runtime: 0.14.0
     dev: false
 
-  /@eslint-community/eslint-utils/4.4.0_eslint@8.49.0:
+  /@eslint-community/eslint-utils@4.4.0(eslint@8.49.0):
     resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
@@ -62,12 +80,12 @@ packages:
       eslint-visitor-keys: 3.4.3
     dev: true
 
-  /@eslint-community/regexpp/4.8.1:
+  /@eslint-community/regexpp@4.8.1:
     resolution: {integrity: sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==}
     engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
     dev: true
 
-  /@eslint/eslintrc/2.1.2:
+  /@eslint/eslintrc@2.1.2:
     resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dependencies:
@@ -84,26 +102,26 @@ packages:
       - supports-color
     dev: true
 
-  /@eslint/js/8.49.0:
+  /@eslint/js@8.49.0:
     resolution: {integrity: sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dev: true
 
-  /@ethereumjs/common/2.5.0:
+  /@ethereumjs/common@2.5.0:
     resolution: {integrity: sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==}
     dependencies:
       crc-32: 1.2.2
       ethereumjs-util: 7.1.5
     dev: false
 
-  /@ethereumjs/tx/3.3.2:
+  /@ethereumjs/tx@3.3.2:
     resolution: {integrity: sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==}
     dependencies:
       '@ethereumjs/common': 2.5.0
       ethereumjs-util: 7.1.5
     dev: false
 
-  /@ethersproject/abi/5.7.0:
+  /@ethersproject/abi@5.7.0:
     resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==}
     dependencies:
       '@ethersproject/address': 5.7.0
@@ -117,7 +135,7 @@ packages:
       '@ethersproject/strings': 5.7.0
     dev: false
 
-  /@ethersproject/abstract-provider/5.7.0:
+  /@ethersproject/abstract-provider@5.7.0:
     resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==}
     dependencies:
       '@ethersproject/bignumber': 5.7.0
@@ -129,7 +147,7 @@ packages:
       '@ethersproject/web': 5.7.1
     dev: false
 
-  /@ethersproject/abstract-signer/5.7.0:
+  /@ethersproject/abstract-signer@5.7.0:
     resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==}
     dependencies:
       '@ethersproject/abstract-provider': 5.7.0
@@ -139,7 +157,7 @@ packages:
       '@ethersproject/properties': 5.7.0
     dev: false
 
-  /@ethersproject/address/5.7.0:
+  /@ethersproject/address@5.7.0:
     resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==}
     dependencies:
       '@ethersproject/bignumber': 5.7.0
@@ -149,20 +167,20 @@ packages:
       '@ethersproject/rlp': 5.7.0
     dev: false
 
-  /@ethersproject/base64/5.7.0:
+  /@ethersproject/base64@5.7.0:
     resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==}
     dependencies:
       '@ethersproject/bytes': 5.7.0
     dev: false
 
-  /@ethersproject/basex/5.7.0:
+  /@ethersproject/basex@5.7.0:
     resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==}
     dependencies:
       '@ethersproject/bytes': 5.7.0
       '@ethersproject/properties': 5.7.0
     dev: false
 
-  /@ethersproject/bignumber/5.7.0:
+  /@ethersproject/bignumber@5.7.0:
     resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==}
     dependencies:
       '@ethersproject/bytes': 5.7.0
@@ -170,19 +188,19 @@ packages:
       bn.js: 5.2.1
     dev: false
 
-  /@ethersproject/bytes/5.7.0:
+  /@ethersproject/bytes@5.7.0:
     resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==}
     dependencies:
       '@ethersproject/logger': 5.7.0
     dev: false
 
-  /@ethersproject/constants/5.7.0:
+  /@ethersproject/constants@5.7.0:
     resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==}
     dependencies:
       '@ethersproject/bignumber': 5.7.0
     dev: false
 
-  /@ethersproject/contracts/5.7.0:
+  /@ethersproject/contracts@5.7.0:
     resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==}
     dependencies:
       '@ethersproject/abi': 5.7.0
@@ -197,7 +215,7 @@ packages:
       '@ethersproject/transactions': 5.7.0
     dev: false
 
-  /@ethersproject/hash/5.7.0:
+  /@ethersproject/hash@5.7.0:
     resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==}
     dependencies:
       '@ethersproject/abstract-signer': 5.7.0
@@ -211,7 +229,7 @@ packages:
       '@ethersproject/strings': 5.7.0
     dev: false
 
-  /@ethersproject/hdnode/5.7.0:
+  /@ethersproject/hdnode@5.7.0:
     resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==}
     dependencies:
       '@ethersproject/abstract-signer': 5.7.0
@@ -228,7 +246,7 @@ packages:
       '@ethersproject/wordlists': 5.7.0
     dev: false
 
-  /@ethersproject/json-wallets/5.7.0:
+  /@ethersproject/json-wallets@5.7.0:
     resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==}
     dependencies:
       '@ethersproject/abstract-signer': 5.7.0
@@ -246,37 +264,37 @@ packages:
       scrypt-js: 3.0.1
     dev: false
 
-  /@ethersproject/keccak256/5.7.0:
+  /@ethersproject/keccak256@5.7.0:
     resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==}
     dependencies:
       '@ethersproject/bytes': 5.7.0
       js-sha3: 0.8.0
     dev: false
 
-  /@ethersproject/logger/5.7.0:
+  /@ethersproject/logger@5.7.0:
     resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==}
     dev: false
 
-  /@ethersproject/networks/5.7.1:
+  /@ethersproject/networks@5.7.1:
     resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==}
     dependencies:
       '@ethersproject/logger': 5.7.0
     dev: false
 
-  /@ethersproject/pbkdf2/5.7.0:
+  /@ethersproject/pbkdf2@5.7.0:
     resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==}
     dependencies:
       '@ethersproject/bytes': 5.7.0
       '@ethersproject/sha2': 5.7.0
     dev: false
 
-  /@ethersproject/properties/5.7.0:
+  /@ethersproject/properties@5.7.0:
     resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==}
     dependencies:
       '@ethersproject/logger': 5.7.0
     dev: false
 
-  /@ethersproject/providers/5.7.2:
+  /@ethersproject/providers@5.7.2:
     resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==}
     dependencies:
       '@ethersproject/abstract-provider': 5.7.0
@@ -304,21 +322,21 @@ packages:
       - utf-8-validate
     dev: false
 
-  /@ethersproject/random/5.7.0:
+  /@ethersproject/random@5.7.0:
     resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==}
     dependencies:
       '@ethersproject/bytes': 5.7.0
       '@ethersproject/logger': 5.7.0
     dev: false
 
-  /@ethersproject/rlp/5.7.0:
+  /@ethersproject/rlp@5.7.0:
     resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==}
     dependencies:
       '@ethersproject/bytes': 5.7.0
       '@ethersproject/logger': 5.7.0
     dev: false
 
-  /@ethersproject/sha2/5.7.0:
+  /@ethersproject/sha2@5.7.0:
     resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==}
     dependencies:
       '@ethersproject/bytes': 5.7.0
@@ -326,7 +344,7 @@ packages:
       hash.js: 1.1.7
     dev: false
 
-  /@ethersproject/signing-key/5.7.0:
+  /@ethersproject/signing-key@5.7.0:
     resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==}
     dependencies:
       '@ethersproject/bytes': 5.7.0
@@ -337,7 +355,7 @@ packages:
       hash.js: 1.1.7
     dev: false
 
-  /@ethersproject/solidity/5.7.0:
+  /@ethersproject/solidity@5.7.0:
     resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==}
     dependencies:
       '@ethersproject/bignumber': 5.7.0
@@ -348,7 +366,7 @@ packages:
       '@ethersproject/strings': 5.7.0
     dev: false
 
-  /@ethersproject/strings/5.7.0:
+  /@ethersproject/strings@5.7.0:
     resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==}
     dependencies:
       '@ethersproject/bytes': 5.7.0
@@ -356,7 +374,7 @@ packages:
       '@ethersproject/logger': 5.7.0
     dev: false
 
-  /@ethersproject/transactions/5.7.0:
+  /@ethersproject/transactions@5.7.0:
     resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==}
     dependencies:
       '@ethersproject/address': 5.7.0
@@ -370,7 +388,7 @@ packages:
       '@ethersproject/signing-key': 5.7.0
     dev: false
 
-  /@ethersproject/units/5.7.0:
+  /@ethersproject/units@5.7.0:
     resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==}
     dependencies:
       '@ethersproject/bignumber': 5.7.0
@@ -378,7 +396,7 @@ packages:
       '@ethersproject/logger': 5.7.0
     dev: false
 
-  /@ethersproject/wallet/5.7.0:
+  /@ethersproject/wallet@5.7.0:
     resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==}
     dependencies:
       '@ethersproject/abstract-provider': 5.7.0
@@ -398,7 +416,7 @@ packages:
       '@ethersproject/wordlists': 5.7.0
     dev: false
 
-  /@ethersproject/web/5.7.1:
+  /@ethersproject/web@5.7.1:
     resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==}
     dependencies:
       '@ethersproject/base64': 5.7.0
@@ -408,7 +426,7 @@ packages:
       '@ethersproject/strings': 5.7.0
     dev: false
 
-  /@ethersproject/wordlists/5.7.0:
+  /@ethersproject/wordlists@5.7.0:
     resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==}
     dependencies:
       '@ethersproject/bytes': 5.7.0
@@ -418,7 +436,7 @@ packages:
       '@ethersproject/strings': 5.7.0
     dev: false
 
-  /@humanwhocodes/config-array/0.11.11:
+  /@humanwhocodes/config-array@0.11.11:
     resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==}
     engines: {node: '>=10.10.0'}
     dependencies:
@@ -429,31 +447,31 @@ packages:
       - supports-color
     dev: true
 
-  /@humanwhocodes/module-importer/1.0.1:
+  /@humanwhocodes/module-importer@1.0.1:
     resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
     engines: {node: '>=12.22'}
     dev: true
 
-  /@humanwhocodes/object-schema/1.2.1:
+  /@humanwhocodes/object-schema@1.2.1:
     resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
     dev: true
 
-  /@jup-ag/api/4.0.0:
+  /@jup-ag/api@4.0.0:
     resolution: {integrity: sha512-GqMgiPXsH+zSYNGiSJl/PuPyIMcVDwIATbnk4s9YL1zUaS7Di9nB23SBZOhDv3Z5bo1Ud/nquL+G8+p94RLmQQ==}
     dev: false
 
-  /@noble/curves/1.2.0:
+  /@noble/curves@1.2.0:
     resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==}
     dependencies:
       '@noble/hashes': 1.3.2
     dev: false
 
-  /@noble/hashes/1.3.2:
+  /@noble/hashes@1.3.2:
     resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==}
     engines: {node: '>= 16'}
     dev: false
 
-  /@nodelib/fs.scandir/2.1.5:
+  /@nodelib/fs.scandir@2.1.5:
     resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
     engines: {node: '>= 8'}
     dependencies:
@@ -461,12 +479,12 @@ packages:
       run-parallel: 1.2.0
     dev: true
 
-  /@nodelib/fs.stat/2.0.5:
+  /@nodelib/fs.stat@2.0.5:
     resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
     engines: {node: '>= 8'}
     dev: true
 
-  /@nodelib/fs.walk/1.2.8:
+  /@nodelib/fs.walk@1.2.8:
     resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
     engines: {node: '>= 8'}
     dependencies:
@@ -474,11 +492,11 @@ packages:
       fastq: 1.15.0
     dev: true
 
-  /@project-serum/anchor/0.25.0:
+  /@project-serum/anchor@0.25.0:
     resolution: {integrity: sha512-E6A5Y/ijqpfMJ5psJvbw0kVTzLZFUcOFgs6eSM2M2iWE1lVRF18T6hWZVNl6zqZsoz98jgnNHtVGJMs+ds9A7A==}
     engines: {node: '>=11'}
     dependencies:
-      '@project-serum/borsh': 0.2.5_@solana+web3.js@1.78.5
+      '@project-serum/borsh': 0.2.5(@solana/web3.js@1.78.5)
       '@solana/web3.js': 1.78.5
       base64-js: 1.5.1
       bn.js: 5.2.1
@@ -499,7 +517,7 @@ packages:
       - utf-8-validate
     dev: false
 
-  /@project-serum/borsh/0.2.5_@solana+web3.js@1.78.5:
+  /@project-serum/borsh@0.2.5(@solana/web3.js@1.78.5):
     resolution: {integrity: sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q==}
     engines: {node: '>=10'}
     peerDependencies:
@@ -510,12 +528,12 @@ packages:
       buffer-layout: 1.2.2
     dev: false
 
-  /@sindresorhus/is/4.6.0:
+  /@sindresorhus/is@4.6.0:
     resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
     engines: {node: '>=10'}
     dev: false
 
-  /@solana/buffer-layout-utils/0.2.0:
+  /@solana/buffer-layout-utils@0.2.0:
     resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==}
     engines: {node: '>= 10'}
     dependencies:
@@ -529,14 +547,14 @@ packages:
       - utf-8-validate
     dev: false
 
-  /@solana/buffer-layout/4.0.1:
+  /@solana/buffer-layout@4.0.1:
     resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==}
     engines: {node: '>=5.10'}
     dependencies:
       buffer: 6.0.3
     dev: false
 
-  /@solana/spl-token/0.3.8_@solana+web3.js@1.78.5:
+  /@solana/spl-token@0.3.8(@solana/web3.js@1.78.5):
     resolution: {integrity: sha512-ogwGDcunP9Lkj+9CODOWMiVJEdRtqHAtX2rWF62KxnnSWtMZtV9rDhTrZFshiyJmxDnRL/1nKE1yJHg4jjs3gg==}
     engines: {node: '>=16'}
     peerDependencies:
@@ -552,7 +570,7 @@ packages:
       - utf-8-validate
     dev: false
 
-  /@solana/web3.js/1.78.5:
+  /@solana/web3.js@1.78.5:
     resolution: {integrity: sha512-2ZHsDNqkKdglJQrIvJ3p2DmgS3cGnary3VJyqt9C1SPrpAtLYzcElr3xyXJOznyQTU/8AMw+GoF11lFoKbicKg==}
     dependencies:
       '@babel/runtime': 7.22.15
@@ -576,31 +594,35 @@ packages:
       - utf-8-validate
     dev: false
 
-  /@szmarczak/http-timer/4.0.6:
+  /@stellar/freighter-api@1.7.1:
+    resolution: {integrity: sha512-XvPO+XgEbkeP0VhP0U1edOkds+rGS28+y8GRGbCVXeZ9ZslbWqRFQoETAdX8IXGuykk2ib/aPokiLc5ZaWYP7w==}
+    dev: false
+
+  /@szmarczak/http-timer@4.0.6:
     resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
     engines: {node: '>=10'}
     dependencies:
       defer-to-connect: 2.0.1
     dev: false
 
-  /@szmarczak/http-timer/5.0.1:
+  /@szmarczak/http-timer@5.0.1:
     resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==}
     engines: {node: '>=14.16'}
     dependencies:
       defer-to-connect: 2.0.1
     dev: false
 
-  /@types/big.js/6.2.0:
+  /@types/big.js@6.2.0:
     resolution: {integrity: sha512-ubLURWoc4tCw/8Yds0P3CE9cBG5q+aoycwWBiXXx4gp7XPYZy9ch0L9+Pv6osSoSRgvuQNqJdlwEhP5QhKKl6w==}
     dev: false
 
-  /@types/bn.js/5.1.1:
+  /@types/bn.js@5.1.1:
     resolution: {integrity: sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==}
     dependencies:
       '@types/node': 20.6.0
     dev: false
 
-  /@types/cacheable-request/6.0.3:
+  /@types/cacheable-request@6.0.3:
     resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==}
     dependencies:
       '@types/http-cache-semantics': 4.0.1
@@ -609,63 +631,77 @@ packages:
       '@types/responselike': 1.0.0
     dev: false
 
-  /@types/connect/3.4.36:
+  /@types/connect@3.4.36:
     resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==}
     dependencies:
       '@types/node': 20.6.0
     dev: false
 
-  /@types/http-cache-semantics/4.0.1:
+  /@types/eventsource@1.1.15:
+    resolution: {integrity: sha512-XQmGcbnxUNa06HR3VBVkc9+A2Vpi9ZyLJcdS5dwaQQ/4ZMWFO+5c90FnMUpbtMZwB/FChoYHwuVg8TvkECacTA==}
+    dev: false
+
+  /@types/http-cache-semantics@4.0.1:
     resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==}
     dev: false
 
-  /@types/json-schema/7.0.12:
+  /@types/json-schema@7.0.12:
     resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==}
     dev: true
 
-  /@types/keyv/3.1.4:
+  /@types/keyv@3.1.4:
     resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
     dependencies:
       '@types/node': 20.6.0
     dev: false
 
-  /@types/node/12.20.55:
+  /@types/node@12.20.55:
     resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
     dev: false
 
-  /@types/node/20.6.0:
+  /@types/node@20.6.0:
     resolution: {integrity: sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==}
     dev: false
 
-  /@types/pbkdf2/3.1.0:
+  /@types/pbkdf2@3.1.0:
     resolution: {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==}
     dependencies:
       '@types/node': 20.6.0
     dev: false
 
-  /@types/responselike/1.0.0:
+  /@types/randombytes@2.0.3:
+    resolution: {integrity: sha512-+NRgihTfuURllWCiIAhm1wsJqzsocnqXM77V/CalsdJIYSRGEHMnritxh+6EsBklshC+clo1KgnN14qgSGeQdw==}
+    dependencies:
+      '@types/node': 20.6.0
+    dev: false
+
+  /@types/responselike@1.0.0:
     resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
     dependencies:
       '@types/node': 20.6.0
     dev: false
 
-  /@types/secp256k1/4.0.3:
+  /@types/secp256k1@4.0.3:
     resolution: {integrity: sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==}
     dependencies:
       '@types/node': 20.6.0
     dev: false
 
-  /@types/semver/7.5.1:
+  /@types/semver@7.5.1:
     resolution: {integrity: sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==}
     dev: true
 
-  /@types/ws/7.4.7:
+  /@types/urijs@1.19.25:
+    resolution: {integrity: sha512-XOfUup9r3Y06nFAZh3WvO0rBU4OtlfPB/vgxpjg+NRdGU6CN6djdc6OEiH+PcqHCY6eFLo9Ista73uarf4gnBg==}
+    dev: false
+
+  /@types/ws@7.4.7:
     resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==}
     dependencies:
       '@types/node': 20.6.0
     dev: false
 
-  /@typescript-eslint/eslint-plugin/5.62.0_w7hjdv7tbjohv55q5pukdj7xvq:
+  /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.49.0)(typescript@5.3.2):
     resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
@@ -677,22 +713,23 @@ packages:
         optional: true
     dependencies:
       '@eslint-community/regexpp': 4.8.1
-      '@typescript-eslint/parser': 5.62.0_eslint@8.49.0
+      '@typescript-eslint/parser': 5.62.0(eslint@8.49.0)(typescript@5.3.2)
       '@typescript-eslint/scope-manager': 5.62.0
-      '@typescript-eslint/type-utils': 5.62.0_eslint@8.49.0
-      '@typescript-eslint/utils': 5.62.0_eslint@8.49.0
+      '@typescript-eslint/type-utils': 5.62.0(eslint@8.49.0)(typescript@5.3.2)
+      '@typescript-eslint/utils': 5.62.0(eslint@8.49.0)(typescript@5.3.2)
       debug: 4.3.4
       eslint: 8.49.0
       graphemer: 1.4.0
       ignore: 5.2.4
       natural-compare-lite: 1.4.0
       semver: 7.5.4
-      tsutils: 3.21.0
+      tsutils: 3.21.0(typescript@5.3.2)
+      typescript: 5.3.2
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@typescript-eslint/parser/5.62.0_eslint@8.49.0:
+  /@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.3.2):
     resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
@@ -704,14 +741,15 @@ packages:
     dependencies:
       '@typescript-eslint/scope-manager': 5.62.0
       '@typescript-eslint/types': 5.62.0
-      '@typescript-eslint/typescript-estree': 5.62.0
+      '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.2)
       debug: 4.3.4
       eslint: 8.49.0
+      typescript: 5.3.2
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@typescript-eslint/scope-manager/5.62.0:
+  /@typescript-eslint/scope-manager@5.62.0:
     resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dependencies:
@@ -719,7 +757,7 @@ packages:
       '@typescript-eslint/visitor-keys': 5.62.0
     dev: true
 
-  /@typescript-eslint/type-utils/5.62.0_eslint@8.49.0:
+  /@typescript-eslint/type-utils@5.62.0(eslint@8.49.0)(typescript@5.3.2):
     resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
@@ -729,21 +767,22 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@typescript-eslint/typescript-estree': 5.62.0
-      '@typescript-eslint/utils': 5.62.0_eslint@8.49.0
+      '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.2)
+      '@typescript-eslint/utils': 5.62.0(eslint@8.49.0)(typescript@5.3.2)
       debug: 4.3.4
       eslint: 8.49.0
-      tsutils: 3.21.0
+      tsutils: 3.21.0(typescript@5.3.2)
+      typescript: 5.3.2
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@typescript-eslint/types/5.62.0:
+  /@typescript-eslint/types@5.62.0:
     resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dev: true
 
-  /@typescript-eslint/typescript-estree/5.62.0:
+  /@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.2):
     resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
@@ -758,23 +797,24 @@ packages:
       globby: 11.1.0
       is-glob: 4.0.3
       semver: 7.5.4
-      tsutils: 3.21.0
+      tsutils: 3.21.0(typescript@5.3.2)
+      typescript: 5.3.2
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@typescript-eslint/utils/5.62.0_eslint@8.49.0:
+  /@typescript-eslint/utils@5.62.0(eslint@8.49.0)(typescript@5.3.2):
     resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
     dependencies:
-      '@eslint-community/eslint-utils': 4.4.0_eslint@8.49.0
+      '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0)
       '@types/json-schema': 7.0.12
       '@types/semver': 7.5.1
       '@typescript-eslint/scope-manager': 5.62.0
       '@typescript-eslint/types': 5.62.0
-      '@typescript-eslint/typescript-estree': 5.62.0
+      '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.2)
       eslint: 8.49.0
       eslint-scope: 5.1.1
       semver: 7.5.4
@@ -783,7 +823,7 @@ packages:
       - typescript
     dev: true
 
-  /@typescript-eslint/visitor-keys/5.62.0:
+  /@typescript-eslint/visitor-keys@5.62.0:
     resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dependencies:
@@ -791,7 +831,7 @@ packages:
       eslint-visitor-keys: 3.4.3
     dev: true
 
-  /JSONStream/1.3.5:
+  /JSONStream@1.3.5:
     resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
     hasBin: true
     dependencies:
@@ -799,11 +839,11 @@ packages:
       through: 2.3.8
     dev: false
 
-  /abortcontroller-polyfill/1.7.5:
+  /abortcontroller-polyfill@1.7.5:
     resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==}
     dev: false
 
-  /accepts/1.3.8:
+  /accepts@1.3.8:
     resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
     engines: {node: '>= 0.6'}
     dependencies:
@@ -811,7 +851,7 @@ packages:
       negotiator: 0.6.3
     dev: false
 
-  /acorn-jsx/5.3.2_acorn@8.10.0:
+  /acorn-jsx@5.3.2(acorn@8.10.0):
     resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
     peerDependencies:
       acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
@@ -819,24 +859,24 @@ packages:
       acorn: 8.10.0
     dev: true
 
-  /acorn/8.10.0:
+  /acorn@8.10.0:
     resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==}
     engines: {node: '>=0.4.0'}
     hasBin: true
     dev: true
 
-  /aes-js/3.0.0:
+  /aes-js@3.0.0:
     resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==}
     dev: false
 
-  /agentkeepalive/4.5.0:
+  /agentkeepalive@4.5.0:
     resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==}
     engines: {node: '>= 8.0.0'}
     dependencies:
       humanize-ms: 1.2.1
     dev: false
 
-  /ajv/6.12.6:
+  /ajv@6.12.6:
     resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
     dependencies:
       fast-deep-equal: 3.1.3
@@ -844,43 +884,43 @@ packages:
       json-schema-traverse: 0.4.1
       uri-js: 4.4.1
 
-  /ansi-regex/5.0.1:
+  /ansi-regex@5.0.1:
     resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
     engines: {node: '>=8'}
     dev: true
 
-  /ansi-styles/4.3.0:
+  /ansi-styles@4.3.0:
     resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
     engines: {node: '>=8'}
     dependencies:
       color-convert: 2.0.1
     dev: true
 
-  /argparse/2.0.1:
+  /argparse@2.0.1:
     resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
     dev: true
 
-  /array-flatten/1.1.1:
+  /array-flatten@1.1.1:
     resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
     dev: false
 
-  /array-union/2.1.0:
+  /array-union@2.1.0:
     resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
     engines: {node: '>=8'}
     dev: true
 
-  /asn1/0.2.6:
+  /asn1@0.2.6:
     resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==}
     dependencies:
       safer-buffer: 2.1.2
     dev: false
 
-  /assert-plus/1.0.0:
+  /assert-plus@1.0.0:
     resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==}
     engines: {node: '>=0.8'}
     dev: false
 
-  /assert/2.1.0:
+  /assert@2.1.0:
     resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==}
     dependencies:
       call-bind: 1.0.2
@@ -890,28 +930,36 @@ packages:
       util: 0.12.5
     dev: false
 
-  /async-limiter/1.0.1:
+  /async-limiter@1.0.1:
     resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==}
     dev: false
 
-  /asynckit/0.4.0:
+  /asynckit@0.4.0:
     resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
     dev: false
 
-  /available-typed-arrays/1.0.5:
+  /available-typed-arrays@1.0.5:
     resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
     engines: {node: '>= 0.4'}
     dev: false
 
-  /aws-sign2/0.7.0:
+  /aws-sign2@0.7.0:
     resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==}
     dev: false
 
-  /aws4/1.12.0:
+  /aws4@1.12.0:
     resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==}
     dev: false
 
-  /axios/0.26.1:
+  /axios@0.25.0:
+    resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==}
+    dependencies:
+      follow-redirects: 1.15.2
+    transitivePeerDependencies:
+      - debug
+    dev: false
+
+  /axios@0.26.1:
     resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==}
     dependencies:
       follow-redirects: 1.15.2
@@ -919,7 +967,7 @@ packages:
       - debug
     dev: false
 
-  /axios/1.5.0:
+  /axios@1.5.0:
     resolution: {integrity: sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==}
     dependencies:
       follow-redirects: 1.15.2
@@ -929,39 +977,54 @@ packages:
       - debug
     dev: false
 
-  /balanced-match/1.0.2:
+  /axios@1.6.2:
+    resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==}
+    dependencies:
+      follow-redirects: 1.15.2
+      form-data: 4.0.0
+      proxy-from-env: 1.1.0
+    transitivePeerDependencies:
+      - debug
+    dev: false
+
+  /balanced-match@1.0.2:
     resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
     dev: true
 
-  /base-x/3.0.9:
+  /base-x@3.0.9:
     resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==}
     dependencies:
       safe-buffer: 5.2.1
     dev: false
 
-  /base-x/4.0.0:
+  /base-x@4.0.0:
     resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==}
     dev: true
 
-  /base64-js/1.5.1:
+  /base32.js@0.1.0:
+    resolution: {integrity: sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==}
+    engines: {node: '>=0.12.0'}
+    dev: false
+
+  /base64-js@1.5.1:
     resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
     dev: false
 
-  /bcrypt-pbkdf/1.0.2:
+  /bcrypt-pbkdf@1.0.2:
     resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
     dependencies:
       tweetnacl: 0.14.5
     dev: false
 
-  /bech32/1.1.4:
+  /bech32@1.1.4:
     resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==}
     dev: false
 
-  /big.js/6.2.1:
+  /big.js@6.2.1:
     resolution: {integrity: sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==}
     dev: false
 
-  /bigint-buffer/1.1.5:
+  /bigint-buffer@1.1.5:
     resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==}
     engines: {node: '>= 10.0.0'}
     requiresBuild: true
@@ -969,37 +1032,41 @@ packages:
       bindings: 1.5.0
     dev: false
 
-  /bignumber.js/9.1.2:
+  /bignumber.js@4.1.0:
+    resolution: {integrity: sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==}
+    dev: false
+
+  /bignumber.js@9.1.2:
     resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==}
     dev: false
 
-  /bindings/1.5.0:
+  /bindings@1.5.0:
     resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
     dependencies:
       file-uri-to-path: 1.0.0
     dev: false
 
-  /blakejs/1.2.1:
+  /blakejs@1.2.1:
     resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==}
     dev: false
 
-  /bluebird/3.7.2:
+  /bluebird@3.7.2:
     resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
     dev: false
 
-  /bn.js/4.11.6:
+  /bn.js@4.11.6:
     resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==}
     dev: false
 
-  /bn.js/4.12.0:
+  /bn.js@4.12.0:
     resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==}
     dev: false
 
-  /bn.js/5.2.1:
+  /bn.js@5.2.1:
     resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==}
     dev: false
 
-  /body-parser/1.20.1:
+  /body-parser@1.20.1:
     resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==}
     engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
     dependencies:
@@ -1019,7 +1086,7 @@ packages:
       - supports-color
     dev: false
 
-  /body-parser/1.20.2:
+  /body-parser@1.20.2:
     resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==}
     engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
     dependencies:
@@ -1039,7 +1106,7 @@ packages:
       - supports-color
     dev: false
 
-  /borsh/0.7.0:
+  /borsh@0.7.0:
     resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==}
     dependencies:
       bn.js: 5.2.1
@@ -1047,25 +1114,25 @@ packages:
       text-encoding-utf-8: 1.0.2
     dev: false
 
-  /brace-expansion/1.1.11:
+  /brace-expansion@1.1.11:
     resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
     dependencies:
       balanced-match: 1.0.2
       concat-map: 0.0.1
     dev: true
 
-  /braces/3.0.2:
+  /braces@3.0.2:
     resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
     engines: {node: '>=8'}
     dependencies:
       fill-range: 7.0.1
     dev: true
 
-  /brorand/1.1.0:
+  /brorand@1.1.0:
     resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==}
     dev: false
 
-  /browserify-aes/1.2.0:
+  /browserify-aes@1.2.0:
     resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==}
     dependencies:
       buffer-xor: 1.0.3
@@ -1076,19 +1143,19 @@ packages:
       safe-buffer: 5.2.1
     dev: false
 
-  /bs58/4.0.1:
+  /bs58@4.0.1:
     resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==}
     dependencies:
       base-x: 3.0.9
     dev: false
 
-  /bs58/5.0.0:
+  /bs58@5.0.0:
     resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==}
     dependencies:
       base-x: 4.0.0
     dev: true
 
-  /bs58check/2.1.2:
+  /bs58check@2.1.2:
     resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==}
     dependencies:
       bs58: 4.0.1
@@ -1096,34 +1163,34 @@ packages:
       safe-buffer: 5.2.1
     dev: false
 
-  /buffer-layout/1.2.2:
+  /buffer-layout@1.2.2:
     resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==}
     engines: {node: '>=4.5'}
     dev: false
 
-  /buffer-to-arraybuffer/0.0.5:
+  /buffer-to-arraybuffer@0.0.5:
     resolution: {integrity: sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==}
     dev: false
 
-  /buffer-xor/1.0.3:
+  /buffer-xor@1.0.3:
     resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==}
     dev: false
 
-  /buffer/5.7.1:
+  /buffer@5.7.1:
     resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
     dependencies:
       base64-js: 1.5.1
       ieee754: 1.2.1
     dev: false
 
-  /buffer/6.0.3:
+  /buffer@6.0.3:
     resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
     dependencies:
       base64-js: 1.5.1
       ieee754: 1.2.1
     dev: false
 
-  /bufferutil/4.0.7:
+  /bufferutil@4.0.7:
     resolution: {integrity: sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==}
     engines: {node: '>=6.14.2'}
     requiresBuild: true
@@ -1131,22 +1198,22 @@ packages:
       node-gyp-build: 4.6.1
     dev: false
 
-  /bytes/3.1.2:
+  /bytes@3.1.2:
     resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
     engines: {node: '>= 0.8'}
     dev: false
 
-  /cacheable-lookup/5.0.4:
+  /cacheable-lookup@5.0.4:
     resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==}
     engines: {node: '>=10.6.0'}
     dev: false
 
-  /cacheable-lookup/6.1.0:
+  /cacheable-lookup@6.1.0:
     resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==}
     engines: {node: '>=10.6.0'}
     dev: false
 
-  /cacheable-request/7.0.4:
+  /cacheable-request@7.0.4:
     resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==}
     engines: {node: '>=8'}
     dependencies:
@@ -1159,28 +1226,28 @@ packages:
       responselike: 2.0.1
     dev: false
 
-  /call-bind/1.0.2:
+  /call-bind@1.0.2:
     resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
     dependencies:
       function-bind: 1.1.1
       get-intrinsic: 1.2.1
     dev: false
 
-  /callsites/3.1.0:
+  /callsites@3.1.0:
     resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
     engines: {node: '>=6'}
     dev: true
 
-  /camelcase/5.3.1:
+  /camelcase@5.3.1:
     resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
     engines: {node: '>=6'}
     dev: false
 
-  /caseless/0.12.0:
+  /caseless@0.12.0:
     resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
     dev: false
 
-  /chalk/4.1.2:
+  /chalk@4.1.2:
     resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
     engines: {node: '>=10'}
     dependencies:
@@ -1188,11 +1255,11 @@ packages:
       supports-color: 7.2.0
     dev: true
 
-  /chownr/1.1.4:
+  /chownr@1.1.4:
     resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
     dev: false
 
-  /cids/0.7.5:
+  /cids@0.7.5:
     resolution: {integrity: sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==}
     engines: {node: '>=4.0.0', npm: '>=3.0.0'}
     deprecated: This module has been superseded by the multiformats module
@@ -1204,57 +1271,57 @@ packages:
       multihashes: 0.4.21
     dev: false
 
-  /cipher-base/1.0.4:
+  /cipher-base@1.0.4:
     resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==}
     dependencies:
       inherits: 2.0.4
       safe-buffer: 5.2.1
     dev: false
 
-  /class-is/1.1.0:
+  /class-is@1.1.0:
     resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==}
     dev: false
 
-  /clone-response/1.0.3:
+  /clone-response@1.0.3:
     resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==}
     dependencies:
       mimic-response: 1.0.1
     dev: false
 
-  /color-convert/2.0.1:
+  /color-convert@2.0.1:
     resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
     engines: {node: '>=7.0.0'}
     dependencies:
       color-name: 1.1.4
     dev: true
 
-  /color-name/1.1.4:
+  /color-name@1.1.4:
     resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
     dev: true
 
-  /combined-stream/1.0.8:
+  /combined-stream@1.0.8:
     resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
     engines: {node: '>= 0.8'}
     dependencies:
       delayed-stream: 1.0.0
     dev: false
 
-  /commander/2.20.3:
+  /commander@2.20.3:
     resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
     dev: false
 
-  /concat-map/0.0.1:
+  /concat-map@0.0.1:
     resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
     dev: true
 
-  /content-disposition/0.5.4:
+  /content-disposition@0.5.4:
     resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
     engines: {node: '>= 0.6'}
     dependencies:
       safe-buffer: 5.2.1
     dev: false
 
-  /content-hash/2.5.2:
+  /content-hash@2.5.2:
     resolution: {integrity: sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==}
     dependencies:
       cids: 0.7.5
@@ -1262,25 +1329,25 @@ packages:
       multihashes: 0.4.21
     dev: false
 
-  /content-type/1.0.5:
+  /content-type@1.0.5:
     resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
     engines: {node: '>= 0.6'}
     dev: false
 
-  /cookie-signature/1.0.6:
+  /cookie-signature@1.0.6:
     resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
     dev: false
 
-  /cookie/0.5.0:
+  /cookie@0.5.0:
     resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
     engines: {node: '>= 0.6'}
     dev: false
 
-  /core-util-is/1.0.2:
+  /core-util-is@1.0.2:
     resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
     dev: false
 
-  /cors/2.8.5:
+  /cors@2.8.5:
     resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
     engines: {node: '>= 0.10'}
     dependencies:
@@ -1288,13 +1355,19 @@ packages:
       vary: 1.1.2
     dev: false
 
-  /crc-32/1.2.2:
+  /crc-32@1.2.2:
     resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==}
     engines: {node: '>=0.8'}
     hasBin: true
     dev: false
 
-  /create-hash/1.2.0:
+  /crc@3.8.0:
+    resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==}
+    dependencies:
+      buffer: 5.7.1
+    dev: false
+
+  /create-hash@1.2.0:
     resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==}
     dependencies:
       cipher-base: 1.0.4
@@ -1304,7 +1377,7 @@ packages:
       sha.js: 2.4.11
     dev: false
 
-  /create-hmac/1.1.7:
+  /create-hmac@1.1.7:
     resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==}
     dependencies:
       cipher-base: 1.0.4
@@ -1315,7 +1388,7 @@ packages:
       sha.js: 2.4.11
     dev: false
 
-  /cross-fetch/3.1.8:
+  /cross-fetch@3.1.8:
     resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==}
     dependencies:
       node-fetch: 2.7.0
@@ -1323,7 +1396,7 @@ packages:
       - encoding
     dev: false
 
-  /cross-spawn/7.0.3:
+  /cross-spawn@7.0.3:
     resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
     engines: {node: '>= 8'}
     dependencies:
@@ -1332,26 +1405,26 @@ packages:
       which: 2.0.2
     dev: true
 
-  /crypto-hash/1.3.0:
+  /crypto-hash@1.3.0:
     resolution: {integrity: sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==}
     engines: {node: '>=8'}
     dev: false
 
-  /d/1.0.1:
+  /d@1.0.1:
     resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==}
     dependencies:
       es5-ext: 0.10.62
       type: 1.2.0
     dev: false
 
-  /dashdash/1.14.1:
+  /dashdash@1.14.1:
     resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==}
     engines: {node: '>=0.10'}
     dependencies:
       assert-plus: 1.0.0
     dev: false
 
-  /debug/2.6.9:
+  /debug@2.6.9:
     resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
     peerDependencies:
       supports-color: '*'
@@ -1362,7 +1435,7 @@ packages:
       ms: 2.0.0
     dev: false
 
-  /debug/4.3.4:
+  /debug@4.3.4:
     resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
     engines: {node: '>=6.0'}
     peerDependencies:
@@ -1374,35 +1447,35 @@ packages:
       ms: 2.1.2
     dev: true
 
-  /decode-uri-component/0.2.2:
+  /decode-uri-component@0.2.2:
     resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
     engines: {node: '>=0.10'}
     dev: false
 
-  /decompress-response/3.3.0:
+  /decompress-response@3.3.0:
     resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==}
     engines: {node: '>=4'}
     dependencies:
       mimic-response: 1.0.1
     dev: false
 
-  /decompress-response/6.0.0:
+  /decompress-response@6.0.0:
     resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
     engines: {node: '>=10'}
     dependencies:
       mimic-response: 3.1.0
     dev: false
 
-  /deep-is/0.1.4:
+  /deep-is@0.1.4:
     resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
     dev: true
 
-  /defer-to-connect/2.0.1:
+  /defer-to-connect@2.0.1:
     resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==}
     engines: {node: '>=10'}
     dev: false
 
-  /define-properties/1.2.0:
+  /define-properties@1.2.0:
     resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==}
     engines: {node: '>= 0.4'}
     dependencies:
@@ -1410,68 +1483,72 @@ packages:
       object-keys: 1.1.1
     dev: false
 
-  /delay/5.0.0:
+  /delay@5.0.0:
     resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==}
     engines: {node: '>=10'}
     dev: false
 
-  /delayed-stream/1.0.0:
+  /delayed-stream@1.0.0:
     resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
     engines: {node: '>=0.4.0'}
     dev: false
 
-  /depd/2.0.0:
+  /depd@2.0.0:
     resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
     engines: {node: '>= 0.8'}
     dev: false
 
-  /destroy/1.2.0:
+  /destroy@1.2.0:
     resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
     engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
     dev: false
 
-  /dir-glob/3.0.1:
+  /detect-node@2.1.0:
+    resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
+    dev: false
+
+  /dir-glob@3.0.1:
     resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
     engines: {node: '>=8'}
     dependencies:
       path-type: 4.0.0
     dev: true
 
-  /doctrine/3.0.0:
+  /doctrine@3.0.0:
     resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
     engines: {node: '>=6.0.0'}
     dependencies:
       esutils: 2.0.3
     dev: true
 
-  /dom-walk/0.1.2:
+  /dom-walk@0.1.2:
     resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==}
     dev: false
 
-  /dot-case/3.0.4:
+  /dot-case@3.0.4:
     resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
     dependencies:
       no-case: 3.0.4
       tslib: 2.6.2
     dev: false
 
-  /dotenv/16.3.1:
+  /dotenv@16.3.1:
     resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==}
     engines: {node: '>=12'}
     dev: true
 
-  /ecc-jsbn/0.1.2:
+  /ecc-jsbn@0.1.2:
     resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==}
     dependencies:
       jsbn: 0.1.1
       safer-buffer: 2.1.2
     dev: false
 
-  /ee-first/1.1.1:
+  /ee-first@1.1.1:
     resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
     dev: false
 
-  /elliptic/6.5.4:
+  /elliptic@6.5.4:
     resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==}
     dependencies:
       bn.js: 4.12.0
@@ -1483,22 +1560,22 @@ packages:
       minimalistic-crypto-utils: 1.0.1
     dev: false
 
-  /encodeurl/1.0.2:
+  /encodeurl@1.0.2:
     resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
     engines: {node: '>= 0.8'}
     dev: false
 
-  /end-of-stream/1.4.4:
+  /end-of-stream@1.4.4:
     resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
     dependencies:
       once: 1.4.0
     dev: false
 
-  /erc-20-abi/1.0.0:
+  /erc-20-abi@1.0.0:
     resolution: {integrity: sha512-X+kdxwbfegJ5quNHVyJPf72Y8g+rpurR3vA+K2b4jVUuAl3qHMYxnR7ZOJRC/T7kQu3V8XU4/U4mIJ+w5wUaeQ==}
     dev: false
 
-  /es5-ext/0.10.62:
+  /es5-ext@0.10.62:
     resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==}
     engines: {node: '>=0.10'}
     requiresBuild: true
@@ -1508,7 +1585,7 @@ packages:
       next-tick: 1.1.0
     dev: false
 
-  /es6-iterator/2.0.3:
+  /es6-iterator@2.0.3:
     resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==}
     dependencies:
       d: 1.0.1
@@ -1516,33 +1593,33 @@ packages:
       es6-symbol: 3.1.3
     dev: false
 
-  /es6-promise/4.2.8:
+  /es6-promise@4.2.8:
     resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==}
     dev: false
 
-  /es6-promisify/5.0.0:
+  /es6-promisify@5.0.0:
     resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==}
     dependencies:
       es6-promise: 4.2.8
     dev: false
 
-  /es6-symbol/3.1.3:
+  /es6-symbol@3.1.3:
     resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==}
     dependencies:
       d: 1.0.1
       ext: 1.7.0
     dev: false
 
-  /escape-html/1.0.3:
+  /escape-html@1.0.3:
     resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
     dev: false
 
-  /escape-string-regexp/4.0.0:
+  /escape-string-regexp@4.0.0:
     resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
     engines: {node: '>=10'}
     dev: true
 
-  /eslint-config-prettier/8.10.0_eslint@8.49.0:
+  /eslint-config-prettier@8.10.0(eslint@8.49.0):
     resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==}
     hasBin: true
     peerDependencies:
@@ -1551,7 +1628,7 @@ packages:
       eslint: 8.49.0
     dev: true
 
-  /eslint-plugin-jest/27.2.3_awyla7akqgxssmr35tmds36qwy:
+  /eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.49.0)(typescript@5.3.2):
     resolution: {integrity: sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     peerDependencies:
@@ -1564,15 +1641,15 @@ packages:
       jest:
         optional: true
     dependencies:
-      '@typescript-eslint/eslint-plugin': 5.62.0_w7hjdv7tbjohv55q5pukdj7xvq
-      '@typescript-eslint/utils': 5.62.0_eslint@8.49.0
+      '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.49.0)(typescript@5.3.2)
+      '@typescript-eslint/utils': 5.62.0(eslint@8.49.0)(typescript@5.3.2)
       eslint: 8.49.0
     transitivePeerDependencies:
       - supports-color
       - typescript
     dev: true
 
-  /eslint-plugin-prettier/4.2.1_v3du5qq33rbbtywpdhf4lgk4fi:
+  /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.49.0)(prettier@2.8.8):
     resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==}
     engines: {node: '>=12.0.0'}
     peerDependencies:
@@ -1584,12 +1661,12 @@ packages:
         optional: true
     dependencies:
       eslint: 8.49.0
-      eslint-config-prettier: 8.10.0_eslint@8.49.0
+      eslint-config-prettier: 8.10.0(eslint@8.49.0)
       prettier: 2.8.8
       prettier-linter-helpers: 1.0.0
     dev: true
 
-  /eslint-scope/5.1.1:
+  /eslint-scope@5.1.1:
     resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
     engines: {node: '>=8.0.0'}
     dependencies:
@@ -1597,7 +1674,7 @@ packages:
       estraverse: 4.3.0
     dev: true
 
-  /eslint-scope/7.2.2:
+  /eslint-scope@7.2.2:
     resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dependencies:
@@ -1605,17 +1682,17 @@ packages:
       estraverse: 5.3.0
     dev: true
 
-  /eslint-visitor-keys/3.4.3:
+  /eslint-visitor-keys@3.4.3:
     resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dev: true
 
-  /eslint/8.49.0:
+  /eslint@8.49.0:
     resolution: {integrity: sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     hasBin: true
     dependencies:
-      '@eslint-community/eslint-utils': 4.4.0_eslint@8.49.0
+      '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0)
       '@eslint-community/regexpp': 4.8.1
       '@eslint/eslintrc': 2.1.2
       '@eslint/js': 8.49.0
@@ -1656,57 +1733,57 @@ packages:
       - supports-color
     dev: true
 
-  /espree/9.6.1:
+  /espree@9.6.1:
     resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dependencies:
       acorn: 8.10.0
-      acorn-jsx: 5.3.2_acorn@8.10.0
+      acorn-jsx: 5.3.2(acorn@8.10.0)
       eslint-visitor-keys: 3.4.3
     dev: true
 
-  /esquery/1.5.0:
+  /esquery@1.5.0:
     resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
     engines: {node: '>=0.10'}
     dependencies:
       estraverse: 5.3.0
     dev: true
 
-  /esrecurse/4.3.0:
+  /esrecurse@4.3.0:
     resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
     engines: {node: '>=4.0'}
     dependencies:
       estraverse: 5.3.0
     dev: true
 
-  /estraverse/4.3.0:
+  /estraverse@4.3.0:
     resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
     engines: {node: '>=4.0'}
     dev: true
 
-  /estraverse/5.3.0:
+  /estraverse@5.3.0:
     resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
     engines: {node: '>=4.0'}
     dev: true
 
-  /esutils/2.0.3:
+  /esutils@2.0.3:
     resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
     engines: {node: '>=0.10.0'}
     dev: true
 
-  /etag/1.8.1:
+  /etag@1.8.1:
     resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
     engines: {node: '>= 0.6'}
     dev: false
 
-  /eth-ens-namehash/2.0.8:
+  /eth-ens-namehash@2.0.8:
     resolution: {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==}
     dependencies:
       idna-uts46-hx: 2.3.1
       js-sha3: 0.5.7
     dev: false
 
-  /eth-lib/0.1.29:
+  /eth-lib@0.1.29:
     resolution: {integrity: sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==}
     dependencies:
       bn.js: 4.12.0
@@ -1721,7 +1798,7 @@ packages:
       - utf-8-validate
     dev: false
 
-  /eth-lib/0.2.8:
+  /eth-lib@0.2.8:
     resolution: {integrity: sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==}
     dependencies:
       bn.js: 4.12.0
@@ -1729,13 +1806,13 @@ packages:
       xhr-request-promise: 0.1.3
     dev: false
 
-  /ethereum-bloom-filters/1.0.10:
+  /ethereum-bloom-filters@1.0.10:
     resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==}
     dependencies:
       js-sha3: 0.8.0
     dev: false
 
-  /ethereum-cryptography/0.1.3:
+  /ethereum-cryptography@0.1.3:
     resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==}
     dependencies:
       '@types/pbkdf2': 3.1.0
@@ -1755,7 +1832,7 @@ packages:
       setimmediate: 1.0.5
     dev: false
 
-  /ethereumjs-util/7.1.5:
+  /ethereumjs-util@7.1.5:
     resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==}
     engines: {node: '>=10.0.0'}
     dependencies:
@@ -1766,7 +1843,7 @@ packages:
       rlp: 2.2.7
     dev: false
 
-  /ethers/5.7.2:
+  /ethers@5.7.2:
     resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==}
     dependencies:
       '@ethersproject/abi': 5.7.0
@@ -1804,7 +1881,7 @@ packages:
       - utf-8-validate
     dev: false
 
-  /ethjs-unit/0.1.6:
+  /ethjs-unit@0.1.6:
     resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==}
     engines: {node: '>=6.5.0', npm: '>=3'}
     dependencies:
@@ -1812,26 +1889,31 @@ packages:
       number-to-bn: 1.7.0
     dev: false
 
-  /eventemitter3/3.1.2:
+  /eventemitter3@3.1.2:
     resolution: {integrity: sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==}
     dev: false
 
-  /eventemitter3/4.0.4:
+  /eventemitter3@4.0.4:
     resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==}
     dev: false
 
-  /eventemitter3/4.0.7:
+  /eventemitter3@4.0.7:
     resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
     dev: false
 
-  /evp_bytestokey/1.0.3:
+  /eventsource@1.1.2:
+    resolution: {integrity: sha512-xAH3zWhgO2/3KIniEKYPr8plNSzlGINOUqYj0m0u7AB81iRw8b/3E73W6AuU+6klLbaSFmZnaETQ2lXPfAydrA==}
+    engines: {node: '>=0.12.0'}
+    dev: false
+
+  /evp_bytestokey@1.0.3:
     resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==}
     dependencies:
       md5.js: 1.3.5
       safe-buffer: 5.2.1
     dev: false
 
-  /express/4.18.2:
+  /express@4.18.2:
     resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==}
     engines: {node: '>= 0.10.0'}
     dependencies:
@@ -1870,34 +1952,34 @@ packages:
       - supports-color
     dev: false
 
-  /ext/1.7.0:
+  /ext@1.7.0:
     resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==}
     dependencies:
       type: 2.7.2
     dev: false
 
-  /extend/3.0.2:
+  /extend@3.0.2:
     resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
     dev: false
 
-  /extsprintf/1.3.0:
+  /extsprintf@1.3.0:
     resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==}
     engines: {'0': node >=0.6.0}
     dev: false
 
-  /eyes/0.1.8:
+  /eyes@0.1.8:
     resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==}
     engines: {node: '> 0.1.90'}
     dev: false
 
-  /fast-deep-equal/3.1.3:
+  /fast-deep-equal@3.1.3:
     resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
 
-  /fast-diff/1.3.0:
+  /fast-diff@1.3.0:
     resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
     dev: true
 
-  /fast-glob/3.3.1:
+  /fast-glob@3.3.1:
     resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==}
     engines: {node: '>=8.6.0'}
     dependencies:
@@ -1908,42 +1990,42 @@ packages:
       micromatch: 4.0.5
     dev: true
 
-  /fast-json-stable-stringify/2.1.0:
+  /fast-json-stable-stringify@2.1.0:
     resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
 
-  /fast-levenshtein/2.0.6:
+  /fast-levenshtein@2.0.6:
     resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
     dev: true
 
-  /fast-stable-stringify/1.0.0:
+  /fast-stable-stringify@1.0.0:
     resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==}
     dev: false
 
-  /fastq/1.15.0:
+  /fastq@1.15.0:
     resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
     dependencies:
       reusify: 1.0.4
     dev: true
 
-  /file-entry-cache/6.0.1:
+  /file-entry-cache@6.0.1:
     resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
     engines: {node: ^10.12.0 || >=12.0.0}
     dependencies:
       flat-cache: 3.1.0
     dev: true
 
-  /file-uri-to-path/1.0.0:
+  /file-uri-to-path@1.0.0:
     resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
     dev: false
 
-  /fill-range/7.0.1:
+  /fill-range@7.0.1:
     resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
     engines: {node: '>=8'}
     dependencies:
       to-regex-range: 5.0.1
     dev: true
 
-  /finalhandler/1.2.0:
+  /finalhandler@1.2.0:
     resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==}
     engines: {node: '>= 0.8'}
     dependencies:
@@ -1958,7 +2040,7 @@ packages:
       - supports-color
     dev: false
 
-  /find-up/5.0.0:
+  /find-up@5.0.0:
     resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
     engines: {node: '>=10'}
     dependencies:
@@ -1966,7 +2048,7 @@ packages:
       path-exists: 4.0.0
     dev: true
 
-  /flat-cache/3.1.0:
+  /flat-cache@3.1.0:
     resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==}
     engines: {node: '>=12.0.0'}
     dependencies:
@@ -1975,11 +2057,11 @@ packages:
       rimraf: 3.0.2
     dev: true
 
-  /flatted/3.2.7:
+  /flatted@3.2.7:
     resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
     dev: true
 
-  /follow-redirects/1.15.2:
+  /follow-redirects@1.15.2:
     resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==}
     engines: {node: '>=4.0'}
     peerDependencies:
@@ -1989,21 +2071,21 @@ packages:
         optional: true
     dev: false
 
-  /for-each/0.3.3:
+  /for-each@0.3.3:
     resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
     dependencies:
       is-callable: 1.2.7
     dev: false
 
-  /forever-agent/0.6.1:
+  /forever-agent@0.6.1:
     resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==}
     dev: false
 
-  /form-data-encoder/1.7.1:
+  /form-data-encoder@1.7.1:
     resolution: {integrity: sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==}
     dev: false
 
-  /form-data/2.3.3:
+  /form-data@2.3.3:
     resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==}
     engines: {node: '>= 0.12'}
     dependencies:
@@ -2012,7 +2094,7 @@ packages:
       mime-types: 2.1.35
     dev: false
 
-  /form-data/4.0.0:
+  /form-data@4.0.0:
     resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
     engines: {node: '>= 6'}
     dependencies:
@@ -2021,17 +2103,17 @@ packages:
       mime-types: 2.1.35
     dev: false
 
-  /forwarded/0.2.0:
+  /forwarded@0.2.0:
     resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
     engines: {node: '>= 0.6'}
     dev: false
 
-  /fresh/0.5.2:
+  /fresh@0.5.2:
     resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
     engines: {node: '>= 0.6'}
     dev: false
 
-  /fs-extra/4.0.3:
+  /fs-extra@4.0.3:
     resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==}
     dependencies:
       graceful-fs: 4.2.11
@@ -2039,21 +2121,21 @@ packages:
       universalify: 0.1.2
     dev: false
 
-  /fs-minipass/1.2.7:
+  /fs-minipass@1.2.7:
     resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==}
     dependencies:
       minipass: 2.9.0
     dev: false
 
-  /fs.realpath/1.0.0:
+  /fs.realpath@1.0.0:
     resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
     dev: true
 
-  /function-bind/1.1.1:
+  /function-bind@1.1.1:
     resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
     dev: false
 
-  /get-intrinsic/1.2.1:
+  /get-intrinsic@1.2.1:
     resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==}
     dependencies:
       function-bind: 1.1.1
@@ -2062,39 +2144,39 @@ packages:
       has-symbols: 1.0.3
     dev: false
 
-  /get-stream/5.2.0:
+  /get-stream@5.2.0:
     resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
     engines: {node: '>=8'}
     dependencies:
       pump: 3.0.0
     dev: false
 
-  /get-stream/6.0.1:
+  /get-stream@6.0.1:
     resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
     engines: {node: '>=10'}
     dev: false
 
-  /getpass/0.1.7:
+  /getpass@0.1.7:
     resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==}
     dependencies:
       assert-plus: 1.0.0
     dev: false
 
-  /glob-parent/5.1.2:
+  /glob-parent@5.1.2:
     resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
     engines: {node: '>= 6'}
     dependencies:
       is-glob: 4.0.3
     dev: true
 
-  /glob-parent/6.0.2:
+  /glob-parent@6.0.2:
     resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
     engines: {node: '>=10.13.0'}
     dependencies:
       is-glob: 4.0.3
     dev: true
 
-  /glob/7.2.3:
+  /glob@7.2.3:
     resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
     dependencies:
       fs.realpath: 1.0.0
@@ -2105,21 +2187,21 @@ packages:
       path-is-absolute: 1.0.1
     dev: true
 
-  /global/4.4.0:
+  /global@4.4.0:
     resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==}
     dependencies:
       min-document: 2.19.0
       process: 0.11.10
     dev: false
 
-  /globals/13.21.0:
+  /globals@13.21.0:
     resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==}
     engines: {node: '>=8'}
     dependencies:
       type-fest: 0.20.2
     dev: true
 
-  /globby/11.1.0:
+  /globby@11.1.0:
     resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
     engines: {node: '>=10'}
     dependencies:
@@ -2131,13 +2213,13 @@ packages:
       slash: 3.0.0
     dev: true
 
-  /gopd/1.0.1:
+  /gopd@1.0.1:
     resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
     dependencies:
       get-intrinsic: 1.2.1
     dev: false
 
-  /got/11.8.6:
+  /got@11.8.6:
     resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==}
     engines: {node: '>=10.19.0'}
     dependencies:
@@ -2154,7 +2236,7 @@ packages:
       responselike: 2.0.1
     dev: false
 
-  /got/12.1.0:
+  /got@12.1.0:
     resolution: {integrity: sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==}
     engines: {node: '>=14.16'}
     dependencies:
@@ -2173,20 +2255,20 @@ packages:
       responselike: 2.0.1
     dev: false
 
-  /graceful-fs/4.2.11:
+  /graceful-fs@4.2.11:
     resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
     dev: false
 
-  /graphemer/1.4.0:
+  /graphemer@1.4.0:
     resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
     dev: true
 
-  /har-schema/2.0.0:
+  /har-schema@2.0.0:
     resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==}
     engines: {node: '>=4'}
     dev: false
 
-  /har-validator/5.1.5:
+  /har-validator@5.1.5:
     resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==}
     engines: {node: '>=6'}
     deprecated: this library is no longer supported
@@ -2195,42 +2277,42 @@ packages:
       har-schema: 2.0.0
     dev: false
 
-  /has-flag/4.0.0:
+  /has-flag@4.0.0:
     resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
     engines: {node: '>=8'}
     dev: true
 
-  /has-property-descriptors/1.0.0:
+  /has-property-descriptors@1.0.0:
     resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
     dependencies:
       get-intrinsic: 1.2.1
     dev: false
 
-  /has-proto/1.0.1:
+  /has-proto@1.0.1:
     resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==}
     engines: {node: '>= 0.4'}
     dev: false
 
-  /has-symbols/1.0.3:
+  /has-symbols@1.0.3:
     resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
     engines: {node: '>= 0.4'}
     dev: false
 
-  /has-tostringtag/1.0.0:
+  /has-tostringtag@1.0.0:
     resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
     engines: {node: '>= 0.4'}
     dependencies:
       has-symbols: 1.0.3
     dev: false
 
-  /has/1.0.3:
+  /has@1.0.3:
     resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
     engines: {node: '>= 0.4.0'}
     dependencies:
       function-bind: 1.1.1
     dev: false
 
-  /hash-base/3.1.0:
+  /hash-base@3.1.0:
     resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==}
     engines: {node: '>=4'}
     dependencies:
@@ -2239,14 +2321,14 @@ packages:
       safe-buffer: 5.2.1
     dev: false
 
-  /hash.js/1.1.7:
+  /hash.js@1.1.7:
     resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==}
     dependencies:
       inherits: 2.0.4
       minimalistic-assert: 1.0.1
     dev: false
 
-  /hmac-drbg/1.0.1:
+  /hmac-drbg@1.0.1:
     resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==}
     dependencies:
       hash.js: 1.1.7
@@ -2254,11 +2336,11 @@ packages:
       minimalistic-crypto-utils: 1.0.1
     dev: false
 
-  /http-cache-semantics/4.1.1:
+  /http-cache-semantics@4.1.1:
     resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
     dev: false
 
-  /http-errors/2.0.0:
+  /http-errors@2.0.0:
     resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
     engines: {node: '>= 0.8'}
     dependencies:
@@ -2269,11 +2351,11 @@ packages:
       toidentifier: 1.0.1
     dev: false
 
-  /http-https/1.0.0:
+  /http-https@1.0.0:
     resolution: {integrity: sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==}
     dev: false
 
-  /http-signature/1.2.0:
+  /http-signature@1.2.0:
     resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==}
     engines: {node: '>=0.8', npm: '>=1.3.7'}
     dependencies:
@@ -2282,7 +2364,7 @@ packages:
       sshpk: 1.17.0
     dev: false
 
-  /http2-wrapper/1.0.3:
+  /http2-wrapper@1.0.3:
     resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==}
     engines: {node: '>=10.19.0'}
     dependencies:
@@ -2290,7 +2372,7 @@ packages:
       resolve-alpn: 1.2.1
     dev: false
 
-  /http2-wrapper/2.2.0:
+  /http2-wrapper@2.2.0:
     resolution: {integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==}
     engines: {node: '>=10.19.0'}
     dependencies:
@@ -2298,36 +2380,36 @@ packages:
       resolve-alpn: 1.2.1
     dev: false
 
-  /humanize-ms/1.2.1:
+  /humanize-ms@1.2.1:
     resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==}
     dependencies:
       ms: 2.1.3
     dev: false
 
-  /iconv-lite/0.4.24:
+  /iconv-lite@0.4.24:
     resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
     engines: {node: '>=0.10.0'}
     dependencies:
       safer-buffer: 2.1.2
     dev: false
 
-  /idna-uts46-hx/2.3.1:
+  /idna-uts46-hx@2.3.1:
     resolution: {integrity: sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==}
     engines: {node: '>=4.0.0'}
     dependencies:
       punycode: 2.1.0
     dev: false
 
-  /ieee754/1.2.1:
+  /ieee754@1.2.1:
     resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
     dev: false
 
-  /ignore/5.2.4:
+  /ignore@5.2.4:
     resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
     engines: {node: '>= 4'}
     dev: true
 
-  /import-fresh/3.3.0:
+  /import-fresh@3.3.0:
     resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
     engines: {node: '>=6'}
     dependencies:
@@ -2335,31 +2417,31 @@ packages:
       resolve-from: 4.0.0
     dev: true
 
-  /imurmurhash/0.1.4:
+  /imurmurhash@0.1.4:
     resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
     engines: {node: '>=0.8.19'}
     dev: true
 
-  /inflight/1.0.6:
+  /inflight@1.0.6:
     resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
     dependencies:
       once: 1.4.0
       wrappy: 1.0.2
     dev: true
 
-  /inherits/2.0.4:
+  /inherits@2.0.4:
     resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
 
-  /injectpromise/1.0.0:
+  /injectpromise@1.0.0:
     resolution: {integrity: sha512-qNq5wy4qX4uWHcVFOEU+RqZkoVG65FhvGkyDWbuBxILMjK6A1LFf5A1mgXZkD4nRx5FCorD81X/XvPKp/zVfPA==}
     dev: false
 
-  /ipaddr.js/1.9.1:
+  /ipaddr.js@1.9.1:
     resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
     engines: {node: '>= 0.10'}
     dev: false
 
-  /is-arguments/1.1.1:
+  /is-arguments@1.1.1:
     resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
     engines: {node: '>= 0.4'}
     dependencies:
@@ -2367,40 +2449,40 @@ packages:
       has-tostringtag: 1.0.0
     dev: false
 
-  /is-callable/1.2.7:
+  /is-callable@1.2.7:
     resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
     engines: {node: '>= 0.4'}
     dev: false
 
-  /is-extglob/2.1.1:
+  /is-extglob@2.1.1:
     resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
     engines: {node: '>=0.10.0'}
     dev: true
 
-  /is-function/1.0.2:
+  /is-function@1.0.2:
     resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==}
     dev: false
 
-  /is-generator-function/1.0.10:
+  /is-generator-function@1.0.10:
     resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
     engines: {node: '>= 0.4'}
     dependencies:
       has-tostringtag: 1.0.0
     dev: false
 
-  /is-glob/4.0.3:
+  /is-glob@4.0.3:
     resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
     engines: {node: '>=0.10.0'}
     dependencies:
       is-extglob: 2.1.1
     dev: true
 
-  /is-hex-prefixed/1.0.0:
+  /is-hex-prefixed@1.0.0:
     resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==}
     engines: {node: '>=6.5.0', npm: '>=3'}
     dev: false
 
-  /is-nan/1.3.2:
+  /is-nan@1.3.2:
     resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==}
     engines: {node: '>= 0.4'}
     dependencies:
@@ -2408,32 +2490,32 @@ packages:
       define-properties: 1.2.0
     dev: false
 
-  /is-number/7.0.0:
+  /is-number@7.0.0:
     resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
     engines: {node: '>=0.12.0'}
     dev: true
 
-  /is-path-inside/3.0.3:
+  /is-path-inside@3.0.3:
     resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
     engines: {node: '>=8'}
     dev: true
 
-  /is-typed-array/1.1.12:
+  /is-typed-array@1.1.12:
     resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==}
     engines: {node: '>= 0.4'}
     dependencies:
       which-typed-array: 1.1.11
     dev: false
 
-  /is-typedarray/1.0.0:
+  /is-typedarray@1.0.0:
     resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
     dev: false
 
-  /isexe/2.0.0:
+  /isexe@2.0.0:
     resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
     dev: true
 
-  /isomorphic-ws/4.0.1_ws@7.5.9:
+  /isomorphic-ws@4.0.1(ws@7.5.9):
     resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==}
     peerDependencies:
       ws: '*'
@@ -2441,11 +2523,11 @@ packages:
       ws: 7.5.9
     dev: false
 
-  /isstream/0.1.2:
+  /isstream@0.1.2:
     resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==}
     dev: false
 
-  /jayson/4.1.0:
+  /jayson@4.1.0:
     resolution: {integrity: sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A==}
     engines: {node: '>=8'}
     hasBin: true
@@ -2458,7 +2540,7 @@ packages:
       delay: 5.0.0
       es6-promisify: 5.0.0
       eyes: 0.1.8
-      isomorphic-ws: 4.0.1_ws@7.5.9
+      isomorphic-ws: 4.0.1(ws@7.5.9)
       json-stringify-safe: 5.0.1
       uuid: 8.3.2
       ws: 7.5.9
@@ -2467,59 +2549,71 @@ packages:
       - utf-8-validate
     dev: false
 
-  /js-sha256/0.9.0:
+  /js-sha256@0.9.0:
     resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==}
     dev: false
 
-  /js-sha3/0.5.7:
+  /js-sha3@0.5.7:
     resolution: {integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==}
     dev: false
 
-  /js-sha3/0.8.0:
+  /js-sha3@0.8.0:
     resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==}
     dev: false
 
-  /js-yaml/4.1.0:
+  /js-xdr@1.3.0:
+    resolution: {integrity: sha512-fjLTm2uBtFvWsE3l2J14VjTuuB8vJfeTtYuNS7LiLHDWIX2kt0l1pqq9334F8kODUkKPMuULjEcbGbkFFwhx5g==}
+    deprecated: ⚠️ This package has moved to @stellar/js-xdr! 🚚
+    dependencies:
+      lodash: 4.17.21
+      long: 2.4.0
+    dev: false
+
+  /js-xdr@3.0.1:
+    resolution: {integrity: sha512-U+myFf2xdgeXsCE4iKwt/j14BLvU0F/YZv9LJwJrQgqtKKwyetYP7LwJKbc9qUYYAsa6ixy57CrDMtg2x+01cA==}
+    dev: false
+
+  /js-yaml@4.1.0:
     resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
     hasBin: true
     dependencies:
       argparse: 2.0.1
     dev: true
 
-  /jsbn/0.1.1:
+  /jsbn@0.1.1:
     resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
     dev: false
 
-  /json-buffer/3.0.1:
+  /json-buffer@3.0.1:
     resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
 
-  /json-schema-traverse/0.4.1:
+  /json-schema-traverse@0.4.1:
     resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
 
-  /json-schema/0.4.0:
+  /json-schema@0.4.0:
     resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
     dev: false
 
-  /json-stable-stringify-without-jsonify/1.0.1:
+  /json-stable-stringify-without-jsonify@1.0.1:
     resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
     dev: true
 
-  /json-stringify-safe/5.0.1:
+  /json-stringify-safe@5.0.1:
     resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
     dev: false
 
-  /jsonfile/4.0.0:
+  /jsonfile@4.0.0:
     resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
     optionalDependencies:
       graceful-fs: 4.2.11
     dev: false
 
-  /jsonparse/1.3.1:
+  /jsonparse@1.3.1:
     resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
     engines: {'0': node >= 0.2.0}
     dev: false
 
-  /jsprim/1.4.2:
+  /jsprim@1.4.2:
     resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==}
     engines: {node: '>=0.6.0'}
     dependencies:
@@ -2529,7 +2623,7 @@ packages:
       verror: 1.10.0
     dev: false
 
-  /keccak/3.0.3:
+  /keccak@3.0.3:
     resolution: {integrity: sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==}
     engines: {node: '>=10.0.0'}
     requiresBuild: true
@@ -2539,12 +2633,12 @@ packages:
       readable-stream: 3.6.2
     dev: false
 
-  /keyv/4.5.3:
+  /keyv@4.5.3:
     resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==}
     dependencies:
       json-buffer: 3.0.1
 
-  /levn/0.4.1:
+  /levn@0.4.1:
     resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
     engines: {node: '>= 0.8.0'}
     dependencies:
@@ -2552,45 +2646,50 @@ packages:
       type-check: 0.4.0
     dev: true
 
-  /locate-path/6.0.0:
+  /locate-path@6.0.0:
     resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
     engines: {node: '>=10'}
     dependencies:
       p-locate: 5.0.0
     dev: true
 
-  /lodash.merge/4.6.2:
+  /lodash.merge@4.6.2:
     resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
     dev: true
 
-  /lodash/4.17.21:
+  /lodash@4.17.21:
     resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
     dev: false
 
-  /lower-case/2.0.2:
+  /long@2.4.0:
+    resolution: {integrity: sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ==}
+    engines: {node: '>=0.6'}
+    dev: false
+
+  /lower-case@2.0.2:
     resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
     dependencies:
       tslib: 2.6.2
     dev: false
 
-  /lowercase-keys/2.0.0:
+  /lowercase-keys@2.0.0:
     resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
     engines: {node: '>=8'}
     dev: false
 
-  /lowercase-keys/3.0.0:
+  /lowercase-keys@3.0.0:
     resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
     dev: false
 
-  /lru-cache/6.0.0:
+  /lru-cache@6.0.0:
     resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
     engines: {node: '>=10'}
     dependencies:
       yallist: 4.0.0
     dev: true
 
-  /md5.js/1.3.5:
+  /md5.js@1.3.5:
     resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==}
     dependencies:
       hash-base: 3.1.0
@@ -2598,26 +2697,26 @@ packages:
       safe-buffer: 5.2.1
     dev: false
 
-  /media-typer/0.3.0:
+  /media-typer@0.3.0:
     resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
     engines: {node: '>= 0.6'}
     dev: false
 
-  /merge-descriptors/1.0.1:
+  /merge-descriptors@1.0.1:
     resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==}
     dev: false
 
-  /merge2/1.4.1:
+  /merge2@1.4.1:
     resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
     engines: {node: '>= 8'}
     dev: true
 
-  /methods/1.1.2:
+  /methods@1.1.2:
     resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
     engines: {node: '>= 0.6'}
     dev: false
 
-  /micromatch/4.0.5:
+  /micromatch@4.0.5:
     resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
     engines: {node: '>=8.6'}
     dependencies:
@@ -2625,72 +2724,72 @@ packages:
       picomatch: 2.3.1
     dev: true
 
-  /mime-db/1.52.0:
+  /mime-db@1.52.0:
     resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
     engines: {node: '>= 0.6'}
     dev: false
 
-  /mime-types/2.1.35:
+  /mime-types@2.1.35:
     resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
     engines: {node: '>= 0.6'}
     dependencies:
       mime-db: 1.52.0
     dev: false
 
-  /mime/1.6.0:
+  /mime@1.6.0:
     resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
     engines: {node: '>=4'}
     hasBin: true
     dev: false
 
-  /mimic-response/1.0.1:
+  /mimic-response@1.0.1:
     resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
     engines: {node: '>=4'}
     dev: false
 
-  /mimic-response/3.1.0:
+  /mimic-response@3.1.0:
     resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
     engines: {node: '>=10'}
     dev: false
 
-  /min-document/2.19.0:
+  /min-document@2.19.0:
     resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==}
     dependencies:
       dom-walk: 0.1.2
     dev: false
 
-  /minimalistic-assert/1.0.1:
+  /minimalistic-assert@1.0.1:
     resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
     dev: false
 
-  /minimalistic-crypto-utils/1.0.1:
+  /minimalistic-crypto-utils@1.0.1:
     resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==}
     dev: false
 
-  /minimatch/3.1.2:
+  /minimatch@3.1.2:
     resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
     dependencies:
       brace-expansion: 1.1.11
     dev: true
 
-  /minimist/1.2.8:
+  /minimist@1.2.8:
     resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
     dev: false
 
-  /minipass/2.9.0:
+  /minipass@2.9.0:
     resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==}
     dependencies:
       safe-buffer: 5.2.1
       yallist: 3.1.1
     dev: false
 
-  /minizlib/1.3.3:
+  /minizlib@1.3.3:
     resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==}
     dependencies:
       minipass: 2.9.0
     dev: false
 
-  /mkdirp-promise/5.0.1:
+  /mkdirp-promise@5.0.1:
     resolution: {integrity: sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==}
     engines: {node: '>=4'}
     deprecated: This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.
@@ -2698,36 +2797,36 @@ packages:
       mkdirp: 3.0.1
     dev: false
 
-  /mkdirp/0.5.6:
+  /mkdirp@0.5.6:
     resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
     hasBin: true
     dependencies:
       minimist: 1.2.8
     dev: false
 
-  /mkdirp/3.0.1:
+  /mkdirp@3.0.1:
     resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==}
     engines: {node: '>=10'}
     hasBin: true
     dev: false
 
-  /mock-fs/4.14.0:
+  /mock-fs@4.14.0:
     resolution: {integrity: sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==}
     dev: false
 
-  /ms/2.0.0:
+  /ms@2.0.0:
     resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
     dev: false
 
-  /ms/2.1.2:
+  /ms@2.1.2:
     resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
     dev: true
 
-  /ms/2.1.3:
+  /ms@2.1.3:
     resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
     dev: false
 
-  /multibase/0.6.1:
+  /multibase@0.6.1:
     resolution: {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==}
     deprecated: This module has been superseded by the multiformats module
     dependencies:
@@ -2735,7 +2834,7 @@ packages:
       buffer: 5.7.1
     dev: false
 
-  /multibase/0.7.0:
+  /multibase@0.7.0:
     resolution: {integrity: sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==}
     deprecated: This module has been superseded by the multiformats module
     dependencies:
@@ -2743,14 +2842,14 @@ packages:
       buffer: 5.7.1
     dev: false
 
-  /multicodec/0.5.7:
+  /multicodec@0.5.7:
     resolution: {integrity: sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==}
     deprecated: This module has been superseded by the multiformats module
     dependencies:
       varint: 5.0.2
     dev: false
 
-  /multicodec/1.0.4:
+  /multicodec@1.0.4:
     resolution: {integrity: sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==}
     deprecated: This module has been superseded by the multiformats module
     dependencies:
@@ -2758,7 +2857,7 @@ packages:
       varint: 5.0.2
     dev: false
 
-  /multihashes/0.4.21:
+  /multihashes@0.4.21:
     resolution: {integrity: sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==}
     dependencies:
       buffer: 5.7.1
@@ -2766,39 +2865,39 @@ packages:
       varint: 5.0.2
     dev: false
 
-  /nano-json-stream-parser/0.1.2:
+  /nano-json-stream-parser@0.1.2:
     resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==}
     dev: false
 
-  /natural-compare-lite/1.4.0:
+  /natural-compare-lite@1.4.0:
     resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==}
     dev: true
 
-  /natural-compare/1.4.0:
+  /natural-compare@1.4.0:
     resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
     dev: true
 
-  /negotiator/0.6.3:
+  /negotiator@0.6.3:
     resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
     engines: {node: '>= 0.6'}
     dev: false
 
-  /next-tick/1.1.0:
+  /next-tick@1.1.0:
     resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
     dev: false
 
-  /no-case/3.0.4:
+  /no-case@3.0.4:
     resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
     dependencies:
       lower-case: 2.0.2
       tslib: 2.6.2
     dev: false
 
-  /node-addon-api/2.0.2:
+  /node-addon-api@2.0.2:
     resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==}
     dev: false
 
-  /node-fetch/2.7.0:
+  /node-fetch@2.7.0:
     resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
     engines: {node: 4.x || >=6.0.0}
     peerDependencies:
@@ -2810,17 +2909,17 @@ packages:
       whatwg-url: 5.0.0
     dev: false
 
-  /node-gyp-build/4.6.1:
+  /node-gyp-build@4.6.1:
     resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==}
     hasBin: true
     dev: false
 
-  /normalize-url/6.1.0:
+  /normalize-url@6.1.0:
     resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}
     engines: {node: '>=10'}
     dev: false
 
-  /number-to-bn/1.7.0:
+  /number-to-bn@1.7.0:
     resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==}
     engines: {node: '>=6.5.0', npm: '>=3'}
     dependencies:
@@ -2828,20 +2927,20 @@ packages:
       strip-hex-prefix: 1.0.0
     dev: false
 
-  /oauth-sign/0.9.0:
+  /oauth-sign@0.9.0:
     resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==}
     dev: false
 
-  /object-assign/4.1.1:
+  /object-assign@4.1.1:
     resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
     engines: {node: '>=0.10.0'}
     dev: false
 
-  /object-inspect/1.12.3:
+  /object-inspect@1.12.3:
     resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==}
     dev: false
 
-  /object-is/1.1.5:
+  /object-is@1.1.5:
     resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==}
     engines: {node: '>= 0.4'}
     dependencies:
@@ -2849,12 +2948,12 @@ packages:
       define-properties: 1.2.0
     dev: false
 
-  /object-keys/1.1.1:
+  /object-keys@1.1.1:
     resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
     engines: {node: '>= 0.4'}
     dev: false
 
-  /object.assign/4.1.4:
+  /object.assign@4.1.4:
     resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
     engines: {node: '>= 0.4'}
     dependencies:
@@ -2864,25 +2963,25 @@ packages:
       object-keys: 1.1.1
     dev: false
 
-  /oboe/2.1.5:
+  /oboe@2.1.5:
     resolution: {integrity: sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==}
     dependencies:
       http-https: 1.0.0
     dev: false
 
-  /on-finished/2.4.1:
+  /on-finished@2.4.1:
     resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
     engines: {node: '>= 0.8'}
     dependencies:
       ee-first: 1.1.1
     dev: false
 
-  /once/1.4.0:
+  /once@1.4.0:
     resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
     dependencies:
       wrappy: 1.0.2
 
-  /optionator/0.9.3:
+  /optionator@0.9.3:
     resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
     engines: {node: '>= 0.8.0'}
     dependencies:
@@ -2894,75 +2993,75 @@ packages:
       type-check: 0.4.0
     dev: true
 
-  /p-cancelable/2.1.1:
+  /p-cancelable@2.1.1:
     resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==}
     engines: {node: '>=8'}
     dev: false
 
-  /p-cancelable/3.0.0:
+  /p-cancelable@3.0.0:
     resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==}
     engines: {node: '>=12.20'}
     dev: false
 
-  /p-limit/3.1.0:
+  /p-limit@3.1.0:
     resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
     engines: {node: '>=10'}
     dependencies:
       yocto-queue: 0.1.0
     dev: true
 
-  /p-locate/5.0.0:
+  /p-locate@5.0.0:
     resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
     engines: {node: '>=10'}
     dependencies:
       p-limit: 3.1.0
     dev: true
 
-  /pako/2.1.0:
+  /pako@2.1.0:
     resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==}
     dev: false
 
-  /parent-module/1.0.1:
+  /parent-module@1.0.1:
     resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
     engines: {node: '>=6'}
     dependencies:
       callsites: 3.1.0
     dev: true
 
-  /parse-headers/2.0.5:
+  /parse-headers@2.0.5:
     resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==}
     dev: false
 
-  /parseurl/1.3.3:
+  /parseurl@1.3.3:
     resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
     engines: {node: '>= 0.8'}
     dev: false
 
-  /path-exists/4.0.0:
+  /path-exists@4.0.0:
     resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
     engines: {node: '>=8'}
     dev: true
 
-  /path-is-absolute/1.0.1:
+  /path-is-absolute@1.0.1:
     resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
     engines: {node: '>=0.10.0'}
     dev: true
 
-  /path-key/3.1.1:
+  /path-key@3.1.1:
     resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
     engines: {node: '>=8'}
     dev: true
 
-  /path-to-regexp/0.1.7:
+  /path-to-regexp@0.1.7:
     resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
     dev: false
 
-  /path-type/4.0.0:
+  /path-type@4.0.0:
     resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
     engines: {node: '>=8'}
     dev: true
 
-  /pbkdf2/3.1.2:
+  /pbkdf2@3.1.2:
     resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==}
     engines: {node: '>=0.12'}
     dependencies:
@@ -2973,39 +3072,39 @@ packages:
       sha.js: 2.4.11
     dev: false
 
-  /performance-now/2.1.0:
+  /performance-now@2.1.0:
     resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
     dev: false
 
-  /picomatch/2.3.1:
+  /picomatch@2.3.1:
     resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
     engines: {node: '>=8.6'}
     dev: true
 
-  /prelude-ls/1.2.1:
+  /prelude-ls@1.2.1:
     resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
     engines: {node: '>= 0.8.0'}
     dev: true
 
-  /prettier-linter-helpers/1.0.0:
+  /prettier-linter-helpers@1.0.0:
     resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
     engines: {node: '>=6.0.0'}
     dependencies:
       fast-diff: 1.3.0
     dev: true
 
-  /prettier/2.8.8:
+  /prettier@2.8.8:
     resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
     engines: {node: '>=10.13.0'}
     hasBin: true
     dev: true
 
-  /process/0.11.10:
+  /process@0.11.10:
     resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
     engines: {node: '>= 0.6.0'}
     dev: false
 
-  /proxy-addr/2.0.7:
+  /proxy-addr@2.0.7:
     resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
     engines: {node: '>= 0.10'}
     dependencies:
@@ -3013,43 +3112,43 @@ packages:
       ipaddr.js: 1.9.1
     dev: false
 
-  /proxy-from-env/1.1.0:
+  /proxy-from-env@1.1.0:
     resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
     dev: false
 
-  /psl/1.9.0:
+  /psl@1.9.0:
     resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
     dev: false
 
-  /pump/3.0.0:
+  /pump@3.0.0:
     resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
     dependencies:
       end-of-stream: 1.4.4
       once: 1.4.0
     dev: false
 
-  /punycode/2.1.0:
+  /punycode@2.1.0:
     resolution: {integrity: sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==}
     engines: {node: '>=6'}
     dev: false
 
-  /punycode/2.3.0:
+  /punycode@2.3.0:
     resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
     engines: {node: '>=6'}
 
-  /qs/6.11.0:
+  /qs@6.11.0:
     resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
     engines: {node: '>=0.6'}
     dependencies:
       side-channel: 1.0.4
     dev: false
 
-  /qs/6.5.3:
+  /qs@6.5.3:
     resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==}
     engines: {node: '>=0.6'}
     dev: false
 
-  /query-string/5.1.1:
+  /query-string@5.1.1:
     resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==}
     engines: {node: '>=0.10.0'}
     dependencies:
@@ -3058,33 +3157,33 @@ packages:
       strict-uri-encode: 1.1.0
     dev: false
 
-  /querystring/0.2.1:
+  /querystring@0.2.1:
     resolution: {integrity: sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==}
     engines: {node: '>=0.4.x'}
     deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
     dev: false
 
-  /queue-microtask/1.2.3:
+  /queue-microtask@1.2.3:
     resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
     dev: true
 
-  /quick-lru/5.1.1:
+  /quick-lru@5.1.1:
     resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
     engines: {node: '>=10'}
     dev: false
 
-  /randombytes/2.1.0:
+  /randombytes@2.1.0:
     resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
     dependencies:
       safe-buffer: 5.2.1
     dev: false
 
-  /range-parser/1.2.1:
+  /range-parser@1.2.1:
     resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
     engines: {node: '>= 0.6'}
     dev: false
 
-  /raw-body/2.5.1:
+  /raw-body@2.5.1:
     resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==}
     engines: {node: '>= 0.8'}
     dependencies:
@@ -3094,7 +3193,7 @@ packages:
       unpipe: 1.0.0
     dev: false
 
-  /raw-body/2.5.2:
+  /raw-body@2.5.2:
     resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
     engines: {node: '>= 0.8'}
     dependencies:
@@ -3104,7 +3203,7 @@ packages:
       unpipe: 1.0.0
     dev: false
 
-  /readable-stream/3.6.2:
+  /readable-stream@3.6.2:
     resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
     engines: {node: '>= 6'}
     dependencies:
@@ -3113,11 +3212,11 @@ packages:
       util-deprecate: 1.0.2
     dev: false
 
-  /regenerator-runtime/0.14.0:
+  /regenerator-runtime@0.14.0:
     resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==}
     dev: false
 
-  /request/2.88.2:
+  /request@2.88.2:
     resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==}
     engines: {node: '>= 6'}
     deprecated: request has been deprecated, see https://github.com/request/request/issues/3142
@@ -3144,82 +3243,82 @@ packages:
       uuid: 3.4.0
     dev: false
 
-  /resolve-alpn/1.2.1:
+  /resolve-alpn@1.2.1:
     resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==}
     dev: false
 
-  /resolve-from/4.0.0:
+  /resolve-from@4.0.0:
     resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
     engines: {node: '>=4'}
     dev: true
 
-  /responselike/2.0.1:
+  /responselike@2.0.1:
     resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==}
     dependencies:
       lowercase-keys: 2.0.0
     dev: false
 
-  /reusify/1.0.4:
+  /reusify@1.0.4:
     resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
     engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
     dev: true
 
-  /rimraf/3.0.2:
+  /rimraf@3.0.2:
     resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
     hasBin: true
     dependencies:
       glob: 7.2.3
     dev: true
 
-  /ripemd160/2.0.2:
+  /ripemd160@2.0.2:
     resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==}
     dependencies:
       hash-base: 3.1.0
       inherits: 2.0.4
     dev: false
 
-  /rlp/2.2.7:
+  /rlp@2.2.7:
     resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==}
     hasBin: true
     dependencies:
       bn.js: 5.2.1
     dev: false
 
-  /rpc-websockets/7.6.0:
+  /rpc-websockets@7.6.0:
     resolution: {integrity: sha512-Jgcs8q6t8Go98dEulww1x7RysgTkzpCMelVxZW4hvuyFtOGpeUz9prpr2KjUa/usqxgFCd9Tu3+yhHEP9GVmiQ==}
     dependencies:
       '@babel/runtime': 7.22.15
       eventemitter3: 4.0.7
       uuid: 8.3.2
-      ws: 8.14.1_3cxu5zja4e2r5wmvge7mdcljwq
+      ws: 8.14.1(bufferutil@4.0.7)(utf-8-validate@5.0.10)
     optionalDependencies:
       bufferutil: 4.0.7
       utf-8-validate: 5.0.10
     dev: false
 
-  /run-parallel/1.2.0:
+  /run-parallel@1.2.0:
     resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
     dependencies:
       queue-microtask: 1.2.3
     dev: true
 
-  /safe-buffer/5.1.2:
+  /safe-buffer@5.1.2:
     resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
     dev: false
 
-  /safe-buffer/5.2.1:
+  /safe-buffer@5.2.1:
     resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
     dev: false
 
-  /safer-buffer/2.1.2:
+  /safer-buffer@2.1.2:
     resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
     dev: false
 
-  /scrypt-js/3.0.1:
+  /scrypt-js@3.0.1:
     resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==}
     dev: false
 
-  /secp256k1/4.0.3:
+  /secp256k1@4.0.3:
     resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==}
     engines: {node: '>=10.0.0'}
     requiresBuild: true
@@ -3229,12 +3328,12 @@ packages:
       node-gyp-build: 4.6.1
     dev: false
 
-  /semver/5.7.2:
+  /semver@5.7.2:
     resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
     hasBin: true
     dev: false
 
-  /semver/7.5.4:
+  /semver@7.5.4:
     resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
     engines: {node: '>=10'}
     hasBin: true
@@ -3242,7 +3341,7 @@ packages:
       lru-cache: 6.0.0
     dev: true
 
-  /send/0.18.0:
+  /send@0.18.0:
     resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
     engines: {node: '>= 0.8.0'}
     dependencies:
@@ -3263,7 +3362,7 @@ packages:
       - supports-color
     dev: false
 
-  /serve-static/1.15.0:
+  /serve-static@1.15.0:
     resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==}
     engines: {node: '>= 0.8.0'}
     dependencies:
@@ -3275,7 +3374,7 @@ packages:
       - supports-color
     dev: false
 
-  /servify/0.1.12:
+  /servify@0.1.12:
     resolution: {integrity: sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==}
     engines: {node: '>=6'}
     dependencies:
@@ -3288,15 +3387,15 @@ packages:
       - supports-color
     dev: false
 
-  /setimmediate/1.0.5:
+  /setimmediate@1.0.5:
     resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
     dev: false
 
-  /setprototypeof/1.2.0:
+  /setprototypeof@1.2.0:
     resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
     dev: false
 
-  /sha.js/2.4.11:
+  /sha.js@2.4.11:
     resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==}
     hasBin: true
     dependencies:
@@ -3304,19 +3403,19 @@ packages:
       safe-buffer: 5.2.1
     dev: false
 
-  /shebang-command/2.0.0:
+  /shebang-command@2.0.0:
     resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
     engines: {node: '>=8'}
     dependencies:
       shebang-regex: 3.0.0
     dev: true
 
-  /shebang-regex/3.0.0:
+  /shebang-regex@3.0.0:
     resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
     engines: {node: '>=8'}
     dev: true
 
-  /side-channel/1.0.4:
+  /side-channel@1.0.4:
     resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
     dependencies:
       call-bind: 1.0.2
@@ -3324,11 +3423,11 @@ packages:
       object-inspect: 1.12.3
     dev: false
 
-  /simple-concat/1.0.1:
+  /simple-concat@1.0.1:
     resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==}
     dev: false
 
-  /simple-get/2.8.2:
+  /simple-get@2.8.2:
     resolution: {integrity: sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==}
     dependencies:
       decompress-response: 3.3.0
@@ -3336,19 +3435,47 @@ packages:
       simple-concat: 1.0.1
     dev: false
 
-  /slash/3.0.0:
+  /slash@3.0.0:
     resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
     engines: {node: '>=8'}
     dev: true
 
-  /snake-case/3.0.4:
+  /snake-case@3.0.4:
     resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
     dependencies:
       dot-case: 3.0.4
       tslib: 2.6.2
     dev: false
 
-  /sshpk/1.17.0:
+  /sodium-native@3.4.1:
+    resolution: {integrity: sha512-PaNN/roiFWzVVTL6OqjzYct38NSXewdl2wz8SRB51Br/MLIJPrbM3XexhVWkq7D3UWMysfrhKVf1v1phZq6MeQ==}
+    requiresBuild: true
+    dependencies:
+      node-gyp-build: 4.6.1
+    dev: false
+    optional: true
+
+  /sodium-native@4.0.4:
+    resolution: {integrity: sha512-faqOKw4WQKK7r/ybn6Lqo1F9+L5T6NlBJJYvpxbZPetpWylUVqz449mvlwIBKBqxEHbWakWuOlUt8J3Qpc4sWw==}
+    requiresBuild: true
+    dependencies:
+      node-gyp-build: 4.6.1
+    dev: false
+    optional: true
+
+  /soroban-client@1.0.0-beta.4:
+    resolution: {integrity: sha512-M1jLCwQtWZkQIJ6U72nYpvj+giYnB2/Vw4E1DBaiCgg5iWIWatDto+QTI/aUR9m7fNGTt/AhFtQzhjksK1rFkQ==}
+    dependencies:
+      axios: 1.6.2
+      bignumber.js: 9.1.2
+      buffer: 6.0.3
+      stellar-base: 10.0.0-beta.4
+      urijs: 1.19.11
+    transitivePeerDependencies:
+      - debug
+    dev: false
+
+  /sshpk@1.17.0:
     resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==}
     engines: {node: '>=0.10.0'}
     hasBin: true
@@ -3364,57 +3491,107 @@ packages:
       tweetnacl: 0.14.5
     dev: false
 
-  /statuses/2.0.1:
+  /statuses@2.0.1:
     resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
     engines: {node: '>= 0.8'}
     dev: false
 
-  /strict-uri-encode/1.1.0:
+  /stellar-base@10.0.0-beta.4:
+    resolution: {integrity: sha512-3EXDFHSahVDMTHrHiFOO8kFf5KN+AL4x5kd5rxjElElPG+385cyWDbO83GrNmDGU/u9/XiVL+riJjz5gQTv6RQ==}
+    dependencies:
+      base32.js: 0.1.0
+      bignumber.js: 9.1.2
+      buffer: 6.0.3
+      js-xdr: 3.0.1
+      sha.js: 2.4.11
+      tweetnacl: 1.0.3
+    optionalDependencies:
+      sodium-native: 4.0.4
+    dev: false
+
+  /stellar-base@8.2.2:
+    resolution: {integrity: sha512-YVCIuJXU1bPn+vU0ded+g0D99DcpYXH9CEXfpYEDc4Gf04h65YjOVhGojQBm1hqVHq3rKT7m1tgfNACkU84FTA==}
+    dependencies:
+      base32.js: 0.1.0
+      bignumber.js: 4.1.0
+      crc: 3.8.0
+      js-xdr: 1.3.0
+      lodash: 4.17.21
+      sha.js: 2.4.11
+      tweetnacl: 1.0.3
+    optionalDependencies:
+      sodium-native: 3.4.1
+    dev: false
+
+  /stellar-sdk@10.4.1:
+    resolution: {integrity: sha512-Wdm2UoLuN9SNrSEHO0R/I+iZuRwUkfny1xg4akhGCpO8LQZw8QzuMTJvbEoMT3sHT4/eWYiteVLp7ND21xZf5A==}
+    dependencies:
+      '@types/eventsource': 1.1.15
+      '@types/node': 20.6.0
+      '@types/randombytes': 2.0.3
+      '@types/urijs': 1.19.25
+      axios: 0.25.0
+      bignumber.js: 4.1.0
+      detect-node: 2.1.0
+      es6-promise: 4.2.8
+      eventsource: 1.1.2
+      lodash: 4.17.21
+      randombytes: 2.1.0
+      stellar-base: 8.2.2
+      toml: 2.3.6
+      tslib: 1.14.1
+      urijs: 1.19.11
+      utility-types: 3.10.0
+    transitivePeerDependencies:
+      - debug
+    dev: false
+
+  /strict-uri-encode@1.1.0:
     resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==}
     engines: {node: '>=0.10.0'}
     dev: false
 
-  /string_decoder/1.3.0:
+  /string_decoder@1.3.0:
     resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
     dependencies:
       safe-buffer: 5.2.1
     dev: false
 
-  /strip-ansi/6.0.1:
+  /strip-ansi@6.0.1:
     resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
     engines: {node: '>=8'}
     dependencies:
       ansi-regex: 5.0.1
     dev: true
 
-  /strip-hex-prefix/1.0.0:
+  /strip-hex-prefix@1.0.0:
     resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==}
     engines: {node: '>=6.5.0', npm: '>=3'}
     dependencies:
       is-hex-prefixed: 1.0.0
     dev: false
 
-  /strip-json-comments/3.1.1:
+  /strip-json-comments@3.1.1:
     resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
     engines: {node: '>=8'}
     dev: true
 
-  /superstruct/0.14.2:
+  /superstruct@0.14.2:
     resolution: {integrity: sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==}
     dev: false
 
-  /superstruct/0.15.5:
+  /superstruct@0.15.5:
     resolution: {integrity: sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==}
     dev: false
 
-  /supports-color/7.2.0:
+  /supports-color@7.2.0:
     resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
     engines: {node: '>=8'}
     dependencies:
       has-flag: 4.0.0
     dev: true
 
-  /swarm-js/0.1.42:
+  /swarm-js@0.1.42:
     resolution: {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==}
     dependencies:
       bluebird: 3.7.2
@@ -3434,7 +3611,7 @@ packages:
       - utf-8-validate
     dev: false
 
-  /tar/4.4.19:
+  /tar@4.4.19:
     resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==}
     engines: {node: '>=4.5'}
     dependencies:
@@ -3447,44 +3624,48 @@ packages:
       yallist: 3.1.1
     dev: false
 
-  /text-encoding-utf-8/1.0.2:
+  /text-encoding-utf-8@1.0.2:
     resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==}
     dev: false
 
-  /text-table/0.2.0:
+  /text-table@0.2.0:
     resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
     dev: true
 
-  /through/2.3.8:
+  /through@2.3.8:
     resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
     dev: false
 
-  /timed-cache/2.0.0:
+  /timed-cache@2.0.0:
     resolution: {integrity: sha512-9owe3VtDCtZKo8bfk5bSC4tSzIRP65doXI0i2oFWNP4VjQDwoRIsADynZQZz6XXK7exL7bOuI3HExFQ9LGi3tQ==}
     dev: false
 
-  /timed-out/4.0.1:
+  /timed-out@4.0.1:
     resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==}
     engines: {node: '>=0.10.0'}
     dev: false
 
-  /to-regex-range/5.0.1:
+  /to-regex-range@5.0.1:
     resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
     engines: {node: '>=8.0'}
     dependencies:
       is-number: 7.0.0
     dev: true
 
-  /toidentifier/1.0.1:
+  /toidentifier@1.0.1:
     resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
     engines: {node: '>=0.6'}
     dev: false
 
-  /toml/3.0.0:
+  /toml@2.3.6:
+    resolution: {integrity: sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==}
+    dev: false
+
+  /toml@3.0.0:
     resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==}
     dev: false
 
-  /tough-cookie/2.5.0:
+  /tough-cookie@2.5.0:
     resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==}
     engines: {node: '>=0.8'}
     dependencies:
@@ -3492,11 +3673,11 @@ packages:
       punycode: 2.3.0
     dev: false
 
-  /tr46/0.0.3:
+  /tr46@0.0.3:
     resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
     dev: false
 
-  /tronweb/4.4.0:
+  /tronweb@4.4.0:
     resolution: {integrity: sha512-0yPmjQE1drPcDtW4YCXFjtvDQmKc/utjKB2J6U5GDcWWhsGqE8yFjdIMJRa1yj1a/oFQNlthKMzw4Jd7lkWbYA==}
     dependencies:
       '@babel/runtime': 7.22.15
@@ -3515,46 +3696,50 @@ packages:
       - utf-8-validate
     dev: false
 
-  /tslib/1.14.1:
+  /tslib@1.14.1:
     resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
-    dev: true
 
-  /tslib/2.6.2:
+  /tslib@2.6.2:
     resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
     dev: false
 
-  /tsutils/3.21.0:
+  /tsutils@3.21.0(typescript@5.3.2):
     resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
     engines: {node: '>= 6'}
     peerDependencies:
       typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
     dependencies:
       tslib: 1.14.1
+      typescript: 5.3.2
     dev: true
 
-  /tunnel-agent/0.6.0:
+  /tunnel-agent@0.6.0:
     resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
     dependencies:
       safe-buffer: 5.2.1
     dev: false
 
-  /tweetnacl/0.14.5:
+  /tweetnacl@0.14.5:
     resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
     dev: false
 
-  /type-check/0.4.0:
+  /tweetnacl@1.0.3:
+    resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==}
+    dev: false
+
+  /type-check@0.4.0:
     resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
     engines: {node: '>= 0.8.0'}
     dependencies:
       prelude-ls: 1.2.1
     dev: true
 
-  /type-fest/0.20.2:
+  /type-fest@0.20.2:
     resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
     engines: {node: '>=10'}
     dev: true
 
-  /type-is/1.6.18:
+  /type-is@1.6.18:
     resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
     engines: {node: '>= 0.6'}
     dependencies:
@@ -3562,44 +3747,54 @@ packages:
       mime-types: 2.1.35
     dev: false
 
-  /type/1.2.0:
+  /type@1.2.0:
     resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==}
     dev: false
 
-  /type/2.7.2:
+  /type@2.7.2:
     resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==}
     dev: false
 
-  /typedarray-to-buffer/3.1.5:
+  /typedarray-to-buffer@3.1.5:
     resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
     dependencies:
       is-typedarray: 1.0.0
     dev: false
 
-  /ultron/1.1.1:
+  /typescript@5.3.2:
+    resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==}
+    engines: {node: '>=14.17'}
+    hasBin: true
+    dev: true
+
+  /ultron@1.1.1:
     resolution: {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==}
     dev: false
 
-  /universalify/0.1.2:
+  /universalify@0.1.2:
     resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
     engines: {node: '>= 4.0.0'}
     dev: false
 
-  /unpipe/1.0.0:
+  /unpipe@1.0.0:
     resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
     engines: {node: '>= 0.8'}
     dev: false
 
-  /uri-js/4.4.1:
+  /uri-js@4.4.1:
     resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
     dependencies:
       punycode: 2.3.0
 
-  /url-set-query/1.0.0:
+  /urijs@1.19.11:
+    resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==}
+    dev: false
+
+  /url-set-query@1.0.0:
     resolution: {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==}
     dev: false
 
-  /utf-8-validate/5.0.10:
+  /utf-8-validate@5.0.10:
     resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==}
     engines: {node: '>=6.14.2'}
     requiresBuild: true
@@ -3607,15 +3802,15 @@ packages:
       node-gyp-build: 4.6.1
     dev: false
 
-  /utf8/3.0.0:
+  /utf8@3.0.0:
     resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==}
     dev: false
 
-  /util-deprecate/1.0.2:
+  /util-deprecate@1.0.2:
     resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
     dev: false
 
-  /util/0.12.5:
+  /util@0.12.5:
     resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==}
     dependencies:
       inherits: 2.0.4
@@ -3625,42 +3820,47 @@ packages:
       which-typed-array: 1.1.11
     dev: false
 
-  /utils-merge/1.0.1:
+  /utility-types@3.10.0:
+    resolution: {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==}
+    engines: {node: '>= 4'}
+    dev: false
+
+  /utils-merge@1.0.1:
     resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
     engines: {node: '>= 0.4.0'}
     dev: false
 
-  /uuid/3.4.0:
+  /uuid@3.4.0:
     resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==}
     deprecated: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.
     hasBin: true
     dev: false
 
-  /uuid/8.3.2:
+  /uuid@8.3.2:
     resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
     hasBin: true
     dev: false
 
-  /uuid/9.0.1:
+  /uuid@9.0.1:
     resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
     hasBin: true
     dev: false
 
-  /validator/13.11.0:
+  /validator@13.11.0:
     resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==}
     engines: {node: '>= 0.10'}
     dev: false
 
-  /varint/5.0.2:
+  /varint@5.0.2:
     resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==}
     dev: false
 
-  /vary/1.1.2:
+  /vary@1.1.2:
     resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
     engines: {node: '>= 0.8'}
     dev: false
 
-  /verror/1.10.0:
+  /verror@1.10.0:
     resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==}
     engines: {'0': node >=0.6.0}
     dependencies:
@@ -3669,7 +3869,7 @@ packages:
       extsprintf: 1.3.0
     dev: false
 
-  /web3-bzz/1.9.0:
+  /web3-bzz@1.9.0:
     resolution: {integrity: sha512-9Zli9dikX8GdHwBb5/WPzpSVuy3EWMKY3P4EokCQra31fD7DLizqAAaTUsFwnK7xYkw5ogpHgelw9uKHHzNajg==}
     engines: {node: '>=8.0.0'}
     requiresBuild: true
@@ -3683,7 +3883,7 @@ packages:
       - utf-8-validate
     dev: false
 
-  /web3-core-helpers/1.9.0:
+  /web3-core-helpers@1.9.0:
     resolution: {integrity: sha512-NeJzylAp9Yj9xAt2uTT+kyug3X0DLnfBdnAcGZuY6HhoNPDIfQRA9CkJjLngVRlGTLZGjNp9x9eR+RyZQgUlXg==}
     engines: {node: '>=8.0.0'}
     dependencies:
@@ -3691,7 +3891,7 @@ packages:
       web3-utils: 1.9.0
     dev: false
 
-  /web3-core-method/1.9.0:
+  /web3-core-method@1.9.0:
     resolution: {integrity: sha512-sswbNsY2xRBBhGeaLt9c/eDc+0yDDhi6keUBAkgIRa9ueSx/VKzUY9HMqiV6bXDcGT2fJyejq74FfEB4lc/+/w==}
     engines: {node: '>=8.0.0'}
     dependencies:
@@ -3702,14 +3902,14 @@ packages:
       web3-utils: 1.9.0
     dev: false
 
-  /web3-core-promievent/1.9.0:
+  /web3-core-promievent@1.9.0:
     resolution: {integrity: sha512-PHG1Mn23IGwMZhnPDN8dETKypqsFbHfiyRqP+XsVMPmTHkVfzDQTCBU/c2r6hUktBDoGKut5xZQpGfhFk71KbQ==}
     engines: {node: '>=8.0.0'}
     dependencies:
       eventemitter3: 4.0.4
     dev: false
 
-  /web3-core-requestmanager/1.9.0:
+  /web3-core-requestmanager@1.9.0:
     resolution: {integrity: sha512-hcJ5PCtTIJpj+8qWxoseqlCovDo94JJjTX7dZOLXgwp8ah7E3WRYozhGyZocerx+KebKyg1mCQIhkDpMwjfo9Q==}
     engines: {node: '>=8.0.0'}
     dependencies:
@@ -3723,7 +3923,7 @@ packages:
       - supports-color
     dev: false
 
-  /web3-core-subscriptions/1.9.0:
+  /web3-core-subscriptions@1.9.0:
     resolution: {integrity: sha512-MaIo29yz7hTV8X8bioclPDbHFOVuHmnbMv+D3PDH12ceJFJAXGyW8GL5KU1DYyWIj4TD1HM4WknyVA/YWBiiLA==}
     engines: {node: '>=8.0.0'}
     dependencies:
@@ -3731,7 +3931,7 @@ packages:
       web3-core-helpers: 1.9.0
     dev: false
 
-  /web3-core/1.9.0:
+  /web3-core@1.9.0:
     resolution: {integrity: sha512-DZ+TPmq/ZLlx4LSVzFgrHCP/QFpKDbGWO4HoquZSdu24cjk5SZ+FEU1SZB2OaK3/bgBh+25mRbmv8y56ysUu1w==}
     engines: {node: '>=8.0.0'}
     dependencies:
@@ -3747,7 +3947,7 @@ packages:
       - supports-color
     dev: false
 
-  /web3-eth-abi/1.9.0:
+  /web3-eth-abi@1.9.0:
     resolution: {integrity: sha512-0BLQ3FKMrzJkA930jOX3fMaybAyubk06HChclLpiR0NWmgWXm1tmBrJdkyRy2ZTZpmfuZc9xTFRfl0yZID1voA==}
     engines: {node: '>=8.0.0'}
     dependencies:
@@ -3755,7 +3955,7 @@ packages:
       web3-utils: 1.9.0
     dev: false
 
-  /web3-eth-accounts/1.9.0:
+  /web3-eth-accounts@1.9.0:
     resolution: {integrity: sha512-VeIZVevmnSll0AC1k5F/y398ZE89d1SRuYk8IewLUhL/tVAsFEsjl2SGgm0+aDcHmgPrkW+qsCJ+C7rWg/N4ZA==}
     engines: {node: '>=8.0.0'}
     dependencies:
@@ -3774,7 +3974,7 @@ packages:
       - supports-color
     dev: false
 
-  /web3-eth-contract/1.9.0:
+  /web3-eth-contract@1.9.0:
     resolution: {integrity: sha512-+j26hpSaEtAdUed0TN5rnc+YZOcjPxMjFX4ZBKatvFkImdbVv/tzTvcHlltubSpgb2ZLyZ89lSL6phKYwd2zNQ==}
     engines: {node: '>=8.0.0'}
     dependencies:
@@ -3791,7 +3991,7 @@ packages:
       - supports-color
     dev: false
 
-  /web3-eth-ens/1.9.0:
+  /web3-eth-ens@1.9.0:
     resolution: {integrity: sha512-LOJZeN+AGe9arhuExnrPPFYQr4WSxXEkpvYIlst/joOEUNLDwfndHnJIK6PI5mXaYSROBtTx6erv+HupzGo7vA==}
     engines: {node: '>=8.0.0'}
     dependencies:
@@ -3808,7 +4008,7 @@ packages:
       - supports-color
     dev: false
 
-  /web3-eth-iban/1.9.0:
+  /web3-eth-iban@1.9.0:
     resolution: {integrity: sha512-jPAm77PuEs1kE/UrrBFJdPD2PN42pwfXA0gFuuw35bZezhskYML9W4QCxcqnUtceyEA4FUn7K2qTMuCk+23fog==}
     engines: {node: '>=8.0.0'}
     dependencies:
@@ -3816,7 +4016,7 @@ packages:
       web3-utils: 1.9.0
     dev: false
 
-  /web3-eth-personal/1.9.0:
+  /web3-eth-personal@1.9.0:
     resolution: {integrity: sha512-r9Ldo/luBqJlv1vCUEQnUS+C3a3ZdbYxVHyfDkj6RWMyCqqo8JE41HWE+pfa0RmB1xnGL2g8TbYcHcqItck/qg==}
     engines: {node: '>=8.0.0'}
     dependencies:
@@ -3831,7 +4031,7 @@ packages:
       - supports-color
     dev: false
 
-  /web3-eth/1.9.0:
+  /web3-eth@1.9.0:
     resolution: {integrity: sha512-c5gSWk9bLNr6VPATHmZ1n7LTIefIZQnJMzfnvkoBcIFGKJbGmsuRhv6lEXsKdAO/FlqYnSbaw3fOq1fVFiIOFQ==}
     engines: {node: '>=8.0.0'}
     dependencies:
@@ -3852,7 +4052,7 @@ packages:
       - supports-color
     dev: false
 
-  /web3-net/1.9.0:
+  /web3-net@1.9.0:
     resolution: {integrity: sha512-L+fDZFgrLM5Y15aonl2q6L+RvfaImAngmC0Jv45hV2FJ5IfRT0/2ob9etxZmvEBWvOpbqSvghfOhJIT3XZ37Pg==}
     engines: {node: '>=8.0.0'}
     dependencies:
@@ -3864,7 +4064,7 @@ packages:
       - supports-color
     dev: false
 
-  /web3-providers-http/1.9.0:
+  /web3-providers-http@1.9.0:
     resolution: {integrity: sha512-5+dMNDAE0rRFz6SJpfnBqlVi2J5bB/Ivr2SanMt2YUrkxW5t8betZbzVwRkTbwtUvkqgj3xeUQzqpOttiv+IqQ==}
     engines: {node: '>=8.0.0'}
     dependencies:
@@ -3876,7 +4076,7 @@ packages:
       - encoding
     dev: false
 
-  /web3-providers-ipc/1.9.0:
+  /web3-providers-ipc@1.9.0:
     resolution: {integrity: sha512-cPXU93Du40HCylvjaa5x62DbnGqH+86HpK/+kMcFIzF6sDUBhKpag2tSbYhGbj7GMpfkmDTUiiMLdWnFV6+uBA==}
     engines: {node: '>=8.0.0'}
     dependencies:
@@ -3884,7 +4084,7 @@ packages:
       web3-core-helpers: 1.9.0
     dev: false
 
-  /web3-providers-ws/1.9.0:
+  /web3-providers-ws@1.9.0:
     resolution: {integrity: sha512-JRVsnQZ7j2k1a2yzBNHe39xqk1ijOv01dfIBFw52VeEkSRzvrOcsPIM/ttSyBuJqt70ntMxXY0ekCrqfleKH/w==}
     engines: {node: '>=8.0.0'}
     dependencies:
@@ -3895,7 +4095,7 @@ packages:
       - supports-color
     dev: false
 
-  /web3-shh/1.9.0:
+  /web3-shh@1.9.0:
     resolution: {integrity: sha512-bIBZlralgz4ICCrwkefB2nPPJWfx28NuHIpjB7d9ADKynElubQuqudYhKtSEkKXACuME/BJm0pIFJcJs/gDnMg==}
     engines: {node: '>=8.0.0'}
     requiresBuild: true
@@ -3909,7 +4109,7 @@ packages:
       - supports-color
     dev: false
 
-  /web3-utils/1.9.0:
+  /web3-utils@1.9.0:
     resolution: {integrity: sha512-p++69rCNNfu2jM9n5+VD/g26l+qkEOQ1m6cfRQCbH8ZRrtquTmrirJMgTmyOoax5a5XRYOuws14aypCOs51pdQ==}
     engines: {node: '>=8.0.0'}
     dependencies:
@@ -3922,7 +4122,7 @@ packages:
       utf8: 3.0.0
     dev: false
 
-  /web3/1.9.0:
+  /web3@1.9.0:
     resolution: {integrity: sha512-E9IvVy/d2ozfQQsCiV+zh/LmlZGv9fQxI0UedDVjm87yOKf4AYbBNEn1iWtHveiGzAk2CEMZMUzAZzaQNSSYog==}
     engines: {node: '>=8.0.0'}
     requiresBuild: true
@@ -3941,11 +4141,11 @@ packages:
       - utf-8-validate
     dev: false
 
-  /webidl-conversions/3.0.1:
+  /webidl-conversions@3.0.1:
     resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
     dev: false
 
-  /websocket/1.0.34:
+  /websocket@1.0.34:
     resolution: {integrity: sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==}
     engines: {node: '>=4.0.0'}
     dependencies:
@@ -3959,14 +4159,14 @@ packages:
       - supports-color
     dev: false
 
-  /whatwg-url/5.0.0:
+  /whatwg-url@5.0.0:
     resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
     dependencies:
       tr46: 0.0.3
       webidl-conversions: 3.0.1
     dev: false
 
-  /which-typed-array/1.1.11:
+  /which-typed-array@1.1.11:
     resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==}
     engines: {node: '>= 0.4'}
     dependencies:
@@ -3977,7 +4177,7 @@ packages:
       has-tostringtag: 1.0.0
     dev: false
 
-  /which/2.0.2:
+  /which@2.0.2:
     resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
     engines: {node: '>= 8'}
     hasBin: true
@@ -3985,10 +4185,10 @@ packages:
       isexe: 2.0.0
     dev: true
 
-  /wrappy/1.0.2:
+  /wrappy@1.0.2:
     resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
 
-  /ws/3.3.3:
+  /ws@3.3.3:
     resolution: {integrity: sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==}
     peerDependencies:
       bufferutil: ^4.0.1
@@ -4004,7 +4204,7 @@ packages:
       ultron: 1.1.1
     dev: false
 
-  /ws/7.4.6:
+  /ws@7.4.6:
     resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==}
     engines: {node: '>=8.3.0'}
     peerDependencies:
@@ -4017,7 +4217,7 @@ packages:
         optional: true
     dev: false
 
-  /ws/7.5.9:
+  /ws@7.5.9:
     resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==}
     engines: {node: '>=8.3.0'}
     peerDependencies:
@@ -4030,7 +4230,7 @@ packages:
         optional: true
     dev: false
 
-  /ws/8.14.1_3cxu5zja4e2r5wmvge7mdcljwq:
+  /ws@8.14.1(bufferutil@4.0.7)(utf-8-validate@5.0.10):
     resolution: {integrity: sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==}
     engines: {node: '>=10.0.0'}
     peerDependencies:
@@ -4046,13 +4246,13 @@ packages:
       utf-8-validate: 5.0.10
     dev: false
 
-  /xhr-request-promise/0.1.3:
+  /xhr-request-promise@0.1.3:
     resolution: {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==}
     dependencies:
       xhr-request: 1.1.0
     dev: false
 
-  /xhr-request/1.1.0:
+  /xhr-request@1.1.0:
     resolution: {integrity: sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==}
     dependencies:
       buffer-to-arraybuffer: 0.0.5
@@ -4064,7 +4264,7 @@ packages:
       xhr: 2.6.0
     dev: false
 
-  /xhr/2.6.0:
+  /xhr@2.6.0:
     resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==}
     dependencies:
       global: 4.4.0
@@ -4073,25 +4273,25 @@ packages:
       xtend: 4.0.2
     dev: false
 
-  /xtend/4.0.2:
+  /xtend@4.0.2:
     resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
     engines: {node: '>=0.4'}
     dev: false
 
-  /yaeti/0.0.6:
+  /yaeti@0.0.6:
     resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==}
     engines: {node: '>=0.10.32'}
     dev: false
 
-  /yallist/3.1.1:
+  /yallist@3.1.1:
     resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
     dev: false
 
-  /yallist/4.0.0:
+  /yallist@4.0.0:
     resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
     dev: true
 
-  /yocto-queue/0.1.0:
+  /yocto-queue@0.1.0:
     resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
     engines: {node: '>=10'}
     dev: true
@@ -4099,21 +4299,24 @@ packages:
   file:..:
     resolution: {directory: .., type: directory}
     name: '@allbridge/bridge-core-sdk'
-    version: 0.0.0-development
     engines: {node: ^18.7.0 || >= 16, npm: ^8.16.0 || >= 8}
     dependencies:
       '@jup-ag/api': 4.0.0
       '@project-serum/anchor': 0.25.0
-      '@solana/spl-token': 0.3.8_@solana+web3.js@1.78.5
+      '@solana/spl-token': 0.3.8(@solana/web3.js@1.78.5)
       '@solana/web3.js': 1.78.5
+      '@stellar/freighter-api': 1.7.1
       '@types/big.js': 6.2.0
       assert: 2.1.0
       axios: 1.5.0
+      base32.js: 0.1.0
       big.js: 6.2.1
       bn.js: 5.2.1
       erc-20-abi: 1.0.0
       querystring: 0.2.1
       randombytes: 2.1.0
+      soroban-client: 1.0.0-beta.4
+      stellar-sdk: 10.4.1
       timed-cache: 2.0.0
       tronweb: 4.4.0
       web3: 1.9.0
diff --git a/examples/src/examples/bridge/srb/srb-send-full-example.ts b/examples/src/examples/bridge/srb/srb-send-full-example.ts
new file mode 100644
index 00000000..0206f5f4
--- /dev/null
+++ b/examples/src/examples/bridge/srb/srb-send-full-example.ts
@@ -0,0 +1,88 @@
+import Big from "big.js";
+import {
+  AllbridgeCoreSdk,
+  ChainSymbol,
+  mainnet,
+  Messenger,
+  nodeUrlsDefault,
+  SendParams,
+} from "@allbridge/bridge-core-sdk";
+import * as SorobanClient from "soroban-client";
+import { SorobanRpc, TransactionBuilder } from "soroban-client";
+import { Keypair as StellarKeypair, TransactionBuilder as StellarTransactionBuilder } from "stellar-sdk";
+import { ensure } from "../../../utils/utils";
+import { getEnvVar } from "../../../utils/env";
+
+const fromAddress = getEnvVar("SRB_ACCOUNT_ADDRESS");
+const privateKey = getEnvVar("SRB_PRIVATE_KEY");
+const toAddress = getEnvVar("ETH_ACCOUNT_ADDRESS");
+
+const main = async () => {
+  const sdk = new AllbridgeCoreSdk(nodeUrlsDefault);
+
+  const chainDetailsMap = await sdk.chainDetailsMap();
+  const sourceToken = ensure(chainDetailsMap[ChainSymbol.SRB].tokens.find((t) => t.symbol == "USDC"));
+  const destinationToken = ensure(chainDetailsMap[ChainSymbol.ETH].tokens.find((t) => t.symbol == "USDC"));
+
+  const amount = "1";
+  const sendParams: SendParams = {
+    amount,
+    fromAccountAddress: fromAddress,
+    toAccountAddress: toAddress,
+    sourceToken,
+    destinationToken,
+    messenger: Messenger.ALLBRIDGE,
+  };
+  const xdrTx: string = (await sdk.bridge.rawTxBuilder.send(sendParams)) as string;
+
+  //SignTx
+  const srbKeypair = SorobanClient.Keypair.fromSecret(privateKey);
+  const transaction = TransactionBuilder.fromXDR(xdrTx, mainnet.sorobanNetworkPassphrase);
+  transaction.sign(srbKeypair);
+  const signedTx = transaction.toXDR();
+  //
+
+  const sent = await sdk.utils.srb.sendTransactionSoroban(signedTx);
+  const confirm = await sdk.utils.srb.confirmTx(sent.hash);
+  if (confirm.status === SorobanRpc.GetTransactionStatus.NOT_FOUND) {
+    console.log(
+      `Waited for transaction to complete, but it did not. ` +
+        `Check the transaction status manually. ` +
+        `Hash: ${sent.hash}`
+    );
+  } else if (confirm.status === SorobanRpc.GetTransactionStatus.FAILED) {
+    console.log(`Transaction failed. Check the transaction manually.` + `Hash: ${sent.hash}`);
+  } else {
+    console.log(`Transaction Confirmed. Hash: ${sent.hash}`);
+  }
+
+  //TrustLine check and Set up for destinationToken if it is SRB
+  const destinationTokenSBR = sourceToken; // simulate destination is srb
+  const toAddressSBR = fromAddress; // simulate destination is srb
+  const balanceLine = await sdk.utils.srb.getBalanceLine(toAddressSBR, destinationTokenSBR.tokenAddress);
+  console.log(`BalanceLine:`, balanceLine);
+  if (!balanceLine || Big(balanceLine.balance).add(amount).gt(Big(balanceLine.limit))) {
+    const xdrTx = await sdk.utils.srb.buildChangeTrustLineXdrTx({
+      sender: toAddressSBR,
+      tokenAddress: destinationTokenSBR.tokenAddress,
+    });
+
+    //SignTx
+    const transaction = StellarTransactionBuilder.fromXDR(xdrTx, mainnet.sorobanNetworkPassphrase);
+    const keypair = StellarKeypair.fromSecret(privateKey);
+    transaction.sign(keypair);
+    const signedTrustLineTx = transaction.toXDR();
+    //
+
+    const submit = await sdk.utils.srb.submitTransactionStellar(signedTrustLineTx);
+    console.log("Submitted change trust tx. Hash:", submit.hash);
+  }
+};
+
+main()
+  .then(() => {
+    console.log("Done");
+  })
+  .catch((e) => {
+    console.error(e);
+  });
diff --git a/package.json b/package.json
index 770513e0..682d8beb 100644
--- a/package.json
+++ b/package.json
@@ -48,7 +48,6 @@
   },
   "keywords": [],
   "devDependencies": {
-    "@esbuild-plugins/node-modules-polyfill": "^0.1.4",
     "@ryansonshine/commitizen": "^4.2.8",
     "@ryansonshine/cz-conventional-changelog": "^3.3.4",
     "@semantic-release/changelog": "^6.0.3",
@@ -70,6 +69,7 @@
     "dotenv": "^16.3.1",
     "esbuild": "^0.15.18",
     "esbuild-plugin-copy": "^1.6.0",
+    "esbuild-plugin-polyfill-node": "^0.3.0",
     "eslint": "^8.49.0",
     "eslint-config-prettier": "^8.10.0",
     "eslint-import-resolver-typescript": "^3.6.0",
@@ -104,6 +104,8 @@
     "erc-20-abi": "^1.0.0",
     "querystring": "^0.2.1",
     "randombytes": "^2.1.0",
+    "soroban-client": "1.0.0-beta.4",
+    "stellar-sdk": "^10.4.1",
     "timed-cache": "^2.0.0",
     "tronweb": "^4.4.0",
     "web3": "1.9.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 975d3d40..90290b63 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -41,6 +41,12 @@ dependencies:
   randombytes:
     specifier: ^2.1.0
     version: 2.1.0
+  soroban-client:
+    specifier: 1.0.0-beta.4
+    version: 1.0.0-beta.4
+  stellar-sdk:
+    specifier: ^10.4.1
+    version: 10.4.1
   timed-cache:
     specifier: ^2.0.0
     version: 2.0.0
@@ -61,9 +67,6 @@ dependencies:
     version: 1.9.0
 
 devDependencies:
-  '@esbuild-plugins/node-modules-polyfill':
-    specifier: ^0.1.4
-    version: 0.1.4(esbuild@0.15.18)
   '@ryansonshine/commitizen':
     specifier: ^4.2.8
     version: 4.2.8
@@ -127,6 +130,9 @@ devDependencies:
   esbuild-plugin-copy:
     specifier: ^1.6.0
     version: 1.6.0(esbuild@0.15.18)
+  esbuild-plugin-polyfill-node:
+    specifier: ^0.3.0
+    version: 0.3.0(esbuild@0.15.18)
   eslint:
     specifier: ^8.49.0
     version: 8.49.0
@@ -887,16 +893,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild-plugins/node-modules-polyfill@0.1.4(esbuild@0.15.18):
-    resolution: {integrity: sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==}
-    peerDependencies:
-      esbuild: '*'
-    dependencies:
-      esbuild: 0.15.18
-      escape-string-regexp: 4.0.0
-      rollup-plugin-node-polyfills: 0.2.1
-    dev: true
-
   /@esbuild/android-arm@0.15.18:
     resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==}
     engines: {node: '>=12'}
@@ -1570,6 +1566,10 @@ packages:
     dev: true
     optional: true
 
+  /@jspm/core@2.0.1:
+    resolution: {integrity: sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==}
+    dev: true
+
   /@noble/curves@1.2.0:
     resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==}
     dependencies:
@@ -2118,6 +2118,10 @@ packages:
       '@types/node': 18.17.15
     dev: false
 
+  /@types/eventsource@1.1.15:
+    resolution: {integrity: sha512-XQmGcbnxUNa06HR3VBVkc9+A2Vpi9ZyLJcdS5dwaQQ/4ZMWFO+5c90FnMUpbtMZwB/FChoYHwuVg8TvkECacTA==}
+    dev: false
+
   /@types/graceful-fs@4.1.6:
     resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==}
     dependencies:
@@ -2211,7 +2215,6 @@ packages:
     resolution: {integrity: sha512-bz8PhAVlwN72vqefzxa14DKNT8jK/mV66CSjwdVQM/k3Th3EPKfUtdMniwZgMedQTFuywAsfjnZsg+pEnltaMA==}
     dependencies:
       '@types/node': 18.17.15
-    dev: true
 
   /@types/responselike@1.0.0:
     resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
@@ -2237,6 +2240,10 @@ packages:
     resolution: {integrity: sha512-3/M7WspJkAXRMxQvq2bm2hEgNohiQhCZZplfYOBBeBdh0dJQ8cpLOaplb4x2znmmUegTgEfaP8C7tDbgwqBOhQ==}
     dev: true
 
+  /@types/urijs@1.19.25:
+    resolution: {integrity: sha512-XOfUup9r3Y06nFAZh3WvO0rBU4OtlfPB/vgxpjg+NRdGU6CN6djdc6OEiH+PcqHCY6eFLo9Ista73uarf4gnBg==}
+    dev: false
+
   /@types/ws@7.4.7:
     resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==}
     dependencies:
@@ -2703,6 +2710,14 @@ packages:
     resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==}
     dev: false
 
+  /axios@0.25.0:
+    resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==}
+    dependencies:
+      follow-redirects: 1.15.2
+    transitivePeerDependencies:
+      - debug
+    dev: false
+
   /axios@0.26.1:
     resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==}
     dependencies:
@@ -2721,6 +2736,16 @@ packages:
       - debug
     dev: false
 
+  /axios@1.6.2:
+    resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==}
+    dependencies:
+      follow-redirects: 1.15.2
+      form-data: 4.0.0
+      proxy-from-env: 1.1.0
+    transitivePeerDependencies:
+      - debug
+    dev: false
+
   /babel-jest@29.7.0(@babel/core@7.22.17):
     resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -2841,6 +2866,10 @@ packages:
       bindings: 1.5.0
     dev: false
 
+  /bignumber.js@4.1.0:
+    resolution: {integrity: sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==}
+    dev: false
+
   /bignumber.js@9.1.2:
     resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==}
     dev: false
@@ -3579,6 +3608,12 @@ packages:
     hasBin: true
     dev: false
 
+  /crc@3.8.0:
+    resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==}
+    dependencies:
+      buffer: 5.7.1
+    dev: false
+
   /create-hash@1.2.0:
     resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==}
     dependencies:
@@ -3959,6 +3994,10 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
+  /detect-node@2.1.0:
+    resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
+    dev: false
+
   /diff-sequences@29.6.3:
     resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -4358,6 +4397,16 @@ packages:
       globby: 11.1.0
     dev: true
 
+  /esbuild-plugin-polyfill-node@0.3.0(esbuild@0.15.18):
+    resolution: {integrity: sha512-SHG6CKUfWfYyYXGpW143NEZtcVVn8S/WHcEOxk62LuDXnY4Zpmc+WmxJKN6GMTgTClXJXhEM5KQlxKY6YjbucQ==}
+    peerDependencies:
+      esbuild: '*'
+    dependencies:
+      '@jspm/core': 2.0.1
+      esbuild: 0.15.18
+      import-meta-resolve: 3.1.1
+    dev: true
+
   /esbuild-sunos-64@0.15.18:
     resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==}
     engines: {node: '>=12'}
@@ -4706,10 +4755,6 @@ packages:
     engines: {node: '>=4.0'}
     dev: true
 
-  /estree-walker@0.6.1:
-    resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==}
-    dev: true
-
   /esutils@2.0.3:
     resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
     engines: {node: '>=0.10.0'}
@@ -4845,6 +4890,11 @@ packages:
     resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
     dev: false
 
+  /eventsource@1.1.2:
+    resolution: {integrity: sha512-xAH3zWhgO2/3KIniEKYPr8plNSzlGINOUqYj0m0u7AB81iRw8b/3E73W6AuU+6klLbaSFmZnaETQ2lXPfAydrA==}
+    engines: {node: '>=0.12.0'}
+    dev: false
+
   /evp_bytestokey@1.0.3:
     resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==}
     dependencies:
@@ -5793,6 +5843,10 @@ packages:
     resolution: {integrity: sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==}
     dev: true
 
+  /import-meta-resolve@3.1.1:
+    resolution: {integrity: sha512-qeywsE/KC3w9Fd2ORrRDUw6nS/nLwZpXgfrOc2IILvZYnCaEMd+D56Vfg9k4G29gIeVi3XKql1RQatME8iYsiw==}
+    dev: true
+
   /imurmurhash@0.1.4:
     resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
     engines: {node: '>=0.8.19'}
@@ -6678,6 +6732,18 @@ packages:
     resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
     dev: true
 
+  /js-xdr@1.3.0:
+    resolution: {integrity: sha512-fjLTm2uBtFvWsE3l2J14VjTuuB8vJfeTtYuNS7LiLHDWIX2kt0l1pqq9334F8kODUkKPMuULjEcbGbkFFwhx5g==}
+    deprecated: ⚠️ This package has moved to @stellar/js-xdr! 🚚
+    dependencies:
+      lodash: 4.17.21
+      long: 2.4.0
+    dev: false
+
+  /js-xdr@3.0.1:
+    resolution: {integrity: sha512-U+myFf2xdgeXsCE4iKwt/j14BLvU0F/YZv9LJwJrQgqtKKwyetYP7LwJKbc9qUYYAsa6ixy57CrDMtg2x+01cA==}
+    dev: false
+
   /js-yaml@3.14.1:
     resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
     hasBin: true
@@ -6933,6 +6999,11 @@ packages:
       is-unicode-supported: 0.1.0
     dev: true
 
+  /long@2.4.0:
+    resolution: {integrity: sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ==}
+    engines: {node: '>=0.6'}
+    dev: false
+
   /longest@2.0.1:
     resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==}
     engines: {node: '>=0.10.0'}
@@ -6976,12 +7047,6 @@ packages:
     resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==}
     dev: true
 
-  /magic-string@0.25.9:
-    resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
-    dependencies:
-      sourcemap-codec: 1.4.8
-    dev: true
-
   /make-dir@3.1.0:
     resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
     engines: {node: '>=8'}
@@ -8435,27 +8500,6 @@ packages:
       bn.js: 5.2.1
     dev: false
 
-  /rollup-plugin-inject@3.0.2:
-    resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==}
-    deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.
-    dependencies:
-      estree-walker: 0.6.1
-      magic-string: 0.25.9
-      rollup-pluginutils: 2.8.2
-    dev: true
-
-  /rollup-plugin-node-polyfills@0.2.1:
-    resolution: {integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==}
-    dependencies:
-      rollup-plugin-inject: 3.0.2
-    dev: true
-
-  /rollup-pluginutils@2.8.2:
-    resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==}
-    dependencies:
-      estree-walker: 0.6.1
-    dev: true
-
   /rpc-websockets@7.6.0:
     resolution: {integrity: sha512-Jgcs8q6t8Go98dEulww1x7RysgTkzpCMelVxZW4hvuyFtOGpeUz9prpr2KjUa/usqxgFCd9Tu3+yhHEP9GVmiQ==}
     dependencies:
@@ -8733,6 +8777,34 @@ packages:
       tslib: 2.6.2
     dev: false
 
+  /sodium-native@3.4.1:
+    resolution: {integrity: sha512-PaNN/roiFWzVVTL6OqjzYct38NSXewdl2wz8SRB51Br/MLIJPrbM3XexhVWkq7D3UWMysfrhKVf1v1phZq6MeQ==}
+    requiresBuild: true
+    dependencies:
+      node-gyp-build: 4.6.1
+    dev: false
+    optional: true
+
+  /sodium-native@4.0.4:
+    resolution: {integrity: sha512-faqOKw4WQKK7r/ybn6Lqo1F9+L5T6NlBJJYvpxbZPetpWylUVqz449mvlwIBKBqxEHbWakWuOlUt8J3Qpc4sWw==}
+    requiresBuild: true
+    dependencies:
+      node-gyp-build: 4.6.1
+    dev: false
+    optional: true
+
+  /soroban-client@1.0.0-beta.4:
+    resolution: {integrity: sha512-M1jLCwQtWZkQIJ6U72nYpvj+giYnB2/Vw4E1DBaiCgg5iWIWatDto+QTI/aUR9m7fNGTt/AhFtQzhjksK1rFkQ==}
+    dependencies:
+      axios: 1.6.2
+      bignumber.js: 9.1.2
+      buffer: 6.0.3
+      stellar-base: 10.0.0-beta.4
+      urijs: 1.19.11
+    transitivePeerDependencies:
+      - debug
+    dev: false
+
   /source-map-support@0.5.13:
     resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
     dependencies:
@@ -8752,11 +8824,6 @@ packages:
     engines: {node: '>=0.10.0'}
     dev: true
 
-  /sourcemap-codec@1.4.8:
-    resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
-    deprecated: Please use @jridgewell/sourcemap-codec instead
-    dev: true
-
   /spawn-error-forwarder@1.0.0:
     resolution: {integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==}
     dev: true
@@ -8845,6 +8912,56 @@ packages:
     engines: {node: '>= 0.8'}
     dev: false
 
+  /stellar-base@10.0.0-beta.4:
+    resolution: {integrity: sha512-3EXDFHSahVDMTHrHiFOO8kFf5KN+AL4x5kd5rxjElElPG+385cyWDbO83GrNmDGU/u9/XiVL+riJjz5gQTv6RQ==}
+    dependencies:
+      base32.js: 0.1.0
+      bignumber.js: 9.1.2
+      buffer: 6.0.3
+      js-xdr: 3.0.1
+      sha.js: 2.4.11
+      tweetnacl: 1.0.3
+    optionalDependencies:
+      sodium-native: 4.0.4
+    dev: false
+
+  /stellar-base@8.2.2:
+    resolution: {integrity: sha512-YVCIuJXU1bPn+vU0ded+g0D99DcpYXH9CEXfpYEDc4Gf04h65YjOVhGojQBm1hqVHq3rKT7m1tgfNACkU84FTA==}
+    dependencies:
+      base32.js: 0.1.0
+      bignumber.js: 4.1.0
+      crc: 3.8.0
+      js-xdr: 1.3.0
+      lodash: 4.17.21
+      sha.js: 2.4.11
+      tweetnacl: 1.0.3
+    optionalDependencies:
+      sodium-native: 3.4.1
+    dev: false
+
+  /stellar-sdk@10.4.1:
+    resolution: {integrity: sha512-Wdm2UoLuN9SNrSEHO0R/I+iZuRwUkfny1xg4akhGCpO8LQZw8QzuMTJvbEoMT3sHT4/eWYiteVLp7ND21xZf5A==}
+    dependencies:
+      '@types/eventsource': 1.1.15
+      '@types/node': 18.17.15
+      '@types/randombytes': 2.0.0
+      '@types/urijs': 1.19.25
+      axios: 0.25.0
+      bignumber.js: 4.1.0
+      detect-node: 2.1.0
+      es6-promise: 4.2.8
+      eventsource: 1.1.2
+      lodash: 4.17.21
+      randombytes: 2.1.0
+      stellar-base: 8.2.2
+      toml: 2.3.6
+      tslib: 1.14.1
+      urijs: 1.19.11
+      utility-types: 3.10.0
+    transitivePeerDependencies:
+      - debug
+    dev: false
+
   /stream-combiner2@1.1.1:
     resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==}
     dependencies:
@@ -9161,6 +9278,10 @@ packages:
     engines: {node: '>=0.6'}
     dev: false
 
+  /toml@2.3.6:
+    resolution: {integrity: sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==}
+    dev: false
+
   /toml@3.0.0:
     resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==}
     dev: false
@@ -9304,7 +9425,6 @@ packages:
 
   /tslib@1.14.1:
     resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
-    dev: true
 
   /tslib@2.6.2:
     resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
@@ -9329,6 +9449,10 @@ packages:
     resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
     dev: false
 
+  /tweetnacl@1.0.3:
+    resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==}
+    dev: false
+
   /type-check@0.4.0:
     resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
     engines: {node: '>= 0.8.0'}
@@ -9570,6 +9694,10 @@ packages:
     dependencies:
       punycode: 2.3.0
 
+  /urijs@1.19.11:
+    resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==}
+    dev: false
+
   /url-join@4.0.1:
     resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==}
     dev: true
@@ -9603,6 +9731,11 @@ packages:
       which-typed-array: 1.1.11
     dev: false
 
+  /utility-types@3.10.0:
+    resolution: {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==}
+    engines: {node: '>= 4'}
+    dev: false
+
   /utils-merge@1.0.1:
     resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
     engines: {node: '>= 0.4.0'}
diff --git a/scripts/build.ts b/scripts/build.ts
index dd9a4785..ac2ba41c 100644
--- a/scripts/build.ts
+++ b/scripts/build.ts
@@ -1,11 +1,13 @@
 import path from "path";
 import { build as esbuild, BuildOptions } from "esbuild";
+import {polyfillNode} from "esbuild-plugin-polyfill-node";
 
 const baseConfig: BuildOptions = {
   nodePaths: [path.join(__dirname, "../src")],
   sourcemap: true,
   external: [],
   bundle: true,
+  minify: true,
 };
 
 async function main() {
@@ -33,6 +35,11 @@ async function main() {
     format: "esm",
     outdir: path.join(__dirname, "../dist/browser"),
     entryPoints: [path.join(__dirname, "../src/index.ts")],
+    plugins: [
+      polyfillNode({
+        // Options (optional)
+      }),
+    ],
   });
 }
 
diff --git a/src/__tests__/index.test.ts b/src/__tests__/index.test.ts
index e324df4d..8ecbc5d5 100644
--- a/src/__tests__/index.test.ts
+++ b/src/__tests__/index.test.ts
@@ -57,6 +57,7 @@ describe("SDK", () => {
     coreApiUrl: "http://localhost",
     wormholeMessengerProgramId: "wormholeMessengerProgramId",
     solanaLookUpTable: "solanaLookUpTable",
+    sorobanNetworkPassphrase: "sorobanNetworkPassphrase",
   };
   beforeEach(() => {
     sdk = new AllbridgeCoreSdk(testNodeUrls, testConfig);
diff --git a/src/__tests__/services/bridge/raw-bridge-transaction-builder.test.ts b/src/__tests__/services/bridge/raw-bridge-transaction-builder.test.ts
index 83bde9d2..a5929e6d 100644
--- a/src/__tests__/services/bridge/raw-bridge-transaction-builder.test.ts
+++ b/src/__tests__/services/bridge/raw-bridge-transaction-builder.test.ts
@@ -13,7 +13,8 @@ describe("RawTransactionBuilder", () => {
   let api: any;
   let solParams: any;
   let nodeRpcUrls: any;
-  const tokenService = new DefaultTokenService(api, nodeRpcUrls);
+  let params: any;
+  const tokenService = new DefaultTokenService(api, nodeRpcUrls, params);
 
   beforeEach(() => {
     rawTransactionBuilder = new DefaultRawBridgeTransactionBuilder(api, nodeRpcUrls, solParams, tokenService);
diff --git a/src/__tests__/services/liquidity-pool/raw-pool-transaction-builder.test.ts b/src/__tests__/services/liquidity-pool/raw-pool-transaction-builder.test.ts
index bf868ecf..ca9064f0 100644
--- a/src/__tests__/services/liquidity-pool/raw-pool-transaction-builder.test.ts
+++ b/src/__tests__/services/liquidity-pool/raw-pool-transaction-builder.test.ts
@@ -11,12 +11,12 @@ import tokenInfoWithChainDetailsGrl from "../../data/tokens-info/TokenInfoWithCh
 describe("RawTransactionBuilder", () => {
   let rawTransactionBuilder: RawPoolTransactionBuilder;
   let api: any;
-  let solParams: any;
   let nodeRpcUrls: any;
-  const tokenService = new DefaultTokenService(api, solParams);
+  let params: any;
+  const tokenService = new DefaultTokenService(api, nodeRpcUrls, params);
 
   beforeEach(() => {
-    rawTransactionBuilder = new DefaultRawPoolTransactionBuilder(api, nodeRpcUrls, tokenService);
+    rawTransactionBuilder = new DefaultRawPoolTransactionBuilder(api, nodeRpcUrls, params, tokenService);
   });
 
   test("approve should call buildRawTransactionApprove", async () => {
diff --git a/src/chains/index.ts b/src/chains/index.ts
index 42862311..50954d62 100644
--- a/src/chains/index.ts
+++ b/src/chains/index.ts
@@ -13,6 +13,11 @@ export enum ChainSymbol {
    */
   SPL = "SPL",
 
+  /**
+   * The Holešky testnet.
+   */
+  HOL = "HOL",
+
   /**
    * The BNB Smart Chain main network.
    */
@@ -57,6 +62,11 @@ export enum ChainSymbol {
    * The Soroban network.
    */
   SRB = "SRB",
+
+  /**
+   * The Stellar network.
+   */
+  STLR = "STLR",
 }
 
 export enum ChainType {
@@ -89,6 +99,12 @@ export const chainProperties: Record<string, BasicChainProperties> = {
     name: "Sepolia",
     chainType: ChainType.EVM,
   },
+  [ChainSymbol.HOL]: {
+    chainSymbol: ChainSymbol.HOL,
+    chainId: "0x4268",
+    name: "Holešky",
+    chainType: ChainType.EVM,
+  },
   [ChainSymbol.BSC]: {
     chainSymbol: ChainSymbol.BSC,
     chainId: "0x38",
@@ -140,4 +156,9 @@ export const chainProperties: Record<string, BasicChainProperties> = {
     name: "Soroban",
     chainType: ChainType.SRB,
   },
+  [ChainSymbol.STLR]: {
+    chainSymbol: ChainSymbol.STLR,
+    name: "Stellar",
+    chainType: ChainType.SRB,
+  },
 };
diff --git a/src/chains/models.ts b/src/chains/models.ts
index 307cb6a4..9120404e 100644
--- a/src/chains/models.ts
+++ b/src/chains/models.ts
@@ -1,8 +1,25 @@
 import { ChainSymbol, ChainType } from "./index";
 
+/**
+ * Contains blockchain's basic information
+ */
 export interface BasicChainProperties {
+  /**
+   * Blockchain symbol
+   */
   chainSymbol: ChainSymbol;
+  /**
+   * Common Blockchain Id</br>
+   * A 0x-prefixed hexadecimal string</br>
+   * Optional.
+   */
   chainId?: string; // A 0x-prefixed hexadecimal string
+  /**
+   * Blockchain name
+   */
   name: string;
+  /**
+   * Blockchain type
+   */
   chainType: ChainType;
 }
diff --git a/src/client/core-api/api-client-caching.ts b/src/client/core-api/api-client-caching.ts
index fcd4f4d2..999d7a14 100644
--- a/src/client/core-api/api-client-caching.ts
+++ b/src/client/core-api/api-client-caching.ts
@@ -3,6 +3,8 @@ import { ChainSymbol } from "../../chains";
 import { PoolInfoMap, PoolKeyObject } from "../../tokens-info";
 import { ApiClient, TokenInfo } from "./api-client";
 import {
+  GasBalanceResponse,
+  PendingInfoResponse,
   ReceiveTransactionCostRequest,
   ReceiveTransactionCostResponse,
   TransferStatusResponse,
@@ -13,11 +15,15 @@ const _55_SECONDS_TTL = 55 * 1000;
 
 export class ApiClientCaching implements ApiClient {
   private tokenInfoCache: Cache<Promise<TokenInfo>>;
+  private pendingInfoCache: Cache<Promise<PendingInfoResponse>>;
+  private gasBalanceCache: Cache<Promise<GasBalanceResponse>>;
   private receivedTransactionCache: Cache<ReceiveTransactionCostResponse>;
 
   constructor(private apiClient: ApiClient) {
-    this.tokenInfoCache = new Cache<Promise<TokenInfo>>({ defaultTtl: _55_SECONDS_TTL });
-    this.receivedTransactionCache = new Cache<ReceiveTransactionCostResponse>({ defaultTtl: _20_SECONDS_TTL });
+    this.tokenInfoCache = new Cache({ defaultTtl: _55_SECONDS_TTL });
+    this.receivedTransactionCache = new Cache({ defaultTtl: _20_SECONDS_TTL });
+    this.pendingInfoCache = new Cache({ defaultTtl: _20_SECONDS_TTL });
+    this.gasBalanceCache = new Cache({ defaultTtl: _20_SECONDS_TTL });
   }
 
   getTokenInfo(): Promise<TokenInfo> {
@@ -31,6 +37,28 @@ export class ApiClientCaching implements ApiClient {
     return tokenInfoPromise;
   }
 
+  async getGasBalance(chainSymbol: ChainSymbol, address: string): Promise<GasBalanceResponse> {
+    const GAS_BALANCE_CACHE_KEY = `GAS_BALANCE_${chainSymbol}_${address}`;
+    const gasBalance = this.gasBalanceCache.get(GAS_BALANCE_CACHE_KEY);
+    if (gasBalance) {
+      return gasBalance;
+    }
+    const gasBalancePromise = this.apiClient.getGasBalance(chainSymbol, address);
+    this.gasBalanceCache.put(GAS_BALANCE_CACHE_KEY, gasBalancePromise);
+    return gasBalancePromise;
+  }
+
+  async getPendingInfo(): Promise<PendingInfoResponse> {
+    const PENDING_INFO_CACHE_KEY = "PENDING_INFO_CACHE_KEY";
+    const pendingInfo = this.pendingInfoCache.get(PENDING_INFO_CACHE_KEY);
+    if (pendingInfo) {
+      return pendingInfo;
+    }
+    const pendingInfoPromise = this.apiClient.getPendingInfo();
+    this.pendingInfoCache.put(PENDING_INFO_CACHE_KEY, pendingInfoPromise);
+    return pendingInfoPromise;
+  }
+
   async getReceiveTransactionCost(args: ReceiveTransactionCostRequest): Promise<ReceiveTransactionCostResponse> {
     const RECEIVE_TX_COST_KEY = `RECEIVE_TX_COST_${args.sourceChainId}_${args.destinationChainId}_${args.messenger}`;
     const transactionCost = this.receivedTransactionCache.get(RECEIVE_TX_COST_KEY);
diff --git a/src/client/core-api/api-client.ts b/src/client/core-api/api-client.ts
index e56e319d..25d15052 100644
--- a/src/client/core-api/api-client.ts
+++ b/src/client/core-api/api-client.ts
@@ -9,6 +9,8 @@ import {
 } from "./core-api-mapper";
 import {
   ChainDetailsResponse,
+  GasBalanceResponse,
+  PendingInfoResponse,
   PoolInfoResponse,
   ReceiveTransactionCostRequest,
   ReceiveTransactionCostResponse,
@@ -23,6 +25,8 @@ export interface TokenInfo {
 
 export interface ApiClient {
   getTokenInfo(): Promise<TokenInfo>;
+  getPendingInfo(): Promise<PendingInfoResponse>;
+  getGasBalance(chainSymbol: ChainSymbol, address: string): Promise<GasBalanceResponse>;
   getTransferStatus(chainSymbol: ChainSymbol, txId: string): Promise<TransferStatusResponse>;
   getReceiveTransactionCost(args: ReceiveTransactionCostRequest): Promise<ReceiveTransactionCostResponse>;
   getPoolInfoMap(pools: PoolKeyObject[] | PoolKeyObject): Promise<PoolInfoMap>;
@@ -51,6 +55,16 @@ export class ApiClientImpl implements ApiClient {
     };
   }
 
+  async getPendingInfo(): Promise<PendingInfoResponse> {
+    const { data } = await this.api.get<PendingInfoResponse>("/pending-info");
+    return data;
+  }
+
+  async getGasBalance(chainSymbol: ChainSymbol, address: string): Promise<GasBalanceResponse> {
+    const { data } = await this.api.get<GasBalanceResponse>(`/check/${chainSymbol}/${address}`);
+    return data;
+  }
+
   async getTransferStatus(chainSymbol: ChainSymbol, txId: string): Promise<TransferStatusResponse> {
     const { data } = await this.api.get<TransferStatusResponse>(`/chain/${chainSymbol}/${txId}`);
     return data;
diff --git a/src/client/core-api/core-api.model.ts b/src/client/core-api/core-api.model.ts
index 2716a170..5d5bcdc3 100644
--- a/src/client/core-api/core-api.model.ts
+++ b/src/client/core-api/core-api.model.ts
@@ -12,6 +12,14 @@ export interface ChainDetailsDTO {
   confirmations: number;
 }
 
+export enum AddressStatus {
+  OK = "OK",
+  INVALID = "INVALID",
+  FORBIDDEN = "FORBIDDEN",
+  UNINITIALIZED = "UNINITIALIZED",
+  CONTRACT_ADDRESS = "CONTRACT_ADDRESS",
+}
+
 export interface TokenDTO {
   symbol: string;
   name: string;
@@ -72,6 +80,11 @@ export interface ReceiveTransactionCostResponse {
   sourceNativeTokenPrice: string;
 }
 
+export interface GasBalanceResponse {
+  gasBalance: string | null;
+  status: AddressStatus;
+}
+
 export interface TransferStatusResponse {
   txId: string;
 
@@ -129,6 +142,8 @@ export interface BridgeTransaction {
 
   confirmations: number;
   confirmationsNeeded: number;
+
+  isClaimable?: boolean;
 }
 
 export type PoolInfoResponse = {
@@ -136,3 +151,11 @@ export type PoolInfoResponse = {
     string: PoolInfo;
   };
 };
+
+export type PendingInfoResponse = Record<ChainSymbol, TokenPendingInfoDTO>;
+export type TokenPendingInfoDTO = Record<string, PendingInfoDTO>;
+
+export interface PendingInfoDTO {
+  pendingTxs: number;
+  totalSentAmount: string;
+}
diff --git a/src/client/core-api/core-client-pool-info-caching.ts b/src/client/core-api/core-client-pool-info-caching.ts
index 67e1f3c3..39da4357 100644
--- a/src/client/core-api/core-client-pool-info-caching.ts
+++ b/src/client/core-api/core-client-pool-info-caching.ts
@@ -3,6 +3,8 @@ import { ChainSymbol } from "../../chains";
 import { ChainDetailsMap, PoolInfo, PoolInfoMap, PoolKeyObject, TokenWithChainDetails } from "../../tokens-info";
 import { mapChainDetailsMapToPoolKeyObjects, mapPoolKeyObjectToPoolKey } from "./core-api-mapper";
 import {
+  GasBalanceResponse,
+  PendingInfoResponse,
   ReceiveTransactionCostRequest,
   ReceiveTransactionCostResponse,
   TransferStatusResponse,
@@ -34,6 +36,14 @@ export class AllbridgeCoreClientPoolInfoCaching implements AllbridgeCoreClient {
     return this.client.getReceiveTransactionCost(args);
   }
 
+  getPendingInfo(): Promise<PendingInfoResponse> {
+    return this.client.getPendingInfo();
+  }
+
+  getGasBalance(chainSymbol: ChainSymbol, address: string): Promise<GasBalanceResponse> {
+    return this.client.getGasBalance(chainSymbol, address);
+  }
+
   async getPoolInfoByKey(poolKeyObject: PoolKeyObject): Promise<PoolInfo> {
     this.poolInfoCache.putAllIfNotExists((await this.client.getChainDetailsMapAndPoolInfoMap()).poolInfoMap);
     const poolInfo = this.poolInfoCache.get(poolKeyObject);
diff --git a/src/client/core-api/index.ts b/src/client/core-api/index.ts
index ad6708e4..acd8dfc5 100644
--- a/src/client/core-api/index.ts
+++ b/src/client/core-api/index.ts
@@ -2,6 +2,8 @@ import { ChainSymbol } from "../../chains";
 import { ChainDetailsMap, PoolInfoMap, PoolKeyObject, TokenWithChainDetails } from "../../tokens-info";
 import { ApiClient } from "./api-client";
 import {
+  GasBalanceResponse,
+  PendingInfoResponse,
   ReceiveTransactionCostRequest,
   ReceiveTransactionCostResponse,
   TransferStatusResponse,
@@ -17,9 +19,13 @@ export interface AllbridgeCoreClient {
   getChainDetailsMap(): Promise<ChainDetailsMap>;
   tokens(): Promise<TokenWithChainDetails[]>;
 
+  getPendingInfo(): Promise<PendingInfoResponse>;
+
   getTransferStatus(chainSymbol: ChainSymbol, txId: string): Promise<TransferStatusResponse>;
 
   getReceiveTransactionCost(args: ReceiveTransactionCostRequest): Promise<ReceiveTransactionCostResponse>;
+
+  getGasBalance(chainSymbol: ChainSymbol, address: string): Promise<GasBalanceResponse>;
 }
 
 export class AllbridgeCoreClientImpl implements AllbridgeCoreClient {
@@ -34,6 +40,14 @@ export class AllbridgeCoreClientImpl implements AllbridgeCoreClient {
     return Object.values(map).flatMap((chainDetails) => chainDetails.tokens);
   }
 
+  async getPendingInfo(): Promise<PendingInfoResponse> {
+    return this.apiClient.getPendingInfo();
+  }
+
+  async getGasBalance(chainSymbol: ChainSymbol, address: string): Promise<GasBalanceResponse> {
+    return this.apiClient.getGasBalance(chainSymbol, address);
+  }
+
   async getChainDetailsMapAndPoolInfoMap(): Promise<{
     chainDetailsMap: ChainDetailsMap;
     poolInfoMap: PoolInfoMap;
diff --git a/src/configs/mainnet.ts b/src/configs/mainnet.ts
index 93c10617..9fd62af0 100644
--- a/src/configs/mainnet.ts
+++ b/src/configs/mainnet.ts
@@ -6,6 +6,7 @@ export const mainnet: AllbridgeCoreSdkOptions = {
   coreApiHeaders: {},
   wormholeMessengerProgramId: "worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth",
   solanaLookUpTable: "2JcBAEVnAwVo4u8d61iqgHPrzZuugur7cVTjWubsVLHj",
+  sorobanNetworkPassphrase: "Public Global Stellar Network ; September 2015",
 };
 
 /**
@@ -23,4 +24,6 @@ export const nodeUrlsDefault: NodeUrlsConfig = {
 export const nodeRpcUrlsDefault: NodeRpcUrls = {
   SOL: "https://api.mainnet-beta.solana.com",
   TRX: "https://api.trongrid.io",
+  SRB: "https://rpc.stellar.org:443",
+  STLR: "https://horizon.stellar.org",
 };
diff --git a/src/configs/testnet.ts b/src/configs/testnet.ts
index 8b028ab6..735a8d7d 100644
--- a/src/configs/testnet.ts
+++ b/src/configs/testnet.ts
@@ -6,6 +6,7 @@ export const testnet: AllbridgeCoreSdkOptions = {
   coreApiHeaders: {},
   wormholeMessengerProgramId: "3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5",
   solanaLookUpTable: "C3jAxHRTZjM2Bs7EqPir4nvrT8zKtpcW7RvGR9R2qKtN",
+  sorobanNetworkPassphrase: "Test SDF Future Network ; October 2022",
 };
 
 /**
@@ -19,4 +20,6 @@ export const testnetNodeUrlsDefault: NodeUrlsConfig = {
 export const testnetNodeRpcUrlsDefault: NodeRpcUrls = {
   SOL: "https://api.devnet.solana.com",
   TRX: "https://nile.trongrid.io",
+  SRB: "https://rpc-futurenet.stellar.org:443",
+  STLR: "https://horizon-futurenet.stellar.org",
 };
diff --git a/src/index.ts b/src/index.ts
index 32ff4636..79a2ffcb 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,49 +1,29 @@
-import { Big } from "big.js";
-import { ChainSymbol } from "./chains";
-import { AllbridgeCoreClientImpl } from "./client/core-api";
-import { ApiClientImpl } from "./client/core-api/api-client";
-import { ApiClientCaching } from "./client/core-api/api-client-caching";
-import { TransferStatusResponse } from "./client/core-api/core-api.model";
-import { AllbridgeCoreClientPoolInfoCaching } from "./client/core-api/core-client-pool-info-caching";
+import { BigSource } from "big.js";
 import { mainnet } from "./configs";
-import { CCTPDoesNotSupportedError, InsufficientPoolLiquidityError, NodeRpcUrlNotInitializedError } from "./exceptions";
 import {
   AmountFormat,
   AmountFormatted,
   AmountsAndGasFeeOptions,
+  BridgeService,
+  ChainDetailsMap,
+  ChainSymbol,
   ExtraGasMaxLimitResponse,
   GasFeeOptions,
+  GetNativeTokenBalanceParams,
   GetTokenBalanceParams,
+  LiquidityPoolService,
   Messenger,
-} from "./models";
-import { BridgeService, DefaultBridgeService } from "./services/bridge";
-import { GetNativeTokenBalanceParams } from "./services/bridge/models";
-import { SolanaBridgeParams } from "./services/bridge/sol";
-import { getExtraGasMaxLimits, getGasFeeOptions } from "./services/bridge/utils";
-import { DefaultLiquidityPoolService, LiquidityPoolService } from "./services/liquidity-pool";
-import { Provider } from "./services/models";
-import { DefaultTokenService, TokenService } from "./services/token";
-import { ChainDetailsMap, PoolInfo, PoolKeyObject, TokenWithChainDetails } from "./tokens-info";
-import { getPoolInfoByToken, validateAmountDecimals, validateAmountGtZero } from "./utils";
-import {
-  aprInPercents,
-  convertAmountPrecision,
-  convertFloatAmountToInt,
-  convertIntAmountToFloat,
-  fromSystemPrecision,
-  getFeePercent,
-  swapFromVUsd,
-  swapFromVUsdReverse,
-  swapToVUsd,
-  swapToVUsdReverse,
-} from "./utils/calculation";
-import { SYSTEM_PRECISION } from "./utils/calculation/constants";
-import { SendAmountDetails, getSendAmountDetails } from "./utils/calculation/swap-and-bridge-details";
-import {
+  PendingStatusInfoResponse,
+  PoolInfo,
+  Provider,
+  SendAmountDetails,
   SwapAndBridgeCalculationData,
-  swapAndBridgeFeeCalculation,
-  swapAndBridgeFeeCalculationReverse,
-} from "./utils/calculation/swap-and-bridge-fee-calc";
+  TokenWithChainDetails,
+  TransferStatusResponse,
+  GasBalanceResponse,
+} from "./models";
+import { AllbridgeCoreSdkService, NodeRpcUrlsConfig } from "./services";
+import { DefaultUtils, Utils } from "./utils";
 
 export * from "./configs";
 export * from "./models";
@@ -60,6 +40,7 @@ export interface AllbridgeCoreSdkOptions {
   coreApiHeaders?: Record<string, string>;
   wormholeMessengerProgramId: string;
   solanaLookUpTable: string;
+  sorobanNetworkPassphrase: string;
 }
 
 /**
@@ -71,19 +52,6 @@ export type NodeRpcUrls = {
   [key in ChainSymbol]?: string;
 };
 
-export class NodeRpcUrlsConfig {
-  constructor(private nodeRpcUrls: NodeRpcUrls) {}
-
-  getNodeRpcUrl(chainSymbol: ChainSymbol): string {
-    const nodeRpcUrl = this.nodeRpcUrls[chainSymbol];
-    if (nodeRpcUrl !== undefined) {
-      return nodeRpcUrl;
-    } else {
-      throw new NodeRpcUrlNotInitializedError(chainSymbol);
-    }
-  }
-}
-
 /**
  * @Deprecated Use {@link NodeRpcUrls}
  */
@@ -100,19 +68,13 @@ function isNodeUrlsConfig(nodeUrls: NodeUrlsConfig | NodeRpcUrls): nodeUrls is N
 }
 
 export class AllbridgeCoreSdk {
-  /**
-   * @internal
-   */
-  private readonly api: AllbridgeCoreClientPoolInfoCaching;
-  /**
-   * @internal
-   */
-  private readonly tokenService: TokenService;
-
   readonly params: AllbridgeCoreSdkOptions;
 
   bridge: BridgeService;
   pool: LiquidityPoolService;
+  utils: Utils;
+
+  private service: AllbridgeCoreSdkService;
 
   /**
    * Initializes the SDK object.
@@ -128,19 +90,10 @@ export class AllbridgeCoreSdk {
     } else {
       nodeRpcUrlsConfig = new NodeRpcUrlsConfig(nodeUrls);
     }
-
-    const apiClient = new ApiClientImpl(params);
-    const apiClientTokenInfoCaching = new ApiClientCaching(apiClient);
-    const coreClient = new AllbridgeCoreClientImpl(apiClientTokenInfoCaching);
-    this.api = new AllbridgeCoreClientPoolInfoCaching(coreClient);
-
-    const solBridgeParams: SolanaBridgeParams = {
-      wormholeMessengerProgramId: params.wormholeMessengerProgramId,
-      solanaLookUpTable: params.solanaLookUpTable,
-    };
-    this.tokenService = new DefaultTokenService(this.api, nodeRpcUrlsConfig);
-    this.bridge = new DefaultBridgeService(this.api, nodeRpcUrlsConfig, solBridgeParams, this.tokenService);
-    this.pool = new DefaultLiquidityPoolService(this.api, nodeRpcUrlsConfig, this.tokenService);
+    this.service = new AllbridgeCoreSdkService(nodeRpcUrlsConfig, params);
+    this.bridge = this.service.bridge;
+    this.pool = this.service.pool;
+    this.utils = new DefaultUtils(nodeRpcUrlsConfig, params);
     this.params = params;
   }
 
@@ -148,22 +101,21 @@ export class AllbridgeCoreSdk {
    * Returns {@link ChainDetailsMap} containing a list of supported tokens groped by chain.
    */
   async chainDetailsMap(): Promise<ChainDetailsMap> {
-    return this.api.getChainDetailsMap();
+    return this.service.chainDetailsMap();
   }
 
   /**
    * Returns a list of supported {@link TokenWithChainDetails | tokens}.
    */
   async tokens(): Promise<TokenWithChainDetails[]> {
-    return this.api.tokens();
+    return this.service.tokens();
   }
 
   /**
    * Returns a list of supported {@link TokenWithChainDetails | tokens} on the selected chain.
    */
   async tokensByChain(chainSymbol: ChainSymbol): Promise<TokenWithChainDetails[]> {
-    const map = await this.api.getChainDetailsMap();
-    return map[chainSymbol].tokens;
+    return this.service.tokensByChain(chainSymbol);
   }
 
   /**
@@ -172,7 +124,33 @@ export class AllbridgeCoreSdk {
    * @param txId
    */
   async getTransferStatus(chainSymbol: ChainSymbol, txId: string): Promise<TransferStatusResponse> {
-    return this.api.getTransferStatus(chainSymbol, txId);
+    return this.service.getTransferStatus(chainSymbol, txId);
+  }
+
+  /**
+   * Get gas balance
+   * @param chainSymbol
+   * @param address
+   */
+  async getGasBalance(chainSymbol: ChainSymbol, address: string): Promise<GasBalanceResponse> {
+    return this.service.getGasBalance(chainSymbol, address);
+  }
+
+  /**
+   * Returns information about pending transactions for the same destination chain and the amount of tokens can be received as a result of transfer considering pending transactions.
+   * @param amount the amount of tokens that will be sent
+   * @param amountFormat amount format
+   * @param sourceToken selected token transfer from
+   * @param destToken selected token transfer to
+   * @returns range of possible amount based on already pending transactions
+   */
+  async getPendingStatusInfo(
+    amount: string,
+    amountFormat: AmountFormat,
+    sourceToken: TokenWithChainDetails,
+    destToken: TokenWithChainDetails
+  ): Promise<PendingStatusInfoResponse> {
+    return this.service.getPendingStatusInfo(amount, amountFormat, sourceToken, destToken);
   }
 
   /**
@@ -182,7 +160,7 @@ export class AllbridgeCoreSdk {
    * @returns Token balance
    */
   async getTokenBalance(params: GetTokenBalanceParams, provider?: Provider): Promise<string> {
-    return this.tokenService.getTokenBalance(params, provider);
+    return this.service.getTokenBalance(params, provider);
   }
 
   /**
@@ -192,7 +170,7 @@ export class AllbridgeCoreSdk {
    * @returns Token balance
    */
   async getNativeTokenBalance(params: GetNativeTokenBalanceParams, provider?: Provider): Promise<AmountFormatted> {
-    return this.tokenService.getNativeTokenBalance(params, provider);
+    return this.service.getNativeTokenBalance(params, provider);
   }
 
   /**
@@ -204,22 +182,10 @@ export class AllbridgeCoreSdk {
    * @returns fee percent
    */
   async calculateFeePercentOnSourceChain(
-    amountFloat: number | string | Big,
+    amountFloat: BigSource,
     sourceChainToken: TokenWithChainDetails
   ): Promise<number> {
-    validateAmountGtZero(amountFloat);
-    validateAmountDecimals("amountFloat", amountFloat, sourceChainToken.decimals);
-    const amountInt = convertFloatAmountToInt(amountFloat, sourceChainToken.decimals);
-    if (amountInt.eq(0)) {
-      return 0;
-    }
-    const vUsdInSystemPrecision = swapToVUsd(
-      amountInt,
-      sourceChainToken,
-      await getPoolInfoByToken(this.api, sourceChainToken)
-    );
-    const vUsdInSourcePrecision = fromSystemPrecision(vUsdInSystemPrecision, sourceChainToken.decimals);
-    return getFeePercent(amountInt, vUsdInSourcePrecision);
+    return this.service.calculateFeePercentOnSourceChain(amountFloat, sourceChainToken);
   }
 
   /**
@@ -233,28 +199,11 @@ export class AllbridgeCoreSdk {
    * @returns fee percent
    */
   async calculateFeePercentOnDestinationChain(
-    amountFloat: number | string | Big,
+    amountFloat: BigSource,
     sourceChainToken: TokenWithChainDetails,
     destinationChainToken: TokenWithChainDetails
   ): Promise<number> {
-    validateAmountGtZero(amountFloat);
-    validateAmountDecimals("amountFloat", amountFloat, sourceChainToken.decimals);
-    const amountInt = convertFloatAmountToInt(amountFloat, sourceChainToken.decimals);
-    if (amountInt.eq(0)) {
-      return 0;
-    }
-    const vUsdInSystemPrecision = swapToVUsd(
-      amountInt,
-      sourceChainToken,
-      await getPoolInfoByToken(this.api, sourceChainToken)
-    );
-    const usd = swapFromVUsd(
-      vUsdInSystemPrecision,
-      destinationChainToken,
-      await getPoolInfoByToken(this.api, destinationChainToken)
-    );
-    const vUsdInDestinationPrecision = fromSystemPrecision(vUsdInSystemPrecision, destinationChainToken.decimals);
-    return getFeePercent(vUsdInDestinationPrecision, usd);
+    return this.service.calculateFeePercentOnDestinationChain(amountFloat, sourceChainToken, destinationChainToken);
   }
 
   /**
@@ -266,23 +215,17 @@ export class AllbridgeCoreSdk {
    * @param messenger
    */
   async getAmountToBeReceivedAndGasFeeOptions(
-    amountToSendFloat: number | string | Big,
+    amountToSendFloat: BigSource,
     sourceChainToken: TokenWithChainDetails,
     destinationChainToken: TokenWithChainDetails,
     messenger: Messenger
   ): Promise<AmountsAndGasFeeOptions> {
-    validateAmountGtZero(amountToSendFloat);
-    validateAmountDecimals("amountToSendFloat", amountToSendFloat, sourceChainToken.decimals);
-    return {
-      amountToSendFloat: Big(amountToSendFloat).toFixed(),
-      amountToBeReceivedFloat: await this.getAmountToBeReceived(
-        amountToSendFloat,
-        sourceChainToken,
-        destinationChainToken,
-        messenger
-      ),
-      gasFeeOptions: await this.getGasFeeOptions(sourceChainToken, destinationChainToken, messenger),
-    };
+    return this.service.getAmountToBeReceivedAndGasFeeOptions(
+      amountToSendFloat,
+      sourceChainToken,
+      destinationChainToken,
+      messenger
+    );
   }
 
   /**
@@ -294,23 +237,17 @@ export class AllbridgeCoreSdk {
    * @param messenger
    */
   async getAmountToSendAndGasFeeOptions(
-    amountToBeReceivedFloat: number | string | Big,
+    amountToBeReceivedFloat: BigSource,
     sourceChainToken: TokenWithChainDetails,
     destinationChainToken: TokenWithChainDetails,
     messenger: Messenger
   ): Promise<AmountsAndGasFeeOptions> {
-    validateAmountGtZero(amountToBeReceivedFloat);
-    validateAmountDecimals("amountToBeReceivedFloat", amountToBeReceivedFloat, destinationChainToken.decimals);
-    return {
-      amountToSendFloat: await this.getAmountToSend(
-        amountToBeReceivedFloat,
-        sourceChainToken,
-        destinationChainToken,
-        messenger
-      ),
-      amountToBeReceivedFloat: Big(amountToBeReceivedFloat).toFixed(),
-      gasFeeOptions: await this.getGasFeeOptions(sourceChainToken, destinationChainToken, messenger),
-    };
+    return this.service.getAmountToSendAndGasFeeOptions(
+      amountToBeReceivedFloat,
+      sourceChainToken,
+      destinationChainToken,
+      messenger
+    );
   }
 
   /**
@@ -321,7 +258,7 @@ export class AllbridgeCoreSdk {
    * @param messenger Optional. selected messenger
    */
   async getAmountToBeReceived(
-    amountToSendFloat: number | string | Big,
+    amountToSendFloat: BigSource,
     sourceChainToken: TokenWithChainDetails,
     destinationChainToken: TokenWithChainDetails,
     /**
@@ -331,33 +268,7 @@ export class AllbridgeCoreSdk {
      */
     messenger?: Messenger
   ): Promise<string> {
-    validateAmountGtZero(amountToSendFloat);
-    validateAmountDecimals("amountToSendFloat", amountToSendFloat, sourceChainToken.decimals);
-    const amountToSend = convertFloatAmountToInt(amountToSendFloat, sourceChainToken.decimals);
-
-    if (messenger && messenger == Messenger.CCTP) {
-      if (!sourceChainToken.cctpAddress || !destinationChainToken.cctpAddress || !sourceChainToken.cctpFeeShare) {
-        throw new CCTPDoesNotSupportedError("Such route does not support CCTP protocol");
-      }
-      const result = amountToSend.mul(Big(1).minus(sourceChainToken.cctpFeeShare)).round(0, Big.roundUp);
-      const resultInDestPrecision = convertAmountPrecision(
-        result,
-        sourceChainToken.decimals,
-        destinationChainToken.decimals
-      ).round(0);
-      return convertIntAmountToFloat(resultInDestPrecision, destinationChainToken.decimals).toFixed();
-    }
-
-    const vUsd = swapToVUsd(amountToSend, sourceChainToken, await getPoolInfoByToken(this.api, sourceChainToken));
-    const resultInt = swapFromVUsd(
-      vUsd,
-      destinationChainToken,
-      await getPoolInfoByToken(this.api, destinationChainToken)
-    );
-    if (Big(resultInt).lt(0)) {
-      throw new InsufficientPoolLiquidityError();
-    }
-    return convertIntAmountToFloat(resultInt, destinationChainToken.decimals).toFixed();
+    return this.service.getAmountToBeReceived(amountToSendFloat, sourceChainToken, destinationChainToken, messenger);
   }
 
   /**
@@ -368,7 +279,7 @@ export class AllbridgeCoreSdk {
    * @param messenger Optional. selected messenger
    */
   async getAmountToSend(
-    amountToBeReceivedFloat: number | string | Big,
+    amountToBeReceivedFloat: BigSource,
     sourceChainToken: TokenWithChainDetails,
     destinationChainToken: TokenWithChainDetails,
     /**
@@ -378,33 +289,7 @@ export class AllbridgeCoreSdk {
      */
     messenger?: Messenger
   ): Promise<string> {
-    validateAmountGtZero(amountToBeReceivedFloat);
-    validateAmountDecimals("amountToBeReceivedFloat", amountToBeReceivedFloat, destinationChainToken.decimals);
-    const amountToBeReceived = convertFloatAmountToInt(amountToBeReceivedFloat, destinationChainToken.decimals);
-
-    if (messenger && messenger == Messenger.CCTP) {
-      if (!sourceChainToken.cctpAddress || !destinationChainToken.cctpAddress || !sourceChainToken.cctpFeeShare) {
-        throw new CCTPDoesNotSupportedError("Such route does not support CCTP protocol");
-      }
-      const result = amountToBeReceived.div(Big(1).minus(sourceChainToken.cctpFeeShare)).round(0, Big.roundDown);
-      const resultInSourcePrecision = convertAmountPrecision(
-        result,
-        destinationChainToken.decimals,
-        sourceChainToken.decimals
-      ).round(0);
-      return convertIntAmountToFloat(resultInSourcePrecision, sourceChainToken.decimals).toFixed();
-    }
-
-    const vUsd = swapFromVUsdReverse(
-      amountToBeReceived,
-      destinationChainToken,
-      await getPoolInfoByToken(this.api, destinationChainToken)
-    );
-    const resultInt = swapToVUsdReverse(vUsd, sourceChainToken, await getPoolInfoByToken(this.api, sourceChainToken));
-    if (Big(resultInt).lte(0)) {
-      throw new InsufficientPoolLiquidityError();
-    }
-    return convertIntAmountToFloat(resultInt, sourceChainToken.decimals).toFixed();
+    return this.service.getAmountToSend(amountToBeReceivedFloat, sourceChainToken, destinationChainToken, messenger);
   }
 
   /**
@@ -419,14 +304,7 @@ export class AllbridgeCoreSdk {
     destinationChainToken: TokenWithChainDetails,
     messenger: Messenger
   ): Promise<GasFeeOptions> {
-    return getGasFeeOptions(
-      sourceChainToken.allbridgeChainId,
-      sourceChainToken.chainType,
-      destinationChainToken.allbridgeChainId,
-      sourceChainToken.decimals,
-      messenger,
-      this.api
-    );
+    return this.service.getGasFeeOptions(sourceChainToken, destinationChainToken, messenger);
   }
 
   /**
@@ -441,10 +319,7 @@ export class AllbridgeCoreSdk {
     destinationChainToken: TokenWithChainDetails,
     messenger: Messenger
   ): number | null {
-    return (
-      /* eslint-disable-next-line  @typescript-eslint/no-unnecessary-condition */
-      sourceChainToken.transferTime?.[destinationChainToken.chainSymbol]?.[messenger] ?? null
-    );
+    return this.service.getAverageTransferTime(sourceChainToken, destinationChainToken, messenger);
   }
 
   /**
@@ -453,7 +328,7 @@ export class AllbridgeCoreSdk {
    * @returns poolInfo
    */
   async getPoolInfoByToken(token: TokenWithChainDetails): Promise<PoolInfo> {
-    return await this.api.getPoolInfoByKey({ chainSymbol: token.chainSymbol, poolAddress: token.poolAddress });
+    return this.service.getPoolInfoByToken(token);
   }
 
   /**
@@ -464,14 +339,7 @@ export class AllbridgeCoreSdk {
    * @param tokens if present, the corresponding liquidity pools will be updated
    */
   async refreshPoolInfo(tokens?: TokenWithChainDetails | TokenWithChainDetails[]): Promise<void> {
-    if (tokens) {
-      const tokensArray = tokens instanceof Array ? tokens : [tokens];
-      const poolKeys: PoolKeyObject[] = tokensArray.map((t) => {
-        return { chainSymbol: t.chainSymbol, poolAddress: t.poolAddress };
-      });
-      return this.api.refreshPoolInfo(poolKeys);
-    }
-    return this.api.refreshPoolInfo();
+    return this.service.refreshPoolInfo(tokens);
   }
 
   /**
@@ -480,7 +348,7 @@ export class AllbridgeCoreSdk {
    * @returns aprPercentageView
    */
   aprInPercents(apr: number): string {
-    return aprInPercents(apr);
+    return this.service.aprInPercents(apr);
   }
 
   /**
@@ -493,7 +361,7 @@ export class AllbridgeCoreSdk {
     sourceChainToken: TokenWithChainDetails,
     destinationChainToken: TokenWithChainDetails
   ): Promise<ExtraGasMaxLimitResponse> {
-    return await getExtraGasMaxLimits(sourceChainToken, destinationChainToken, this.api);
+    return this.service.getExtraGasMaxLimits(sourceChainToken, destinationChainToken);
   }
 
   /**
@@ -507,20 +375,7 @@ export class AllbridgeCoreSdk {
     amountFormat: AmountFormat,
     sourceToken: TokenWithChainDetails
   ): Promise<AmountFormatted> {
-    validateAmountGtZero(amount);
-    let amountInTokenPrecision;
-    if (amountFormat == AmountFormat.FLOAT) {
-      validateAmountDecimals("amount", amount, sourceToken.decimals);
-      amountInTokenPrecision = convertFloatAmountToInt(amount, sourceToken.decimals).toFixed();
-    } else {
-      amountInTokenPrecision = amount;
-    }
-
-    const vUsdAmount = swapToVUsd(amountInTokenPrecision, sourceToken, await getPoolInfoByToken(this.api, sourceToken));
-    return {
-      [AmountFormat.INT]: vUsdAmount,
-      [AmountFormat.FLOAT]: convertIntAmountToFloat(vUsdAmount, SYSTEM_PRECISION).toFixed(),
-    };
+    return this.service.getVUsdFromAmount(amount, amountFormat, sourceToken);
   }
 
   /**
@@ -529,12 +384,7 @@ export class AllbridgeCoreSdk {
    * @return amount of destToken
    */
   async getAmountFromVUsd(vUsdAmount: string, destToken: TokenWithChainDetails): Promise<AmountFormatted> {
-    validateAmountGtZero(vUsdAmount);
-    const amount = swapFromVUsd(vUsdAmount, destToken, await getPoolInfoByToken(this.api, destToken));
-    return {
-      [AmountFormat.INT]: amount,
-      [AmountFormat.FLOAT]: convertIntAmountToFloat(amount, destToken.decimals).toFixed(),
-    };
+    return this.service.getAmountFromVUsd(vUsdAmount, destToken);
   }
 
   /**
@@ -548,19 +398,7 @@ export class AllbridgeCoreSdk {
     sourceToken: TokenWithChainDetails,
     destToken: TokenWithChainDetails
   ): Promise<SwapAndBridgeCalculationData> {
-    return swapAndBridgeFeeCalculation(
-      amountInTokenPrecision,
-      {
-        decimals: sourceToken.decimals,
-        feeShare: sourceToken.feeShare,
-        poolInfo: await getPoolInfoByToken(this.api, sourceToken),
-      },
-      {
-        decimals: destToken.decimals,
-        feeShare: destToken.feeShare,
-        poolInfo: await getPoolInfoByToken(this.api, destToken),
-      }
-    );
+    return this.service.swapAndBridgeFeeCalculation(amountInTokenPrecision, sourceToken, destToken);
   }
 
   /**
@@ -574,24 +412,7 @@ export class AllbridgeCoreSdk {
     sourceToken: TokenWithChainDetails,
     destToken: TokenWithChainDetails
   ): Promise<SwapAndBridgeCalculationData> {
-    const result = swapAndBridgeFeeCalculationReverse(
-      amountInTokenPrecision,
-      {
-        decimals: sourceToken.decimals,
-        feeShare: sourceToken.feeShare,
-        poolInfo: await getPoolInfoByToken(this.api, sourceToken),
-      },
-      {
-        decimals: destToken.decimals,
-        feeShare: destToken.feeShare,
-        poolInfo: await getPoolInfoByToken(this.api, destToken),
-      }
-    );
-    const newAmount = result.swapFromVUsdCalcResult.amountIncludingCommissionInTokenPrecision;
-    if (Big(newAmount).lt(0)) {
-      throw new InsufficientPoolLiquidityError();
-    }
-    return result;
+    return this.service.swapAndBridgeFeeCalculationReverse(amountInTokenPrecision, sourceToken, destToken);
   }
 
   /**
@@ -603,21 +424,6 @@ export class AllbridgeCoreSdk {
     sourceToken: TokenWithChainDetails,
     destToken: TokenWithChainDetails
   ): Promise<SendAmountDetails> {
-    validateAmountGtZero(amount);
-    let amountInTokenPrecision;
-    if (amountFormat == AmountFormat.FLOAT) {
-      validateAmountDecimals("amount", amount, sourceToken.decimals);
-      amountInTokenPrecision = convertFloatAmountToInt(amount, sourceToken.decimals).toFixed();
-    } else {
-      amountInTokenPrecision = amount;
-    }
-
-    return getSendAmountDetails(
-      amountInTokenPrecision,
-      sourceToken,
-      await getPoolInfoByToken(this.api, sourceToken),
-      destToken,
-      await getPoolInfoByToken(this.api, destToken)
-    );
+    return this.service.getSendAmountDetails(amount, amountFormat, sourceToken, destToken);
   }
 }
diff --git a/src/models/index.ts b/src/models/index.ts
index 72e4e556..c851a4a0 100644
--- a/src/models/index.ts
+++ b/src/models/index.ts
@@ -6,11 +6,18 @@ export {
   GetTokenBalanceParams,
   SendParams,
   SwapParams,
+  GetNativeTokenBalanceParams,
 } from "../services/bridge/models/bridge.model";
 export { BridgeService } from "../services/bridge/index";
 export { LiquidityPoolService } from "../services/liquidity-pool/index";
 export { TransactionResponse } from "../services/models/index";
-export { Messenger, TransferStatusResponse, BridgeTransaction } from "../client/core-api/core-api.model";
+export {
+  Messenger,
+  TransferStatusResponse,
+  BridgeTransaction,
+  GasBalanceResponse,
+  AddressStatus,
+} from "../client/core-api/core-api.model";
 export { ChainSymbol, ChainType } from "../chains/index";
 export { RawBridgeTransactionBuilder } from "../services/bridge/raw-bridge-transaction-builder";
 export { RawPoolTransactionBuilder } from "../services/liquidity-pool/raw-pool-transaction-builder";
@@ -21,11 +28,6 @@ export {
   TxCostAmount,
   MessengerTransferTime,
 } from "../tokens-info/tokens-info.model";
-export {
-  CheckAllowanceParams as TokensCheckAllowanceParams,
-  GetAllowanceParams as TokensGetAllowanceParams,
-  GetTokenBalanceParams as TokensGetTokenBalanceParams,
-} from "../services/token/models/token.model";
 export {
   UserBalanceInfo,
   UserBalanceInfoDTO,
@@ -43,6 +45,9 @@ export {
 } from "../utils/calculation/swap-and-bridge-fee-calc";
 export { SendAmountDetails, AmountImpact } from "../utils/calculation/swap-and-bridge-details";
 export { ChainDetailsMap, ChainDetailsWithTokens } from "../tokens-info";
+export { Utils } from "../utils";
+export { SrbUtils, TrustLineParams } from "../utils/srb";
+export { SolUtils } from "../utils/sol";
 export * from "../exceptions";
 
 export enum FeePaymentMethod {
@@ -167,3 +172,21 @@ export interface ExtraGasMaxLimitResponse {
    */
   sourceNativeTokenPrice: string;
 }
+
+/**
+ * Provide pending status information
+ */
+export interface PendingStatusInfoResponse {
+  /**
+   * Number of pending transactions
+   */
+  pendingTxs: number;
+  /**
+   * Total amount of pending transactions
+   */
+  pendingAmount: AmountFormatted;
+  /**
+   * The amount of tokens can be received as a result of transfer considering pending transactions
+   */
+  estimatedAmount: { min: AmountFormatted; max: AmountFormatted };
+}
diff --git a/src/services/bridge/evm/index.ts b/src/services/bridge/evm/index.ts
index f76f8c0b..97e39f82 100644
--- a/src/services/bridge/evm/index.ts
+++ b/src/services/bridge/evm/index.ts
@@ -142,7 +142,7 @@ export class EvmBridgeService extends ChainBridgeService {
     // prettier-ignore
     const feeOptions: { maxPriorityFeePerGas?: number | string | BN; maxFeePerGas?: number | string | BN } = { maxPriorityFeePerGas: null, maxFeePerGas: null };
     const { transactionHash } = await this.web3.eth.sendTransaction({
-      ...rawTransaction,
+      ...(rawTransaction as Object),
       gas: estimateGas,
       ...feeOptions,
     });
diff --git a/src/services/bridge/index.ts b/src/services/bridge/index.ts
index 76ed23d5..ad301911 100644
--- a/src/services/bridge/index.ts
+++ b/src/services/bridge/index.ts
@@ -1,23 +1,22 @@
 // @ts-expect-error import tron
 import TronWeb from "tronweb";
 import Web3 from "web3";
+import { NodeRpcUrlsConfig } from "..";
 import { chainProperties, ChainSymbol, ChainType } from "../../chains";
 import { AllbridgeCoreClient } from "../../client/core-api";
-import {
-  CCTPDoesNotSupportedError,
-  Messenger,
-  MethodNotSupportedError,
-  NodeRpcUrlsConfig,
-  TokenWithChainDetails,
-} from "../../index";
-import { validateAmountDecimals, validateAmountGtZero } from "../../utils";
+import { Messenger } from "../../client/core-api/core-api.model";
+import { CCTPDoesNotSupportedError } from "../../exceptions";
+import { AllbridgeCoreSdkOptions } from "../../index";
+import { TokenWithChainDetails } from "../../tokens-info";
+import { validateAmountDecimals, validateAmountGtZero } from "../../utils/utils";
 import { Provider, TransactionResponse } from "../models";
 import { TokenService } from "../token";
 import { EvmBridgeService } from "./evm";
 import { ApproveParams, CheckAllowanceParams, GetAllowanceParams, SendParams } from "./models";
 import { ChainBridgeService } from "./models/bridge";
 import { DefaultRawBridgeTransactionBuilder, RawBridgeTransactionBuilder } from "./raw-bridge-transaction-builder";
-import { SolanaBridgeParams, SolanaBridgeService } from "./sol";
+import { SolanaBridgeService } from "./sol";
+import { SrbBridgeService } from "./srb";
 import { TronBridgeService } from "./trx";
 
 export interface BridgeService {
@@ -79,10 +78,10 @@ export class DefaultBridgeService implements BridgeService {
   constructor(
     private api: AllbridgeCoreClient,
     private nodeRpcUrlsConfig: NodeRpcUrlsConfig,
-    private solParams: SolanaBridgeParams,
+    private params: AllbridgeCoreSdkOptions,
     private tokenService: TokenService
   ) {
-    this.rawTxBuilder = new DefaultRawBridgeTransactionBuilder(api, nodeRpcUrlsConfig, solParams, tokenService);
+    this.rawTxBuilder = new DefaultRawBridgeTransactionBuilder(api, nodeRpcUrlsConfig, params, tokenService);
   }
 
   async getAllowance(a: Provider | GetAllowanceParams, b?: GetAllowanceParams): Promise<string> {
@@ -123,7 +122,7 @@ export class DefaultBridgeService implements BridgeService {
       params.sourceToken.chainSymbol,
       this.api,
       this.nodeRpcUrlsConfig,
-      this.solParams,
+      this.params,
       provider
     ).send(params);
   }
@@ -145,7 +144,7 @@ export function getChainBridgeService(
   chainSymbol: ChainSymbol,
   api: AllbridgeCoreClient,
   nodeRpcUrlsConfig: NodeRpcUrlsConfig,
-  solParams: SolanaBridgeParams,
+  params: AllbridgeCoreSdkOptions,
   provider?: Provider
 ): ChainBridgeService {
   switch (chainProperties[chainSymbol].chainType) {
@@ -166,10 +165,17 @@ export function getChainBridgeService(
       }
     }
     case ChainType.SOLANA: {
-      return new SolanaBridgeService(nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SOL), solParams, api);
+      return new SolanaBridgeService(
+        nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SOL),
+        {
+          wormholeMessengerProgramId: params.wormholeMessengerProgramId,
+          solanaLookUpTable: params.solanaLookUpTable,
+        },
+        api
+      );
     }
     case ChainType.SRB: {
-      throw new MethodNotSupportedError("Soroban does not support yet");
+      return new SrbBridgeService(nodeRpcUrlsConfig, params, api);
     }
   }
 }
diff --git a/src/services/bridge/models/bridge.ts b/src/services/bridge/models/bridge.ts
index 12d7791c..919783c8 100644
--- a/src/services/bridge/models/bridge.ts
+++ b/src/services/bridge/models/bridge.ts
@@ -8,11 +8,21 @@ export abstract class ChainBridgeService {
   abstract chainType: ChainType;
   abstract api: AllbridgeCoreClient;
 
+  /**
+   * @Deprecated Use {@link buildRawTransactionSend} or {@link buildRawTransactionSwap} instead<p>
+   * Send tokens through the ChainBridgeService
+   * @param params
+   */
   async send(params: SendParams): Promise<TransactionResponse> {
     const txSendParams = await prepareTxSendParams(this.chainType, params, this.api);
     return this.sendTx(txSendParams);
   }
 
+  /**
+   * @Deprecated Use {@link buildRawTransactionSend} or {@link buildRawTransactionSwap} instead<p>
+   * Send tokens through the ChainBridgeService
+   * @param params
+   */
   abstract sendTx(params: TxSendParams): Promise<TransactionResponse>;
 
   abstract buildRawTransactionSend(params: SendParams): Promise<RawTransaction>;
diff --git a/src/services/bridge/raw-bridge-transaction-builder.ts b/src/services/bridge/raw-bridge-transaction-builder.ts
index 0d8cace0..98031dbf 100644
--- a/src/services/bridge/raw-bridge-transaction-builder.ts
+++ b/src/services/bridge/raw-bridge-transaction-builder.ts
@@ -1,10 +1,10 @@
+import { NodeRpcUrlsConfig } from "..";
 import { AllbridgeCoreClient } from "../../client/core-api";
-import { NodeRpcUrlsConfig } from "../../index";
-import { validateAmountDecimals, validateAmountGtZero } from "../../utils";
+import { AllbridgeCoreSdkOptions } from "../../index";
+import { validateAmountDecimals, validateAmountGtZero } from "../../utils/utils";
 import { Provider, RawTransaction } from "../models";
 import { TokenService } from "../token";
 import { ApproveParams, SendParams, SwapParams } from "./models";
-import { SolanaBridgeParams } from "./sol";
 import { isSendParams } from "./utils";
 import { getChainBridgeService, getSpender } from "./index";
 
@@ -32,7 +32,7 @@ export class DefaultRawBridgeTransactionBuilder implements RawBridgeTransactionB
   constructor(
     private api: AllbridgeCoreClient,
     private nodeRpcUrlsConfig: NodeRpcUrlsConfig,
-    private solParams: SolanaBridgeParams,
+    private params: AllbridgeCoreSdkOptions,
     private tokenService: TokenService
   ) {}
 
@@ -63,7 +63,7 @@ export class DefaultRawBridgeTransactionBuilder implements RawBridgeTransactionB
         params.sourceToken.chainSymbol,
         this.api,
         this.nodeRpcUrlsConfig,
-        this.solParams,
+        this.params,
         provider
       ).buildRawTransactionSend(params);
     }
@@ -71,7 +71,7 @@ export class DefaultRawBridgeTransactionBuilder implements RawBridgeTransactionB
       params.sourceToken.chainSymbol,
       this.api,
       this.nodeRpcUrlsConfig,
-      this.solParams,
+      this.params,
       provider
     ).buildRawTransactionSwap(params);
   }
diff --git a/src/services/bridge/sol/jupiter.ts b/src/services/bridge/sol/jupiter.ts
index b228031d..07f868e0 100644
--- a/src/services/bridge/sol/jupiter.ts
+++ b/src/services/bridge/sol/jupiter.ts
@@ -1,7 +1,8 @@
 import { NATIVE_MINT } from "@solana/spl-token";
-import { AddressLookupTableAccount, Connection, TransactionMessage, VersionedTransaction } from "@solana/web3.js";
+import { Connection, TransactionMessage, VersionedTransaction } from "@solana/web3.js";
 import axios, { AxiosError } from "axios";
-import { JupiterError, SdkError } from "../../../exceptions";
+import { JupiterError } from "../../../exceptions";
+import { fetchAddressLookupTableAccountsFromTx } from "../../../utils/sol/utils";
 
 export class JupiterService {
   connection: Connection;
@@ -70,36 +71,8 @@ export class JupiterService {
     sdkTx: VersionedTransaction
   ): Promise<VersionedTransaction> {
     try {
-      const addressLookupTableAccounts = await Promise.all(
-        transaction.message.addressTableLookups.map(async (lookup) => {
-          return new AddressLookupTableAccount({
-            key: lookup.accountKey,
-            state: AddressLookupTableAccount.deserialize(
-              await this.connection.getAccountInfo(lookup.accountKey).then((res) => {
-                if (!res) {
-                  throw new SdkError("Cannot get AccountInfo");
-                }
-                return res.data;
-              })
-            ),
-          });
-        })
-      );
-      const sdkAddressLookupTableAccounts = await Promise.all(
-        sdkTx.message.addressTableLookups.map(async (lookup) => {
-          return new AddressLookupTableAccount({
-            key: lookup.accountKey,
-            state: AddressLookupTableAccount.deserialize(
-              await this.connection.getAccountInfo(lookup.accountKey).then((res) => {
-                if (!res) {
-                  throw new SdkError("Cannot get AccountInfo");
-                }
-                return res.data;
-              })
-            ),
-          });
-        })
-      );
+      const addressLookupTableAccounts = await fetchAddressLookupTableAccountsFromTx(transaction, this.connection);
+      const sdkAddressLookupTableAccounts = await fetchAddressLookupTableAccountsFromTx(sdkTx, this.connection);
 
       const message = TransactionMessage.decompile(transaction.message, {
         addressLookupTableAccounts: addressLookupTableAccounts,
diff --git a/src/services/bridge/srb/index.ts b/src/services/bridge/srb/index.ts
new file mode 100644
index 00000000..fdeb9fd2
--- /dev/null
+++ b/src/services/bridge/srb/index.ts
@@ -0,0 +1,118 @@
+import Big from "big.js";
+import { Address } from "soroban-client";
+import { ChainSymbol, ChainType } from "../../../chains";
+import { AllbridgeCoreClient } from "../../../client/core-api";
+import { MethodNotSupportedError } from "../../../exceptions";
+import { AllbridgeCoreSdkOptions } from "../../../index";
+import { FeePaymentMethod } from "../../../models";
+import { NodeRpcUrlsConfig } from "../../index";
+import { RawTransaction, TransactionResponse } from "../../models";
+import { BridgeContract } from "../../models/srb/bridge";
+import { ClassOptions } from "../../models/srb/method-options";
+import { ChainBridgeService, SendParams, SwapParams, TxSendParams, TxSwapParams } from "../models";
+import { getNonceBigInt, prepareTxSendParams, prepareTxSwapParams } from "../utils";
+
+export class SrbBridgeService extends ChainBridgeService {
+  chainType: ChainType.SRB = ChainType.SRB;
+
+  constructor(
+    readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,
+    readonly params: AllbridgeCoreSdkOptions,
+    readonly api: AllbridgeCoreClient
+  ) {
+    super();
+  }
+
+  async buildRawTransactionSend(params: SendParams): Promise<RawTransaction> {
+    const txSendParams = await prepareTxSendParams(this.chainType, params, this.api);
+    return await this.buildRawTransactionSendFromParams(txSendParams);
+  }
+
+  async buildRawTransactionSendFromParams(params: TxSendParams): Promise<RawTransaction> {
+    const {
+      amount,
+      contractAddress,
+      fromAccountAddress,
+      fromTokenAddress,
+      toChainId,
+      toAccountAddress,
+      toTokenAddress,
+      fee,
+      gasFeePaymentMethod,
+      extraGas,
+    } = params;
+
+    let totalFee = fee;
+    if (extraGas) {
+      totalFee = Big(totalFee).plus(extraGas).toFixed();
+    }
+    const contract = this.getContract(BridgeContract, contractAddress);
+    let tx;
+    if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {
+      tx = await contract.swapAndBridge({
+        sender: Address.fromString(fromAccountAddress),
+        token: Address.contract(Buffer.from(fromTokenAddress)).toBuffer(),
+        amount: BigInt(amount),
+        recipient: Buffer.from(toAccountAddress),
+        destination_chain_id: +toChainId,
+        receive_token: Buffer.from(toTokenAddress),
+        nonce: getNonceBigInt(),
+        gas_amount: BigInt(0),
+        fee_token_amount: BigInt(totalFee),
+      });
+    } else {
+      tx = await contract.swapAndBridge({
+        sender: Address.fromString(fromAccountAddress),
+        token: Address.contract(Buffer.from(fromTokenAddress)).toBuffer(),
+        amount: BigInt(amount),
+        recipient: Buffer.from(toAccountAddress),
+        destination_chain_id: +toChainId,
+        receive_token: Buffer.from(toTokenAddress),
+        nonce: getNonceBigInt(),
+        gas_amount: BigInt(totalFee),
+        fee_token_amount: BigInt(0),
+      });
+    }
+    return tx;
+  }
+
+  async buildRawTransactionSwap(params: SwapParams): Promise<RawTransaction> {
+    const txSwapParams = prepareTxSwapParams(this.chainType, params);
+    return await this.buildRawTransactionSwapFromParams(txSwapParams);
+  }
+
+  async buildRawTransactionSwapFromParams(params: TxSwapParams): Promise<RawTransaction> {
+    const {
+      amount,
+      contractAddress,
+      fromAccountAddress,
+      fromTokenAddress,
+      toAccountAddress,
+      toTokenAddress,
+      minimumReceiveAmount,
+    } = params;
+    const contract = this.getContract(BridgeContract, contractAddress);
+    return await contract.swap({
+      sender: Address.fromString(fromAccountAddress),
+      amount: BigInt(amount),
+      token: Address.contract(Buffer.from(fromTokenAddress)).toBuffer(),
+      receive_token: Buffer.from(toTokenAddress),
+      recipient: Address.fromString(toAccountAddress as string),
+      receive_amount_min: BigInt(minimumReceiveAmount),
+      claimable: false,
+    });
+  }
+
+  sendTx(): Promise<TransactionResponse> {
+    throw new MethodNotSupportedError();
+  }
+
+  private getContract<T>(contract: new (args: ClassOptions) => T, address: string): T {
+    const config: ClassOptions = {
+      contractId: address,
+      networkPassphrase: this.params.sorobanNetworkPassphrase,
+      rpcUrl: this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SRB),
+    };
+    return new contract(config);
+  }
+}
diff --git a/src/services/bridge/utils.ts b/src/services/bridge/utils.ts
index 21f1e2a1..8c79830d 100644
--- a/src/services/bridge/utils.ts
+++ b/src/services/bridge/utils.ts
@@ -13,7 +13,6 @@ import {
   CCTPDoesNotSupportedError,
   ExtraGasMaxLimitExceededError,
   InvalidGasFeePaymentOptionError,
-  MethodNotSupportedError,
   SdkError,
 } from "../../exceptions";
 import {
@@ -60,16 +59,16 @@ export function formatAddress(address: string, from: ChainType, to: ChainType):
       return buffer.toJSON().data;
     }
     case ChainType.SRB: {
-      throw new MethodNotSupportedError("Soroban does not supported yet");
+      return buffer.toJSON().data;
     }
   }
 }
 
-function hexToBuffer(hex: string): Buffer {
+export function hexToBuffer(hex: string): Buffer {
   return Buffer.from(hex.replace(/^0x/i, ""), "hex");
 }
 
-function evmAddressToBuffer32(address: string): Buffer {
+export function evmAddressToBuffer32(address: string): Buffer {
   const length = 32;
   const buff = hexToBuffer(address);
   return Buffer.concat([Buffer.alloc(length - buff.length, 0), buff], length);
@@ -112,6 +111,14 @@ export function getNonce(): Buffer {
   return randomBytes(32);
 }
 
+export function getNonceBigInt(): bigint {
+  const bigint = randomBytes(32).readBigInt64BE();
+  if (bigint < 0) {
+    return bigint * -1n;
+  }
+  return bigint;
+}
+
 export function prepareTxSwapParams(bridgeChainType: ChainType, params: SwapParams): TxSwapParams {
   const txSwapParams = {} as TxSwapParams;
   const sourceToken = params.sourceToken;
diff --git a/src/services/index.ts b/src/services/index.ts
new file mode 100644
index 00000000..01ab6a99
--- /dev/null
+++ b/src/services/index.ts
@@ -0,0 +1,502 @@
+import { Big } from "big.js";
+import { ChainSymbol } from "../chains";
+import { AllbridgeCoreClientImpl } from "../client/core-api";
+import { ApiClientImpl } from "../client/core-api/api-client";
+import { ApiClientCaching } from "../client/core-api/api-client-caching";
+import {
+  GasBalanceResponse,
+  Messenger,
+  PendingInfoDTO,
+  TransferStatusResponse,
+} from "../client/core-api/core-api.model";
+import { AllbridgeCoreClientPoolInfoCaching } from "../client/core-api/core-client-pool-info-caching";
+import { mainnet } from "../configs";
+import { AllbridgeCoreSdkOptions, NodeRpcUrls } from "../index";
+import {
+  AmountFormat,
+  AmountFormatted,
+  AmountsAndGasFeeOptions,
+  CCTPDoesNotSupportedError,
+  ExtraGasMaxLimitResponse,
+  GasFeeOptions,
+  GetTokenBalanceParams,
+  InsufficientPoolLiquidityError,
+  NodeRpcUrlNotInitializedError,
+  PendingStatusInfoResponse,
+  Provider,
+  SendAmountDetails,
+  SwapAndBridgeCalculationData,
+} from "../models";
+import { ChainDetailsMap, PoolInfo, PoolKeyObject, TokenWithChainDetails } from "../tokens-info";
+import {
+  aprInPercents,
+  convertAmountPrecision,
+  convertFloatAmountToInt,
+  convertIntAmountToFloat,
+  fromSystemPrecision,
+  getFeePercent,
+  getSwapFromVUsdPoolInfo,
+  swapFromVUsd,
+  swapFromVUsdReverse,
+  swapToVUsd,
+  swapToVUsdReverse,
+} from "../utils/calculation";
+import { SYSTEM_PRECISION } from "../utils/calculation/constants";
+import { getSendAmountDetails } from "../utils/calculation/swap-and-bridge-details";
+import {
+  swapAndBridgeFeeCalculation,
+  swapAndBridgeFeeCalculationReverse,
+} from "../utils/calculation/swap-and-bridge-fee-calc";
+import { getPoolInfoByToken, validateAmountDecimals, validateAmountGtZero } from "../utils/utils";
+import { BridgeService, DefaultBridgeService } from "./bridge";
+import { GetNativeTokenBalanceParams } from "./bridge/models";
+import { getExtraGasMaxLimits, getGasFeeOptions } from "./bridge/utils";
+import { DefaultLiquidityPoolService, LiquidityPoolService } from "./liquidity-pool";
+import { DefaultTokenService, TokenService } from "./token";
+
+export class NodeRpcUrlsConfig {
+  constructor(private nodeRpcUrls: NodeRpcUrls) {}
+
+  getNodeRpcUrl(chainSymbol: ChainSymbol): string {
+    const nodeRpcUrl = this.nodeRpcUrls[chainSymbol];
+    if (nodeRpcUrl !== undefined) {
+      return nodeRpcUrl;
+    } else {
+      throw new NodeRpcUrlNotInitializedError(chainSymbol);
+    }
+  }
+}
+
+export class AllbridgeCoreSdkService {
+  private readonly api: AllbridgeCoreClientPoolInfoCaching;
+
+  private readonly tokenService: TokenService;
+
+  readonly params: AllbridgeCoreSdkOptions;
+
+  bridge: BridgeService;
+  pool: LiquidityPoolService;
+
+  constructor(nodeRpcUrlsConfig: NodeRpcUrlsConfig, params: AllbridgeCoreSdkOptions = mainnet) {
+    const apiClient = new ApiClientImpl(params);
+    const apiClientCaching = new ApiClientCaching(apiClient);
+    const coreClient = new AllbridgeCoreClientImpl(apiClientCaching);
+    this.api = new AllbridgeCoreClientPoolInfoCaching(coreClient);
+    this.tokenService = new DefaultTokenService(this.api, nodeRpcUrlsConfig, params);
+    this.bridge = new DefaultBridgeService(this.api, nodeRpcUrlsConfig, params, this.tokenService);
+    this.pool = new DefaultLiquidityPoolService(this.api, nodeRpcUrlsConfig, params, this.tokenService);
+    this.params = params;
+  }
+
+  async chainDetailsMap(): Promise<ChainDetailsMap> {
+    return this.api.getChainDetailsMap();
+  }
+
+  async tokens(): Promise<TokenWithChainDetails[]> {
+    return this.api.tokens();
+  }
+
+  async tokensByChain(chainSymbol: ChainSymbol): Promise<TokenWithChainDetails[]> {
+    const map = await this.api.getChainDetailsMap();
+    return map[chainSymbol].tokens;
+  }
+
+  async getTransferStatus(chainSymbol: ChainSymbol, txId: string): Promise<TransferStatusResponse> {
+    return this.api.getTransferStatus(chainSymbol, txId);
+  }
+
+  async getGasBalance(chainSymbol: ChainSymbol, address: string): Promise<GasBalanceResponse> {
+    return this.api.getGasBalance(chainSymbol, address);
+  }
+
+  async getPendingStatusInfo(
+    amount: string,
+    amountFormat: AmountFormat,
+    sourceToken: TokenWithChainDetails,
+    destToken: TokenWithChainDetails
+  ): Promise<PendingStatusInfoResponse> {
+    validateAmountGtZero(amount);
+    let amountInTokenPrecision;
+    if (amountFormat == AmountFormat.FLOAT) {
+      validateAmountDecimals("amount", amount, sourceToken.decimals);
+      amountInTokenPrecision = convertFloatAmountToInt(amount, sourceToken.decimals).toFixed();
+    } else {
+      amountInTokenPrecision = amount;
+    }
+
+    const vUsdAmountInt = swapToVUsd(
+      amountInTokenPrecision,
+      sourceToken,
+      await getPoolInfoByToken(this.api, sourceToken)
+    );
+    const destPoolInfo = await getPoolInfoByToken(this.api, destToken);
+    const amountResultIntFormatted: AmountFormatted = this.getAmountFromVUsdFormatted(
+      vUsdAmountInt,
+      destToken,
+      destPoolInfo
+    );
+
+    let pendingInfoDTO: PendingInfoDTO | undefined;
+    const pendingInfo = await this.api.getPendingInfo();
+    for (const tokenAddress in pendingInfo[destToken.chainSymbol]) {
+      if (tokenAddress.toLowerCase() === destToken.tokenAddress.toLowerCase()) {
+        pendingInfoDTO = pendingInfo[destToken.chainSymbol][tokenAddress];
+      }
+    }
+    if (pendingInfoDTO) {
+      const destPoolAfterPending = getSwapFromVUsdPoolInfo(pendingInfoDTO.totalSentAmount, destPoolInfo);
+      const amountResultIntAfterPendingFormatted: AmountFormatted = this.getAmountFromVUsdFormatted(
+        vUsdAmountInt,
+        destToken,
+        destPoolAfterPending
+      );
+
+      let estimatedAmount: { min: AmountFormatted; max: AmountFormatted };
+      if (Big(amountResultIntAfterPendingFormatted.int).gt(amountResultIntFormatted.int)) {
+        estimatedAmount = { min: amountResultIntFormatted, max: amountResultIntAfterPendingFormatted };
+      } else {
+        estimatedAmount = { min: amountResultIntAfterPendingFormatted, max: amountResultIntFormatted };
+      }
+
+      return {
+        pendingTxs: pendingInfoDTO.pendingTxs,
+        pendingAmount: {
+          [AmountFormat.INT]: convertAmountPrecision(
+            pendingInfoDTO.totalSentAmount,
+            SYSTEM_PRECISION,
+            destToken.decimals
+          ).toFixed(0),
+          [AmountFormat.FLOAT]: convertIntAmountToFloat(pendingInfoDTO.totalSentAmount, SYSTEM_PRECISION).toFixed(),
+        },
+        estimatedAmount,
+      };
+    }
+    return {
+      pendingTxs: 0,
+      pendingAmount: {
+        [AmountFormat.INT]: "0",
+        [AmountFormat.FLOAT]: "0",
+      },
+      estimatedAmount: {
+        min: amountResultIntFormatted,
+        max: amountResultIntFormatted,
+      },
+    };
+  }
+
+  async getTokenBalance(params: GetTokenBalanceParams, provider?: Provider): Promise<string> {
+    return this.tokenService.getTokenBalance(params, provider);
+  }
+
+  async getNativeTokenBalance(params: GetNativeTokenBalanceParams, provider?: Provider): Promise<AmountFormatted> {
+    return this.tokenService.getNativeTokenBalance(params, provider);
+  }
+
+  async calculateFeePercentOnSourceChain(
+    amountFloat: number | string | Big,
+    sourceChainToken: TokenWithChainDetails
+  ): Promise<number> {
+    validateAmountGtZero(amountFloat);
+    validateAmountDecimals("amountFloat", amountFloat, sourceChainToken.decimals);
+    const amountInt = convertFloatAmountToInt(amountFloat, sourceChainToken.decimals);
+    if (amountInt.eq(0)) {
+      return 0;
+    }
+    const vUsdInSystemPrecision = swapToVUsd(
+      amountInt,
+      sourceChainToken,
+      await getPoolInfoByToken(this.api, sourceChainToken)
+    );
+    const vUsdInSourcePrecision = fromSystemPrecision(vUsdInSystemPrecision, sourceChainToken.decimals);
+    return getFeePercent(amountInt, vUsdInSourcePrecision);
+  }
+
+  async calculateFeePercentOnDestinationChain(
+    amountFloat: number | string | Big,
+    sourceChainToken: TokenWithChainDetails,
+    destinationChainToken: TokenWithChainDetails
+  ): Promise<number> {
+    validateAmountGtZero(amountFloat);
+    validateAmountDecimals("amountFloat", amountFloat, sourceChainToken.decimals);
+    const amountInt = convertFloatAmountToInt(amountFloat, sourceChainToken.decimals);
+    if (amountInt.eq(0)) {
+      return 0;
+    }
+    const vUsdInSystemPrecision = swapToVUsd(
+      amountInt,
+      sourceChainToken,
+      await getPoolInfoByToken(this.api, sourceChainToken)
+    );
+    const usd = swapFromVUsd(
+      vUsdInSystemPrecision,
+      destinationChainToken,
+      await getPoolInfoByToken(this.api, destinationChainToken)
+    );
+    const vUsdInDestinationPrecision = fromSystemPrecision(vUsdInSystemPrecision, destinationChainToken.decimals);
+    return getFeePercent(vUsdInDestinationPrecision, usd);
+  }
+
+  async getAmountToBeReceivedAndGasFeeOptions(
+    amountToSendFloat: number | string | Big,
+    sourceChainToken: TokenWithChainDetails,
+    destinationChainToken: TokenWithChainDetails,
+    messenger: Messenger
+  ): Promise<AmountsAndGasFeeOptions> {
+    validateAmountGtZero(amountToSendFloat);
+    validateAmountDecimals("amountToSendFloat", amountToSendFloat, sourceChainToken.decimals);
+    return {
+      amountToSendFloat: Big(amountToSendFloat).toFixed(),
+      amountToBeReceivedFloat: await this.getAmountToBeReceived(
+        amountToSendFloat,
+        sourceChainToken,
+        destinationChainToken,
+        messenger
+      ),
+      gasFeeOptions: await this.getGasFeeOptions(sourceChainToken, destinationChainToken, messenger),
+    };
+  }
+
+  async getAmountToSendAndGasFeeOptions(
+    amountToBeReceivedFloat: number | string | Big,
+    sourceChainToken: TokenWithChainDetails,
+    destinationChainToken: TokenWithChainDetails,
+    messenger: Messenger
+  ): Promise<AmountsAndGasFeeOptions> {
+    validateAmountGtZero(amountToBeReceivedFloat);
+    validateAmountDecimals("amountToBeReceivedFloat", amountToBeReceivedFloat, destinationChainToken.decimals);
+    return {
+      amountToSendFloat: await this.getAmountToSend(
+        amountToBeReceivedFloat,
+        sourceChainToken,
+        destinationChainToken,
+        messenger
+      ),
+      amountToBeReceivedFloat: Big(amountToBeReceivedFloat).toFixed(),
+      gasFeeOptions: await this.getGasFeeOptions(sourceChainToken, destinationChainToken, messenger),
+    };
+  }
+
+  async getAmountToBeReceived(
+    amountToSendFloat: number | string | Big,
+    sourceChainToken: TokenWithChainDetails,
+    destinationChainToken: TokenWithChainDetails,
+    messenger?: Messenger
+  ): Promise<string> {
+    validateAmountGtZero(amountToSendFloat);
+    validateAmountDecimals("amountToSendFloat", amountToSendFloat, sourceChainToken.decimals);
+    const amountToSend = convertFloatAmountToInt(amountToSendFloat, sourceChainToken.decimals);
+
+    if (messenger && messenger == Messenger.CCTP) {
+      if (!sourceChainToken.cctpAddress || !destinationChainToken.cctpAddress || !sourceChainToken.cctpFeeShare) {
+        throw new CCTPDoesNotSupportedError("Such route does not support CCTP protocol");
+      }
+      const result = amountToSend.mul(Big(1).minus(sourceChainToken.cctpFeeShare)).round(0, Big.roundUp);
+      const resultInDestPrecision = convertAmountPrecision(
+        result,
+        sourceChainToken.decimals,
+        destinationChainToken.decimals
+      ).round(0);
+      return convertIntAmountToFloat(resultInDestPrecision, destinationChainToken.decimals).toFixed();
+    }
+
+    const vUsd = swapToVUsd(amountToSend, sourceChainToken, await getPoolInfoByToken(this.api, sourceChainToken));
+    return (await this.getAmountFromVUsd(vUsd, destinationChainToken)).float;
+  }
+
+  async getAmountToSend(
+    amountToBeReceivedFloat: number | string | Big,
+    sourceChainToken: TokenWithChainDetails,
+    destinationChainToken: TokenWithChainDetails,
+    messenger?: Messenger
+  ): Promise<string> {
+    validateAmountGtZero(amountToBeReceivedFloat);
+    validateAmountDecimals("amountToBeReceivedFloat", amountToBeReceivedFloat, destinationChainToken.decimals);
+    const amountToBeReceived = convertFloatAmountToInt(amountToBeReceivedFloat, destinationChainToken.decimals);
+
+    if (messenger && messenger == Messenger.CCTP) {
+      if (!sourceChainToken.cctpAddress || !destinationChainToken.cctpAddress || !sourceChainToken.cctpFeeShare) {
+        throw new CCTPDoesNotSupportedError("Such route does not support CCTP protocol");
+      }
+      const result = amountToBeReceived.div(Big(1).minus(sourceChainToken.cctpFeeShare)).round(0, Big.roundDown);
+      const resultInSourcePrecision = convertAmountPrecision(
+        result,
+        destinationChainToken.decimals,
+        sourceChainToken.decimals
+      ).round(0);
+      return convertIntAmountToFloat(resultInSourcePrecision, sourceChainToken.decimals).toFixed();
+    }
+
+    const vUsd = swapFromVUsdReverse(
+      amountToBeReceived,
+      destinationChainToken,
+      await getPoolInfoByToken(this.api, destinationChainToken)
+    );
+    const resultInt = swapToVUsdReverse(vUsd, sourceChainToken, await getPoolInfoByToken(this.api, sourceChainToken));
+    if (Big(resultInt).lte(0)) {
+      throw new InsufficientPoolLiquidityError();
+    }
+    return convertIntAmountToFloat(resultInt, sourceChainToken.decimals).toFixed();
+  }
+
+  async getGasFeeOptions(
+    sourceChainToken: TokenWithChainDetails,
+    destinationChainToken: TokenWithChainDetails,
+    messenger: Messenger
+  ): Promise<GasFeeOptions> {
+    return getGasFeeOptions(
+      sourceChainToken.allbridgeChainId,
+      sourceChainToken.chainType,
+      destinationChainToken.allbridgeChainId,
+      sourceChainToken.decimals,
+      messenger,
+      this.api
+    );
+  }
+
+  getAverageTransferTime(
+    sourceChainToken: TokenWithChainDetails,
+    destinationChainToken: TokenWithChainDetails,
+    messenger: Messenger
+  ): number | null {
+    return (
+      /* eslint-disable-next-line  @typescript-eslint/no-unnecessary-condition */
+      sourceChainToken.transferTime?.[destinationChainToken.chainSymbol]?.[messenger] ?? null
+    );
+  }
+
+  async getPoolInfoByToken(token: TokenWithChainDetails): Promise<PoolInfo> {
+    return await this.api.getPoolInfoByKey({ chainSymbol: token.chainSymbol, poolAddress: token.poolAddress });
+  }
+
+  async refreshPoolInfo(tokens?: TokenWithChainDetails | TokenWithChainDetails[]): Promise<void> {
+    if (tokens) {
+      const tokensArray = tokens instanceof Array ? tokens : [tokens];
+      const poolKeys: PoolKeyObject[] = tokensArray.map((t) => {
+        return { chainSymbol: t.chainSymbol, poolAddress: t.poolAddress };
+      });
+      return this.api.refreshPoolInfo(poolKeys);
+    }
+    return this.api.refreshPoolInfo();
+  }
+
+  aprInPercents(apr: number): string {
+    return aprInPercents(apr);
+  }
+
+  async getExtraGasMaxLimits(
+    sourceChainToken: TokenWithChainDetails,
+    destinationChainToken: TokenWithChainDetails
+  ): Promise<ExtraGasMaxLimitResponse> {
+    return await getExtraGasMaxLimits(sourceChainToken, destinationChainToken, this.api);
+  }
+
+  async getVUsdFromAmount(
+    amount: string,
+    amountFormat: AmountFormat,
+    sourceToken: TokenWithChainDetails
+  ): Promise<AmountFormatted> {
+    validateAmountGtZero(amount);
+    let amountInTokenPrecision;
+    if (amountFormat == AmountFormat.FLOAT) {
+      validateAmountDecimals("amount", amount, sourceToken.decimals);
+      amountInTokenPrecision = convertFloatAmountToInt(amount, sourceToken.decimals).toFixed();
+    } else {
+      amountInTokenPrecision = amount;
+    }
+
+    const vUsdAmount = swapToVUsd(amountInTokenPrecision, sourceToken, await getPoolInfoByToken(this.api, sourceToken));
+    return {
+      [AmountFormat.INT]: vUsdAmount,
+      [AmountFormat.FLOAT]: convertIntAmountToFloat(vUsdAmount, SYSTEM_PRECISION).toFixed(),
+    };
+  }
+
+  async getAmountFromVUsd(vUsdAmount: string, destToken: TokenWithChainDetails): Promise<AmountFormatted> {
+    return this.getAmountFromVUsdFormatted(vUsdAmount, destToken, await getPoolInfoByToken(this.api, destToken));
+  }
+
+  private getAmountFromVUsdFormatted(
+    vUsdAmountInt: string,
+    destToken: TokenWithChainDetails,
+    destPoolInfo: Pick<PoolInfo, "vUsdBalance" | "aValue" | "dValue" | "tokenBalance">
+  ): AmountFormatted {
+    validateAmountGtZero(vUsdAmountInt);
+    const amountResultInt = swapFromVUsd(vUsdAmountInt, destToken, destPoolInfo);
+    if (Big(amountResultInt).lt(0)) {
+      throw new InsufficientPoolLiquidityError();
+    }
+    return {
+      [AmountFormat.INT]: amountResultInt,
+      [AmountFormat.FLOAT]: convertIntAmountToFloat(amountResultInt, destToken.decimals).toFixed(),
+    };
+  }
+
+  async swapAndBridgeFeeCalculation(
+    amountInTokenPrecision: string,
+    sourceToken: TokenWithChainDetails,
+    destToken: TokenWithChainDetails
+  ): Promise<SwapAndBridgeCalculationData> {
+    return swapAndBridgeFeeCalculation(
+      amountInTokenPrecision,
+      {
+        decimals: sourceToken.decimals,
+        feeShare: sourceToken.feeShare,
+        poolInfo: await getPoolInfoByToken(this.api, sourceToken),
+      },
+      {
+        decimals: destToken.decimals,
+        feeShare: destToken.feeShare,
+        poolInfo: await getPoolInfoByToken(this.api, destToken),
+      }
+    );
+  }
+
+  async swapAndBridgeFeeCalculationReverse(
+    amountInTokenPrecision: string,
+    sourceToken: TokenWithChainDetails,
+    destToken: TokenWithChainDetails
+  ): Promise<SwapAndBridgeCalculationData> {
+    const result = swapAndBridgeFeeCalculationReverse(
+      amountInTokenPrecision,
+      {
+        decimals: sourceToken.decimals,
+        feeShare: sourceToken.feeShare,
+        poolInfo: await getPoolInfoByToken(this.api, sourceToken),
+      },
+      {
+        decimals: destToken.decimals,
+        feeShare: destToken.feeShare,
+        poolInfo: await getPoolInfoByToken(this.api, destToken),
+      }
+    );
+    const newAmount = result.swapFromVUsdCalcResult.amountIncludingCommissionInTokenPrecision;
+    if (Big(newAmount).lt(0)) {
+      throw new InsufficientPoolLiquidityError();
+    }
+    return result;
+  }
+
+  async getSendAmountDetails(
+    amount: string,
+    amountFormat: AmountFormat,
+    sourceToken: TokenWithChainDetails,
+    destToken: TokenWithChainDetails
+  ): Promise<SendAmountDetails> {
+    validateAmountGtZero(amount);
+    let amountInTokenPrecision;
+    if (amountFormat == AmountFormat.FLOAT) {
+      validateAmountDecimals("amount", amount, sourceToken.decimals);
+      amountInTokenPrecision = convertFloatAmountToInt(amount, sourceToken.decimals).toFixed();
+    } else {
+      amountInTokenPrecision = amount;
+    }
+
+    return getSendAmountDetails(
+      amountInTokenPrecision,
+      sourceToken,
+      await getPoolInfoByToken(this.api, sourceToken),
+      destToken,
+      await getPoolInfoByToken(this.api, destToken)
+    );
+  }
+}
diff --git a/src/services/liquidity-pool/evm/index.ts b/src/services/liquidity-pool/evm/index.ts
index dc47f612..0f661483 100644
--- a/src/services/liquidity-pool/evm/index.ts
+++ b/src/services/liquidity-pool/evm/index.ts
@@ -3,8 +3,8 @@ import { AbiItem } from "web3-utils";
 import { ChainType } from "../../../chains";
 import { AllbridgeCoreClient } from "../../../client/core-api";
 import { PoolInfo, TokenWithChainDetails } from "../../../tokens-info";
-import { promiseWithTimeout } from "../../../utils";
 import { calculatePoolInfoImbalance } from "../../../utils/calculation";
+import { promiseWithTimeout } from "../../../utils/utils";
 import { RawTransaction } from "../../models";
 import PoolAbi from "../../models/abi/Pool.json";
 import { Pool as PoolContract } from "../../models/abi/types/Pool";
diff --git a/src/services/liquidity-pool/index.ts b/src/services/liquidity-pool/index.ts
index 81eeff04..0c2187ee 100644
--- a/src/services/liquidity-pool/index.ts
+++ b/src/services/liquidity-pool/index.ts
@@ -2,13 +2,14 @@ import { Big } from "big.js";
 // @ts-expect-error import tron
 import TronWeb from "tronweb";
 import Web3 from "web3";
+import { NodeRpcUrlsConfig } from "..";
 import { chainProperties, ChainSymbol, ChainType } from "../../chains";
 import { AllbridgeCoreClient } from "../../client/core-api";
-import { MethodNotSupportedError, NodeRpcUrlsConfig } from "../../index";
+import { AllbridgeCoreSdkOptions } from "../../index";
 import { PoolInfo, TokenWithChainDetails } from "../../tokens-info";
-import { validateAmountDecimals, validateAmountGtZero } from "../../utils";
 import { convertIntAmountToFloat, fromSystemPrecision } from "../../utils/calculation";
 import { SYSTEM_PRECISION } from "../../utils/calculation/constants";
+import { validateAmountDecimals, validateAmountGtZero } from "../../utils/utils";
 import { Provider, TransactionResponse } from "../models";
 import { TokenService } from "../token";
 import { depositAmountToVUsd, vUsdToWithdrawalAmount } from "../utils/calculation";
@@ -16,6 +17,7 @@ import { EvmPoolService } from "./evm";
 import { ApproveParams, ChainPoolService, CheckAllowanceParams, GetAllowanceParams, UserBalanceInfo } from "./models";
 import { DefaultRawPoolTransactionBuilder, RawPoolTransactionBuilder } from "./raw-pool-transaction-builder";
 import { SolanaPoolService } from "./sol";
+import { SrbPoolService } from "./srb";
 import { TronPoolService } from "./trx";
 
 export interface LiquidityPoolService {
@@ -114,9 +116,10 @@ export class DefaultLiquidityPoolService implements LiquidityPoolService {
   constructor(
     private api: AllbridgeCoreClient,
     private nodeRpcUrlsConfig: NodeRpcUrlsConfig,
+    private params: AllbridgeCoreSdkOptions,
     private tokenService: TokenService
   ) {
-    this.rawTxBuilder = new DefaultRawPoolTransactionBuilder(api, nodeRpcUrlsConfig, tokenService);
+    this.rawTxBuilder = new DefaultRawPoolTransactionBuilder(api, nodeRpcUrlsConfig, this.params, tokenService);
   }
 
   async getAllowance(a: Provider | GetAllowanceParams, b?: GetAllowanceParams): Promise<string> {
@@ -176,10 +179,13 @@ export class DefaultLiquidityPoolService implements LiquidityPoolService {
     token: TokenWithChainDetails,
     provider?: Provider
   ): Promise<UserBalanceInfo> {
-    return getChainPoolService(token.chainSymbol, this.api, this.nodeRpcUrlsConfig, provider).getUserBalanceInfo(
-      accountAddress,
-      token
-    );
+    return getChainPoolService(
+      token.chainSymbol,
+      this.api,
+      this.nodeRpcUrlsConfig,
+      this.params,
+      provider
+    ).getUserBalanceInfo(accountAddress, token);
   }
 
   async getPoolInfoFromChain(token: TokenWithChainDetails, provider?: Provider): Promise<PoolInfo> {
@@ -187,6 +193,7 @@ export class DefaultLiquidityPoolService implements LiquidityPoolService {
       token.chainSymbol,
       this.api,
       this.nodeRpcUrlsConfig,
+      this.params,
       provider
     ).getPoolInfoFromChain(token);
   }
@@ -196,6 +203,7 @@ export function getChainPoolService(
   chainSymbol: ChainSymbol,
   api: AllbridgeCoreClient,
   nodeRpcUrlsConfig: NodeRpcUrlsConfig,
+  params: AllbridgeCoreSdkOptions,
   provider?: Provider
 ): ChainPoolService {
   switch (chainProperties[chainSymbol].chainType) {
@@ -220,7 +228,7 @@ export function getChainPoolService(
       return new SolanaPoolService(nodeRpcUrl, api);
     }
     case ChainType.SRB: {
-      throw new MethodNotSupportedError("Soroban does not support yet");
+      return new SrbPoolService(nodeRpcUrlsConfig, params, api);
     }
   }
 }
diff --git a/src/services/liquidity-pool/raw-pool-transaction-builder.ts b/src/services/liquidity-pool/raw-pool-transaction-builder.ts
index f2087d24..d426f564 100644
--- a/src/services/liquidity-pool/raw-pool-transaction-builder.ts
+++ b/src/services/liquidity-pool/raw-pool-transaction-builder.ts
@@ -1,8 +1,9 @@
+import { NodeRpcUrlsConfig } from "..";
 import { AllbridgeCoreClient } from "../../client/core-api";
-import { NodeRpcUrlsConfig } from "../../index";
-import { validateAmountDecimals, validateAmountGtZero } from "../../utils";
+import { AllbridgeCoreSdkOptions } from "../../index";
 import { convertFloatAmountToInt } from "../../utils/calculation";
 import { SYSTEM_PRECISION } from "../../utils/calculation/constants";
+import { validateAmountDecimals, validateAmountGtZero } from "../../utils/utils";
 import { Provider, RawTransaction } from "../models";
 import { TokenService } from "../token";
 import { ApproveParams, LiquidityPoolsParams, LiquidityPoolsParamsWithAmount } from "./models";
@@ -47,6 +48,7 @@ export class DefaultRawPoolTransactionBuilder implements RawPoolTransactionBuild
   constructor(
     private api: AllbridgeCoreClient,
     private nodeRpcUrlsConfig: NodeRpcUrlsConfig,
+    private params: AllbridgeCoreSdkOptions,
     private tokenService: TokenService
   ) {}
 
@@ -78,6 +80,7 @@ export class DefaultRawPoolTransactionBuilder implements RawPoolTransactionBuild
       params.token.chainSymbol,
       this.api,
       this.nodeRpcUrlsConfig,
+      this.params,
       provider
     ).buildRawTransactionDeposit(params);
   }
@@ -90,6 +93,7 @@ export class DefaultRawPoolTransactionBuilder implements RawPoolTransactionBuild
       params.token.chainSymbol,
       this.api,
       this.nodeRpcUrlsConfig,
+      this.params,
       provider
     ).buildRawTransactionWithdraw(params);
   }
@@ -99,6 +103,7 @@ export class DefaultRawPoolTransactionBuilder implements RawPoolTransactionBuild
       params.token.chainSymbol,
       this.api,
       this.nodeRpcUrlsConfig,
+      this.params,
       provider
     ).buildRawTransactionClaimRewards(params);
   }
diff --git a/src/services/liquidity-pool/srb/index.ts b/src/services/liquidity-pool/srb/index.ts
new file mode 100644
index 00000000..ddf80ce0
--- /dev/null
+++ b/src/services/liquidity-pool/srb/index.ts
@@ -0,0 +1,96 @@
+import { Address } from "soroban-client";
+import { ChainSymbol, ChainType } from "../../../chains";
+import { AllbridgeCoreClient } from "../../../client/core-api";
+import { AllbridgeCoreSdkOptions } from "../../../index";
+import {
+  LiquidityPoolsParams,
+  LiquidityPoolsParamsWithAmount,
+  PoolInfo,
+  SdkError,
+  TokenWithChainDetails,
+  UserBalanceInfo,
+} from "../../../models";
+import { calculatePoolInfoImbalance } from "../../../utils/calculation";
+import { NodeRpcUrlsConfig } from "../../index";
+import { RawTransaction } from "../../models";
+import { ClassOptions } from "../../models/srb/method-options";
+import { PoolContract } from "../../models/srb/pool";
+import { ChainPoolService, UserBalance } from "../models";
+
+export class SrbPoolService extends ChainPoolService {
+  chainType: ChainType.SRB = ChainType.SRB;
+  private P = 48;
+
+  constructor(
+    readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,
+    readonly params: AllbridgeCoreSdkOptions,
+    readonly api: AllbridgeCoreClient
+  ) {
+    super();
+  }
+
+  async getUserBalanceInfo(accountAddress: string, token: TokenWithChainDetails): Promise<UserBalanceInfo> {
+    const poolContract = this.getContract(token.poolAddress);
+    const userDeposit = (await poolContract.getUserDeposit({ user: Address.fromString(accountAddress) }))?.unwrap();
+    if (!userDeposit) {
+      throw new SdkError();
+    }
+    return new UserBalance({
+      lpAmount: userDeposit.lp_amount.toString(),
+      rewardDebt: userDeposit.reward_debt.toString(),
+    });
+  }
+
+  async getPoolInfoFromChain(token: TokenWithChainDetails): Promise<PoolInfo> {
+    const poolContract = this.getContract(token.poolAddress);
+    const pool = (await poolContract.getPool())?.unwrap();
+    if (!pool) {
+      throw new SdkError();
+    }
+    return {
+      aValue: pool.a.toString(),
+      accRewardPerShareP: pool.acc_reward_per_share_p.toString(),
+      dValue: pool.d.toString(),
+      tokenBalance: pool.token_balance.toString(),
+      p: this.P,
+      totalLpAmount: pool.total_lp_amount.toString(),
+      vUsdBalance: pool.v_usd_balance.toString(),
+      imbalance: calculatePoolInfoImbalance({
+        tokenBalance: pool.token_balance.toString(),
+        vUsdBalance: pool.v_usd_balance.toString(),
+      }),
+    };
+  }
+
+  async buildRawTransactionDeposit(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction> {
+    const poolContract = this.getContract(params.token.poolAddress);
+    return await poolContract.deposit({
+      sender: Address.fromString(params.accountAddress),
+      amount: BigInt(params.amount),
+    });
+  }
+
+  async buildRawTransactionWithdraw(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction> {
+    const poolContract = this.getContract(params.token.poolAddress);
+    return await poolContract.withdraw({
+      sender: Address.fromString(params.accountAddress),
+      amount_lp: BigInt(params.amount),
+    });
+  }
+
+  async buildRawTransactionClaimRewards(params: LiquidityPoolsParams): Promise<RawTransaction> {
+    const poolContract = this.getContract(params.token.poolAddress);
+    return await poolContract.claimRewards({
+      sender: Address.fromString(params.accountAddress),
+    });
+  }
+
+  private getContract(address: string): PoolContract {
+    const config: ClassOptions = {
+      contractId: address,
+      networkPassphrase: this.params.sorobanNetworkPassphrase,
+      rpcUrl: this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SRB),
+    };
+    return new PoolContract(config);
+  }
+}
diff --git a/src/services/models/index.ts b/src/services/models/index.ts
index 89155b31..0b5758bf 100644
--- a/src/services/models/index.ts
+++ b/src/services/models/index.ts
@@ -10,7 +10,13 @@ import { TransactionConfig } from "web3-core";
  */
 export type Provider = Web3 | TronWeb;
 
-export type RawTransaction = Object | VersionedTransaction | TransactionConfig;
+/**
+ * EVM TransactionConfig
+ * Solana VersionedTransaction
+ * Tron Object
+ * Soroban string
+ */
+export type RawTransaction = Object | VersionedTransaction | TransactionConfig | string;
 
 export interface SmartContractMethodParameter {
   type: string;
diff --git a/src/services/models/srb/bridge.ts b/src/services/models/srb/bridge.ts
new file mode 100644
index 00000000..aca4d7e4
--- /dev/null
+++ b/src/services/models/srb/bridge.ts
@@ -0,0 +1,259 @@
+import { Address, ContractSpec } from "soroban-client";
+import { SdkError } from "../../../exceptions";
+import { xdrTxBuilder } from "../../utils/srb/tx-builder";
+import type { ClassOptions } from "./method-options";
+
+export * from "../../utils/srb/tx-builder";
+export * from "./method-options";
+
+export type u32 = number;
+export type i32 = number;
+export type u64 = bigint;
+export type i64 = bigint;
+export type u128 = bigint;
+export type i128 = bigint;
+export type u256 = bigint;
+export type i256 = bigint;
+export type Option<T> = T | undefined;
+export type Typepoint = bigint;
+export type Duration = bigint;
+export { Address };
+
+/// Error interface containing the error message
+export interface Error_ {
+  message: string;
+}
+
+export interface Result<T, E extends Error_> {
+  unwrap(): T;
+
+  unwrapErr(): E;
+
+  isOk(): boolean;
+
+  isErr(): boolean;
+}
+
+export class Ok<T, E extends Error_ = Error_> implements Result<T, E> {
+  constructor(readonly value: T) {}
+
+  unwrapErr(): E {
+    throw new SdkError("No error");
+  }
+
+  unwrap(): T {
+    return this.value;
+  }
+
+  isOk(): boolean {
+    return true;
+  }
+
+  isErr(): boolean {
+    return !this.isOk();
+  }
+}
+
+export class Err<E extends Error_ = Error_> implements Result<any, E> {
+  constructor(readonly error: E) {}
+
+  unwrapErr(): E {
+    return this.error;
+  }
+
+  unwrap(): never {
+    throw new SdkError(this.error.message);
+  }
+
+  isOk(): boolean {
+    return false;
+  }
+
+  isErr(): boolean {
+    return !this.isOk();
+  }
+}
+
+export const networks = {
+  futurenet: {
+    networkPassphrase: "Test SDF Future Network ; October 2022",
+    contractId: "CAXKSIMIIFKKHAQKM32QD4AYEXVLBYIQVUKPRAAUV5HNLTLXHSROM4AV",
+  },
+} as const;
+
+export interface Bridge {
+  /**
+   * precomputed values of the scaling factor required for paying the bridging fee with stable tokens
+   */
+  bridging_fee_conversion_factor: Map<Address, u128>;
+  can_swap: boolean;
+  /**
+   * precomputed values to divide by to change the precision from the Gas Oracle precision to the token precision
+   */
+  from_gas_oracle_factor: Map<Address, u128>;
+  messenger: Address;
+  pools: Map<Buffer, Address>;
+  rebalancer: Address;
+}
+
+const Errors = {
+  0: { message: "" },
+  1: { message: "" },
+  2: { message: "" },
+  3: { message: "" },
+  4: { message: "" },
+  5: { message: "" },
+  6: { message: "" },
+  7: { message: "" },
+  8: { message: "" },
+  9: { message: "" },
+  103: { message: "" },
+  104: { message: "" },
+  105: { message: "" },
+  106: { message: "" },
+  107: { message: "" },
+  108: { message: "" },
+  109: { message: "" },
+  203: { message: "" },
+  204: { message: "" },
+  205: { message: "" },
+  206: { message: "" },
+  207: { message: "" },
+  208: { message: "" },
+  209: { message: "" },
+  210: { message: "" },
+  211: { message: "" },
+  212: { message: "" },
+  214: { message: "" },
+  215: { message: "" },
+  216: { message: "" },
+  217: { message: "" },
+  218: { message: "" },
+  300: { message: "" },
+  301: { message: "" },
+  302: { message: "" },
+  303: { message: "" },
+  400: { message: "" },
+};
+
+export class BridgeContract {
+  spec: ContractSpec;
+
+  constructor(public readonly options: ClassOptions) {
+    this.spec = new ContractSpec([
+      "AAAAAAAAAAAAAAAKaW5pdGlhbGl6ZQAAAAAABAAAAAAAAAAFYWRtaW4AAAAAAAATAAAAAAAAAAltZXNzZW5nZXIAAAAAAAATAAAAAAAAAApnYXNfb3JhY2xlAAAAAAATAAAAAAAAAAxuYXRpdmVfdG9rZW4AAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=",
+      "AAAAAAAAAAAAAAAPc3dhcF9hbmRfYnJpZGdlAAAAAAkAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAFdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAlyZWNpcGllbnQAAAAAAAPuAAAAIAAAAAAAAAAUZGVzdGluYXRpb25fY2hhaW5faWQAAAAEAAAAAAAAAA1yZWNlaXZlX3Rva2VuAAAAAAAD7gAAACAAAAAAAAAABW5vbmNlAAAAAAAADAAAAAAAAAAKZ2FzX2Ftb3VudAAAAAAACgAAAAAAAAAQZmVlX3Rva2VuX2Ftb3VudAAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==",
+      "AAAAAAAAAAAAAAAOcmVjZWl2ZV90b2tlbnMAAAAAAAkAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAlyZWNpcGllbnQAAAAAAAATAAAAAAAAAA9zb3VyY2VfY2hhaW5faWQAAAAABAAAAAAAAAANcmVjZWl2ZV90b2tlbgAAAAAAA+4AAAAgAAAAAAAAAAVub25jZQAAAAAAAAwAAAAAAAAAEnJlY2VpdmVfYW1vdW50X21pbgAAAAAACgAAAAAAAAAJY2xhaW1hYmxlAAAAAAAAAQAAAAAAAAAJZXh0cmFfZ2FzAAAAAAAD6AAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==",
+      "AAAAAAAAAAAAAAAEc3dhcAAAAAcAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAV0b2tlbgAAAAAAA+4AAAAgAAAAAAAAAA1yZWNlaXZlX3Rva2VuAAAAAAAD7gAAACAAAAAAAAAACXJlY2lwaWVudAAAAAAAABMAAAAAAAAAEnJlY2VpdmVfYW1vdW50X21pbgAAAAAACgAAAAAAAAAJY2xhaW1hYmxlAAAAAAAAAQAAAAEAAAPpAAAD7QAAAAAAAAAD",
+      "AAAAAAAAAAAAAAAJc3RvcF9zd2FwAAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD",
+      "AAAAAAAAAAAAAAAKc3RhcnRfc3dhcAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD",
+      "AAAAAAAAAAAAAAAOc2V0X2dhc19vcmFjbGUAAAAAAAEAAAAAAAAAC25ld19hZGRyZXNzAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==",
+      "AAAAAAAAAAAAAAASc2V0X3N0b3BfYXV0aG9yaXR5AAAAAAABAAAAAAAAAA5zdG9wX2F1dGhvcml0eQAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD",
+      "AAAAAAAAAAAAAAAOc2V0X3JlYmFsYW5jZXIAAAAAAAEAAAAAAAAACnJlYmFsYW5jZXIAAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==",
+      "AAAAAAAAAAAAAAANc2V0X21lc3NlbmdlcgAAAAAAAAEAAAAAAAAACW1lc3NlbmdlcgAAAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==",
+      "AAAAAAAAAAAAAAANc2V0X2dhc191c2FnZQAAAAAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAAJZ2FzX3VzYWdlAAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD",
+      "AAAAAAAAAAAAAAAPcmVnaXN0ZXJfYnJpZGdlAAAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAAOYnJpZGdlX2FkZHJlc3MAAAAAA+4AAAAgAAAAAQAAA+kAAAPtAAAAAAAAAAM=",
+      "AAAAAAAAAAAAAAAQYWRkX2JyaWRnZV90b2tlbgAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAANdG9rZW5fYWRkcmVzcwAAAAAAA+4AAAAgAAAAAQAAA+kAAAPtAAAAAAAAAAM=",
+      "AAAAAAAAAAAAAAATcmVtb3ZlX2JyaWRnZV90b2tlbgAAAAACAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAPuAAAAIAAAAAEAAAPpAAAD7QAAAAAAAAAD",
+      "AAAAAAAAAAAAAAAIYWRkX3Bvb2wAAAACAAAAAAAAAARwb29sAAAAEwAAAAAAAAAFdG9rZW4AAAAAAAPuAAAAIAAAAAEAAAPpAAAD7QAAAAAAAAAD",
+      "AAAAAAAAAAAAAAATd2l0aGRyYXdfZ2FzX3Rva2VucwAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABmFtb3VudAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD",
+      "AAAAAAAAAAAAAAAfd2l0aGRyYXdfYnJpZGdpbmdfZmVlX2luX3Rva2VucwAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=",
+      "AAAAAAAAAAAAAAAVaGFzX3Byb2Nlc3NlZF9tZXNzYWdlAAAAAAAAAQAAAAAAAAAHbWVzc2FnZQAAAAPuAAAAIAAAAAEAAAPpAAAAAQAAAAM=",
+      "AAAAAAAAAAAAAAAUaGFzX3JlY2VpdmVkX21lc3NhZ2UAAAABAAAAAAAAAAdtZXNzYWdlAAAAA+4AAAAgAAAAAQAAA+kAAAABAAAAAw==",
+      "AAAAAAAAAAAAAAAQZ2V0X3Bvb2xfYWRkcmVzcwAAAAEAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAPuAAAAIAAAAAEAAAPpAAAAEwAAAAM=",
+      "AAAAAAAAAAAAAAAKZ2V0X2NvbmZpZwAAAAAAAAAAAAEAAAPpAAAH0AAAAAZCcmlkZ2UAAAAAAAM=",
+      "AAAAAAAAAAAAAAASZ2V0X3N0b3BfYXV0aG9yaXR5AAAAAAAAAAAAAQAAA+kAAAATAAAAAw==",
+      "AAAAAAAAAAAAAAAUZ2V0X3RyYW5zYWN0aW9uX2Nvc3QAAAABAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAABAAAD6QAAAAoAAAAD",
+      "AAAAAAAAAAAAAAANZ2V0X2dhc191c2FnZQAAAAAAAAEAAAAAAAAACGNoYWluX2lkAAAABAAAAAEAAAPpAAAACgAAAAM=",
+      "AAAAAAAAAAAAAAAJZ2V0X2FkbWluAAAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=",
+      "AAAAAAAAAAAAAAAOZ2V0X2dhc19vcmFjbGUAAAAAAAAAAAABAAAD6QAAABMAAAAD",
+      "AAAAAAAAAAAAAAASZ2V0X2Fub3RoZXJfYnJpZGdlAAAAAAABAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAABAAAD6QAAB9AAAAANQW5vdGhlckJyaWRnZQAAAAAAAAM=",
+      "AAAAAQAAAAAAAAAAAAAAB1N3YXBwZWQAAAAABgAAAAAAAAAOcmVjZWl2ZV9hbW91bnQAAAAAAAoAAAAAAAAADXJlY2VpdmVfdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAJcmVjaXBpZW50AAAAAAAAEwAAAAAAAAALc2VuZF9hbW91bnQAAAAACgAAAAAAAAAKc2VuZF90b2tlbgAAAAAD7gAAACAAAAAAAAAABnNlbmRlcgAAAAAAEw==",
+      "AAAAAQAAAAAAAAAAAAAAClRva2Vuc1NlbnQAAAAAAAUAAAAAAAAABmFtb3VudAAAAAAACgAAAAAAAAAUZGVzdGluYXRpb25fY2hhaW5faWQAAAAEAAAAAAAAAAVub25jZQAAAAAAAAwAAAAAAAAADXJlY2VpdmVfdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAJcmVjaXBpZW50AAAAAAAD7gAAACA=",
+      "AAAAAQAAAAAAAAAAAAAADlRva2Vuc1JlY2VpdmVkAAAAAAAFAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAACWNsYWltYWJsZQAAAAAAAAEAAAAAAAAAB21lc3NhZ2UAAAAD7gAAACAAAAAAAAAABW5vbmNlAAAAAAAADAAAAAAAAAAJcmVjaXBpZW50AAAAAAAD7gAAACA=",
+      "AAAAAQAAAAAAAAAAAAAAClJlY2VpdmVGZWUAAAAAAAMAAAAAAAAAF2JyaWRnZV90cmFuc2FjdGlvbl9jb3N0AAAAAAoAAAAAAAAACWV4dHJhX2dhcwAAAAAAAAoAAAAAAAAAGG1lc3NhZ2VfdHJhbnNhY3Rpb25fY29zdAAAAAo=",
+      "AAAAAQAAAAAAAAAAAAAAFUJyaWRnaW5nRmVlRnJvbVRva2VucwAAAAAAAAIAAAAAAAAAEGZlZV90b2tlbl9hbW91bnQAAAAKAAAAAAAAAANnYXMAAAAACg==",
+      "AAAAAQAAAAAAAAAAAAAADUFub3RoZXJCcmlkZ2UAAAAAAAACAAAAAAAAAAdhZGRyZXNzAAAAA+4AAAAgAAAAAAAAAAZ0b2tlbnMAAAAAA+wAAAPuAAAAIAAAAAE=",
+      "AAAAAQAAAAAAAAAAAAAABkJyaWRnZQAAAAAABgAAAGBwcmVjb21wdXRlZCB2YWx1ZXMgb2YgdGhlIHNjYWxpbmcgZmFjdG9yIHJlcXVpcmVkIGZvciBwYXlpbmcgdGhlIGJyaWRnaW5nIGZlZSB3aXRoIHN0YWJsZSB0b2tlbnMAAAAeYnJpZGdpbmdfZmVlX2NvbnZlcnNpb25fZmFjdG9yAAAAAAPsAAAAEwAAAAoAAAAAAAAACGNhbl9zd2FwAAAAAQAAAGxwcmVjb21wdXRlZCB2YWx1ZXMgdG8gZGl2aWRlIGJ5IHRvIGNoYW5nZSB0aGUgcHJlY2lzaW9uIGZyb20gdGhlIEdhcyBPcmFjbGUgcHJlY2lzaW9uIHRvIHRoZSB0b2tlbiBwcmVjaXNpb24AAAAWZnJvbV9nYXNfb3JhY2xlX2ZhY3RvcgAAAAAD7AAAABMAAAAKAAAAAAAAAAltZXNzZW5nZXIAAAAAAAATAAAAAAAAAAVwb29scwAAAAAAA+wAAAPuAAAAIAAAABMAAAAAAAAACnJlYmFsYW5jZXIAAAAAABM=",
+      "AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAwAAAAEAAAAAAAAAC090aGVyQnJpZGdlAAAAAAEAAAAEAAAAAQAAAAAAAAALU2VudE1lc3NhZ2UAAAAAAQAAA+4AAAAgAAAAAQAAAAAAAAAPUmVjZWl2ZWRNZXNzYWdlAAAAAAEAAAPuAAAAIA==",
+      "AAAAAQAAAAAAAAAAAAAABUFkbWluAAAAAAAAAQAAAAAAAAABMAAAAAAAABM=",
+      "AAAAAQAAAAAAAAAAAAAAEEdhc09yYWNsZUFkZHJlc3MAAAABAAAAAAAAAAEwAAAAAAAAEw==",
+      "AAAAAQAAAAAAAAAAAAAACEdhc1VzYWdlAAAAAQAAAAAAAAABMAAAAAAAA+wAAAAEAAAACg==",
+      "AAAAAQAAAAAAAAAAAAAAC05hdGl2ZVRva2VuAAAAAAEAAAAAAAAAATAAAAAAAAAT",
+      "AAAAAQAAAAAAAAAAAAAADVN0b3BBdXRob3JpdHkAAAAAAAABAAAAAAAAAAEwAAAAAAAAEw==",
+      "AAAABAAAAAAAAAAAAAAABUVycm9yAAAAAAAAJQAAAAAAAAANVW5pbXBsZW1lbnRlZAAAAAAAAAAAAAAAAAAAC0luaXRpYWxpemVkAAAAAAEAAAAAAAAADVVuaW5pdGlhbGl6ZWQAAAAAAAACAAAAAAAAAAxVbmF1dGhvcml6ZWQAAAADAAAAAAAAAApJbnZhbGlkQXJnAAAAAAAEAAAAAAAAAA5JbnZhbGlkQ2hhaW5JZAAAAAAABQAAAAAAAAATSW52YWxpZE90aGVyQ2hhaW5JZAAAAAAGAAAAAAAAAA5HYXNVc2FnZU5vdFNldAAAAAAABwAAAAAAAAANQnJva2VuQWRkcmVzcwAAAAAAAAgAAAAAAAAACE5vdEZvdW5kAAAACQAAAAAAAAAKWmVyb0Ftb3VudAAAAAAAZwAAAAAAAAAMUG9vbE92ZXJmbG93AAAAaAAAAAAAAAALWmVyb0NoYW5nZXMAAAAAaQAAAAAAAAARUmVzZXJ2ZXNFeGhhdXN0ZWQAAAAAAABqAAAAAAAAABpJbnN1ZmZpY2llbnRSZWNlaXZlZEFtb3VudAAAAAAAawAAAAAAAAAUQmFsYW5jZVJhdGlvRXhjZWVkZWQAAABsAAAAAAAAAAlGb3JiaWRkZW4AAAAAAABtAAAAAAAAABlVbmF1dGhvcml6ZWRTdG9wQXV0aG9yaXR5AAAAAAAAywAAAAAAAAAOU3dhcFByb2hpYml0ZWQAAAAAAMwAAAAAAAAAEkFtb3VudFRvb0xvd0ZvckZlZQAAAAAAzQAAAAAAAAAWQnJpZGdlVG9UaGVaZXJvQWRkcmVzcwAAAAAAzgAAAAAAAAAORW1wdHlSZWNpcGllbnQAAAAAAM8AAAAAAAAAE1NvdXJjZU5vdFJlZ2lzdGVyZWQAAAAA0AAAAAAAAAAVV3JvbmdEZXN0aW5hdGlvbkNoYWluAAAAAAAA0QAAAAAAAAATVW5rbm93bkFub3RoZXJDaGFpbgAAAADSAAAAAAAAABFUb2tlbnNBbHJlYWR5U2VudAAAAAAAANMAAAAAAAAAEE1lc3NhZ2VQcm9jZXNzZWQAAADUAAAAAAAAAAxOb3RFbm91Z2hGZWUAAADWAAAAAAAAAAlOb01lc3NhZ2UAAAAAAADXAAAAAAAAAA1Ob1JlY2VpdmVQb29sAAAAAAAA2AAAAAAAAAAGTm9Qb29sAAAAAADZAAAAAAAAABNVbmtub3duQW5vdGhlclRva2VuAAAAANoAAAAAAAAAD1dyb25nQnl0ZUxlbmd0aAAAAAEsAAAAAAAAAApIYXNNZXNzYWdlAAAAAAEtAAAAAAAAABdJbnZhbGlkUHJpbWFyeVNpZ25hdHVyZQAAAAEuAAAAAAAAABlJbnZhbGlkU2Vjb25kYXJ5U2lnbmF0dXJlAAAAAAABLwAAAAAAAAARTm9HYXNEYXRhRm9yQ2hhaW4AAAAAAAGQ",
+    ]);
+  }
+
+  async swapAndBridge({
+    sender,
+    token,
+    amount,
+    recipient,
+    destination_chain_id,
+    receive_token,
+    nonce,
+    gas_amount,
+    fee_token_amount,
+  }: {
+    sender: Address;
+    token: Buffer;
+    amount: u128;
+    recipient: Buffer;
+    destination_chain_id: u32;
+    receive_token: Buffer;
+    nonce: u256;
+    gas_amount: u128;
+    fee_token_amount: u128;
+  }): Promise<string> {
+    return await xdrTxBuilder({
+      sender,
+      method: "swap_and_bridge",
+      args: this.spec.funcArgsToScVals("swap_and_bridge", {
+        sender,
+        token,
+        amount,
+        recipient,
+        destination_chain_id,
+        receive_token,
+        nonce,
+        gas_amount,
+        fee_token_amount,
+      }),
+      ...this.options,
+    });
+  }
+
+  async swap({
+    sender,
+    amount,
+    token,
+    receive_token,
+    recipient,
+    receive_amount_min,
+    claimable,
+  }: {
+    sender: Address;
+    amount: u128;
+    token: Buffer;
+    receive_token: Buffer;
+    recipient: Address;
+    receive_amount_min: u128;
+    claimable: boolean;
+  }) {
+    return await xdrTxBuilder({
+      sender,
+      method: "swap",
+      args: this.spec.funcArgsToScVals("swap", {
+        sender,
+        amount,
+        token,
+        receive_token,
+        recipient,
+        receive_amount_min,
+        claimable,
+      }),
+      ...this.options,
+    });
+  }
+}
diff --git a/src/services/models/srb/method-options.ts b/src/services/models/srb/method-options.ts
new file mode 100644
index 00000000..a932f1b4
--- /dev/null
+++ b/src/services/models/srb/method-options.ts
@@ -0,0 +1,58 @@
+// defined this way so typeahead shows full union, not named alias
+let responseTypes: "simulated" | "full" | undefined;
+export type ResponseTypes = typeof responseTypes;
+
+export type XDR_BASE64 = string;
+
+export interface Wallet {
+  isConnected: () => Promise<boolean>;
+  isAllowed: () => Promise<boolean>;
+  getUserInfo: () => Promise<{ publicKey?: string }>;
+  signTransaction: (
+    tx: XDR_BASE64,
+    opts?: {
+      network?: string;
+      networkPassphrase?: string;
+      accountToSign?: string;
+    }
+  ) => Promise<XDR_BASE64>;
+}
+
+export interface ClassOptions {
+  contractId: string;
+  networkPassphrase: string;
+  rpcUrl: string;
+  /**
+   * A Wallet interface, such as Freighter, that has the methods `isConnected`, `isAllowed`, `getUserInfo`, and `signTransaction`. If not provided, will attempt to import and use Freighter. Example:
+   *
+   * @example
+   * ```ts
+   * import freighter from "@stellar/freighter-api";
+   * import { Contract } from "tmp";
+   * const contract = new Contract({
+   *   …,
+   *   wallet: freighter,
+   * })
+   * ```
+   */
+  wallet?: Wallet;
+}
+
+export interface MethodOptions<R extends ResponseTypes> {
+  /**
+   * The fee to pay for the transaction. Default: 100.
+   */
+  fee?: number;
+  /**
+   * What type of response to return.
+   *
+   *   - `undefined`, the default,  parses the returned XDR as `{RETURN_TYPE}`. Runs preflight, checks to see if auth/signing is required, and sends the transaction if so. If there's no error and `secondsToWait` is positive, awaits the finalized transaction.
+   *   - `'simulated'` will only simulate/preflight the transaction, even if it's a change/set method that requires auth/signing. Returns full preflight info.
+   *   - `'full'` return the full RPC response, meaning either 1. the preflight info, if it's a view/read method that doesn't require auth/signing, or 2. the `sendTransaction` response, if there's a problem with sending the transaction or if you set `secondsToWait` to 0, or 3. the `getTransaction` response, if it's a change method with no `sendTransaction` errors and a positive `secondsToWait`.
+   */
+  responseType?: R;
+  /**
+   * If the simulation shows that this invocation requires auth/signing, `invoke` will wait `secondsToWait` seconds for the transaction to complete before giving up and returning the incomplete {@link SorobanClient.SorobanRpc.GetTransactionResponse} results (or attempting to parse their probably-missing XDR with `parseResultXdr`, depending on `responseType`). Set this to `0` to skip waiting altogether, which will return you {@link SorobanClient.SorobanRpc.SendTransactionResponse} more quickly, before the transaction has time to be included in the ledger. Default: 10.
+   */
+  secondsToWait?: number;
+}
diff --git a/src/services/models/srb/pool.ts b/src/services/models/srb/pool.ts
new file mode 100644
index 00000000..51ac374f
--- /dev/null
+++ b/src/services/models/srb/pool.ts
@@ -0,0 +1,318 @@
+import { Address, ContractSpec } from "soroban-client";
+import { SdkError } from "../../../exceptions";
+import { invoke } from "../../utils/srb/invoke";
+import { xdrTxBuilder } from "../../utils/srb/tx-builder";
+import type { ClassOptions } from "./method-options";
+
+export * from "../../utils/srb/invoke";
+export * from "./method-options";
+
+export type u32 = number;
+export type i32 = number;
+export type u64 = bigint;
+export type i64 = bigint;
+export type u128 = bigint;
+export type i128 = bigint;
+export type u256 = bigint;
+export type i256 = bigint;
+export type Option<T> = T | undefined;
+export type Typepoint = bigint;
+export type Duration = bigint;
+export { Address };
+
+/// Error interface containing the error message
+export interface Error_ {
+  message: string;
+}
+
+export interface Result<T, E extends Error_> {
+  unwrap(): T;
+
+  unwrapErr(): E;
+
+  isOk(): boolean;
+
+  isErr(): boolean;
+}
+
+export class Ok<T, E extends Error_ = Error_> implements Result<T, E> {
+  constructor(readonly value: T) {}
+
+  unwrapErr(): E {
+    throw new SdkError("No error");
+  }
+
+  unwrap(): T {
+    return this.value;
+  }
+
+  isOk(): boolean {
+    return true;
+  }
+
+  isErr(): boolean {
+    return !this.isOk();
+  }
+}
+
+export class Err<E extends Error_ = Error_> implements Result<any, E> {
+  constructor(readonly error: E) {}
+
+  unwrapErr(): E {
+    return this.error;
+  }
+
+  unwrap(): never {
+    throw new SdkError(this.error.message);
+  }
+
+  isOk(): boolean {
+    return false;
+  }
+
+  isErr(): boolean {
+    return !this.isOk();
+  }
+}
+
+const regex = /Error\(Contract, #(\d+)\)/;
+
+function parseError(message: string): Err | undefined {
+  const match = message.match(regex);
+  if (!match) {
+    return undefined;
+  }
+  const i = parseInt(match[1], 10);
+  // @ts-expect-error //TODO
+  const err = Errors[i];
+  if (err) {
+    return new Err(err);
+  }
+  return undefined;
+}
+
+export const networks = {
+  futurenet: {
+    networkPassphrase: "Test SDF Future Network ; October 2022",
+    contractId: "CCUFKM6WZKBPAFSY7EHTB4FKMMTQPK7YH7U3VV7MRBPO3FAO6P5A2CZV",
+  },
+} as const;
+
+export interface SwappedFromVUsd {
+  amount: u128;
+  fee: u128;
+  recipient: Address;
+  token: Address;
+  vusd_amount: u128;
+}
+
+export interface SwappedToVUsd {
+  amount: u128;
+  fee: u128;
+  sender: Address;
+  token: Address;
+  vusd_amount: u128;
+}
+
+export interface Deposit {
+  amount: u128;
+  user: Address;
+}
+
+export interface Withdraw {
+  amount: u128;
+  user: Address;
+}
+
+export interface RewardsClaimed {
+  amount: u128;
+  user: Address;
+}
+
+export type Bridge = readonly [Address];
+
+export interface DataKey {
+  tag: "UserDeposit";
+  values: readonly [Address];
+}
+
+export interface Pool {
+  a: u128;
+  acc_reward_per_share_p: u128;
+  admin_fee_amount: u128;
+  admin_fee_share_bp: u128;
+  balance_ratio_min_bp: u128;
+  can_deposit: boolean;
+  can_withdraw: boolean;
+  d: u128;
+  decimals: u32;
+  fee_share_bp: u128;
+  reserves: u128;
+  token: Address;
+  token_balance: u128;
+  total_lp_amount: u128;
+  v_usd_balance: u128;
+}
+
+export interface UserDeposit {
+  lp_amount: u128;
+  reward_debt: u128;
+}
+
+export type Admin = readonly [Address];
+export type GasOracleAddress = readonly [Address];
+export type GasUsage = readonly [Map<u32, u128>];
+export type NativeToken = readonly [Address];
+export type StopAuthority = readonly [Address];
+const Errors = {
+  0: { message: "" },
+  1: { message: "" },
+  2: { message: "" },
+  3: { message: "" },
+  4: { message: "" },
+  5: { message: "" },
+  6: { message: "" },
+  7: { message: "" },
+  8: { message: "" },
+  9: { message: "" },
+  103: { message: "" },
+  104: { message: "" },
+  105: { message: "" },
+  106: { message: "" },
+  107: { message: "" },
+  108: { message: "" },
+  109: { message: "" },
+  203: { message: "" },
+  204: { message: "" },
+  205: { message: "" },
+  206: { message: "" },
+  207: { message: "" },
+  208: { message: "" },
+  209: { message: "" },
+  210: { message: "" },
+  211: { message: "" },
+  212: { message: "" },
+  214: { message: "" },
+  215: { message: "" },
+  216: { message: "" },
+  217: { message: "" },
+  218: { message: "" },
+  300: { message: "" },
+  301: { message: "" },
+  302: { message: "" },
+  303: { message: "" },
+  400: { message: "" },
+};
+
+export class PoolContract {
+  spec: ContractSpec;
+
+  constructor(public readonly options: ClassOptions) {
+    this.spec = new ContractSpec([
+      "AAAAAAAAAAAAAAAKaW5pdGlhbGl6ZQAAAAAABwAAAAAAAAAFYWRtaW4AAAAAAAATAAAAAAAAAAZicmlkZ2UAAAAAABMAAAAAAAAAAWEAAAAAAAAKAAAAAAAAAAV0b2tlbgAAAAAAABMAAAAAAAAADGZlZV9zaGFyZV9icAAAAAoAAAAAAAAAFGJhbGFuY2VfcmF0aW9fbWluX2JwAAAACgAAAAAAAAASYWRtaW5fZmVlX3NoYXJlX2JwAAAAAAAKAAAAAQAAA+kAAAPtAAAAAAAAAAM=",
+      "AAAAAAAAAAAAAAAHZGVwb3NpdAAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABmFtb3VudAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD",
+      "AAAAAAAAAAAAAAAId2l0aGRyYXcAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAACWFtb3VudF9scAAAAAAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==",
+      "AAAAAAAAAAAAAAANc3dhcF90b192X3VzZAAAAAAAAAMAAAAAAAAABHVzZXIAAAATAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAACHplcm9fZmVlAAAAAQAAAAEAAAPpAAAACgAAAAM=",
+      "AAAAAAAAAAAAAAAPc3dhcF9mcm9tX3ZfdXNkAAAAAAQAAAAAAAAABHVzZXIAAAATAAAAAAAAAAt2dXNkX2Ftb3VudAAAAAAKAAAAAAAAABJyZWNlaXZlX2Ftb3VudF9taW4AAAAAAAoAAAAAAAAACHplcm9fZmVlAAAAAQAAAAEAAAPpAAAACgAAAAM=",
+      "AAAAAAAAAAAAAAANY2xhaW1fcmV3YXJkcwAAAAAAAAEAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD",
+      "AAAAAAAAAAdgYWRtaW5gAAAAAA1zZXRfZmVlX3NoYXJlAAAAAAAAAQAAAAAAAAAMZmVlX3NoYXJlX2JwAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD",
+      "AAAAAAAAAAAAAAAWYWRqdXN0X3RvdGFsX2xwX2Ftb3VudAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD",
+      "AAAAAAAAAAAAAAAYc2V0X2JhbGFuY2VfcmF0aW9fbWluX2JwAAAAAQAAAAAAAAAUYmFsYW5jZV9yYXRpb19taW5fYnAAAAAKAAAAAQAAA+kAAAPtAAAAAAAAAAM=",
+      "AAAAAAAAAAAAAAAMc3RvcF9kZXBvc2l0AAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD",
+      "AAAAAAAAAAAAAAANc3RhcnRfZGVwb3NpdAAAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==",
+      "AAAAAAAAAAAAAAANc3RvcF93aXRoZHJhdwAAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==",
+      "AAAAAAAAAAAAAAAOc3RhcnRfd2l0aGRyYXcAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==",
+      "AAAAAAAAAAAAAAASc2V0X3N0b3BfYXV0aG9yaXR5AAAAAAABAAAAAAAAAA5zdG9wX2F1dGhvcml0eQAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD",
+      "AAAAAAAAAAAAAAAKc2V0X2JyaWRnZQAAAAAAAQAAAAAAAAAGYnJpZGdlAAAAAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=",
+      "AAAAAAAAAAAAAAAJc2V0X2FkbWluAAAAAAAAAQAAAAAAAAAJbmV3X2FkbWluAAAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD",
+      "AAAAAAAAAAAAAAATc2V0X2FkbWluX2ZlZV9zaGFyZQAAAAABAAAAAAAAABJhZG1pbl9mZWVfc2hhcmVfYnAAAAAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==",
+      "AAAAAAAAAAAAAAAPY2xhaW1fYWRtaW5fZmVlAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==",
+      "AAAAAAAAAAZgdmlld2AAAAAAAA5wZW5kaW5nX3Jld2FyZAAAAAAAAQAAAAAAAAAEdXNlcgAAABMAAAABAAAD6QAAAAoAAAAD",
+      "AAAAAAAAAAAAAAAIZ2V0X3Bvb2wAAAAAAAAAAQAAA+kAAAfQAAAABFBvb2wAAAAD",
+      "AAAAAAAAAAAAAAAJZ2V0X2FkbWluAAAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=",
+      "AAAAAAAAAAAAAAASZ2V0X3N0b3BfYXV0aG9yaXR5AAAAAAAAAAAAAQAAA+kAAAATAAAAAw==",
+      "AAAAAAAAAAAAAAAKZ2V0X2JyaWRnZQAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=",
+      "AAAAAAAAAAAAAAAQZ2V0X3VzZXJfZGVwb3NpdAAAAAEAAAAAAAAABHVzZXIAAAATAAAAAQAAA+kAAAfQAAAAC1VzZXJEZXBvc2l0AAAAAAM=",
+      "AAAAAQAAAAAAAAAAAAAAD1N3YXBwZWRGcm9tVlVzZAAAAAAFAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAAA2ZlZQAAAAAKAAAAAAAAAAlyZWNpcGllbnQAAAAAAAATAAAAAAAAAAV0b2tlbgAAAAAAABMAAAAAAAAAC3Z1c2RfYW1vdW50AAAAAAo=",
+      "AAAAAQAAAAAAAAAAAAAADVN3YXBwZWRUb1ZVc2QAAAAAAAAFAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAAA2ZlZQAAAAAKAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABXRva2VuAAAAAAAAEwAAAAAAAAALdnVzZF9hbW91bnQAAAAACg==",
+      "AAAAAQAAAAAAAAAAAAAAB0RlcG9zaXQAAAAAAgAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAR1c2VyAAAAEw==",
+      "AAAAAQAAAAAAAAAAAAAACFdpdGhkcmF3AAAAAgAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAR1c2VyAAAAEw==",
+      "AAAAAQAAAAAAAAAAAAAADlJld2FyZHNDbGFpbWVkAAAAAAACAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAABHVzZXIAAAAT",
+      "AAAAAQAAAAAAAAAAAAAABkJyaWRnZQAAAAAAAQAAAAAAAAABMAAAAAAAABM=",
+      "AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAQAAAAEAAAAAAAAAC1VzZXJEZXBvc2l0AAAAAAEAAAAT",
+      "AAAAAQAAAAAAAAAAAAAABFBvb2wAAAAPAAAAAAAAAAFhAAAAAAAACgAAAAAAAAAWYWNjX3Jld2FyZF9wZXJfc2hhcmVfcAAAAAAACgAAAAAAAAAQYWRtaW5fZmVlX2Ftb3VudAAAAAoAAAAAAAAAEmFkbWluX2ZlZV9zaGFyZV9icAAAAAAACgAAAAAAAAAUYmFsYW5jZV9yYXRpb19taW5fYnAAAAAKAAAAAAAAAAtjYW5fZGVwb3NpdAAAAAABAAAAAAAAAAxjYW5fd2l0aGRyYXcAAAABAAAAAAAAAAFkAAAAAAAACgAAAAAAAAAIZGVjaW1hbHMAAAAEAAAAAAAAAAxmZWVfc2hhcmVfYnAAAAAKAAAAAAAAAAhyZXNlcnZlcwAAAAoAAAAAAAAABXRva2VuAAAAAAAAEwAAAAAAAAANdG9rZW5fYmFsYW5jZQAAAAAAAAoAAAAAAAAAD3RvdGFsX2xwX2Ftb3VudAAAAAAKAAAAAAAAAA12X3VzZF9iYWxhbmNlAAAAAAAACg==",
+      "AAAAAQAAAAAAAAAAAAAAC1VzZXJEZXBvc2l0AAAAAAIAAAAAAAAACWxwX2Ftb3VudAAAAAAAAAoAAAAAAAAAC3Jld2FyZF9kZWJ0AAAAAAo=",
+      "AAAAAQAAAAAAAAAAAAAABUFkbWluAAAAAAAAAQAAAAAAAAABMAAAAAAAABM=",
+      "AAAAAQAAAAAAAAAAAAAAEEdhc09yYWNsZUFkZHJlc3MAAAABAAAAAAAAAAEwAAAAAAAAEw==",
+      "AAAAAQAAAAAAAAAAAAAACEdhc1VzYWdlAAAAAQAAAAAAAAABMAAAAAAAA+wAAAAEAAAACg==",
+      "AAAAAQAAAAAAAAAAAAAAC05hdGl2ZVRva2VuAAAAAAEAAAAAAAAAATAAAAAAAAAT",
+      "AAAAAQAAAAAAAAAAAAAADVN0b3BBdXRob3JpdHkAAAAAAAABAAAAAAAAAAEwAAAAAAAAEw==",
+      "AAAABAAAAAAAAAAAAAAABUVycm9yAAAAAAAAJQAAAAAAAAANVW5pbXBsZW1lbnRlZAAAAAAAAAAAAAAAAAAAC0luaXRpYWxpemVkAAAAAAEAAAAAAAAADVVuaW5pdGlhbGl6ZWQAAAAAAAACAAAAAAAAAAxVbmF1dGhvcml6ZWQAAAADAAAAAAAAAApJbnZhbGlkQXJnAAAAAAAEAAAAAAAAAA5JbnZhbGlkQ2hhaW5JZAAAAAAABQAAAAAAAAATSW52YWxpZE90aGVyQ2hhaW5JZAAAAAAGAAAAAAAAAA5HYXNVc2FnZU5vdFNldAAAAAAABwAAAAAAAAANQnJva2VuQWRkcmVzcwAAAAAAAAgAAAAAAAAACE5vdEZvdW5kAAAACQAAAAAAAAAKWmVyb0Ftb3VudAAAAAAAZwAAAAAAAAAMUG9vbE92ZXJmbG93AAAAaAAAAAAAAAALWmVyb0NoYW5nZXMAAAAAaQAAAAAAAAARUmVzZXJ2ZXNFeGhhdXN0ZWQAAAAAAABqAAAAAAAAABpJbnN1ZmZpY2llbnRSZWNlaXZlZEFtb3VudAAAAAAAawAAAAAAAAAUQmFsYW5jZVJhdGlvRXhjZWVkZWQAAABsAAAAAAAAAAlGb3JiaWRkZW4AAAAAAABtAAAAAAAAABlVbmF1dGhvcml6ZWRTdG9wQXV0aG9yaXR5AAAAAAAAywAAAAAAAAAOU3dhcFByb2hpYml0ZWQAAAAAAMwAAAAAAAAAEkFtb3VudFRvb0xvd0ZvckZlZQAAAAAAzQAAAAAAAAAWQnJpZGdlVG9UaGVaZXJvQWRkcmVzcwAAAAAAzgAAAAAAAAAORW1wdHlSZWNpcGllbnQAAAAAAM8AAAAAAAAAE1NvdXJjZU5vdFJlZ2lzdGVyZWQAAAAA0AAAAAAAAAAVV3JvbmdEZXN0aW5hdGlvbkNoYWluAAAAAAAA0QAAAAAAAAATVW5rbm93bkFub3RoZXJDaGFpbgAAAADSAAAAAAAAABFUb2tlbnNBbHJlYWR5U2VudAAAAAAAANMAAAAAAAAAEE1lc3NhZ2VQcm9jZXNzZWQAAADUAAAAAAAAAAxOb3RFbm91Z2hGZWUAAADWAAAAAAAAAAlOb01lc3NhZ2UAAAAAAADXAAAAAAAAAA1Ob1JlY2VpdmVQb29sAAAAAAAA2AAAAAAAAAAGTm9Qb29sAAAAAADZAAAAAAAAABNVbmtub3duQW5vdGhlclRva2VuAAAAANoAAAAAAAAAD1dyb25nQnl0ZUxlbmd0aAAAAAEsAAAAAAAAAApIYXNNZXNzYWdlAAAAAAEtAAAAAAAAABdJbnZhbGlkUHJpbWFyeVNpZ25hdHVyZQAAAAEuAAAAAAAAABlJbnZhbGlkU2Vjb25kYXJ5U2lnbmF0dXJlAAAAAAABLwAAAAAAAAARTm9HYXNEYXRhRm9yQ2hhaW4AAAAAAAGQ",
+    ]);
+  }
+
+  async deposit({ sender, amount }: { sender: Address; amount: u128 }): Promise<string> {
+    return await xdrTxBuilder({
+      sender,
+      method: "deposit",
+      args: this.spec.funcArgsToScVals("deposit", { sender, amount }),
+      ...this.options,
+    });
+  }
+
+  async withdraw({ sender, amount_lp }: { sender: Address; amount_lp: u128 }): Promise<string> {
+    return await xdrTxBuilder({
+      sender,
+      method: "withdraw",
+      args: this.spec.funcArgsToScVals("withdraw", { sender, amount_lp }),
+      ...this.options,
+    });
+  }
+
+  async claimRewards({ sender }: { sender: Address }): Promise<string> {
+    return await xdrTxBuilder({
+      sender,
+      method: "claim_rewards",
+      args: this.spec.funcArgsToScVals("claim_rewards", { sender }),
+      ...this.options,
+    });
+  }
+
+  async getPool() {
+    try {
+      return await invoke({
+        method: "get_pool",
+        args: this.spec.funcArgsToScVals("get_pool", {}),
+        ...this.options,
+        parseResultXdr: (xdr): Ok<Pool> | Err | undefined => {
+          return new Ok(this.spec.funcResToNative("get_pool", xdr));
+        },
+      });
+    } catch (e) {
+      if (typeof e === "string") {
+        const err = parseError(e);
+        if (err) return err;
+      }
+      throw e;
+    }
+  }
+
+  async getUserDeposit({ user }: { user: Address }) {
+    try {
+      return await invoke({
+        method: "get_user_deposit",
+        args: this.spec.funcArgsToScVals("get_user_deposit", { user }),
+        ...this.options,
+        parseResultXdr: (xdr): Ok<UserDeposit> | Err | undefined => {
+          return new Ok(this.spec.funcResToNative("get_user_deposit", xdr));
+        },
+      });
+    } catch (e) {
+      if (typeof e === "string") {
+        const err = parseError(e);
+        if (err) return err;
+      }
+      throw e;
+    }
+  }
+}
diff --git a/src/services/models/srb/token-contract.ts b/src/services/models/srb/token-contract.ts
new file mode 100644
index 00000000..591dca75
--- /dev/null
+++ b/src/services/models/srb/token-contract.ts
@@ -0,0 +1,309 @@
+import { ContractSpec, Address } from "soroban-client";
+import { SdkError } from "../../../exceptions";
+import { invoke } from "../../utils/srb/invoke";
+import type { ResponseTypes, ClassOptions } from "./method-options";
+
+export * from "../../utils/srb/invoke";
+export * from "./method-options";
+
+export type u32 = number;
+export type i32 = number;
+export type u64 = bigint;
+export type i64 = bigint;
+export type u128 = bigint;
+export type i128 = bigint;
+export type u256 = bigint;
+export type i256 = bigint;
+export type Option<T> = T | undefined;
+export type Typepoint = bigint;
+export type Duration = bigint;
+export { Address };
+
+/// Error interface containing the error message
+export interface Error_ {
+  message: string;
+}
+
+export interface Result<T, E extends Error_> {
+  unwrap(): T;
+  unwrapErr(): E;
+  isOk(): boolean;
+  isErr(): boolean;
+}
+
+export class Ok<T, E extends Error_ = Error_> implements Result<T, E> {
+  constructor(readonly value: T) {}
+  unwrapErr(): E {
+    throw new SdkError("No error");
+  }
+  unwrap(): T {
+    return this.value;
+  }
+
+  isOk(): boolean {
+    return true;
+  }
+
+  isErr(): boolean {
+    return !this.isOk();
+  }
+}
+
+export class Err<E extends Error_ = Error_> implements Result<any, E> {
+  constructor(readonly error: E) {}
+  unwrapErr(): E {
+    return this.error;
+  }
+  unwrap(): never {
+    throw new SdkError(this.error.message);
+  }
+
+  isOk(): boolean {
+    return false;
+  }
+
+  isErr(): boolean {
+    return !this.isOk();
+  }
+}
+
+const regex = /Error\(Contract, #(\d+)\)/;
+
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
+function parseError(message: string): Err | undefined {
+  const match = message.match(regex);
+  if (!match) {
+    return undefined;
+  }
+  const i = parseInt(match[1], 10);
+  // @ts-expect-error //TODO
+  const err = Errors[i];
+  if (err) {
+    return new Err(err);
+  }
+  return undefined;
+}
+
+export const networks = {
+  futurenet: {
+    networkPassphrase: "Test SDF Future Network ; October 2022",
+    contractId: "CDUAECF3CF4QBJASV4W3PWTNV7LXR26PF2G6FWZDVZGPAGRRIWTGVARF",
+  },
+} as const;
+
+const Errors = {};
+
+export class TokenContract {
+  spec: ContractSpec;
+  constructor(public readonly options: ClassOptions) {
+    this.spec = new ContractSpec([
+      "AAAAAAAAAAAAAAAKaW5pdGlhbGl6ZQAAAAAABAAAAAAAAAAFYWRtaW4AAAAAAAATAAAAAAAAAAdkZWNpbWFsAAAAAAQAAAAAAAAABG5hbWUAAAAQAAAAAAAAAAZzeW1ib2wAAAAAABAAAAAA",
+      "AAAAAAAAAAAAAAAEbWludAAAAAIAAAAAAAAAAnRvAAAAAAATAAAAAAAAAAZhbW91bnQAAAAAAAsAAAAA",
+      "AAAAAAAAAAAAAAAJc2V0X2FkbWluAAAAAAAAAQAAAAAAAAAJbmV3X2FkbWluAAAAAAAAEwAAAAA=",
+      "AAAAAAAAAAAAAAAJYWxsb3dhbmNlAAAAAAAAAgAAAAAAAAAEZnJvbQAAABMAAAAAAAAAB3NwZW5kZXIAAAAAEwAAAAEAAAAL",
+      "AAAAAAAAAAAAAAAHYXBwcm92ZQAAAAAEAAAAAAAAAARmcm9tAAAAEwAAAAAAAAAHc3BlbmRlcgAAAAATAAAAAAAAAAZhbW91bnQAAAAAAAsAAAAAAAAAEWV4cGlyYXRpb25fbGVkZ2VyAAAAAAAABAAAAAA=",
+      "AAAAAAAAAAAAAAAHYmFsYW5jZQAAAAABAAAAAAAAAAJpZAAAAAAAEwAAAAEAAAAL",
+      "AAAAAAAAAAAAAAARc3BlbmRhYmxlX2JhbGFuY2UAAAAAAAABAAAAAAAAAAJpZAAAAAAAEwAAAAEAAAAL",
+      "AAAAAAAAAAAAAAAIdHJhbnNmZXIAAAADAAAAAAAAAARmcm9tAAAAEwAAAAAAAAACdG8AAAAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=",
+      "AAAAAAAAAAAAAAANdHJhbnNmZXJfZnJvbQAAAAAAAAQAAAAAAAAAB3NwZW5kZXIAAAAAEwAAAAAAAAAEZnJvbQAAABMAAAAAAAAAAnRvAAAAAAATAAAAAAAAAAZhbW91bnQAAAAAAAsAAAAA",
+      "AAAAAAAAAAAAAAAEYnVybgAAAAIAAAAAAAAABGZyb20AAAATAAAAAAAAAAZhbW91bnQAAAAAAAsAAAAA",
+      "AAAAAAAAAAAAAAAJYnVybl9mcm9tAAAAAAAAAwAAAAAAAAAHc3BlbmRlcgAAAAATAAAAAAAAAARmcm9tAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA==",
+      "AAAAAAAAAAAAAAAIZGVjaW1hbHMAAAAAAAAAAQAAAAQ=",
+      "AAAAAAAAAAAAAAAEbmFtZQAAAAAAAAABAAAAEA==", // cSpell:disable-line
+      "AAAAAAAAAAAAAAAGc3ltYm9sAAAAAAAAAAAAAQAAABA=",
+      "AAAAAQAAAAAAAAAAAAAAEEFsbG93YW5jZURhdGFLZXkAAAACAAAAAAAAAARmcm9tAAAAEwAAAAAAAAAHc3BlbmRlcgAAAAAT",
+      "AAAAAQAAAAAAAAAAAAAADkFsbG93YW5jZVZhbHVlAAAAAAACAAAAAAAAAAZhbW91bnQAAAAAAAsAAAAAAAAAEWV4cGlyYXRpb25fbGVkZ2VyAAAAAAAABA==",
+      "AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAABQAAAAEAAAAAAAAACUFsbG93YW5jZQAAAAAAAAEAAAfQAAAAEEFsbG93YW5jZURhdGFLZXkAAAABAAAAAAAAAAdCYWxhbmNlAAAAAAEAAAATAAAAAQAAAAAAAAAFTm9uY2UAAAAAAAABAAAAEwAAAAEAAAAAAAAABVN0YXRlAAAAAAAAAQAAABMAAAAAAAAAAAAAAAVBZG1pbgAAAA==",
+      "AAAAAQAAAAAAAAAAAAAADVRva2VuTWV0YWRhdGEAAAAAAAADAAAAAAAAAAdkZWNpbWFsAAAAAAQAAAAAAAAABG5hbWUAAAAQAAAAAAAAAAZzeW1ib2wAAAAAABA=",
+    ]);
+  }
+
+  async allowance<R extends ResponseTypes = undefined>(
+    { from, spender }: { from: Address; spender: Address },
+    options: {
+      /**
+       * The fee to pay for the transaction. Default: 100.
+       */
+      fee?: number;
+      /**
+       * What type of response to return.
+       *
+       *   - `undefined`, the default, parses the returned XDR as `i128`. Runs preflight, checks to see if auth/signing is required, and sends the transaction if so. If there's no error and `secondsToWait` is positive, awaits the finalized transaction.
+       *   - `'simulated'` will only simulate/preflight the transaction, even if it's a change/set method that requires auth/signing. Returns full preflight info.
+       *   - `'full'` return the full RPC response, meaning either 1. the preflight info, if it's a view/read method that doesn't require auth/signing, or 2. the `sendTransaction` response, if there's a problem with sending the transaction or if you set `secondsToWait` to 0, or 3. the `getTransaction` response, if it's a change method with no `sendTransaction` errors and a positive `secondsToWait`.
+       */
+      responseType?: R;
+      /**
+       * If the simulation shows that this invocation requires auth/signing, `invoke` will wait `secondsToWait` seconds for the transaction to complete before giving up and returning the incomplete {@link SorobanClient.SorobanRpc.GetTransactionResponse} results (or attempting to parse their probably-missing XDR with `parseResultXdr`, depending on `responseType`). Set this to `0` to skip waiting altogether, which will return you {@link SorobanClient.SorobanRpc.SendTransactionResponse} more quickly, before the transaction has time to be included in the ledger. Default: 10.
+       */
+      secondsToWait?: number;
+    } = {}
+  ) {
+    return await invoke({
+      method: "allowance",
+      args: this.spec.funcArgsToScVals("allowance", { from, spender }),
+      ...options,
+      ...this.options,
+      parseResultXdr: (xdr): i128 => {
+        return this.spec.funcResToNative("allowance", xdr);
+      },
+    });
+  }
+
+  async balance<R extends ResponseTypes = undefined>(
+    { id }: { id: Address },
+    options: {
+      /**
+       * The fee to pay for the transaction. Default: 100.
+       */
+      fee?: number;
+      /**
+       * What type of response to return.
+       *
+       *   - `undefined`, the default, parses the returned XDR as `i128`. Runs preflight, checks to see if auth/signing is required, and sends the transaction if so. If there's no error and `secondsToWait` is positive, awaits the finalized transaction.
+       *   - `'simulated'` will only simulate/preflight the transaction, even if it's a change/set method that requires auth/signing. Returns full preflight info.
+       *   - `'full'` return the full RPC response, meaning either 1. the preflight info, if it's a view/read method that doesn't require auth/signing, or 2. the `sendTransaction` response, if there's a problem with sending the transaction or if you set `secondsToWait` to 0, or 3. the `getTransaction` response, if it's a change method with no `sendTransaction` errors and a positive `secondsToWait`.
+       */
+      responseType?: R;
+      /**
+       * If the simulation shows that this invocation requires auth/signing, `invoke` will wait `secondsToWait` seconds for the transaction to complete before giving up and returning the incomplete {@link SorobanClient.SorobanRpc.GetTransactionResponse} results (or attempting to parse their probably-missing XDR with `parseResultXdr`, depending on `responseType`). Set this to `0` to skip waiting altogether, which will return you {@link SorobanClient.SorobanRpc.SendTransactionResponse} more quickly, before the transaction has time to be included in the ledger. Default: 10.
+       */
+      secondsToWait?: number;
+    } = {}
+  ) {
+    return await invoke({
+      method: "balance",
+      args: this.spec.funcArgsToScVals("balance", { id }),
+      ...options,
+      ...this.options,
+      parseResultXdr: (xdr): i128 => {
+        return this.spec.funcResToNative("balance", xdr);
+      },
+    });
+  }
+
+  async spendableBalance<R extends ResponseTypes = undefined>(
+    { id }: { id: Address },
+    options: {
+      /**
+       * The fee to pay for the transaction. Default: 100.
+       */
+      fee?: number;
+      /**
+       * What type of response to return.
+       *
+       *   - `undefined`, the default, parses the returned XDR as `i128`. Runs preflight, checks to see if auth/signing is required, and sends the transaction if so. If there's no error and `secondsToWait` is positive, awaits the finalized transaction.
+       *   - `'simulated'` will only simulate/preflight the transaction, even if it's a change/set method that requires auth/signing. Returns full preflight info.
+       *   - `'full'` return the full RPC response, meaning either 1. the preflight info, if it's a view/read method that doesn't require auth/signing, or 2. the `sendTransaction` response, if there's a problem with sending the transaction or if you set `secondsToWait` to 0, or 3. the `getTransaction` response, if it's a change method with no `sendTransaction` errors and a positive `secondsToWait`.
+       */
+      responseType?: R;
+      /**
+       * If the simulation shows that this invocation requires auth/signing, `invoke` will wait `secondsToWait` seconds for the transaction to complete before giving up and returning the incomplete {@link SorobanClient.SorobanRpc.GetTransactionResponse} results (or attempting to parse their probably-missing XDR with `parseResultXdr`, depending on `responseType`). Set this to `0` to skip waiting altogether, which will return you {@link SorobanClient.SorobanRpc.SendTransactionResponse} more quickly, before the transaction has time to be included in the ledger. Default: 10.
+       */
+      secondsToWait?: number;
+    } = {}
+  ) {
+    return await invoke({
+      method: "spendable_balance",
+      args: this.spec.funcArgsToScVals("spendable_balance", { id }),
+      ...options,
+      ...this.options,
+      parseResultXdr: (xdr): i128 => {
+        return this.spec.funcResToNative("spendable_balance", xdr);
+      },
+    });
+  }
+
+  async decimals<R extends ResponseTypes = undefined>(
+    options: {
+      /**
+       * The fee to pay for the transaction. Default: 100.
+       */
+      fee?: number;
+      /**
+       * What type of response to return.
+       *
+       *   - `undefined`, the default, parses the returned XDR as `u32`. Runs preflight, checks to see if auth/signing is required, and sends the transaction if so. If there's no error and `secondsToWait` is positive, awaits the finalized transaction.
+       *   - `'simulated'` will only simulate/preflight the transaction, even if it's a change/set method that requires auth/signing. Returns full preflight info.
+       *   - `'full'` return the full RPC response, meaning either 1. the preflight info, if it's a view/read method that doesn't require auth/signing, or 2. the `sendTransaction` response, if there's a problem with sending the transaction or if you set `secondsToWait` to 0, or 3. the `getTransaction` response, if it's a change method with no `sendTransaction` errors and a positive `secondsToWait`.
+       */
+      responseType?: R;
+      /**
+       * If the simulation shows that this invocation requires auth/signing, `invoke` will wait `secondsToWait` seconds for the transaction to complete before giving up and returning the incomplete {@link SorobanClient.SorobanRpc.GetTransactionResponse} results (or attempting to parse their probably-missing XDR with `parseResultXdr`, depending on `responseType`). Set this to `0` to skip waiting altogether, which will return you {@link SorobanClient.SorobanRpc.SendTransactionResponse} more quickly, before the transaction has time to be included in the ledger. Default: 10.
+       */
+      secondsToWait?: number;
+    } = {}
+  ) {
+    return await invoke({
+      method: "decimals",
+      args: this.spec.funcArgsToScVals("decimals", {}),
+      ...options,
+      ...this.options,
+      parseResultXdr: (xdr): u32 => {
+        return this.spec.funcResToNative("decimals", xdr);
+      },
+    });
+  }
+
+  async name<R extends ResponseTypes = undefined>(
+    options: {
+      /**
+       * The fee to pay for the transaction. Default: 100.
+       */
+      fee?: number;
+      /**
+       * What type of response to return.
+       *
+       *   - `undefined`, the default, parses the returned XDR as `string`. Runs preflight, checks to see if auth/signing is required, and sends the transaction if so. If there's no error and `secondsToWait` is positive, awaits the finalized transaction.
+       *   - `'simulated'` will only simulate/preflight the transaction, even if it's a change/set method that requires auth/signing. Returns full preflight info.
+       *   - `'full'` return the full RPC response, meaning either 1. the preflight info, if it's a view/read method that doesn't require auth/signing, or 2. the `sendTransaction` response, if there's a problem with sending the transaction or if you set `secondsToWait` to 0, or 3. the `getTransaction` response, if it's a change method with no `sendTransaction` errors and a positive `secondsToWait`.
+       */
+      responseType?: R;
+      /**
+       * If the simulation shows that this invocation requires auth/signing, `invoke` will wait `secondsToWait` seconds for the transaction to complete before giving up and returning the incomplete {@link SorobanClient.SorobanRpc.GetTransactionResponse} results (or attempting to parse their probably-missing XDR with `parseResultXdr`, depending on `responseType`). Set this to `0` to skip waiting altogether, which will return you {@link SorobanClient.SorobanRpc.SendTransactionResponse} more quickly, before the transaction has time to be included in the ledger. Default: 10.
+       */
+      secondsToWait?: number;
+    } = {}
+  ) {
+    return await invoke({
+      method: "name",
+      args: this.spec.funcArgsToScVals("name", {}),
+      ...options,
+      ...this.options,
+      parseResultXdr: (xdr): string => {
+        return this.spec.funcResToNative("name", xdr);
+      },
+    });
+  }
+
+  async symbol<R extends ResponseTypes = undefined>(
+    options: {
+      /**
+       * The fee to pay for the transaction. Default: 100.
+       */
+      fee?: number;
+      /**
+       * What type of response to return.
+       *
+       *   - `undefined`, the default, parses the returned XDR as `string`. Runs preflight, checks to see if auth/signing is required, and sends the transaction if so. If there's no error and `secondsToWait` is positive, awaits the finalized transaction.
+       *   - `'simulated'` will only simulate/preflight the transaction, even if it's a change/set method that requires auth/signing. Returns full preflight info.
+       *   - `'full'` return the full RPC response, meaning either 1. the preflight info, if it's a view/read method that doesn't require auth/signing, or 2. the `sendTransaction` response, if there's a problem with sending the transaction or if you set `secondsToWait` to 0, or 3. the `getTransaction` response, if it's a change method with no `sendTransaction` errors and a positive `secondsToWait`.
+       */
+      responseType?: R;
+      /**
+       * If the simulation shows that this invocation requires auth/signing, `invoke` will wait `secondsToWait` seconds for the transaction to complete before giving up and returning the incomplete {@link SorobanClient.SorobanRpc.GetTransactionResponse} results (or attempting to parse their probably-missing XDR with `parseResultXdr`, depending on `responseType`). Set this to `0` to skip waiting altogether, which will return you {@link SorobanClient.SorobanRpc.SendTransactionResponse} more quickly, before the transaction has time to be included in the ledger. Default: 10.
+       */
+      secondsToWait?: number;
+    } = {}
+  ) {
+    return await invoke({
+      method: "symbol",
+      args: this.spec.funcArgsToScVals("symbol", {}),
+      ...options,
+      ...this.options,
+      parseResultXdr: (xdr): string => {
+        return this.spec.funcResToNative("symbol", xdr);
+      },
+    });
+  }
+}
diff --git a/src/services/token/index.ts b/src/services/token/index.ts
index e1fe6001..240c5506 100644
--- a/src/services/token/index.ts
+++ b/src/services/token/index.ts
@@ -4,10 +4,12 @@ import TronWeb from "tronweb";
 import Web3 from "web3";
 import { ChainDecimalsByType, chainProperties, ChainSymbol, ChainType } from "../../chains";
 import { AllbridgeCoreClient } from "../../client/core-api";
-import { AmountFormat, AmountFormatted, MethodNotSupportedError, NodeRpcUrlsConfig } from "../../index";
-import { validateAmountDecimals, validateAmountGtZero } from "../../utils";
+import { AllbridgeCoreSdkOptions } from "../../index";
+import { AmountFormat, AmountFormatted } from "../../models";
 import { convertFloatAmountToInt, convertIntAmountToFloat } from "../../utils/calculation";
+import { validateAmountDecimals, validateAmountGtZero } from "../../utils/utils";
 import { GetNativeTokenBalanceParams } from "../bridge/models";
+import { NodeRpcUrlsConfig } from "../index";
 import { Provider, RawTransaction, TransactionResponse } from "../models";
 import { EvmTokenService } from "./evm";
 import {
@@ -20,6 +22,7 @@ import {
 } from "./models";
 import { ChainTokenService } from "./models/token";
 import { SolanaTokenService } from "./sol";
+import { SrbTokenService } from "./srb";
 import { TronTokenService } from "./trx";
 
 export interface TokenService {
@@ -37,7 +40,11 @@ export interface TokenService {
 }
 
 export class DefaultTokenService implements TokenService {
-  constructor(public api: AllbridgeCoreClient, public nodeRpcUrlsConfig: NodeRpcUrlsConfig) {}
+  constructor(
+    readonly api: AllbridgeCoreClient,
+    readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,
+    readonly params: AllbridgeCoreSdkOptions
+  ) {}
 
   async getAllowance(params: GetAllowanceParams, provider?: Provider): Promise<string> {
     const allowanceInt = await this.getChainTokenService(params.token.chainSymbol, params.owner, provider).getAllowance(
@@ -128,7 +135,7 @@ export class DefaultTokenService implements TokenService {
         return new SolanaTokenService(nodeRpcUrl, this.api);
       }
       case ChainType.SRB: {
-        throw new MethodNotSupportedError("Soroban does not support yet");
+        return new SrbTokenService(this.nodeRpcUrlsConfig, this.params, this.api);
       }
     }
   }
diff --git a/src/services/token/srb/index.ts b/src/services/token/srb/index.ts
new file mode 100644
index 00000000..6b58f922
--- /dev/null
+++ b/src/services/token/srb/index.ts
@@ -0,0 +1,76 @@
+import { Horizon, Server as StellarServer } from "stellar-sdk";
+import { ChainDecimalsByType, chainProperties, ChainSymbol, ChainType } from "../../../chains";
+import { AllbridgeCoreClient } from "../../../client/core-api";
+import { AllbridgeCoreSdkOptions, SdkError } from "../../../index";
+import { GetTokenBalanceParams, MethodNotSupportedError, TransactionResponse } from "../../../models";
+import { convertFloatAmountToInt } from "../../../utils/calculation";
+import { GetNativeTokenBalanceParams } from "../../bridge/models";
+import { NodeRpcUrlsConfig } from "../../index";
+import { RawTransaction } from "../../models";
+import { ChainTokenService } from "../models";
+import BalanceLineAsset = Horizon.BalanceLineAsset;
+import BalanceLineNative = Horizon.BalanceLineNative;
+
+export class SrbTokenService extends ChainTokenService {
+  chainType: ChainType.SRB = ChainType.SRB;
+
+  constructor(
+    readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,
+    readonly params: AllbridgeCoreSdkOptions,
+    readonly api: AllbridgeCoreClient
+  ) {
+    super();
+  }
+
+  getAllowance(): Promise<string> {
+    throw new MethodNotSupportedError();
+  }
+
+  async getTokenBalance(params: GetTokenBalanceParams): Promise<string> {
+    if (!params.token.originTokenAddress) {
+      throw new SdkError("OriginTokenAddress missing");
+    }
+    const [symbol, srbTokenAddress] = params.token.originTokenAddress.split(":");
+
+    const stellar = new StellarServer(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.STLR));
+    const stellarAccount = await stellar.loadAccount(params.account);
+    const balances = stellarAccount.balances;
+
+    const balanceInfo = balances.find(
+      (balance): balance is BalanceLineAsset =>
+        (balance.asset_type === "credit_alphanum4" || balance.asset_type === "credit_alphanum12") &&
+        balance.asset_code == symbol &&
+        balance.asset_issuer == srbTokenAddress
+    );
+    if (balanceInfo?.balance) {
+      return convertFloatAmountToInt(
+        balanceInfo.balance,
+        ChainDecimalsByType[chainProperties[params.token.chainSymbol].chainType]
+      ).toFixed();
+    }
+    return "0";
+  }
+
+  async getNativeTokenBalance(params: GetNativeTokenBalanceParams): Promise<string> {
+    const stellar = new StellarServer(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.STLR));
+    const stellarAccount = await stellar.loadAccount(params.account);
+    const balances = stellarAccount.balances;
+
+    const nativeBalance = balances.find((balance): balance is BalanceLineNative => balance.asset_type === "native");
+    if (nativeBalance?.balance) {
+      return convertFloatAmountToInt(
+        nativeBalance.balance,
+        ChainDecimalsByType[chainProperties[params.chainSymbol].chainType]
+      ).toFixed();
+    }
+    return "0";
+  }
+
+  approve(): Promise<TransactionResponse> {
+    throw new MethodNotSupportedError();
+  }
+
+  buildRawTransactionApprove(): Promise<RawTransaction> {
+    throw new MethodNotSupportedError();
+  }
+}
diff --git a/src/services/utils/srb/convert.ts b/src/services/utils/srb/convert.ts
new file mode 100644
index 00000000..d91d5576
--- /dev/null
+++ b/src/services/utils/srb/convert.ts
@@ -0,0 +1,109 @@
+import { xdr, Address, nativeToScVal, scValToBigInt, ScInt } from "soroban-client";
+import { SdkError } from "../../../exceptions";
+
+export function strToScVal(base64Xdr: string): xdr.ScVal {
+  return xdr.ScVal.fromXDR(base64Xdr, "base64");
+}
+
+export function scValStrToJs<T>(base64Xdr: string): T {
+  return scValToJs(strToScVal(base64Xdr));
+}
+
+export function scValToJs<T>(val: xdr.ScVal): T {
+  switch (val.switch()) {
+    case xdr.ScValType.scvBool(): {
+      return val.b() as unknown as T;
+    }
+    case xdr.ScValType.scvVoid():
+    case undefined: {
+      return 0 as unknown as T;
+    }
+    case xdr.ScValType.scvU32(): {
+      return val.u32() as unknown as T;
+    }
+    case xdr.ScValType.scvI32(): {
+      return val.i32() as unknown as T;
+    }
+    case xdr.ScValType.scvU64():
+    case xdr.ScValType.scvI64():
+    case xdr.ScValType.scvU128():
+    case xdr.ScValType.scvI128():
+    case xdr.ScValType.scvU256():
+    case xdr.ScValType.scvI256(): {
+      return scValToBigInt(val) as unknown as T;
+    }
+    case xdr.ScValType.scvAddress(): {
+      return Address.fromScVal(val).toString() as unknown as T;
+    }
+    case xdr.ScValType.scvString(): {
+      return val.str().toString() as unknown as T;
+    }
+    case xdr.ScValType.scvSymbol(): {
+      return val.sym().toString() as unknown as T;
+    }
+    case xdr.ScValType.scvBytes(): {
+      return val.bytes() as unknown as T;
+    }
+    case xdr.ScValType.scvVec(): {
+      type Element = ElementType<T>;
+      // @ts-expect-error //TODO
+      return val.vec().map((v) => scValToJs<Element>(v)) as unknown as T;
+    }
+    case xdr.ScValType.scvMap(): {
+      type Key = KeyType<T>;
+      type Value = ValueType<T>;
+      const res: any = {};
+      // @ts-expect-error //TODO
+      val.map().forEach((e) => {
+        const key = scValToJs<Key>(e.key());
+        let value;
+        const v: xdr.ScVal = e.val();
+        // For now we assume second level maps are real maps. Not perfect but better.
+        switch (v.switch()) {
+          case xdr.ScValType.scvMap(): {
+            const inner_map = new Map();
+            // @ts-expect-error //TODO
+            v.map().forEach((e) => {
+              const key = scValToJs<Key>(e.key());
+              const value = scValToJs<Value>(e.val());
+              inner_map.set(key, value);
+            });
+            value = inner_map;
+            break;
+          }
+          default: {
+            value = scValToJs<Value>(e.val());
+          }
+        }
+        res[key] = value as Value;
+      });
+      return res as unknown as T;
+    }
+    case xdr.ScValType.scvContractInstance():
+    case xdr.ScValType.scvLedgerKeyNonce():
+    case xdr.ScValType.scvTimepoint():
+    case xdr.ScValType.scvDuration():
+      return val.value() as unknown as T;
+    // TODO: Add this case when merged
+    // case xdr.ScValType.scvError():
+    default: {
+      throw new SdkError(`type not implemented yet: ${val.switch().name}`);
+    }
+  }
+}
+
+type ElementType<T> = T extends (infer U)[] ? U : never;
+type KeyType<T> = T extends Map<infer K, any> ? K : never;
+type ValueType<T> = T extends Map<any, infer V> ? V : never;
+
+export function addressToScVal(addr: string): xdr.ScVal {
+  return nativeToScVal(addr, { type: "address" } as any /* bug workaround */);
+}
+
+export function i128ToScVal(i: bigint): xdr.ScVal {
+  return new ScInt(i).toI128();
+}
+
+export function u128ToScVal(i: bigint): xdr.ScVal {
+  return new ScInt(i).toU128();
+}
diff --git a/src/services/utils/srb/invoke.ts b/src/services/utils/srb/invoke.ts
new file mode 100644
index 00000000..447a54c3
--- /dev/null
+++ b/src/services/utils/srb/invoke.ts
@@ -0,0 +1,74 @@
+import * as SorobanClient from "soroban-client";
+import { SorobanRpc } from "soroban-client";
+import type { Transaction, xdr } from "soroban-client";
+import { SdkError } from "../../../exceptions";
+import type { ClassOptions, MethodOptions, ResponseTypes } from "../../models/srb/method-options.js";
+
+export type Tx = Transaction;
+
+type Simulation = SorobanRpc.SimulateTransactionResponse;
+type SendTx = SorobanRpc.SendTransactionResponse;
+type GetTx = SorobanRpc.GetTransactionResponse;
+
+// defined this way so typeahead shows full union, not named alias
+let someRpcResponse: Simulation | SendTx | GetTx;
+type SomeRpcResponse = typeof someRpcResponse;
+
+type InvokeArgs<R extends ResponseTypes, T = string> = MethodOptions<R> &
+  ClassOptions & {
+    method: string;
+    args?: any[];
+    parseResultXdr: (xdr: string | xdr.ScVal) => T;
+  };
+
+/**
+ * Invoke a method on the test_custom_types contract.
+ *
+ * Uses Freighter to determine the current user and if necessary sign the transaction.
+ *
+ * @returns {T}, by default, the parsed XDR from either the simulation or the full transaction. If `simulateOnly` or `fullRpcResponse` are true, returns either the full simulation or the result of sending/getting the transaction to/from the ledger.
+ */
+export async function invoke<R extends ResponseTypes = undefined, T = string>(
+  args: InvokeArgs<R, T>
+): Promise<R extends undefined ? T : R extends "simulated" ? Simulation : R extends "full" ? SomeRpcResponse : T>;
+export async function invoke<R extends ResponseTypes, T = string>({
+  method,
+  args = [],
+  fee = 100,
+  responseType,
+  parseResultXdr,
+  rpcUrl,
+  networkPassphrase,
+  contractId,
+}: InvokeArgs<R, T>): Promise<T | string | SomeRpcResponse> {
+  const server = new SorobanClient.Server(rpcUrl, {
+    allowHttp: rpcUrl.startsWith("http://"),
+  });
+
+  // use a placeholder null account if not yet connected to Freighter so that view calls can still work
+  const account = new SorobanClient.Account("GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF", "0"); // cSpell:disable-line
+
+  const contract = new SorobanClient.Contract(contractId);
+
+  const tx = new SorobanClient.TransactionBuilder(account, {
+    fee: fee.toString(10),
+    networkPassphrase,
+  })
+    .addOperation(contract.call(method, ...args))
+    .setTimeout(SorobanClient.TimeoutInfinite)
+    .build();
+  const simulated = await server.simulateTransaction(tx);
+
+  if (SorobanRpc.isSimulationError(simulated)) {
+    throw new SdkError(simulated.error);
+  } else if (responseType === "simulated") {
+    return simulated;
+  } else if (!simulated.result) {
+    throw new SdkError(`invalid simulation: no result for \`simulated\` transaction`);
+  }
+
+  if (responseType === "full") {
+    return simulated;
+  }
+  return parseResultXdr(simulated.result.retval);
+}
diff --git a/src/services/utils/srb/tx-builder.ts b/src/services/utils/srb/tx-builder.ts
new file mode 100644
index 00000000..2989ba7d
--- /dev/null
+++ b/src/services/utils/srb/tx-builder.ts
@@ -0,0 +1,76 @@
+import * as SorobanClient from "soroban-client";
+import { Address, SorobanRpc } from "soroban-client";
+import type { Transaction } from "soroban-client";
+import { SdkError, TimeoutError } from "../../../exceptions";
+import type { ClassOptions } from "../../models/srb/method-options.js";
+
+export type Tx = Transaction;
+
+type InvokeArgs = ClassOptions & {
+  sender: Address;
+  method: string;
+  args?: any[];
+};
+const FEE = 100;
+
+export async function xdrTxBuilder(args: InvokeArgs): Promise<string>;
+export async function xdrTxBuilder({
+  sender,
+  method,
+  args = [],
+  rpcUrl,
+  networkPassphrase,
+  contractId,
+}: InvokeArgs): Promise<string> {
+  const server = new SorobanClient.Server(rpcUrl);
+  const account = await server.getAccount(sender.toString());
+  const contract = new SorobanClient.Contract(contractId);
+
+  const tx = new SorobanClient.TransactionBuilder(account, {
+    fee: FEE.toString(10),
+    networkPassphrase,
+  })
+    .addOperation(contract.call(method, ...args))
+    .setTimeout(SorobanClient.TimeoutInfinite)
+    .build();
+
+  const simulated = await server.simulateTransaction(tx);
+  if (SorobanRpc.isSimulationError(simulated)) {
+    throw new SdkError(simulated.error);
+  } else if (!simulated.result) {
+    throw new SdkError(`invalid simulation: no result for \`simulated\` transaction`);
+  }
+
+  return SorobanClient.assembleTransaction(tx, networkPassphrase, simulated).build().toXDR();
+}
+
+export async function confirmTx(
+  hash: string,
+  secondsToWait: number,
+  server: SorobanClient.Server
+): Promise<SorobanRpc.GetTransactionResponse> {
+  let getTransactionResponse = await server.getTransaction(hash);
+
+  const waitUntil = new Date(Date.now() + secondsToWait * 1000).valueOf();
+
+  let waitTime = 1000;
+  const exponentialFactor = 1.5;
+
+  while (Date.now() < waitUntil && getTransactionResponse.status === SorobanRpc.GetTransactionStatus.NOT_FOUND) {
+    // Wait a beat
+    await new Promise((resolve) => setTimeout(resolve, waitTime));
+    /// Exponential backoff
+    waitTime = waitTime * exponentialFactor;
+    // See if the transaction is complete
+    getTransactionResponse = await server.getTransaction(hash);
+  }
+
+  if (getTransactionResponse.status === SorobanRpc.GetTransactionStatus.NOT_FOUND) {
+    throw new TimeoutError(
+      `Waited ${secondsToWait} seconds for transaction to complete, but it did not. ` +
+        `Returning anyway. Check the transaction status manually. ` +
+        `Info: ${JSON.stringify(hash, null, 2)}`
+    );
+  }
+  return getTransactionResponse;
+}
diff --git a/src/tokens-info/tokens-info.model.ts b/src/tokens-info/tokens-info.model.ts
index 60ea57e0..6b4dac02 100644
--- a/src/tokens-info/tokens-info.model.ts
+++ b/src/tokens-info/tokens-info.model.ts
@@ -6,43 +6,139 @@ import { Messenger } from "../client/core-api/core-api.model";
  */
 export type ChainDetailsMap = Record<string, ChainDetailsWithTokens>;
 
+/**
+ * Contains some blockchain details
+ */
 export interface ChainDetails extends BasicChainProperties {
+  /**
+   * Allbridge's Id
+   */
   allbridgeChainId: number;
+  /**
+   * Bridge contract address
+   */
   bridgeAddress: string;
+  /**
+   * Average transfer time to other blockchains
+   */
   transferTime: TransferTime;
+  /**
+   * Transfers costs
+   */
   txCostAmount: TxCostAmount;
+  /**
+   * Number of confirmations required
+   */
   confirmations: number;
 }
 
+/**
+ * Contains tokens list
+ */
 export interface ChainDetailsWithTokens extends ChainDetails {
+  /**
+   * Tokens
+   */
   tokens: TokenWithChainDetails[];
 }
 
+/**
+ * Contains token information
+ */
 export interface Token {
+  /**
+   * Token symbol
+   */
   symbol: string;
+  /**
+   * Token name
+   */
   name: string;
+  /**
+   * Token decimals
+   */
   decimals: number;
+  /**
+   * Token pool address
+   */
   poolAddress: string;
+  /**
+   * Token address
+   */
   tokenAddress: string;
+  /**
+   * Token origin address
+   */
+  originTokenAddress?: string;
+  /**
+   * Token CCTP address</br>
+   * Optional. Defined if CCTP supported by token
+   */
   cctpAddress?: string;
+  /**
+   * Token CCTP address</br>
+   * Optional. Defined if CCTP supported by token
+   */
   cctpFeeShare?: string;
+  /**
+   * Token fee share
+   */
   feeShare: string;
+  /**
+   * Token APR
+   */
   apr: number;
+  /**
+   * Token LP rate
+   */
   lpRate: number;
 }
 
+/**
+ * General Token Interface
+ */
 export interface TokenWithChainDetails extends Token, Omit<ChainDetails, "name"> {
+  /**
+   * Blockchain network name
+   */
   chainName: string;
 }
 
+/**
+ * General Pool Interface
+ */
 export interface PoolInfo {
+  /**
+   * Pool A value
+   */
   aValue: string;
+  /**
+   * Pool D value
+   */
   dValue: string;
+  /**
+   * Pool token balance
+   */
   tokenBalance: string;
+  /**
+   * Pool virtual USD balance
+   */
   vUsdBalance: string;
+  /**
+   * Pool total liquidity amount
+   */
   totalLpAmount: string;
+  /**
+   * Current accumulated reward per share shifted by P bits
+   */
   accRewardPerShareP: string;
+  /**
+   * P value, needed for accRewardPerShareP
+   */
   p: number;
+  /**
+   * Pool imbalance
+   */
   imbalance: string;
 }
 
@@ -53,6 +149,9 @@ export type TransferTime = {
   [chain in ChainSymbol]?: MessengerTransferTime;
 };
 
+/**
+ * Contains Avg transaction time withing different messenger protocols
+ */
 export type MessengerTransferTime = {
   [messenger in Messenger]?: number;
 };
@@ -62,9 +161,21 @@ export interface PoolKeyObject {
   poolAddress: string;
 }
 
+/**
+ * Contains transfer costs
+ */
 export interface TxCostAmount {
+  /**
+   * The maximum gas amount that can be received as extra gas for one transfer
+   */
   maxAmount: string;
+  /**
+   * Swap cost
+   */
   swap: string;
+  /**
+   * Transfer cost
+   */
   transfer: string;
 }
 
diff --git a/src/utils/calculation/index.ts b/src/utils/calculation/index.ts
index de445b92..9c012ff7 100644
--- a/src/utils/calculation/index.ts
+++ b/src/utils/calculation/index.ts
@@ -63,7 +63,7 @@ export function swapToVUsd(
 export function swapFromVUsd(
   amount: BigSource,
   { feeShare, decimals }: Pick<Token, "feeShare" | "decimals">,
-  poolInfo: Omit<PoolInfo, "imbalance">
+  poolInfo: Pick<PoolInfo, "vUsdBalance" | "aValue" | "dValue" | "tokenBalance">
 ): string {
   const amountValue = Big(amount);
   if (amountValue.lte(0)) {
@@ -76,6 +76,24 @@ export function swapFromVUsd(
   return Big(result).minus(fee).round(0, Big.roundDown).toFixed();
 }
 
+export function getSwapFromVUsdPoolInfo(
+  vUsdAmount: BigSource,
+  poolInfo: Omit<PoolInfo, "imbalance">
+): Pick<PoolInfo, "vUsdBalance" | "aValue" | "dValue" | "tokenBalance"> {
+  const amountValue = Big(vUsdAmount);
+  if (amountValue.lte(0)) {
+    return poolInfo;
+  }
+  const vUsdBalance = amountValue.plus(poolInfo.vUsdBalance);
+  const newAmount = getY(vUsdBalance, poolInfo.aValue, poolInfo.dValue);
+  return {
+    aValue: poolInfo.aValue,
+    dValue: poolInfo.dValue,
+    tokenBalance: newAmount.toFixed(0),
+    vUsdBalance: vUsdBalance.toFixed(0),
+  };
+}
+
 /**
  * @param amount - vUsd amount should be received
  * @param feeShare
diff --git a/src/utils/index.ts b/src/utils/index.ts
index 6caa0dc4..71d5af83 100644
--- a/src/utils/index.ts
+++ b/src/utils/index.ts
@@ -1,36 +1,22 @@
-import { Big, BigSource } from "big.js";
-import { AllbridgeCoreClientPoolInfoCaching } from "../client/core-api/core-client-pool-info-caching";
-import { ArgumentInvalidDecimalsError, InvalidAmountError, TimeoutError } from "../exceptions";
-import { TokenWithChainDetails } from "../tokens-info";
+import { AllbridgeCoreSdkOptions } from "../index";
+import { NodeRpcUrlsConfig } from "../services";
+import { DefaultSolUtils, SolUtils } from "./sol";
+import { DefaultSrbUtils, SrbUtils } from "./srb";
 
-export async function getPoolInfoByToken(
-  api: AllbridgeCoreClientPoolInfoCaching,
-  sourceChainToken: TokenWithChainDetails
-) {
-  return await api.getPoolInfoByKey({
-    chainSymbol: sourceChainToken.chainSymbol,
-    poolAddress: sourceChainToken.poolAddress,
-  });
+/**
+ * Contains usefully methods
+ */
+export interface Utils {
+  srb: SrbUtils;
+  sol: SolUtils;
 }
 
-export function validateAmountGtZero(amount: BigSource) {
-  if (Big(amount).lte(0)) {
-    throw new InvalidAmountError("Amount must be greater than zero");
-  }
-}
+export class DefaultUtils implements Utils {
+  srb: SrbUtils;
+  sol: SolUtils;
 
-export function validateAmountDecimals(argName: string, amountFloat: number | string | Big, decimalRequired: number) {
-  const amount = Big(amountFloat).toFixed();
-  if (amount.split(".").length == 2 && amount.split(".")[1].length > decimalRequired) {
-    throw new ArgumentInvalidDecimalsError(argName, amount.split(".")[1].length, decimalRequired);
+  constructor(readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig, params: AllbridgeCoreSdkOptions) {
+    this.srb = new DefaultSrbUtils(nodeRpcUrlsConfig, params);
+    this.sol = new DefaultSolUtils(nodeRpcUrlsConfig, params);
   }
 }
-
-export async function promiseWithTimeout<T>(promise: Promise<T>, msg: string, timeoutMs: number): Promise<T> {
-  return (await Promise.race([
-    promise,
-    new Promise((resolve, reject) => {
-      setTimeout(() => reject(new TimeoutError(msg)), timeoutMs);
-    }),
-  ])) as any as T;
-}
diff --git a/src/utils/sol/index.ts b/src/utils/sol/index.ts
new file mode 100644
index 00000000..7241b307
--- /dev/null
+++ b/src/utils/sol/index.ts
@@ -0,0 +1,37 @@
+import { Connection, PublicKey, TransactionMessage, VersionedTransaction } from "@solana/web3.js";
+import { AllbridgeCoreSdkOptions, ChainSymbol, SdkError } from "../../index";
+import { NodeRpcUrlsConfig } from "../../services";
+import { fetchAddressLookupTableAccountsFromTx } from "./utils";
+
+/**
+ * Contains usefully Solana methods
+ */
+export interface SolUtils {
+  /**
+   * Add memo to solana's transaction
+   * @param transaction transaction to add memo
+   * @param memo memo to add (28 char max)
+   */
+  addMemoToTx(transaction: VersionedTransaction, memo: string): Promise<void>;
+}
+
+export class DefaultSolUtils implements SolUtils {
+  constructor(readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig, readonly params: AllbridgeCoreSdkOptions) {}
+
+  async addMemoToTx(transaction: VersionedTransaction, memo: string): Promise<void> {
+    if (memo.length > 28) {
+      throw new SdkError("InvalidArgumentException memo cannot be more than 28 characters");
+    }
+    const connection = new Connection(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SOL), "confirmed");
+    const addressLookupTableAccounts = await fetchAddressLookupTableAccountsFromTx(transaction, connection);
+    const message = TransactionMessage.decompile(transaction.message, {
+      addressLookupTableAccounts: addressLookupTableAccounts,
+    });
+    message.instructions[message.instructions.length - 1].keys.push({
+      pubkey: new PublicKey(Buffer.from(memo)),
+      isSigner: false,
+      isWritable: false,
+    });
+    transaction.message = message.compileToV0Message(addressLookupTableAccounts);
+  }
+}
diff --git a/src/utils/sol/utils.ts b/src/utils/sol/utils.ts
new file mode 100644
index 00000000..a1b4c946
--- /dev/null
+++ b/src/utils/sol/utils.ts
@@ -0,0 +1,23 @@
+import { AddressLookupTableAccount, Connection, VersionedTransaction } from "@solana/web3.js";
+import { SdkError } from "../../exceptions";
+
+export async function fetchAddressLookupTableAccountsFromTx(
+  transaction: VersionedTransaction,
+  connection: Connection
+): Promise<AddressLookupTableAccount[]> {
+  return await Promise.all(
+    transaction.message.addressTableLookups.map(async (lookup) => {
+      return new AddressLookupTableAccount({
+        key: lookup.accountKey,
+        state: AddressLookupTableAccount.deserialize(
+          await connection.getAccountInfo(lookup.accountKey).then((res) => {
+            if (!res) {
+              throw new SdkError("Cannot get AccountInfo");
+            }
+            return res.data;
+          })
+        ),
+      });
+    })
+  );
+}
diff --git a/src/utils/srb/index.ts b/src/utils/srb/index.ts
new file mode 100644
index 00000000..c59a3339
--- /dev/null
+++ b/src/utils/srb/index.ts
@@ -0,0 +1,136 @@
+import * as SorobanClient from "soroban-client";
+import { SorobanRpc, Transaction, TransactionBuilder } from "soroban-client";
+import {
+  Asset as StellarAsset,
+  Horizon,
+  Operation as StellarOperation,
+  Server as StellarServer,
+  TransactionBuilder as StellarTransactionBuilder,
+} from "stellar-sdk";
+import { AllbridgeCoreSdkOptions, ChainSymbol } from "../../index";
+import { NodeRpcUrlsConfig } from "../../services";
+import { ClassOptions } from "../../services/models/srb/method-options";
+import { TokenContract } from "../../services/models/srb/token-contract";
+import { confirmTx } from "../../services/utils/srb/tx-builder";
+import BalanceLineAsset = Horizon.BalanceLineAsset;
+
+/**
+ * Contains usefully Soroban methods
+ */
+export interface SrbUtils {
+  /**
+   * Build change Trust line Tx
+   * @param params see {@link TrustLineParams}
+   * @returns xdr Tx
+   */
+  buildChangeTrustLineXdrTx(params: TrustLineParams): Promise<string>;
+
+  /**
+   * Get Balance Line information if exists
+   * @param sender
+   * @param tokenAddress
+   */
+  getBalanceLine(sender: string, tokenAddress: string): Promise<Horizon.BalanceLineAsset | undefined>;
+
+  /**
+   * Submit tx
+   * @param xdrTx
+   */
+  submitTransactionStellar(xdrTx: string): Promise<Horizon.SubmitTransactionResponse>;
+
+  /**
+   * Submit tx
+   * @param xdrTx
+   */
+  sendTransactionSoroban(xdrTx: string): Promise<SorobanRpc.SendTransactionResponse>;
+
+  /**
+   * Confirm tx
+   */
+  confirmTx(hash: string, secondsToWait?: number): Promise<SorobanRpc.GetTransactionResponse>;
+}
+
+export interface TrustLineParams {
+  /**
+   * Float amount of tokens, default is Number.MAX_SAFE_INTEGER
+   */
+  limit?: string;
+  sender: string;
+  tokenAddress: string;
+}
+
+const FEE = 100;
+const SEND_TRANSACTION_TIMEOUT = 180;
+
+export class DefaultSrbUtils implements SrbUtils {
+  constructor(readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig, readonly params: AllbridgeCoreSdkOptions) {}
+
+  async buildChangeTrustLineXdrTx(params: TrustLineParams): Promise<string> {
+    const stellar = new StellarServer(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.STLR));
+    const stellarAccount = await stellar.loadAccount(params.sender);
+    const tokenContract = this.getContract(TokenContract, params.tokenAddress);
+    const tokenName = await tokenContract.name();
+    const [symbol, srbTokenAddress] = tokenName.split(":");
+
+    const asset = new StellarAsset(symbol, srbTokenAddress);
+    const changeTrust = StellarOperation.changeTrust({
+      asset: asset,
+      limit: params.limit,
+    });
+
+    return new StellarTransactionBuilder(stellarAccount, {
+      fee: FEE.toString(10),
+      networkPassphrase: this.params.sorobanNetworkPassphrase,
+    })
+      .addOperation(changeTrust)
+      .setTimeout(SEND_TRANSACTION_TIMEOUT)
+      .build()
+      .toXDR();
+  }
+
+  async getBalanceLine(sender: string, tokenAddress: string): Promise<Horizon.BalanceLineAsset | undefined> {
+    const tokenContract = this.getContract(TokenContract, tokenAddress);
+    const tokenName = await tokenContract.name();
+    const [symbol, srbTokenAddress] = tokenName.split(":");
+
+    const stellar = new StellarServer(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.STLR));
+    const stellarAccount = await stellar.loadAccount(sender);
+    const balanceInfo = stellarAccount.balances;
+
+    return balanceInfo.find(
+      (balance): balance is BalanceLineAsset =>
+        (balance.asset_type === "credit_alphanum4" || balance.asset_type === "credit_alphanum12") &&
+        balance.asset_code == symbol &&
+        balance.asset_issuer == srbTokenAddress
+    );
+  }
+
+  async submitTransactionStellar(xdrTx: string): Promise<Horizon.SubmitTransactionResponse> {
+    const stellar = new StellarServer(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.STLR));
+    const transaction = StellarTransactionBuilder.fromXDR(
+      xdrTx,
+      this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.STLR)
+    );
+    return await stellar.submitTransaction(transaction);
+  }
+
+  async sendTransactionSoroban(xdrTx: string): Promise<SorobanRpc.SendTransactionResponse> {
+    const server = new SorobanClient.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SRB));
+    const transaction = TransactionBuilder.fromXDR(xdrTx, this.params.sorobanNetworkPassphrase) as Transaction;
+    return server.sendTransaction(transaction);
+  }
+
+  async confirmTx(hash: string, secondsToWait = 15): Promise<SorobanRpc.GetTransactionResponse> {
+    const server = new SorobanClient.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SRB));
+    return confirmTx(hash, secondsToWait, server);
+  }
+
+  private getContract<T>(contract: new (args: ClassOptions) => T, address: string): T {
+    const config: ClassOptions = {
+      contractId: address,
+      networkPassphrase: this.params.sorobanNetworkPassphrase,
+      rpcUrl: this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SRB),
+    };
+    return new contract(config);
+  }
+}
diff --git a/src/utils/utils.ts b/src/utils/utils.ts
new file mode 100644
index 00000000..c13f3695
--- /dev/null
+++ b/src/utils/utils.ts
@@ -0,0 +1,36 @@
+import { Big, BigSource } from "big.js";
+import { AllbridgeCoreClientPoolInfoCaching } from "../client/core-api/core-client-pool-info-caching";
+import { ArgumentInvalidDecimalsError, InvalidAmountError, TimeoutError } from "../exceptions";
+import { PoolInfo, TokenWithChainDetails } from "../tokens-info";
+
+export async function getPoolInfoByToken(
+  api: AllbridgeCoreClientPoolInfoCaching,
+  sourceChainToken: TokenWithChainDetails
+): Promise<PoolInfo> {
+  return await api.getPoolInfoByKey({
+    chainSymbol: sourceChainToken.chainSymbol,
+    poolAddress: sourceChainToken.poolAddress,
+  });
+}
+
+export function validateAmountGtZero(amount: BigSource) {
+  if (Big(amount).lte(0)) {
+    throw new InvalidAmountError("Amount must be greater than zero");
+  }
+}
+
+export function validateAmountDecimals(argName: string, amountFloat: number | string | Big, decimalRequired: number) {
+  const amount = Big(amountFloat).toFixed();
+  if (amount.split(".").length == 2 && amount.split(".")[1].length > decimalRequired) {
+    throw new ArgumentInvalidDecimalsError(argName, amount.split(".")[1].length, decimalRequired);
+  }
+}
+
+export async function promiseWithTimeout<T>(promise: Promise<T>, msg: string, timeoutMs: number): Promise<T> {
+  return (await Promise.race([
+    promise,
+    new Promise((resolve, reject) => {
+      setTimeout(() => reject(new TimeoutError(msg)), timeoutMs);
+    }),
+  ])) as any as T;
+}