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; +}