From 090c21e5cd1c482fa73f902ddbe1623915e90e40 Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Mon, 2 Dec 2024 13:58:16 +0530 Subject: [PATCH 01/32] typescript testing --- configuration/common.ts | 51 ++ configuration/config.json | 2 + configuration/config.ts | 440 +++++++++++++ configuration/dYdXCommon.ts | 17 + configuration/intialiseWeb3.ts | 75 +++ configuration/schema.ts | 386 +++++++++++ configuration/schemaValidator.ts | 40 ++ package-lock.json | 599 ++++++++++++++++-- package.json | 10 +- src/adapters/Wallet/index.ts | 193 ++++++ .../Wallet/signTransaction/Ethereum.ts | 31 + src/adapters/Wallet/signTransaction/index.ts | 67 ++ src/index.ts | 98 +++ src/interfaces/index.ts | 25 + test/swapTest.ts | 40 ++ tsconfig.json | 19 + 16 files changed, 2029 insertions(+), 64 deletions(-) create mode 100644 configuration/common.ts create mode 100644 configuration/config.ts create mode 100644 configuration/dYdXCommon.ts create mode 100644 configuration/intialiseWeb3.ts create mode 100644 configuration/schema.ts create mode 100644 configuration/schemaValidator.ts create mode 100644 src/adapters/Wallet/index.ts create mode 100644 src/adapters/Wallet/signTransaction/Ethereum.ts create mode 100644 src/adapters/Wallet/signTransaction/index.ts create mode 100644 src/index.ts create mode 100644 src/interfaces/index.ts create mode 100644 test/swapTest.ts create mode 100644 tsconfig.json diff --git a/configuration/common.ts b/configuration/common.ts new file mode 100644 index 0000000..11d80b8 --- /dev/null +++ b/configuration/common.ts @@ -0,0 +1,51 @@ +import config from './config.json'; + +type ChainConfig = { + chains: { + [key: string]: { + localName: string; + chainName: string; + chainSymbol: string; + }; + }; +}; + +type Options = { + chainId?: string | number | null; + chainSymbol?: string | null; +}; + +const getChainIdFromChainSymbol = async (chainSymbol: string): Promise => { + const upperCaseChainSymbol = chainSymbol.toUpperCase(); + + for (const chain in (config as ChainConfig).chains) { + if ((config as ChainConfig).chains[chain].chainSymbol.toUpperCase() === upperCaseChainSymbol) { + return chain; + } + } + + return null; +} + +export const getChainId = async (options: Options): Promise => { + /* + * This function returns the appropriate chainId + * for the given combination of chainId and chainSymbol + */ + + let chainId: string | null = options.chainId ? options.chainId.toString() : null; + const chainSymbol: string | null = options.chainSymbol ? options.chainSymbol.toUpperCase() : null; + + if (chainId === null && chainSymbol === null) { + // By default setting it to EVM based chains + chainId = "1"; + } else if (chainId === null && chainSymbol != null) { + // Fetch the equivalent chain ID from the configuration file + chainId = await getChainIdFromChainSymbol(chainSymbol); + } else if (chainId != null) { + // Ensure chainId is a string + chainId = chainId.toString(); + } + + return chainId; +}; diff --git a/configuration/config.json b/configuration/config.json index eab5b6a..000b362 100644 --- a/configuration/config.json +++ b/configuration/config.json @@ -1,3 +1,4 @@ + { "chains": { "1": { @@ -418,3 +419,4 @@ } } } + diff --git a/configuration/config.ts b/configuration/config.ts new file mode 100644 index 0000000..95b02ca --- /dev/null +++ b/configuration/config.ts @@ -0,0 +1,440 @@ +type ChainConfig = { + localName: string; + chainName: string; + chainSymbol: string; + rpc?: string; + publicRpc?: string; + aptosCoin?: string; + nativeEthAddress?: string; + domain?: string; + sslMateId?: string; + apiKey?: string; + }; + + type Config = { + chains: Record; + }; + +const config: Config = { + "chains": { + "1": { + "localName": "Ethereum", + "chainName": "Evm", + "chainSymbol": "ETH" + }, + "3": { + "localName": "EthereumTestnetRopsten", + "chainName": "Evm", + "chainSymbol": "TETHRPT" + }, + "4": { + "localName": "EthereumTestnetRinkeby", + "chainName": "Evm", + "chainSymbol": "TETHRNK" + }, + "5": { + "localName": "EthereumTestnetGoerli", + "chainName": "Evm", + "chainSymbol": "TETHGRL" + }, + "42": { + "localName": "EthereumTestnetKovan", + "chainName": "Evm", + "chainSymbol": "TETHKVN" + }, + "17000": { + "localName": "EthereumTestnetHolesky", + "chainName": "Evm", + "chainSymbol": "TETHHSKY" + }, + "56": { + "localName": "BinanceSmartChain", + "chainName": "Evm", + "chainSymbol": "BSC" + }, + "97": { + "localName": "BinanceSmartChainTestnet", + "chainName": "Evm", + "chainSymbol": "TBSC" + }, + "43114": { + "localName": "Avalanche", + "chainName": "Evm", + "chainSymbol": "AVAL" + }, + "43113": { + "localName": "AvalancheTesnet", + "chainName": "Evm", + "chainSymbol": "TAVAL" + }, + "137": { + "localName": "Polygon", + "chainName": "Evm", + "chainSymbol": "MATIC" + }, + "80001": { + "localName": "PolygonTestnet", + "chainName": "Evm", + "chainSymbol": "TMATIC" + }, + "25": { + "localName": "Cronos", + "chainName": "Evm", + "chainSymbol": "CRO" + }, + "338": { + "localName": "CronosTestnet", + "chainName": "Evm", + "chainSymbol": "TCRO" + }, + "42161": { + "localName": "Arbitrum", + "chainName": "Evm", + "chainSymbol": "AETH" + }, + "421611": { + "localName": "ArbitrumTestnet", + "chainName": "Evm", + "chainSymbol": "TAETH" + }, + "250": { + "localName": "Fantom", + "chainName": "Evm", + "chainSymbol": "FTM" + }, + "4002": { + "localName": "FantomTestnet", + "chainName": "Evm", + "chainSymbol": "TFTM" + }, + "324": { + "localName": "zkSync", + "chainName": "Evm", + "chainSymbol": "ZKS" + }, + "300": { + "localName": "zkSync", + "chainName": "Evm", + "chainSymbol": "TZKS" + }, + "900": { + "localName": "Solana", + "chainName": "Solana", + "chainSymbol": "SOL" + }, + "901": { + "localName": "SolanaDevnet", + "chainName": "Solana", + "chainSymbol": "DSOL" + }, + "1000": { + "localName": "Tron", + "chainName": "Tron", + "chainSymbol": "TRON" + }, + "1001": { + "localName": "TronTestnet", + "chainName": "Tron", + "chainSymbol": "TTRON" + }, + "1200": { + "localName": "Near", + "chainName": "Near", + "chainSymbol": "NEAR" + }, + "1201": { + "localName": "NearTestnet", + "chainName": "Near", + "chainSymbol": "TNEAR" + }, + "1300": { + "localName": "Algorand", + "chainName": "Algorand", + "chainSymbol": "ALGO" + }, + "1301": { + "localName": "AlgorandTestnet", + "chainName": "Algorand", + "chainSymbol": "TALGO" + }, + "10": { + "localName": "Optimism", + "chainName": "Evm", + "chainSymbol": "OPT" + }, + "101": { + "localName": "Sui", + "chainName": "Sui", + "chainSymbol": "SUI", + "rpc": "https://sui-mainnet-rpc.nodereal.io", + "publicRpc": "https://fullnode.mainnet.sui.io:443" + }, + "102": { + "localName": "SuiDevnet", + "chainName": "Sui", + "chainSymbol": "DSUI", + "rpc": "https://fullnode.devnet.sui.io:443", + "publicRpc": "https://fullnode.devnet.sui.io:443" + }, + "103": { + "localName": "SuiTestnet", + "chainName": "Sui", + "chainSymbol": "TSUI", + "rpc": "https://fullnode.testnet.sui.io:443", + "publicRpc": "https://fullnode.testnet.sui.io:443" + }, + "1400": { + "localName": "Aptos", + "chainName": "Aptos", + "chainSymbol": "APT", + "aptosCoin": "0x1::aptos_coin::AptosCoin", + "rpc": "https://fullnode.mainnet.aptoslabs.com", + "publicRpc": "https://fullnode.mainnet.aptoslabs.com" + }, + "1401": { + "localName": "AptosTestnet", + "chainName": "Aptos", + "chainSymbol": "TAPT", + "aptosCoin": "0x1::aptos_coin::AptosCoin", + "rpc": "https://fullnode.testnet.aptoslabs.com", + "publicRpc": "https://fullnode.testnet.aptoslabs.com" + }, + "400": { + "localName": "StarkNet", + "chainName": "StarkNet", + "chainSymbol": "STRK", + "nativeEthAddress": "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "rpc": "https://starknet-mainnet.blastapi.io/efc44012-502c-4b57-a7b2-f7e7a44535f5", + "publicRpc": "https://starknet-mainnet.blastapi.io/efc44012-502c-4b57-a7b2-f7e7a44535f5", + "domain": "infura.io", + "sslMateId": "4054117900" + }, + "401": { + "localName": "StarkNetTestnet", + "chainName": "StarkNet", + "chainSymbol": "TSTRK", + "nativeEthAddress": "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "rpc": "https://starknet-testnet.blastapi.io/a0c768c4-cd06-4dfc-8a5c-a6a7a0716e2a", + "publicRpc": "https://starknet-testnet.blastapi.io/efc44012-502c-4b57-a7b2-f7e7a44535f5", + "domain": "infura.io", + "sslMateId": "4054117900" + }, + "1100": { + "localName": "TON", + "chainName": "TON", + "chainSymbol": "TON", + "rpc": "https://toncenter.com/api/v2/jsonRPC", + "publicRpc": "https://toncenter.com/api/v2/jsonRPC", + "apiKey": "f5dcc14824318f08f20c7c10b29a3eaac29b9d0c73609f10c1d8f125dd3f6cd2" + }, + "1101": { + "localName": "TONTestnet", + "chainName": "TON", + "chainSymbol": "TONTest", + "rpc": "https://testnet.toncenter.com/api/v2/jsonRPC", + "publicRpc": "https://testnet.toncenter.com/api/v2/jsonRPC", + "apiKey": "f5dcc14824318f08f20c7c10b29a3eaac29b9d0c73609f10c1d8f125dd3f6cd2" + }, + "8453": { + "localName": "Base", + "chainName": "Evm", + "chainSymbol": "BASE", + "rpc": "https://mainnet.base.org", + "publicRpc": "https://mainnet.base.org", + "domain": "base.org" + }, + "84532": { + "localName": "BaseTestnet2", + "chainName": "Evm", + "chainSymbol": "TBASE2", + "rpc": "https://sepolia.base.org", + "publicRpc": "https://sepolia.base.org", + "domain": "base.org" + }, + "11155111": { + "localName": "EthereumTestnetSepolia", + "chainName": "Evm", + "chainSymbol": "TETHSPL", + "rpc": "https://sepolia.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161", + "publicRpc": "https://sepolia.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161", + "domain": "infura.io" + }, + "421614": { + "localName": "ArbitrumSepoliaTestnet", + "chainName": "Evm", + "chainSymbol": "TASPL", + "rpc": "https://sepolia-rollup.arbitrum.io/rpc", + "publicRpc": "https://sepolia-rollup.arbitrum.io/rpc", + "domain": "arbitrum.io" + }, + "11155420": { + "localName": "OptimismSepoliaTestnet", + "chainName": "Evm", + "chainSymbol": "TSPL", + "rpc": "https://sepolia.optimism.io", + "publicRpc": "https://sepolia.optimism.io", + "domain": "optimism.io" + }, + "1500": { + "localName": "Stellar", + "chainName": "Stellar", + "chainSymbol": "XLM", + "rpc": "https://horizon.stellar.org", + "networkPassphrase": "Public Global Stellar Network ; September 2015" + }, + "1501": { + "localName": "StellarTestnet", + "chainName": "Stellar", + "chainSymbol": "TXLM", + "networkPassphrase": "Test SDF Network ; September 2015", + "rpc": "https://horizon-testnet.stellar.org" + }, + "cosmoshub-4": { + "localName": "cosmoshub_mainnet", + "chainName": "Cosmos", + "chainSymbol": "cosmos", + "rpc": "https://cosmos-rpc.publicnode.com:443", + "publicRpc": "https://cosmos-rpc.publicnode.com:443", + "gasPrice": "3000" + }, + "theta-testnet-001": { + "localName": "cosmoshub_testnet", + "chainName": "Cosmos", + "chainSymbol": "cosmos", + "rpc": "https://rpc.sentry-01.theta-testnet.polypore.xyz", + "publicRpc": "https://rpc.sentry-01.theta-testnet.polypore.xyz", + "gasPrice": "3000" + }, + "1600": { + "localName": "XRPLedger", + "chainName": "XRPL", + "chainSymbol": "XRPL", + "network": "mainnet" + }, + "1601": { + "localName": "XRPLedgerTestnet", + "chainName": "XRPL", + "chainSymbol": "TXRPL", + "network": "testnet" + } + }, + "fireblocks": { + "baseUrl": "https://api.fireblocks.io", + "createTransaction": "/v1/transactions" + }, + "circleProgrammableWallet": { + "baseUrl": "https://api.circle.com/v1/w3s/user/transactions/" + }, + "Mask250": "3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "url": { + "apiurl" : "https://api.expand.network" + }, + + "dexes": { + "1900": { + "localName": "UniswapX", + "dexName": "UniswapX", + "chainName": "Ethereum", + "chainId": "1" + }, + "1901": { + "localName": "UniswapXTestnet", + "dexName": "UniswapX", + "chainName": "Ethereum", + "chainId": "5" + }, + "2200": { + "dexName": "Kyberswap", + "localDexName": "Kyberswap", + "chainName": "Ethereum", + "chainId": "1" + }, + "2201": { + "dexName": "Kyberswap", + "localDexName": "KyberswapBsc", + "chainName": "Ethereum", + "chainId": "56" + }, + "2202": { + "dexName": "Kyberswap", + "localDexName": "KyberswapPolygon", + "chainName": "Ethereum", + "chainId": "137" + }, + "2203": { + "dexName": "Kyberswap", + "localDexName": "KyberswapArbitrum", + "chainName": "Ethereum", + "chainId": "42161" + }, + "2204": { + "dexName": "Kyberswap", + "localDexName": "KyberswapAvalanche", + "chainName": "Ethereum", + "chainId": "43114" + }, + "2205": { + "dexName": "Kyberswap", + "localDexName": "KyberswapOptimism", + "chainName": "Ethereum", + "chainId": "10" + }, + "2206": { + "dexName": "Kyberswap", + "localDexName": "KyberswapBase", + "chainName": "Ethereum", + "chainId": "8453" + }, + "2207": { + "dexName": "Kyberswap", + "localDexName": "KyberswapFantom", + "chainName": "Ethereum", + "chainId": "250" + }, + "2208": { + "dexName": "Kyberswap", + "localDexName": "KyberswapCronos", + "chainName": "Ethereum", + "chainId": "25" + } + }, + + "dYdXV4": { + "chainId": "dydx-testnet-4", + "USDC": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5", + "MAX_CLIENT_ID": 4294967295, + "squidRouterAPIBaseUrl": "https://testnet.api.squidrouter.com/v1/", + "rpc": "https://sepolia.infura.io/v3/fc5d23096e754d64a5f261f5f07170d5", + "signingMsg": { + "domain": { + "name": "dYdX V4", + "chainId": 11155111 + }, + "primaryType": "dYdX", + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + } + ], + "dYdX": [ + { + "name": "action", + "type": "string" + } + ] + }, + "message": { + "action": "dYdX Chain Onboarding" + } + } + } +}; + +export default config; + diff --git a/configuration/dYdXCommon.ts b/configuration/dYdXCommon.ts new file mode 100644 index 0000000..dbfcbe8 --- /dev/null +++ b/configuration/dYdXCommon.ts @@ -0,0 +1,17 @@ +const { LocalWallet, Network, CompositeClient, BECH32_PREFIX, SubaccountClient, ValidatorClient } = require("@dydxprotocol/v4-client-js"); + +exports.getSubAccountCompositeClient = async (mnemonic: any, subAccountNumber: any) => { + const wallet = await LocalWallet.fromMnemonic(mnemonic, BECH32_PREFIX); + const client = await CompositeClient.connect(Network.testnet()); + + const subaccount = new SubaccountClient(wallet, subAccountNumber); + return { client, subaccount }; +}; + +exports.getSubAccountValidatorClient = async (mnemonic: any, subAccountNumber: any) => { + const wallet = await LocalWallet.fromMnemonic(mnemonic, BECH32_PREFIX); + const client = await ValidatorClient.connect(Network.testnet().validatorConfig); + + const subaccount = new SubaccountClient(wallet, subAccountNumber); + return { client, subaccount }; +}; \ No newline at end of file diff --git a/configuration/intialiseWeb3.ts b/configuration/intialiseWeb3.ts new file mode 100644 index 0000000..274142b --- /dev/null +++ b/configuration/intialiseWeb3.ts @@ -0,0 +1,75 @@ +import EvmWeb from "web3"; +import solanaWeb from "@solana/web3.js"; +import TronWeb from "tronweb"; +import nearApi from "near-api-js"; +import algosdk from "algosdk"; +import { JsonRpcProvider, Connection } from "@mysten/sui.js"; +import { AptosClient } from "aptos"; +import { TonClient } from "@ton/ton"; +import { StargateClient } from "@cosmjs/stargate"; +import StellarSdk from "stellar-sdk"; +import { getChainId } from "./common"; +import config from "./config.json"; +import errorMessage from "./errorMessage.json"; + +const server = new StellarSdk.Server("https://horizon.stellar.org"); + +const invalidChainId = { + error: errorMessage.error.message.invalidChainId, + code: errorMessage.error.code.invalidInput +}; + +export const initialiseWeb3 = async (data: any) => { + const chainId = await getChainId({ + chainId: data.chainId, + chainSymbol: data.chainSymbol + }); + + let rpc; + let chainName; + + try { + rpc = data.rpc || config.chains[chainId].rpc; + chainName = config.chains[chainId].chainName; + } catch (error) { + return invalidChainId; + } + + let web3; + + if (chainName === "Evm") { + web3 = new EvmWeb(rpc); + } else if (chainName === "Solana") { + web3 = new solanaWeb.Connection(rpc); + } else if (chainName === "Tron") { + const { HttpProvider } = TronWeb.providers; + const fullNode = new HttpProvider(rpc); + const solidityNode = new HttpProvider(rpc); + const eventServer = new HttpProvider(rpc); + web3 = new TronWeb(fullNode, solidityNode, eventServer); + } else if (chainName === "Near") { + web3 = await nearApi.connect({ + networkId: data.networkId, + nodeUrl: rpc + }); + } else if (chainName === "Algorand") { + const token = { "x-api-key": data.key }; + web3 = + data.connectionType === "idx" + ? new algosdk.Indexer(token, rpc, "") + : new algosdk.Algodv2(token, rpc, ""); + } else if (chainName === "Sui") { + const connection = new Connection({ fullnode: rpc }); + web3 = new JsonRpcProvider(connection); + } else if (chainName === "Aptos") { + web3 = new AptosClient(rpc); + } else if (chainName === "TON") { + web3 = new TonClient({ endpoint: rpc, apiKey: config.chains[chainId]?.apiKey }); + } else if (chainName === "Stellar") { + web3 = new HorizonServer(rpc); + } else if (chainName === "Cosmos") { + web3 = await StargateClient.connect(rpc); + } + + return web3; +}; diff --git a/configuration/schema.ts b/configuration/schema.ts new file mode 100644 index 0000000..081983e --- /dev/null +++ b/configuration/schema.ts @@ -0,0 +1,386 @@ +/* +* For the functions under chain category, +* the validation is set on the function level +* For example, for funciton getBlock() the request will be same, regardless of the chain ID and symbol +* Whereas for all the other category, validations are broken one level down, i.e. to the protocol level +* +*/ + +export const jsonSchema = { + + type: "object", + + allOf: [ + + // Field Mapping for prepareTransaction() function + { + if: { + properties: { + function: { type: "string", pattern: "prepareTransaction()" }, + } + }, + then: { + properties: { + chainId: { type: "string" }, + chainSymbol: { type: "string" }, + xApiKey: { type: "string" }, + rpc: { type: "string" } + + }, + required: ["xApiKey"] + }, + }, + + // Field Mapping for signTransaction() function + { + if: { + properties: { + function: { type: "string", pattern: "signTransaction()" }, + } + }, + then: { + properties: { + rpc: { type: "string" }, + privateKey: { type: "string" }, + chainId: { type: "string" }, + chainSymbol: { type: "string" }, + key: { type: "string" }, + xApiKey: { type: "string" } + }, + required: ["xApiKey"] + }, + }, + + // Field Mapping for transactionObject() function + + { + if: { + properties: { + function: { type: "string", pattern: "transactionObject()" }, + } + }, + then: { + properties: { + from: { type: "string" }, + to: { type: "string" }, + value: { type: "string" }, + gas: { type: "string" }, + data: { type: "string" }, + networkId: { type: "string" } + }, + + required: ["from", "to"] + } + + }, + + // Field Mapping for tontransactionObject() function + + { + if: { + properties: { + function: { type: "string", pattern: "tonTxObject()" }, + } + }, + then: { + properties: { + from: { type: "string" }, + to: { type: "string" }, + value: { type: "string" }, + gas: { type: "string" }, + data: { type: "string" } + }, + + required: [ "to", "value"] + } + + }, + + // Field Mapping for txObjSol() function + + { + if: { + properties: { + function: { type: "string", pattern: "txObjSol()" }, + } + }, + then: { + properties: { + from: { type: "string" }, + to: { type: "string" }, + value: { type: "string" }, + gas: { type: "string" }, + data: { type: "string" }, + }, + + required: ["from", "to"] + } + + }, + + // Field Mapping for sendTransaction() function + { + if: { + properties: { + function: { type: "string", pattern: "sendTransaction()" }, + } + }, + then: { + properties: { + chainId: { type: "string" }, + chainSymbol: { type: "string", maxLength: 7, minLength: 3 }, + rawTransaction: { type: "string" }, + signature: { type: "string" }, + xApiKey: { type: "string" }, + rpc: { type: "string" } + }, + required: ["rawTransaction"] + }, + }, + + { + if: { + properties: { + function: { type: "string", pattern: "TONTransaction()" }, + } + }, + then: { + properties: { + chainId: { type: "string" }, + chainSymbol: { type: "string", maxLength: 7, minLength: 3 }, + rawTransaction: { type: "object" }, + xApiKey: { type: "string" }, + rpc: { type: "string" } + }, + required: ["rawTransaction"] + }, + }, + + { + if: { + properties: { + function: { type: "string", pattern: "FordefiTransaction()" }, + } + }, + then: { + properties: { + data: { type: "string" }, + timestamp: { type: "number" }, + signature: { type: "string" }, + accessToken: { type: "string" }, + }, + required: ["data", "signature", "accessToken", "timestamp"] + }, + }, + + // Fireblocks + + { + if: { + properties: { + function: { type: "string", pattern: "FireblockSign()" }, + } + }, + then: { + properties: { + from: { type: "string" }, + assetId: { type: "string" }, + data: { type: "string" }, + note: { type: "string" }, + amount: { type: "string" } + }, + required: ["from"] + }, + }, + + { + if: { + properties: { + function: { type: "string", pattern: "SendFireblocks()" }, + } + }, + then: { + properties: { + jwt: { type: "string" }, + path: { type: "string" }, + data: { type: "object" }, + method: { type: "string", } + }, + required: ["jwt", "data"] + }, + }, + + // Field Mapping for stellarSignTransaction() function + { + if: { + properties: { + function: { type: "string", pattern: "stellarSignTransaction()" }, + } + }, + then: { + properties: { + chainId: { type: "string" }, + chainSymbol: { type: "string" }, + data: { type: "string" }, + rpc: { type: "string" }, + }, + required: ["data"] + }, + }, + + // Field Mapping for xrplSignTransaction() function + { + if: { + properties: { + function: { type: "string", pattern: "xrplSignTransaction()" }, + } + }, + then: { + properties: { + chainId: { type: "string" }, + chainSymbol: { type: "string" }, + data: { type: "string" }, + rpc: { type: "string" }, + }, + required: ["data"] + }, + }, + + // Field Mapping for userOnboardingDYDX() function + { + if: { + properties: { + function: { type: "string", pattern: "userOnboardingDYDX()" }, + } + }, + then: { + properties: { + privateKey: { type: "string" } + }, + required: ["privateKey"] + }, + }, + + // Field Mapping for signOrderRFQ() function + { + if: { + properties: { + function: { type:"string", pattern: "signOrderRFQ()" }, + } + }, + then: { + properties: { + dexId: { type: "string", enum: ["1900", "1901"], default: "1900" }, + domain: { type: "object" }, + types: { type: "object" }, + values: { type: "object" } + }, + required: ["domain", "types", "values"] + }, + }, + + // Field Mapping for signLimitOrder() function + { + if: { + properties: { + function: { type:"string", pattern: "signLimitOrder()" }, + } + }, + then: { + properties: { + dexId: { type: "string", enum: ["2200", "2201", "2202", "2203", "2204", "2205", "2206", "2207", "2208"], default: "2200" }, + domain: { type: "object" }, + types: { type: "object" }, + message: { type: "object" }, + orderType: { type: "string", enum: ["create", "cancel"], default: "create"}, + }, + required: ["domain", "types", "message"] + }, + }, + + // Field Mapping for placeOrderDYDX() function + { + if: { + properties: { + function: { type: "string", pattern: "placeOrderDYDX()" }, + } + }, + then: { + properties: { + subAccountNumber: { type: "string", pattern: '^[0-9][0-9]*$', "errorMessage": "Value should be positive" }, + mnemonic: { type: "string" }, + market: { type: "string" }, + type: { type: "string", enum: ['LIMIT', 'MARKET'] }, + side: { type: "string", enum: ['SELL', 'BUY'] }, + timeInForce: { type: "string", default: "IOC", enum: ["GTT", "IOC", "FOK"] }, + time: { type: "string", default: "60" }, + price: { type: "string" }, + size: { type: "string" }, + postOnly: { type: "string", default: "false", enum: ["true", "false"] }, + reduceOnly: { type: "string", default: "false", enum: ["true", "false"] }, + triggerPrice: { type: "string", default: "null" }, + }, + required: ["subAccountNumber", "size", "mnemonic", "market", "type", "side", "price"], + }, + }, + + // Field Mapping for cancelOrderDYDX() function + { + if: { + properties: { + function: { type: "string", pattern: "cancelOrderDYDX()" }, + } + }, + then: { + properties: { + subAccountNumber: { type: "string", pattern: '^[0-9][0-9]*$', "errorMessage": "Value should be positive" }, + mnemonic: { type: "string" }, + orderId: { type: "string" }, + goodTillTimeInSeconds: { type: "string", default: '500' } + }, + required: ["subAccountNumber", "mnemonic", "orderId"] + }, + }, + + // Field Mapping for transferDYDX() function + { + if: { + properties: { + function: { type: "string", pattern: "transferDYDX()" }, + } + }, + then: { + properties: { + subAccountNumber: { type: "string", pattern: '^[0-9][0-9]*$', "errorMessage": "Value should be positive" }, + mnemonic: { type: "string" }, + recipient: { type: "string" }, + assetId: { type: "string", default: "0", pattern: '^[0-9][0-9]*$', "errorMessage": "Value should be positive" }, + amount: { type: "string" }, + }, + required: ["subAccountNumber", "mnemonic", "recipient", "amount"] + }, + }, + + // Field Mapping for depositDYDX() function + { + if: { + properties: { + function: { type: "string", pattern: "depositDYDX()" }, + } + }, + then: { + properties: { + amountIn: { type: "string" }, + from: { type: "string" }, + slippage: { type: "string", default: "1" }, + srcChainId: { type: "string", default: "5", enum: ["5", "97", "80001", "420", "43113", "4002"] }, + tokenIn: { type: "string" }, + to: { type: "string" }, + gas: { type: "string", pattern: '^[0-9][0-9]*$', "errorMessage": "Value should be positive" }, + privateKey: { type: "string" }, + }, + required: ["amountIn", "to", "gas", "from", "tokenIn", "privateKey"] + }, + }, + ] +}; \ No newline at end of file diff --git a/configuration/schemaValidator.ts b/configuration/schemaValidator.ts new file mode 100644 index 0000000..9e1d849 --- /dev/null +++ b/configuration/schemaValidator.ts @@ -0,0 +1,40 @@ +// Copyright 2022 The CmLab Authors +// This file is part of the expand Library. + +import Ajv from "ajv"; +import addErrors from "ajv-errors"; +import errorMessage from "./errorMessage.json"; +import { jsonSchema } from "./schema"; + +const ajv = new Ajv({ allErrors: true, strict: true, useDefaults: true }); +addErrors(ajv); + +export const validateInput = async(options:any) => { + /* + * This functions validate the given options as per the schema + * Returns the validate response as of following + * + * { + * "valid": false, + * "message" : { + * "error": { + * missingProperty: 'address' + * } + * } + * "code" : 401 + * } + */ + + const validate = ajv.compile(jsonSchema); + const valid = validate(options); + const error = valid ? null : (validate.errors && validate.errors[0]?.params); + const response: any = {}; + response.valid = valid; + + if (!valid) { + response.message = error || { error: "Unknown validation error" }; + response.code = errorMessage.error.code.invalidInput; + } + + return (response); +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 246de15..eada588 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,8 +14,8 @@ "@cosmjs/stargate": "0.32.4", "@cosmjs/tendermint-rpc": "^0.32.0", "@dfns/lib-ethersjs6": "^0.4.2", - "@dfns/sdk": "^0.3.1", - "@dfns/sdk-keysigner": "^0.3.1", + "@dfns/sdk": "^0.4.3", + "@dfns/sdk-keysigner": "^0.4.3", "@dydxprotocol/v4-client-js": "1.1.25", "@ethereumjs/common": "4.1.0", "@mysten/bcs": "0.11.1", @@ -46,7 +46,7 @@ "near-api-js": "4.0.2", "rpc-websockets": "7.5.1", "starknet": "5.24.3", - "stellar-sdk": "^11.2.2", + "stellar-sdk": "^12.3.0", "ton-crypto": "3.2.0", "tronweb": "5.3.1", "tweetnacl": "1.0.3", @@ -55,11 +55,14 @@ }, "devDependencies": { "@babel/eslint-parser": "^7.22.15", + "@types/node": "^22.10.1", "eslint": "8.56.0", "eslint-config-airbnb-base": "15.0.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-import": "2.29.1", - "jest": "29.7.0" + "jest": "29.7.0", + "tsx": "^4.19.2", + "typescript": "^5.1.6" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -1003,9 +1006,9 @@ } }, "node_modules/@dfns/sdk": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@dfns/sdk/-/sdk-0.3.1.tgz", - "integrity": "sha512-KrfX8xbQR8+CaQSRLJW4YtX+qTf877J/CDcFJoWsDssgkTwXRoQ9TqGePkIQ118muMCHyW5xOto6Mr/O6TAKuA==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@dfns/sdk/-/sdk-0.4.3.tgz", + "integrity": "sha512-ef95C9X9WWv0jy/dRGjRFX+3PuLmqiEQPkXA9NRLvLUBTwDfet32zt4TYae9g5ANmhHsBAX86sNjyl0+Wx4Bbw==", "dependencies": { "buffer": "6.0.3", "cross-fetch": "3.1.6", @@ -1013,16 +1016,16 @@ } }, "node_modules/@dfns/sdk-keysigner": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@dfns/sdk-keysigner/-/sdk-keysigner-0.3.1.tgz", - "integrity": "sha512-NI/Z8lTUYSaLUZgNlLxgvn0nJWfXwQdmEjHZ27UjxySukhRyG/zI3gMGIhHbgAiCIBP9jLXvA8nFaw6RAGha4A==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@dfns/sdk-keysigner/-/sdk-keysigner-0.4.3.tgz", + "integrity": "sha512-sptpimRoNFyhQzJxRME9bK5D9xiNvBcMbTxQVU0tHbi/2AayJno17p4hGWoyrnrOf0IB2LtiVrvWp4M+6LPjtA==", "dependencies": { "buffer": "6.0.3", "cross-fetch": "3.1.6", "uuid": "9.0.0" }, "peerDependencies": { - "@dfns/sdk": "0.3.1" + "@dfns/sdk": "0.4.3" } }, "node_modules/@dfns/sdk-keysigner/node_modules/uuid": { @@ -1145,6 +1148,390 @@ "pbts": "bin/pbts" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -3248,16 +3635,14 @@ "node_modules/@stellar/js-xdr": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-3.1.2.tgz", - "integrity": "sha512-VVolPL5goVEIsvuGqDc5uiKxV03lzfWdvYg1KikvwheDmTBO68CKDji3bAZ/kppZrx5iTA8z3Ld5yuytcvhvOQ==", - "license": "Apache-2.0" + "integrity": "sha512-VVolPL5goVEIsvuGqDc5uiKxV03lzfWdvYg1KikvwheDmTBO68CKDji3bAZ/kppZrx5iTA8z3Ld5yuytcvhvOQ==" }, "node_modules/@stellar/stellar-base": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-11.0.1.tgz", - "integrity": "sha512-VQh+1KEtFjegD6spx08+lENt8tQOkQQQZoLtqExjpRXyWlqDhEe+bXMlBTYKDc5MIynHyD42RPEib27UG17trA==", - "license": "Apache-2.0", + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-12.1.1.tgz", + "integrity": "sha512-gOBSOFDepihslcInlqnxKZdIW9dMUO1tpOm3AtJR33K2OvpXG6SaVHCzAmCFArcCqI9zXTEiSoh70T48TmiHJA==", "dependencies": { - "@stellar/js-xdr": "^3.1.1", + "@stellar/js-xdr": "^3.1.2", "base32.js": "^0.1.0", "bignumber.js": "^9.1.2", "buffer": "^6.0.3", @@ -3265,7 +3650,7 @@ "tweetnacl": "^1.0.3" }, "optionalDependencies": { - "sodium-native": "^4.0.10" + "sodium-native": "^4.1.1" } }, "node_modules/@suchipi/femver": { @@ -3503,9 +3888,12 @@ "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" }, "node_modules/@types/node": { - "version": "20.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.0.tgz", - "integrity": "sha512-cumHmIAf6On83X7yP+LrsEyUOf/YlociZelmpRYaGFydoaPdxdt80MAbu6vWerQT2COCp2nPvHdsbD7tHn/YlQ==" + "version": "22.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", + "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", + "dependencies": { + "undici-types": "~6.20.0" + } }, "node_modules/@types/pbkdf2": { "version": "3.1.0", @@ -4141,7 +4529,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.1.0.tgz", "integrity": "sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==", - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -4746,19 +5133,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chokidar/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/chokidar/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -5670,6 +6044,45 @@ "ext": "^1.1.2" } }, + "node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -6815,6 +7228,19 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -6935,6 +7361,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -8289,20 +8727,6 @@ "fsevents": "^2.3.2" } }, - "node_modules/jest-haste-map/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/jest-leak-detector": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", @@ -10680,6 +11104,15 @@ "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/resolve.exports": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", @@ -11220,11 +11653,9 @@ } }, "node_modules/sodium-native": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.1.1.tgz", - "integrity": "sha512-LXkAfRd4FHtkQS4X6g+nRcVaN7mWVNepV06phIsC6+IZFvGh1voW5TNQiQp2twVaMf05gZqQjuS+uWLM6gHhNQ==", - "hasInstallScript": true, - "license": "MIT", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.3.1.tgz", + "integrity": "sha512-YdP64gAdpIKHfL4ttuX4aIfjeunh9f+hNeQJpE9C8UMndB3zkgZ7YmmGT4J2+v6Ibyp6Wem8D1TcSrtdW0bqtg==", "optional": true, "dependencies": { "node-gyp-build": "^4.8.0" @@ -11351,14 +11782,13 @@ } }, "node_modules/stellar-sdk": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/stellar-sdk/-/stellar-sdk-11.3.0.tgz", - "integrity": "sha512-xOp2zpQm5TIbgJi7wJhAmJh+Uy0ew5GbGtj1kZv6HEWHgSvW95xYMxGaw6MWM9r2YPUSQySboE6JwDc9jdx53A==", + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/stellar-sdk/-/stellar-sdk-12.3.0.tgz", + "integrity": "sha512-3z7umyuBAHN+vm3zLTKqj7P/bErBFnjrwoanBsNyBHaoek9krUgufNupQSMK67B1p0E2NKD1Z6gYPuZiPfJ2qQ==", "deprecated": "⚠️ This package has moved to @stellar/stellar-sdk! 🚚", - "license": "Apache-2.0", "dependencies": { - "@stellar/stellar-base": "^11.0.1", - "axios": "^1.6.8", + "@stellar/stellar-base": "^12.1.1", + "axios": "^1.7.7", "bignumber.js": "^9.1.2", "eventsource": "^2.0.2", "randombytes": "^2.1.0", @@ -11366,6 +11796,16 @@ "urijs": "^1.19.1" } }, + "node_modules/stellar-sdk/node_modules/axios": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.8.tgz", + "integrity": "sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/strict-event-emitter": { "version": "0.4.6", "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.4.6.tgz", @@ -11899,6 +12339,25 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" }, + "node_modules/tsx": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", + "dev": true, + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -12038,6 +12497,19 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/ultron": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", @@ -12058,6 +12530,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", diff --git a/package.json b/package.json index ae693b6..74da2b7 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,8 @@ "name": "expand-network", "version": "3.2.4", "description": "The external SDK for the adapter", - "main": "src/index.js", + "main": "src/index.ts", + "type": "module", "parserOptions": { "ecmaVersion": 2018 }, @@ -58,7 +59,7 @@ "near-api-js": "4.0.2", "rpc-websockets": "7.5.1", "starknet": "5.24.3", - "stellar-sdk": "^11.2.2", + "stellar-sdk": "^12.3.0", "ton-crypto": "3.2.0", "tronweb": "5.3.1", "tweetnacl": "1.0.3", @@ -67,10 +68,13 @@ }, "devDependencies": { "@babel/eslint-parser": "^7.22.15", + "@types/node": "^22.10.1", "eslint": "8.56.0", "eslint-config-airbnb-base": "15.0.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-import": "2.29.1", - "jest": "29.7.0" + "jest": "29.7.0", + "tsx": "^4.19.2", + "typescript": "^5.1.6" } } diff --git a/src/adapters/Wallet/index.ts b/src/adapters/Wallet/index.ts new file mode 100644 index 0000000..4f0680c --- /dev/null +++ b/src/adapters/Wallet/index.ts @@ -0,0 +1,193 @@ +import axios from 'axios'; +import BN from 'bn.js'; +import rawTransaction from './signTransaction/index'; +import config from '../../../configuration/config.json'; +import { getChainId } from '../../../configuration/common'; +import {schemaValidator} from '../../../configuration/schemaValidator'; +import {initialiseWeb3} from '../../../configuration/intialiseWeb3'; +import { ethers } from 'ethers-5'; + +class Wallet { + + constructor(options) { + this.privateKey = options.privateKey; + this.xApiKey = options.xApiKey; + }; + + signTransaction = async (transactionObject) => { + + const configuration = { "params": {} }; + const transactionOptions = transactionObject; + transactionOptions.function = "transactionObject()"; + const validObject = await schemaValidator.validateInput(transactionObject); + + if (!validObject.valid) { + return (validObject); + } + + axios.defaults.headers['X-API-KEY'] = this.xApiKey; + const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; + + const chainId = await getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); + + + configuration.params = { + chainId + }; + + let rpc = await axios.get(apiURL, configuration); + rpc = rpc.data.data.rpc; + const web3 = await initialiseWeb3({ rpc: rpc, chainId, key: this.xApiKey }); + transactionOptions.value = new BN(transactionOptions.value); + + let chainName = config.chains[chainId].chainName; + console.log(chainName); + + const options = {}; + options.privateKey = this.privateKey; + options.chainId = transactionObject.chainId; + options.rpc = rpc; + const rawData = await rawTransaction[`signTransaction${chainName}`](web3,transactionObject,options); + rawData.chainId = chainId; + + return rawData; + }; + + signVersionedTransaction = async (transactionObject) => { + + const configuration = { "params": {} }; + transactionObject.function = "txObjSol()"; + const validObject = await schemaValidator.validateInput(transactionObject); + + if (!validObject.valid) { + return (validObject); + } + + axios.defaults.headers['X-API-KEY'] = this.xApiKey; + const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; + + const chainId = await getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); + + let chainName = config.chains[chainId].chainName; + + if (chainName !== "Solana") + return new Error("chain not Supported"); + + configuration.params = { + chainId + }; + + let rpc = await axios.get(apiURL, configuration); + rpc = rpc.data.data.rpc; + const web3 = await initialiseWeb3({ rpc: rpc, chainId, key: this.xApiKey }); + + const options = {}; + options.privateKey = this.privateKey; + const rawData = await rawTransaction[`signVersionedTransaction${chainName}`](web3, transactionObject, options); + rawData.chainId = chainId; + + return rawData; + }; + + sendTransaction = async (options) => { + + const filterOptions = options; + filterOptions.function = "sendTransaction()"; + const validJson = await schemaValidator.validateInput(filterOptions); + if (!validJson.valid) { + return (validJson); + } + + try { + + const apiURL = `${config.url.apiurl}/chain/sendtransaction/`; + + const params = { + method: "post", + url: apiURL, + data: options, + headers: { + "x-api-key": this.xApiKey + } + }; + + const transactionHash = await axios(params); + return transactionHash.data; + } + + catch (error) { + return error; + } + + }; + + signOrderRFQ = async (options) => { + const filterOptions = options; + filterOptions.function = "signOrderRFQ()"; + const validJson = await schemaValidator.validateInput(options); + if (!validJson.valid) { + return (validJson); + } + + const { dexId, domain, types, values } = options; + const { chainId } = config.dexes[dexId] + + let apiConfig = { + method: 'get', + maxBodyLength: Infinity, + url: `${config.url.apiurl}/chain/getpublicrpc?chainId=${chainId}`, + headers: { + 'x-api-key': this.xApiKey + } + }; + + let rpc = await axios.request(apiConfig); + + rpc = rpc.data.data.rpc; + + const provider = new ethers.providers.JsonRpcProvider(rpc); + const signer = new ethers.Wallet(this.privateKey, provider); + const signature = await signer._signTypedData(domain, types, values); + return { signature }; + }; + + signLimitOrder = async (options) => { + const filterOptions = options; + filterOptions.function = "signLimitOrder()"; + const validJson = await schemaValidator.validateInput(options); + if (!validJson.valid) { + return (validJson); + } + + const { dexId, orderType, domain, types, message } = options; + const { chainId } = config.dexes[dexId] + + let apiConfig = { + method: 'get', + maxBodyLength: Infinity, + url: `${config.url.apiurl}/chain/getpublicrpc?chainId=${chainId}`, + headers: { + 'x-api-key': this.xApiKey + } + }; + + let rpc = await axios.request(apiConfig); + rpc = rpc.data.data.rpc; + + const provider = new ethers.providers.JsonRpcProvider(rpc); + const signer = new ethers.Wallet(this.privateKey, provider); + const signature = orderType === "create" ? await signer._signTypedData( + domain, + { Order: types.Order }, + message + ) : await signer._signTypedData( + domain, + { CancelOrder: types.CancelOrder }, + message + ); + return { signature, ...(orderType === "create" && {salt: message.salt}) }; + }; +} + +export default { Wallet }; + diff --git a/src/adapters/Wallet/signTransaction/Ethereum.ts b/src/adapters/Wallet/signTransaction/Ethereum.ts new file mode 100644 index 0000000..bb4cae7 --- /dev/null +++ b/src/adapters/Wallet/signTransaction/Ethereum.ts @@ -0,0 +1,31 @@ +import Web3 from 'web3'; + +interface TransactionObject { + to: string; + value: string; + gas: string; + data?: string; + // Add other properties as necessary +} + +interface Options { + privateKey: string; +} + +export const signTransactionEvm = async ( + web3: Web3, + transactionObject: TransactionObject, + options: Options +): Promise => { + /* + * Function will sign the transaction payload for Ethereum-based chains + */ + + try { + const signedTransaction = await web3.eth.accounts.signTransaction(transactionObject, options.privateKey); + return signedTransaction.rawTransaction as string; // Assuming you need the raw transaction + } catch (error) { + console.error('Error signing transaction:', error); + throw new Error('Transaction signing failed'); + } +}; diff --git a/src/adapters/Wallet/signTransaction/index.ts b/src/adapters/Wallet/signTransaction/index.ts new file mode 100644 index 0000000..aecc593 --- /dev/null +++ b/src/adapters/Wallet/signTransaction/index.ts @@ -0,0 +1,67 @@ +// import Algorand from './Algorand'; +import Ethereum from './Ethereum'; +// import Near from './Near'; +// import Solana from './Solana'; +// import Tron from './Tron'; +// import Sui from './Sui'; +// import Aptos from './Aptos'; +// import StarkNet from './Starknet'; + +// export const signTransactionAlgorand = async (web3: any, transactionObject: any, options: any) => { + +// const rawData = await Algorand.signTransactionAlgorand(web3, transactionObject, options); +// return rawData; + +// }; + +export const signTransactionEvm = async (web3: any, transactionObject: any, options: any) => { + + const rawData = await Ethereum.signTransactionEvm(web3, transactionObject, options); + return rawData; +}; + +// exports.signTransactionNear = async (web3, transactionObject, options) => { + +// const rawData = await Near.signTransactionNear(web3, transactionObject, options); +// return rawData; + +// }; + +// exports.signTransactionTron = async (web3, transactionObject, options) => { + +// const rawData = await Tron.signTransactionTron(web3, transactionObject, options); +// return rawData; +// }; + +// exports.signTransactionSolana = async (web3, transactionObject, options) => { + +// const rawData = await Solana.signTransactionSolana(web3, transactionObject, options); +// return rawData; +// }; + +// exports.signTransactionSui = async (web3, transactionObject, options) => { + +// const rawData = await Sui.signTransactionSui(web3, transactionObject, options); +// return rawData; +// }; + + +// exports.signTransactionAptos = async (web3, transactionObject, options) => { + +// const rawData = await Aptos.signTransactionAptos(web3, transactionObject, options); +// return rawData; +// }; + +// exports.signTransactionStarkNet = async (web3, transactionObject, options) => { + +// const rawData = await StarkNet.signTransactionStarkNet(web3, transactionObject, options); +// return rawData; +// }; + +// exports.signVersionedTransactionSolana = async (web3, transactionObject, options) => { + +// const rawData = await Solana.signVersionedTransactionSolana(web3, transactionObject, options); +// return rawData; +// }; + + diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..9bd1a37 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,98 @@ +import axios from 'axios'; +import config from '../configuration/config'; +import schemaValidator from '../configuration/schemaValidator'; +import { Wallet, WalletFordefi, WalletDFNS, WalletTON, + WalletFireblocks, WalletPhantom, WalletCoinbase, + WalletCircle, WalletCosmos, WalletStellar, WalletXRPL } from './interfaces/index'; + +exports.prepareTransaction = async (apiURL, options) => { + + const filterOptions = options; + filterOptions.function = "prepareTransaction()"; + const validJson = await schemaValidator.validateInput(filterOptions); + + if (!validJson.valid) { + return (validJson); + } + + const { chainId, xApiKey } = filterOptions; + try { + const paramConfig = { + method: "post", + url: apiURL, + data: filterOptions, + headers: { + "x-api-key": xApiKey + } + + }; + + const response = await axios(paramConfig).then(result => result.data); + if (chainId) response.data.chainId = chainId; + return response.data; + + } + catch (error) { + return error; + } +}; + + +exports.decodeTransaction = async (options) => { + + const filterOptions = options; + filterOptions.function = "decodeTransaction()"; + const validJson = await schemaValidator.validateInput(options); + + if (!validJson.valid) { + return (validJson); + } + + try { + const apiURL = `${config.url.apiurl}/chain/decodetransaction/`; + + const paramConfig = { + method: "post", + url: apiURL, + data: filterOptions, + headers: { + "x-api-key": filterOptions.xApiKey + } + }; + + const response = await axios(paramConfig).then(result => result.data); + return response.data; + + } catch (error) { + return error; + } +}; + + +exports.Wallet = Wallet; + +exports.WalletFordefi = WalletFordefi; + +exports.WalletDFNS = WalletDFNS; + +exports.WalletPhantom = WalletPhantom; + +exports.WalletCoinbase = WalletCoinbase; + +exports.WalletTON = WalletTON; + +exports.WalletFireblocks = WalletFireblocks; + +exports.WalletCircle = WalletCircle; + +exports.WalletStellar = WalletStellar; + +exports.WalletXRPL = WalletXRPL; + +exports.WalletCosmos = WalletCosmos; + + + + + + diff --git a/src/interfaces/index.ts b/src/interfaces/index.ts new file mode 100644 index 0000000..0c7d63d --- /dev/null +++ b/src/interfaces/index.ts @@ -0,0 +1,25 @@ +import { Wallet } from '../adapters/Wallet'; +import { WalletFordefi } from '../adapters/WalletFordefi'; +import { WalletDFNS } from '../adapters/WalletDFNS'; +import { WalletPhantom } from '../adapters/WalletPhantom'; +import { WalletCoinbase } from '../adapters/WalletCoinbase'; +import { WalletTON } from '../adapters/WalletTON'; +import { WalletFireblocks } from '../adapters/WalletFireblocks'; +import { WalletCircle } from '../adapters/WalletCircle'; +import { WalletCosmos } from "../adapters/WalletCosmos"; +import { WalletStellar } from '../adapters/WalletStellar'; +import { WalletXRPL } from '../adapters/WalletXRPL'; + +export { + Wallet, + WalletFordefi, + WalletDFNS, + WalletPhantom, + WalletCoinbase, + WalletTON, + WalletFireblocks, + WalletCircle, + WalletStellar, + WalletXRPL, + WalletCosmos +}; \ No newline at end of file diff --git a/test/swapTest.ts b/test/swapTest.ts new file mode 100644 index 0000000..9817d69 --- /dev/null +++ b/test/swapTest.ts @@ -0,0 +1,40 @@ +import { Wallet, prepareTransaction } from "../src/index"; +import dotenv from 'dotenv'; + +async function swap() { + dotenv.config(); + + const xApiKey = "tK503cR23o8YTvXhNoDNo7kQf5sQdbXP8qbqkBeQ"; + const privateKey = ""; + + const wallet = new Wallet({ privateKey , xApiKey }); + + // Preparing transaction + const preparedTx = await prepareTransaction('https://api.expand.network/dex/swap', { + "dexId": "1300", + "path": [ + "0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0", + "0xdac17f958d2ee523a2206206994597c13d831ec7" + ], + "amountIn": "50000000000000000000", + "amountOutMin": "730655", + "to": "0xB409cB0b5DB9f148d0bc491E140D9E0FDd789C11", + "gas": "80000", + "from": "0xB409cB0b5DB9f148d0bc491E140D9E0FDd789C11", + "deadline": "1716461989", + "slippage": "1", + xApiKey, + function: "" + }); + + console.log(preparedTx); + + // Signing transaction + const signedTx = await wallet.signTransaction(preparedTx); + console.log("Transaction Pending....", signedTx); + + // //Sending transaction + // const tx = await wallet.sendTransaction(signedTx); + // console.log("Transaction Pending....", tx.data); +} +swap(); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..6215c6c --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "ESNext", + "strict": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "moduleResolution": "node", + "jsx": "react", + "outDir": "./dist", + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src/**/*", "errorMessage.json"], + "exclude": ["node_modules", "dist"] + } + \ No newline at end of file From ada4f5ebe8fdbd59a281b16415349293363168d0 Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Fri, 6 Dec 2024 15:56:43 +0530 Subject: [PATCH 02/32] all file changed to ts --- configuration/intialiseWeb3.ts | 6 +- package-lock.json | 304 +++++++++++++----- package.json | 3 +- src/adapters/Wallet/index.ts | 12 +- src/adapters/Wallet/signTransaction/index.ts | 11 +- src/adapters/WalletCircle/index.ts | 130 ++++++++ src/adapters/WalletCoinbase/index.ts | 90 ++++++ .../signTransaction/Ethereum.ts | 33 ++ .../WalletCoinbase/signTransaction/index.ts | 10 + src/adapters/WalletCosmos/index.ts | 110 +++++++ src/adapters/WalletDFNS/index.ts | 121 +++++++ .../WalletDFNS/signTransaction/Ethereum.ts | 52 +++ .../WalletDFNS/signTransaction/index.ts | 22 ++ src/adapters/WalletFireblocks/index.ts | 128 ++++++++ src/adapters/WalletFordefi/index.ts | 80 +++++ .../WalletFordefi/signTransaction/Ethereum.ts | 90 ++++++ .../WalletFordefi/signTransaction/Solana.ts | 93 ++++++ .../WalletFordefi/signTransaction/index.ts | 31 ++ src/adapters/WalletPhantom/index.ts | 123 +++++++ .../WalletPhantom/signTransaction/Ethereum.ts | 19 ++ .../WalletPhantom/signTransaction/Solana.ts | 126 ++++++++ .../WalletPhantom/signTransaction/index.ts | 29 ++ src/adapters/WalletStellar/index.ts | 73 +++++ src/adapters/WalletTON/index.ts | 120 +++++++ src/adapters/WalletXRPL/index.ts | 71 ++++ src/index.ts | 177 +++++----- test/swapTest.ts | 2 +- 27 files changed, 1875 insertions(+), 191 deletions(-) create mode 100644 src/adapters/WalletCircle/index.ts create mode 100644 src/adapters/WalletCoinbase/index.ts create mode 100644 src/adapters/WalletCoinbase/signTransaction/Ethereum.ts create mode 100644 src/adapters/WalletCoinbase/signTransaction/index.ts create mode 100644 src/adapters/WalletCosmos/index.ts create mode 100644 src/adapters/WalletDFNS/index.ts create mode 100644 src/adapters/WalletDFNS/signTransaction/Ethereum.ts create mode 100644 src/adapters/WalletDFNS/signTransaction/index.ts create mode 100644 src/adapters/WalletFireblocks/index.ts create mode 100644 src/adapters/WalletFordefi/index.ts create mode 100644 src/adapters/WalletFordefi/signTransaction/Ethereum.ts create mode 100644 src/adapters/WalletFordefi/signTransaction/Solana.ts create mode 100644 src/adapters/WalletFordefi/signTransaction/index.ts create mode 100644 src/adapters/WalletPhantom/index.ts create mode 100644 src/adapters/WalletPhantom/signTransaction/Ethereum.ts create mode 100644 src/adapters/WalletPhantom/signTransaction/Solana.ts create mode 100644 src/adapters/WalletPhantom/signTransaction/index.ts create mode 100644 src/adapters/WalletStellar/index.ts create mode 100644 src/adapters/WalletTON/index.ts create mode 100644 src/adapters/WalletXRPL/index.ts diff --git a/configuration/intialiseWeb3.ts b/configuration/intialiseWeb3.ts index 274142b..fc815bc 100644 --- a/configuration/intialiseWeb3.ts +++ b/configuration/intialiseWeb3.ts @@ -8,11 +8,11 @@ import { AptosClient } from "aptos"; import { TonClient } from "@ton/ton"; import { StargateClient } from "@cosmjs/stargate"; import StellarSdk from "stellar-sdk"; -import { getChainId } from "./common"; +import * as common from "./common"; import config from "./config.json"; import errorMessage from "./errorMessage.json"; -const server = new StellarSdk.Server("https://horizon.stellar.org"); +import { Server } from "stellar-sdk"; const invalidChainId = { error: errorMessage.error.message.invalidChainId, @@ -20,7 +20,7 @@ const invalidChainId = { }; export const initialiseWeb3 = async (data: any) => { - const chainId = await getChainId({ + const chainId = await common.getChainId({ chainId: data.chainId, chainSymbol: data.chainSymbol }); diff --git a/package-lock.json b/package-lock.json index eada588..9ff165d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,8 +61,9 @@ "eslint-config-prettier": "9.1.0", "eslint-plugin-import": "2.29.1", "jest": "29.7.0", + "ts-node": "^10.9.2", "tsx": "^4.19.2", - "typescript": "^5.1.6" + "typescript": "^5.7.2" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -982,6 +983,28 @@ "integrity": "sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w==", "license": "Apache-2.0" }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@dfns/lib-ethersjs6": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@dfns/lib-ethersjs6/-/lib-ethersjs6-0.4.3.tgz", @@ -2891,15 +2914,15 @@ } }, "node_modules/@mswjs/interceptors": { - "version": "0.17.9", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.17.9.tgz", - "integrity": "sha512-4LVGt03RobMH/7ZrbHqRxQrS9cc2uh+iNKSj8UWr8M26A2i793ju+csaB5zaqYltqJmA2jUq4VeYfKmVqvsXQg==", + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.17.10.tgz", + "integrity": "sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw==", "dependencies": { "@open-draft/until": "^1.0.3", "@types/debug": "^4.1.7", "@xmldom/xmldom": "^0.8.3", "debug": "^4.3.3", - "headers-polyfill": "^3.1.0", + "headers-polyfill": "3.2.5", "outvariant": "^1.2.1", "strict-event-emitter": "^0.2.4", "web-encoding": "^1.1.5" @@ -3733,6 +3756,30 @@ "resolved": "https://registry.npmjs.org/@tronweb3/google-protobuf/-/google-protobuf-3.21.2.tgz", "integrity": "sha512-IVcT2GfWX3K6tHUVhs14NP5uzKhQt4KeDya1g9ACxuZsUzsaoGUIGzceK2Ltu7xp1YV94AaHOf4yxLAivlvEkQ==" }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -3807,9 +3854,9 @@ "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" }, "node_modules/@types/debug": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", - "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dependencies": { "@types/ms": "*" } @@ -3853,9 +3900,9 @@ } }, "node_modules/@types/js-levenshtein": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/js-levenshtein/-/js-levenshtein-1.1.1.tgz", - "integrity": "sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g==" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/js-levenshtein/-/js-levenshtein-1.1.3.tgz", + "integrity": "sha512-jd+Q+sD20Qfu9e2aEXogiO3vpOC1PYJOUdyN9gvs4Qrvkg4wF43L5OhqrPeokdv8TL0/mXoYfpkcoGZMNN2pkQ==" }, "node_modules/@types/json-schema": { "version": "7.0.15", @@ -3883,9 +3930,9 @@ "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" }, "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { "version": "22.10.1", @@ -3920,9 +3967,9 @@ } }, "node_modules/@types/set-cookie-parser": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.2.tgz", - "integrity": "sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w==", + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.10.tgz", + "integrity": "sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==", "dependencies": { "@types/node": "*" } @@ -3963,9 +4010,9 @@ "dev": true }, "node_modules/@xmldom/xmldom": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.8.tgz", - "integrity": "sha512-0LNz4EY8B/8xXY86wMrQ4tz6zEHZv9ehFMJPm8u2gq5lQ71cfRKdaKyxfJAx5aUoyzx0qzgURblTisPGgz3d+Q==", + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", "engines": { "node": ">=10.0.0" } @@ -4065,6 +4112,18 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/aes-js": { "version": "4.0.0-beta.5", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", @@ -4211,6 +4270,12 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -4592,11 +4657,14 @@ } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bindings": { @@ -5108,15 +5176,9 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -5129,6 +5191,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -5246,9 +5311,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", - "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "engines": { "node": ">=6" }, @@ -5497,6 +5562,12 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/cross-fetch": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", @@ -5755,6 +5826,15 @@ "node": ">=8" } }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -7500,9 +7580,9 @@ "dev": true }, "node_modules/graphql": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz", - "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==", + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", + "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -7658,9 +7738,9 @@ } }, "node_modules/headers-polyfill": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-3.1.2.tgz", - "integrity": "sha512-tWCK4biJ6hcLqTviLXVR9DTRfYGQMXEIUj3gwJ2rZ5wO/at3XtkI4g8mCvFdUF9l1KMBNCfmNAdnahm1cgavQA==" + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-3.2.5.tgz", + "integrity": "sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA==" }, "node_modules/hi-base32": { "version": "0.5.1", @@ -7905,9 +7985,9 @@ "integrity": "sha512-qNq5wy4qX4uWHcVFOEU+RqZkoVG65FhvGkyDWbuBxILMjK6A1LFf5A1mgXZkD4nRx5FCorD81X/XvPKp/zVfPA==" }, "node_modules/inquirer": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", - "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", + "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", @@ -7923,12 +8003,25 @@ "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6", - "wrap-ansi": "^7.0.0" + "wrap-ansi": "^6.0.1" }, "engines": { "node": ">=12.0.0" } }, + "node_modules/inquirer/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -9556,6 +9649,12 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -9770,27 +9869,27 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/msw": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/msw/-/msw-1.2.2.tgz", - "integrity": "sha512-GsW3PE/Es/a1tYThXcM8YHOZ1S1MtivcS3He/LQbbTCx3rbWJYCtWD5XXyJ53KlNPT7O1VI9sCW3xMtgFe8XpQ==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/msw/-/msw-1.3.5.tgz", + "integrity": "sha512-nG3fpmBXxFbKSIdk6miPuL3KjU6WMxgoW4tG1YgnP1M+TRG3Qn7b7R0euKAHq4vpwARHb18ZyfZljSxsTnMX2w==", "hasInstallScript": true, "dependencies": { "@mswjs/cookies": "^0.2.2", - "@mswjs/interceptors": "^0.17.5", + "@mswjs/interceptors": "^0.17.10", "@open-draft/until": "^1.0.3", "@types/cookie": "^0.4.1", "@types/js-levenshtein": "^1.1.1", - "chalk": "4.1.1", + "chalk": "^4.1.1", "chokidar": "^3.4.2", "cookie": "^0.4.2", - "graphql": "^15.0.0 || ^16.0.0", - "headers-polyfill": "^3.1.2", + "graphql": "^16.8.1", + "headers-polyfill": "3.2.5", "inquirer": "^8.2.0", "is-node-process": "^1.2.0", "js-levenshtein": "^1.1.6", "node-fetch": "^2.6.7", "outvariant": "^1.4.0", - "path-to-regexp": "^6.2.0", + "path-to-regexp": "^6.3.0", "strict-event-emitter": "^0.4.3", "type-fest": "^2.19.0", "yargs": "^17.3.1" @@ -9806,7 +9905,7 @@ "url": "https://opencollective.com/mswjs" }, "peerDependencies": { - "typescript": ">= 4.4.x <= 5.1.x" + "typescript": ">= 4.4.x" }, "peerDependenciesMeta": { "typescript": { @@ -9814,21 +9913,6 @@ } } }, - "node_modules/msw/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/msw/node_modules/cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", @@ -9838,9 +9922,9 @@ } }, "node_modules/msw/node_modules/path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==" }, "node_modules/msw/node_modules/type-fest": { "version": "2.19.0", @@ -10379,9 +10463,9 @@ } }, "node_modules/outvariant": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.0.tgz", - "integrity": "sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==" + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==" }, "node_modules/p-cancelable": { "version": "3.0.0", @@ -11495,9 +11579,9 @@ } }, "node_modules/set-cookie-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", - "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==" }, "node_modules/set-function-length": { "version": "1.1.1", @@ -12301,6 +12385,49 @@ "semver": "bin/semver" } }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -12498,9 +12625,9 @@ } }, "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "devOptional": true, "bin": { "tsc": "bin/tsc", @@ -12655,6 +12782,12 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/v8-to-istanbul": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", @@ -13505,6 +13638,15 @@ "node": ">=12" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 74da2b7..d312820 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,8 @@ "eslint-config-prettier": "9.1.0", "eslint-plugin-import": "2.29.1", "jest": "29.7.0", + "ts-node": "^10.9.2", "tsx": "^4.19.2", - "typescript": "^5.1.6" + "typescript": "^5.7.2" } } diff --git a/src/adapters/Wallet/index.ts b/src/adapters/Wallet/index.ts index 4f0680c..d44561c 100644 --- a/src/adapters/Wallet/index.ts +++ b/src/adapters/Wallet/index.ts @@ -1,9 +1,9 @@ import axios from 'axios'; import BN from 'bn.js'; -import rawTransaction from './signTransaction/index'; +import * as rawTransaction from './signTransaction/index'; import config from '../../../configuration/config.json'; -import { getChainId } from '../../../configuration/common'; -import {schemaValidator} from '../../../configuration/schemaValidator'; +import * as common from '../../../configuration/common'; +import * as schemaValidator from '../../../configuration/schemaValidator'; import {initialiseWeb3} from '../../../configuration/intialiseWeb3'; import { ethers } from 'ethers-5'; @@ -28,7 +28,7 @@ class Wallet { axios.defaults.headers['X-API-KEY'] = this.xApiKey; const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; - const chainId = await getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); + const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); configuration.params = { @@ -66,7 +66,7 @@ class Wallet { axios.defaults.headers['X-API-KEY'] = this.xApiKey; const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; - const chainId = await getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); + const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); let chainName = config.chains[chainId].chainName; @@ -189,5 +189,5 @@ class Wallet { }; } -export default { Wallet }; +export { Wallet }; diff --git a/src/adapters/Wallet/signTransaction/index.ts b/src/adapters/Wallet/signTransaction/index.ts index aecc593..91e8311 100644 --- a/src/adapters/Wallet/signTransaction/index.ts +++ b/src/adapters/Wallet/signTransaction/index.ts @@ -1,5 +1,5 @@ // import Algorand from './Algorand'; -import Ethereum from './Ethereum'; +import { signTransactionEvm } from './Ethereum'; // import Near from './Near'; // import Solana from './Solana'; // import Tron from './Tron'; @@ -14,12 +14,13 @@ import Ethereum from './Ethereum'; // }; -export const signTransactionEvm = async (web3: any, transactionObject: any, options: any) => { - - const rawData = await Ethereum.signTransactionEvm(web3, transactionObject, options); - return rawData; +export const signTransactionEvm = async (web3: any, transactionObject: any, options: any) => { + const signedTransaction = await web3.eth.accounts.signTransaction(transactionObject, options.privateKey); + return signedTransaction; }; +export default signTransactionEvm; + // exports.signTransactionNear = async (web3, transactionObject, options) => { // const rawData = await Near.signTransactionNear(web3, transactionObject, options); diff --git a/src/adapters/WalletCircle/index.ts b/src/adapters/WalletCircle/index.ts new file mode 100644 index 0000000..a20f4b2 --- /dev/null +++ b/src/adapters/WalletCircle/index.ts @@ -0,0 +1,130 @@ +import { initiateUserControlledWalletsClient } from '@circle-fin/user-controlled-wallets'; +import { v4 } from 'uuid'; +import axios from 'axios'; +import * as schemaValidator from '../../../configuration/schemaValidator'; +import * as conf from '../../../configuration/config.json'; + + +class WalletCircle { + constructor(options) { + this.appId = options.appId; + this.apiKey = options.apiKey; + this.client = initiateUserControlledWalletsClient({ + apiKey: options.apiKey, + }); + this.userId = options.userId; + this.userToken = options.userToken; + this.walletId = options.walletId; + this.encryptionKey = options.encryptionKey; + }; + + static getUserToken = async (options) => { + const client = initiateUserControlledWalletsClient({ + apiKey: options.apiKey, + }); + const userToken = await client.createUserToken({ userId: options.userId }).then(res => res.data); + return userToken; + }; + + signTransaction = async (transactionObject) => { + const transactionOptions = transactionObject; + transactionOptions.function = "transactionObject()"; + const validObject = await schemaValidator.validateInput(transactionObject); + + if (!validObject.valid) { + return (validObject); + } + + if (transactionObject.data) { + let data = JSON.stringify({ + "userId": this.userId, + "idempotencyKey": v4(), + "amounts": [ + transactionObject.value + ], + "callData": transactionObject.data, + "contractAddress": transactionObject.to, + "walletId": this.walletId, + "feeLevel": "MEDIUM" + }); + + let config = { + method: 'post', + maxBodyLength: Infinity, + url: `${conf.circleProgrammableWallet.baseUrl}contractExecution`, + headers: { + 'Content-Type': 'application/json', + 'authorization': `Bearer ${this.apiKey}`, + 'X-User-Token': this.userToken, + }, + data: data + }; + try { + const challengeId = await axios.request(config).then(res => res.data); + return challengeId; + // const response = {}; + // response.appId = this.appId; + // response.userToken = this.userToken; + // response.encryptionKey = this.encryptionKey; + // response.challengeId = challengeId; + // return response; + } catch (error) { + return error; + } + } else { + let data = JSON.stringify({ + "userId": this.userId, + "idempotencyKey": v4(), + "amounts": [ + transactionObject.value + ], + "destinationAddress": transactionObject.to, + "tokenId": transactionObject.tokenId, + "walletId": this.walletId, + "feeLevel": "MEDIUM" + }); + + let config = { + method: 'post', + maxBodyLength: Infinity, + url: `${conf.circleProgrammableWallet.baseUrl}/transfer`, + headers: { + 'Content-Type': 'application/json', + 'authorization': `Bearer ${this.apiKey}`, + 'X-User-Token': this.userToken, + }, + data: data + }; + + try { + + const challengeId = await axios.request(config).then(res => res.data); + return challengeId; + // const response = {}; + // response.appId = this.appId; + // response.userToken = this.userToken; + // response.encryptionKey = this.encryptionKey; + // response.challengeId = challengeId; + // return response; + } catch (error) { + return error.response.data; + } + + } + + }; + + sendTransaction = async (challengeId) => { + + const response = {}; + response.appId = this.appId; + response.userToken = this.userToken; + response.encryptionKey = this.encryptionKey; + response.challengeId = challengeId.data.challengeId; + return response; + + } + +} + +export { WalletCircle }; \ No newline at end of file diff --git a/src/adapters/WalletCoinbase/index.ts b/src/adapters/WalletCoinbase/index.ts new file mode 100644 index 0000000..2d0d023 --- /dev/null +++ b/src/adapters/WalletCoinbase/index.ts @@ -0,0 +1,90 @@ +import axios from 'axios'; +import BN from 'bn.js'; +import * as rawTransaction from './signTransaction/index'; +import config from '../../../configuration/config.json'; +import * as common from '../../../configuration/common'; +import * as schemaValidator from '../../../configuration/schemaValidator'; +import { initialiseWeb3 } from '../../../configuration/intialiseWeb3'; + +class WalletCoinbase { + + constructor(options) { + this.privateKey = options.privateKey; + this.xApiKey = options.xApiKey; + }; + + signTransaction = async (transactionObject) => { + + const configuration = { "params": {} }; + const transactionOptions = transactionObject; + transactionOptions.function = "transactionObject()"; + const validObject = await schemaValidator.validateInput(transactionObject); + + if (!validObject.valid) { + return (validObject); + } + + axios.defaults.headers['X-API-KEY'] = this.xApiKey; + const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; + + const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); + + let chainName = config.chains[chainId].chainName; + + if (chainName !== "Evm") + return new Error("chain not Supported"); + + configuration.params = { + chainId + }; + + let rpc = await axios.get(apiURL, configuration); + rpc = rpc.data.data.rpc; + const web3 = await initialiseWeb3({ rpc: rpc, chainId, key: this.xApiKey }); + transactionOptions.value = new BN(transactionOptions.value); + + + const options = {}; + options.privateKey = this.privateKey; + const rawData = await rawTransaction[`signTransaction${chainName}`](web3, transactionObject, options); + rawData.chainId = chainId; + + return rawData; + }; + + sendTransaction = async (options) => { + + const filterOptions = options; + filterOptions.function = "sendTransaction()"; + const validJson = await schemaValidator.validateInput(options); + if (!validJson.valid) { + return (validJson); + } + + try { + + const apiURL = `${config.url.apiurl}/chain/sendtransaction/`; + + const params = { + method: "post", + url: apiURL, + data: options, + headers: { + "x-api-key": this.xApiKey + } + }; + + const transactionHash = await axios(params); + return transactionHash.data; + } + + catch (error) { + return error; + } + + }; + +} + +export { WalletCoinbase }; + diff --git a/src/adapters/WalletCoinbase/signTransaction/Ethereum.ts b/src/adapters/WalletCoinbase/signTransaction/Ethereum.ts new file mode 100644 index 0000000..efb010a --- /dev/null +++ b/src/adapters/WalletCoinbase/signTransaction/Ethereum.ts @@ -0,0 +1,33 @@ +import Web3 from "web3"; + +interface TransactionObject { + to: string; + value: string | number; + gas: number | string; + gasPrice?: number | string; + data?: string; + nonce?: number; +} + +interface Options { + privateKey: string; +} + +export const signTransactionEvm = async ( + web3: Web3, + transactionObject: TransactionObject, + options: Options +): Promise => { + /* + * Function will sign the transaction payload for Ethereum-based chains + */ + try { + const signedTransaction = await web3.eth.accounts.signTransaction( + transactionObject, + options.privateKey + ); + return signedTransaction; + } catch (error) { + return error as Error; + } +}; diff --git a/src/adapters/WalletCoinbase/signTransaction/index.ts b/src/adapters/WalletCoinbase/signTransaction/index.ts new file mode 100644 index 0000000..24a97c5 --- /dev/null +++ b/src/adapters/WalletCoinbase/signTransaction/index.ts @@ -0,0 +1,10 @@ +import * as Ethereum from './Ethereum'; + + + +export const signTransactionEvm = async (web3: any, transactionObject: any, options:any) => { + + const rawData = await Ethereum.signTransactionEvm(web3, transactionObject, options); + return rawData; +}; + diff --git a/src/adapters/WalletCosmos/index.ts b/src/adapters/WalletCosmos/index.ts new file mode 100644 index 0000000..4afd5ed --- /dev/null +++ b/src/adapters/WalletCosmos/index.ts @@ -0,0 +1,110 @@ +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { SigningStargateClient } from "@cosmjs/stargate"; +import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx"; +import axios from 'axios'; +import * as schemaValidator from '../../../configuration/schemaValidator'; +import * as common from '../../../configuration/common'; +import * as config from '../../../configuration/config.json'; + + +class WalletCosmos { + + constructor(options) { + this.wallet = options.privateKey; + this.xApiKey = options.xApiKey; + } + + signTransaction = async (transactionObject) => { + + const configuration = { "params": {} }; + transactionObject.function = "txObjSol()"; + const validJson = await schemaValidator.validateInput(transactionObject); + + if (!validJson.valid) { + return validJson; + } + + const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); + let chainName = config.chains[chainId].chainName; + + axios.defaults.headers['X-API-KEY'] = this.xApiKey; + const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; + + configuration.params = { + chainId + }; + + let rpc = await axios.get(apiURL, configuration); + rpc = rpc.data.data.rpc; + + if (chainName !== "Cosmos") { + return { + "msg": "Cosmos wallet can be used only with Cosmos chains" + } + }; + + const wallet = await DirectSecp256k1HdWallet.fromMnemonic(this.wallet, { + prefix: "cosmos", + }); + + const Account = (await wallet.getAccounts())[0].address; + const signingClient = await SigningStargateClient.connectWithSigner(rpc, wallet); + + const tx = await signingClient.sign(Account, [ + { + typeUrl: "/cosmos.bank.v1beta1.MsgSend", + value: { + fromAddress: Account, + toAddress: transactionObject.to, + amount: [{ denom: "uatom", amount: transactionObject.value }], + }, + } + ], { + amount: [{ denom: "uatom", amount: "1000" }], + gas: "200000", + }, + "expand" + ); + + const encodedTx = TxRaw.encode(tx).finish(); + const rawString = Buffer.from(encodedTx).toString("base64"); + return { chainId: chainId, rawTransaction: rawString }; + + } + + sendTransaction = async (options) => { + + const filterOptions = options; + filterOptions.function = "sendTransaction()"; + const validJson = await schemaValidator.validateInput(options); + if (!validJson.valid) { + return (validJson); + } + + try { + + const apiURL = `${config.url.apiurl}/chain/sendtransaction/`; + + const params = { + method: "post", + url: apiURL, + data: options, + headers: { + "x-api-key": this.xApiKey + } + }; + + const transactionHash = await axios(params); + return transactionHash.data; + } + + catch (error) { + return error; + } + + }; + + +} + +export { WalletCosmos }; \ No newline at end of file diff --git a/src/adapters/WalletDFNS/index.ts b/src/adapters/WalletDFNS/index.ts new file mode 100644 index 0000000..17720f5 --- /dev/null +++ b/src/adapters/WalletDFNS/index.ts @@ -0,0 +1,121 @@ +import { DfnsApiClient } from "@dfns/sdk"; +import { AsymmetricKeySigner } from "@dfns/sdk-keysigner"; +import { DfnsWallet } from "@dfns/lib-ethersjs6"; +import { JsonRpcProvider, Network, Transaction } from "ethers"; +import axios from 'axios'; +import * as rawTransaction from './signTransaction/index'; +import config from '../../../configuration/config.json'; +import * as common from '../../../configuration/common'; +import * as schemaValidator from '../../../configuration/schemaValidator'; + + +class WalletDFNS { + + constructor(options) { + this.xApiKey = options.xApiKey; + this.privateKey = options.privateKey; + this.credId = options.credId; + this.appId = options.appId; + this.authToken = options.authToken; + this.walletId = options.walletId; + this.baseUrl = options.baseUrl + this.appOrigin = options.appOrigin + this.signer = new AsymmetricKeySigner({ + privateKey: options.privateKey, + credId: options.credId, + appOrigin: options.appOrigin + }); + this.dfnsClient = new DfnsApiClient({ + appId: options.appId, + authToken: options.authToken, + baseUrl: options.baseUrl, + signer: this.signer + }); + this.wallet = new DfnsWallet({ + walletId: this.walletId, + dfnsClient: this.dfnsClient, + maxRetries: 10, + }); + + } + + + signTransaction = async (transactionObject) => { + + try { + const transactionOptions = transactionObject; + transactionOptions.function = "transactionObject()"; + const validObject = await schemaValidator.validateInput(transactionObject); + + if (!validObject.valid) { + return (validObject); + } + + + const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); + let chainName = config.chains[chainId].chainName; + axios.defaults.headers['X-API-KEY'] = this.xApiKey; + const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; + const configuration = {}; + configuration.params = { + chainId + }; + let rpc = await axios.get(apiURL, configuration); + rpc = rpc.data.data.rpc; + + const rpcProvider = new JsonRpcProvider(rpc, Number(transactionObject.chainId)); + + + if (chainName !== "Evm") + return new Error("chain not Supported"); + + const options = {}; + options.wallet = this.wallet //.connect(rpcProvider); + options.xApiKey = this.xApiKey; + options.rpcProvider = rpcProvider; + const response = await rawTransaction[`signTransaction${chainName}`](transactionObject, options); + return response; + } catch (error) { + return error; + } + }; + + sendTransaction = async (transactionObject) => { + try { + + const filterOptions = transactionObject; + filterOptions.function = "DFNSTransaction()"; + const validJson = await schemaValidator.validateInput(filterOptions); + + if (!validJson.valid) { + return (validJson); + } + axios.defaults.headers['X-API-KEY'] = this.xApiKey; + const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); + let chainName = config.chains[chainId].chainName; + const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; + const configuration = {}; + configuration.params = { + chainId + }; + let rpc = await axios.get(apiURL, configuration); + rpc = rpc.data.data.rpc; + if (chainName !== "Evm") + return new Error("chain not Supported"); + + const rpcProvider = new JsonRpcProvider(rpc, Number(transactionObject.chainId)); + + let wallet = this.wallet.connect(rpcProvider); + + let transaction = Transaction.from(transactionObject.rawTransaction); + let TxHash = await wallet.sendTransaction(transaction); + return { "TxHash": TxHash.hash } + + } catch (error) { + return error; + } + + } +} + +export { WalletDFNS }; \ No newline at end of file diff --git a/src/adapters/WalletDFNS/signTransaction/Ethereum.ts b/src/adapters/WalletDFNS/signTransaction/Ethereum.ts new file mode 100644 index 0000000..f225276 --- /dev/null +++ b/src/adapters/WalletDFNS/signTransaction/Ethereum.ts @@ -0,0 +1,52 @@ +import { Wallet, providers } from "ethers"; + +interface TransactionObject { + to: string; + value: string | number; + gas: number | string; + chainId: number; + data?: string; +} + +interface Options { + wallet: Wallet; + rpcProvider: providers.JsonRpcProvider; +} + +interface SignedTransactionResponse { + rawTransaction: string; +} + +export const signTransactionEvm = async ( + transactionObject: TransactionObject, + options: Options +): Promise => { + /* + * Function will sign the transaction payload for Ethereum-based chains + */ + try { + const nonce = await options.rpcProvider.getTransactionCount( + await options.wallet.getAddress(), + "latest" + ); + + const tx = { + nonce, + to: transactionObject.to, + data: transactionObject.data, + value: transactionObject.value, + gas: transactionObject.gas, + chainId: transactionObject.chainId, + maxFeePerGas: "120000000000", // Set these values as required + maxPriorityFeePerGas: "120000000000", + gasLimit: transactionObject.gas, + }; + + const signedTx = await options.wallet.signTransaction(tx); + const response: SignedTransactionResponse = { rawTransaction: signedTx }; + + return response; + } catch (error) { + return error as Error; + } +}; diff --git a/src/adapters/WalletDFNS/signTransaction/index.ts b/src/adapters/WalletDFNS/signTransaction/index.ts new file mode 100644 index 0000000..40cc3a1 --- /dev/null +++ b/src/adapters/WalletDFNS/signTransaction/index.ts @@ -0,0 +1,22 @@ +import * as Ethereum from './Ethereum'; + +interface TransactionObject { + to: string; + value: string | number; + gas: number | string; + gasPrice?: number | string; + data?: string; + nonce?: number; +} + +interface Options { + privateKey: string; +} + +export const signTransactionEvm = async ( + transactionObject: TransactionObject, + options: Options +): Promise => { + const rawData = await Ethereum.signTransactionEvm(transactionObject, options); + return rawData; +}; diff --git a/src/adapters/WalletFireblocks/index.ts b/src/adapters/WalletFireblocks/index.ts new file mode 100644 index 0000000..b0ff357 --- /dev/null +++ b/src/adapters/WalletFireblocks/index.ts @@ -0,0 +1,128 @@ +import axios from 'axios'; +import * as sign from 'jsonwebtoken'; +import * as uuid from 'uuid'; +import crypto from 'crypto'; +import * as config from '../../../configuration/config.json'; +import * as common from '../../../configuration/common'; +import * as schemaValidator from '../../../configuration/schemaValidator'; + +class WalletFireblocks { + + constructor(options) { + this.baseUrl = options.baseUrl ? (options.baseUrl) : config.fireblocks.baseUrl; + this.apiSecret = options.apiSecret; + this.apiKey = options.apiKey; + } + + jwtSign(path, data) { + const token = sign({ + uri: path, + nonce: uuid(), + iat: Math.floor(Date.now() / 1000), + exp: Math.floor(Date.now() / 1000) + 55, + sub: this.apiKey, + bodyHash: crypto.createHash("sha256").update(JSON.stringify(data || "")).digest().toString("hex") + }, this.apiSecret, { algorithm: "RS256" }); + return token; + } + + + signTransaction = async (transactionObject) => { + try { + + const configuration = { "params": {} }; + transactionObject.function = "FireblockSign()"; + const validJson = await schemaValidator.validateInput(transactionObject); + + if (!validJson.valid) { + return validJson; + } + + const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); + let chainName = config.chains[chainId].chainName; + + const txData = {} + txData.operation = (transactionObject.data) ? "CONTRACT_CALL" : "TRANSFER", + txData.source = { + "type": "VAULT_ACCOUNT", + "id": transactionObject.from + }; + + if (transactionObject.internal === true) { + txData.destination = { + "type": "VAULT_ACCOUNT", + "id": transactionObject.to + } + + } + else { + txData.destination = { + "type": "ONE_TIME_ADDRESS", + "oneTimeAddress": { + "address": transactionObject.to + } + } + } + const assetDecimals = (transactionObject.assetDecimals) ? (transactionObject.assetDecimals) : 18; + txData.assetId = (transactionObject.assetId) ? (transactionObject.assetId) : "ETH_TEST3"; + txData.amount = (transactionObject.value) ? (transactionObject.value) / 10 ** assetDecimals : '0', + txData.note = (transactionObject.note) ? (transactionObject.note) : "expand" + + + if (transactionObject.data) { + txData.extraParameters = { + "contractCallData": transactionObject.data + } + } + const signature = this.jwtSign("/v1/transactions", txData); + const rawTx = { + "jwt": signature, + "path": config.fireblocks.createTransaction, + "data": txData, + "method": "POST" + } + return rawTx; + + } catch (error) { + return error; + } + } + + sendTransaction = async (rawTx) => { + + + try { + + const options = rawTx; + options.function = "SendFireblocks()"; + const validJson = await schemaValidator.validateInput(options); + + if (!validJson.valid) { + return (validJson); + } + + + const resp = await axios({ + url: `${this.baseUrl}${rawTx.path}`, + method: rawTx.method, + data: rawTx.data, + headers: { + "X-API-Key": this.apiKey, + "Authorization": `Bearer ${rawTx.jwt}` + } + }) + + return resp.data; + } catch (error) { + console.log(error); + return error.data; + } + + } + +} + +export { WalletFireblocks } + + + diff --git a/src/adapters/WalletFordefi/index.ts b/src/adapters/WalletFordefi/index.ts new file mode 100644 index 0000000..f79e213 --- /dev/null +++ b/src/adapters/WalletFordefi/index.ts @@ -0,0 +1,80 @@ +import axios from 'axios'; +import * as rawTransaction from './signTransaction/index'; +import config from '../../../configuration/config.json'; +import { getChainId } from '../../../configuration/common'; +import * as schemaValidator from '../../../configuration/schemaValidator'; + +class WalletFordefi { + constructor(options) { + this.accessToken = options.accessToken; + this.xApiKey = options.xApiKey; + this.privateKeyFile = options.privateKeyFile; + this.vault_id = options.vault_id; + }; + + signTransaction = async (transactionObject) => { + + try { + const transactionOptions = transactionObject; + transactionOptions.function = "transactionObject()"; + const validObject = await schemaValidator.validateInput(transactionObject); + + if (!validObject.valid) { + return (validObject); + } + + const chainId = await getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); + let chainName = config.chains[chainId].chainName; + if (chainName !== "Evm" && chainName !== "Solana") + return new Error("chain not Supported"); + const options = {}; + options.vault_id = this.vault_id; + options.privateKeyFile = this.privateKeyFile; + options.accessToken = this.accessToken; + options.xApiKey = this.xApiKey; + const response = await rawTransaction[`signTransaction${chainName}`](transactionObject, options); + return response; + } catch (error) { + return error; + } + }; + + sendTransaction = async (response) => { + try { + const filterOptions = response; + filterOptions.function = "FordefiTransaction()"; + const validJson = await schemaValidator.validateInput(filterOptions); + + if (!validJson.valid) { + return (validJson); + } + + const path = "/api/v1/transactions"; + const config = { + method: "POST", + url: `https://api.fordefi.com${path}`, + headers: { + 'Content-Type': 'application/json', + "Authorization": response.accessToken, + 'X-Timestamp': response.timestamp, + 'X-Signature': response.signature, + }, + data: response.data + }; + const resp = await axios.request(config); + return resp.data; + // .then((response) => { + // return (JSON.stringify(response.data)); + // }) + // .catch((error) => { + // return (error.response.data.detail); + // }); + + } catch (error) { + return error.response.data; + } + + } +} + +export { WalletFordefi }; \ No newline at end of file diff --git a/src/adapters/WalletFordefi/signTransaction/Ethereum.ts b/src/adapters/WalletFordefi/signTransaction/Ethereum.ts new file mode 100644 index 0000000..29d80f4 --- /dev/null +++ b/src/adapters/WalletFordefi/signTransaction/Ethereum.ts @@ -0,0 +1,90 @@ +import crypto from 'crypto'; +import fs from 'fs'; + +interface TransactionObject { + chainId?: number | string; + gas: number; + to: string; + value: string | number; + data?: string; +} + +interface Gas { + type: string; + priority_level: string; + gas_limit: number; +} + +interface Options { + vault_id: string; + privateKeyFile: string; + accessToken: string; +} + +interface Response { + data: string; + timestamp: number; + signature: string; + accessToken: string; +} + +export const signTransactionEvm = async ( + transactionObject: TransactionObject, + options: Options +): Promise => { + /* + * Function will sign the transaction payload for ethereum-based chains + */ + + try { + let reqBody: any = {}; + reqBody.type = 'evm_transaction'; + reqBody.vault_id = options.vault_id; + + const path = '/api/v1/transactions'; + + const details = { ...transactionObject }; + details.chain = parseInt(transactionObject.chainId as string) || 1; + + const gas: Gas = { + type: 'priority', + priority_level: 'medium', + gas_limit: transactionObject.gas, + }; + details.gas = gas; + details.to = transactionObject.to; + details.value = transactionObject.value; + details.type = 'evm_raw_transaction'; + + if (transactionObject.data) { + details.data = { + type: 'hex', + hex_data: transactionObject.data, + }; + } + + reqBody.details = details; + reqBody.signer_type = 'api_signer'; + reqBody = JSON.stringify(reqBody); + + const timestamp = Date.now(); + const payload = `${path}|${timestamp}|${reqBody}`; + + const secretPem = fs.readFileSync(options.privateKeyFile, 'utf8'); + const privateKey = crypto.createPrivateKey(secretPem); + + const sign = crypto.createSign('SHA256').update(payload, 'utf8').end(); + const signature = sign.sign(privateKey, 'base64'); + + const response: Response = { + data: reqBody, + timestamp, + signature, + accessToken: `Bearer ${options.accessToken}`, + }; + + return response; + } catch (error) { + return error as Error; + } +}; diff --git a/src/adapters/WalletFordefi/signTransaction/Solana.ts b/src/adapters/WalletFordefi/signTransaction/Solana.ts new file mode 100644 index 0000000..22d2178 --- /dev/null +++ b/src/adapters/WalletFordefi/signTransaction/Solana.ts @@ -0,0 +1,93 @@ +import crypto from 'crypto'; +import fs from 'fs'; + +interface TransactionObject { + chainId: string; + to: string; + value: string | number; +} + +interface AssetIdentifier { + type: string; + details: { + type: string; + chain: string; + }; +} + +interface Options { + vault_id: string; + privateKeyFile: string; + accessToken: string; +} + +interface Response { + data: string; + timestamp: number; + signature: string; + accessToken: string; +} + +export const signTransactionSolana = async ( + transactionObject: TransactionObject, + options: Options +): Promise => { + /* + * Function will sign the transaction payload for Solana-based chains + */ + + try { + let reqBody: any = {}; + reqBody.vault_id = options.vault_id; + reqBody.type = 'solana_transaction'; + reqBody.signer_type = 'api_signer'; + + // Determine the chain + const chain = transactionObject.chainId === '901' ? 'solana_devnet' : 'solana_mainnet'; + + const path = '/api/v1/transactions'; + + // Prepare details object + const details: any = { + format: 'hash_binary', + type: 'solana_transfer', + to: transactionObject.to, + value: { + type: 'value', + value: transactionObject.value, + }, + asset_identifier: { + type: 'solana', + details: { + type: 'native', + chain: chain, + }, + }, + }; + + reqBody.details = details; + reqBody = JSON.stringify(reqBody); + + const timestamp = Date.now(); + const payload = `${path}|${timestamp}|${reqBody}`; + + // Read private key + const secretPem = fs.readFileSync(options.privateKeyFile, 'utf8'); + const privateKey = crypto.createPrivateKey(secretPem); + + // Create signature + const sign = crypto.createSign('SHA256').update(payload, 'utf8').end(); + const signature = sign.sign(privateKey, 'base64'); + + const response: Response = { + data: reqBody, + timestamp, + signature, + accessToken: `Bearer ${options.accessToken}`, + }; + + return response; + } catch (error) { + return error as Error; + } +}; diff --git a/src/adapters/WalletFordefi/signTransaction/index.ts b/src/adapters/WalletFordefi/signTransaction/index.ts new file mode 100644 index 0000000..1d66991 --- /dev/null +++ b/src/adapters/WalletFordefi/signTransaction/index.ts @@ -0,0 +1,31 @@ +import * as Ethereum from './Ethereum'; +import * as Solana from './Solana'; + +interface TransactionObject { + to?: string; + value?: string | number; + gas?: number | string; + chainId?: number; + data?: string; + [key: string]: any; // Additional properties for flexibility +} + +interface Options { + [key: string]: any; // Adjust based on your specific `options` structure +} + +export const signTransactionEvm = async ( + transactionObject: TransactionObject, + options: Options +): Promise => { + const rawData = await Ethereum.signTransactionEvm(transactionObject, options); + return rawData; +}; + +export const signTransactionSolana = async ( + transactionObject: TransactionObject, + options: Options +): Promise => { + const rawData = await Solana.signTransactionSolana(transactionObject, options); + return rawData; +}; diff --git a/src/adapters/WalletPhantom/index.ts b/src/adapters/WalletPhantom/index.ts new file mode 100644 index 0000000..9a90c40 --- /dev/null +++ b/src/adapters/WalletPhantom/index.ts @@ -0,0 +1,123 @@ +import axios from 'axios'; +import BN from 'bn.js'; +import * as rawTransaction from './signTransaction/index'; +import config from '../../../configuration/config.json'; +import * as common from '../../../configuration/common'; +import * as schemaValidator from '../../../configuration/schemaValidator'; +import { initialiseWeb3 } from '../../../configuration/intialiseWeb3'; + +class WalletPhantom { + + constructor(options) { + this.privateKey = options.privateKey; + this.xApiKey = options.xApiKey; + }; + + signTransaction = async (transactionObject) => { + + const configuration = { "params": {} }; + transactionObject.function = "txObjSol()"; + const validObject = await schemaValidator.validateInput(transactionObject); + + if (!validObject.valid) { + return (validObject); + } + + axios.defaults.headers['X-API-KEY'] = this.xApiKey; + const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; + + const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); + + let chainName = config.chains[chainId].chainName; + + if (chainName !== "Evm" && chainName !== "Solana") + return new Error("chain not Supported"); + + configuration.params = { + chainId + }; + + let rpc = await axios.get(apiURL, configuration); + rpc = rpc.data.data.rpc; + const web3 = await initialiseWeb3({ rpc: rpc, chainId, key: this.xApiKey }); + + const options = {}; + options.privateKey = this.privateKey; + const rawData = await rawTransaction[`signTransaction${chainName}`](web3, transactionObject, options); + rawData.chainId = chainId; + + return rawData; + }; + + signVersionedTransaction = async (transactionObject) => { + + const configuration = { "params": {} }; + transactionObject.function = "txObjectSol()"; + const validObject = await schemaValidator.validateInput(transactionObject); + + if (!validObject.valid) { + return (validObject); + } + + axios.defaults.headers['X-API-KEY'] = this.xApiKey; + const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; + + const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); + + let chainName = config.chains[chainId].chainName; + + if (chainName !== "Solana") + return new Error("chain not Supported"); + + configuration.params = { + chainId + }; + + let rpc = await axios.get(apiURL, configuration); + rpc = rpc.data.data.rpc; + const web3 = await initialiseWeb3({ rpc: rpc, chainId, key: this.xApiKey }); + + const options = {}; + options.privateKey = this.privateKey; + const rawData = await rawTransaction[`signVersionedTransaction${chainName}`](web3, transactionObject, options); + rawData.chainId = chainId; + + return rawData; + }; + + sendTransaction = async (options) => { + + const filterOptions = options; + filterOptions.function = "sendTransaction()"; + const validJson = await schemaValidator.validateInput(options); + if (!validJson.valid) { + return (validJson); + } + + try { + + const apiURL = `${config.url.apiurl}/chain/sendtransaction/`; + + const params = { + method: "post", + url: apiURL, + data: options, + headers: { + "x-api-key": this.xApiKey + } + }; + + const transactionHash = await axios(params); + return transactionHash.data; + } + + catch (error) { + return error; + } + + }; + +} + +export { WalletPhantom }; + diff --git a/src/adapters/WalletPhantom/signTransaction/Ethereum.ts b/src/adapters/WalletPhantom/signTransaction/Ethereum.ts new file mode 100644 index 0000000..e612067 --- /dev/null +++ b/src/adapters/WalletPhantom/signTransaction/Ethereum.ts @@ -0,0 +1,19 @@ +export const signTransactionEvm = async ( + web3: any, + transactionObject: Record, + options: { privateKey: string } + ): Promise => { + /** + * Function to sign the transaction payload for Ethereum-based chains + */ + try { + const signedTransaction = await web3.eth.accounts.signTransaction( + transactionObject, + options.privateKey + ); + return signedTransaction; + } catch (error) { + return error; + } + }; + \ No newline at end of file diff --git a/src/adapters/WalletPhantom/signTransaction/Solana.ts b/src/adapters/WalletPhantom/signTransaction/Solana.ts new file mode 100644 index 0000000..0f045d9 --- /dev/null +++ b/src/adapters/WalletPhantom/signTransaction/Solana.ts @@ -0,0 +1,126 @@ +import { Wallet } from '@project-serum/anchor'; +import { + Keypair, + Transaction, + SystemProgram, + VersionedTransaction, + TransactionMessage, + PublicKey, + Connection, + BlockhashWithExpiryBlockHeight +} from '@solana/web3.js'; +import * as sign from 'tweetnacl'; +import * as decode from 'bs58'; +import BN from 'bn.js'; + +interface TransactionObject { + to: string; + value: number | BN; + data?: string; + from?: string; + additionalSigners?: string; +} + +interface Options { + privateKey: string; + additionalSigners?: string; +} + +export const signTransactionSolana = async ( + web3: Connection, + transactionObject: TransactionObject, + options: Options +): Promise<{ rawTransaction: string } | { msg: string } | Error> => { + try { + const from = Keypair.fromSecretKey(decode(options.privateKey)); + const blockHeight: BlockhashWithExpiryBlockHeight = await web3.getLatestBlockhash(); + let preparedTx: Transaction; + let transactionBuffer: Buffer; + + if (!transactionObject.data) { + transactionObject.value = new BN(transactionObject.value); + preparedTx = new Transaction({ + blockhash: blockHeight.blockhash, + lastValidBlockHeight: blockHeight.lastValidBlockHeight + 1500, + feePayer: from.publicKey, + }); + preparedTx.add( + SystemProgram.transfer({ + fromPubkey: from.publicKey, + toPubkey: new PublicKey(transactionObject.to), + lamports: transactionObject.value.toNumber(), + }) + ); + } else { + if (transactionObject.from !== from.publicKey.toBase58()) { + return { msg: 'Signer is not matching with the from address' }; + } + const buffer = Buffer.from(transactionObject.data, 'base64'); + preparedTx = Transaction.from(buffer); + preparedTx.recentBlockhash = blockHeight.blockhash; + } + + transactionBuffer = preparedTx.serializeMessage(); + const signature = sign.detached(transactionBuffer, from.secretKey); + preparedTx.addSignature(from.publicKey, signature); + + if (transactionObject.additionalSigners) { + const additionalKey = Keypair.fromSecretKey(decode(transactionObject.additionalSigners)); + const additionalSignature = sign.detached(transactionBuffer, additionalKey.secretKey); + preparedTx.addSignature(additionalKey.publicKey, additionalSignature); + } + + const serializedTx = preparedTx.serialize(); + const rawTransaction = Buffer.from(serializedTx).toString('base64'); + return { rawTransaction }; + } catch (error) { + return error as Error; + } +}; + +export const signVersionedTransactionSolana = async ( + web3: Connection, + transactionObject: TransactionObject, + options: Options +): Promise<{ rawTransaction: string } | { msg: string } | Error> => { + try { + const from = Keypair.fromSecretKey(decode(options.privateKey)); + const wallet = new Wallet(from); + const recentBlockhash: BlockhashWithExpiryBlockHeight = await web3.getLatestBlockhash(); + let preparedTx: VersionedTransaction; + + if (!transactionObject.data) { + const instructions = [ + SystemProgram.transfer({ + fromPubkey: from.publicKey, + toPubkey: new PublicKey(transactionObject.to), + lamports: transactionObject.value as number, + }), + ]; + const versionedMessage = new TransactionMessage({ + payerKey: from.publicKey, + recentBlockhash: recentBlockhash.blockhash, + instructions, + }).compileToV0Message(); + preparedTx = new VersionedTransaction(versionedMessage); + } else { + if (transactionObject.from !== from.publicKey.toBase58()) { + return { msg: 'Signer is not matching with the from address' }; + } + const buffer = Buffer.from(transactionObject.data, 'base64'); + preparedTx = VersionedTransaction.deserialize(buffer); + } + + preparedTx.sign([wallet.payer]); + + if (transactionObject.additionalSigners) { + preparedTx.sign([Keypair.fromSecretKey(decode(transactionObject.additionalSigners))]); + } + + const serializedTx = preparedTx.serialize(); + const rawTransaction = Buffer.from(serializedTx).toString('base64'); + return { rawTransaction }; + } catch (error) { + return error as Error; + } +}; diff --git a/src/adapters/WalletPhantom/signTransaction/index.ts b/src/adapters/WalletPhantom/signTransaction/index.ts new file mode 100644 index 0000000..ceff2f3 --- /dev/null +++ b/src/adapters/WalletPhantom/signTransaction/index.ts @@ -0,0 +1,29 @@ +import * as Solana from './Solana'; +import * as Ethereum from './Ethereum'; + +export const signTransactionEvm = async ( + web3: any, + transactionObject: any, + options: any +): Promise => { + const rawData = await Ethereum.signTransactionEvm(web3, transactionObject, options); + return rawData; +}; + +export const signTransactionSolana = async ( + web3: any, + transactionObject: any, + options: any +): Promise => { + const rawData = await Solana.signTransactionSolana(web3, transactionObject, options); + return rawData; +}; + +export const signVersionedTransactionSolana = async ( + web3: any, + transactionObject: any, + options: any +): Promise => { + const rawData = await Solana.signVersionedTransactionSolana(web3, transactionObject, options); + return rawData; +}; diff --git a/src/adapters/WalletStellar/index.ts b/src/adapters/WalletStellar/index.ts new file mode 100644 index 0000000..70a252f --- /dev/null +++ b/src/adapters/WalletStellar/index.ts @@ -0,0 +1,73 @@ +import { TransactionBuilder, Keypair } from "stellar-sdk"; +import * as schemaValidator from '../../../configuration/schemaValidator'; +import * as common from '../../../configuration/common'; +import * as config from '../../../configuration/config.json'; +import axios from "axios"; + +class WalletStellar { + constructor(options) { + this.privateKey = options.privateKey, + this.xApiKey = options.xApiKey + } + + signTransaction = async (options) => { + options.function = "stellarSignTransaction()"; + const validJson = await schemaValidator.validateInput(options); + + if (!validJson.valid) { + return validJson; + } + + const { chainSymbol, data } = options; + let { chainId } = options; + + chainId = await common.getChainId({ chainId, chainSymbol }); + const chainName = config.chains[chainId]?.chainName; + + if (chainName !== "Stellar") { + return { + "msg": "Stellar wallet can be used only with Stellar chain" + } + }; + + const userKeyPair = Keypair.fromSecret(this.privateKey); + const { networkPassphrase } = config.chains[chainId]; + + let rawTransaction = TransactionBuilder.fromXDR(data, networkPassphrase); + rawTransaction.sign(userKeyPair) + + rawTransaction = rawTransaction.toEnvelope().toXDR('base64'); + return { rawTransaction, chainId }; + }; + + sendTransaction = async (options) => { + const filterOptions = options; + filterOptions.function = "sendTransaction()"; + const validJson = await schemaValidator.validateInput(filterOptions); + + if (!validJson.valid) { + return (validJson); + } + + try { + const apiURL = `${config.url.apiurl}/chain/sendtransaction/`; + const params = { + method: "post", + url: apiURL, + data: options, + headers: { + "x-api-key": this.xApiKey + } + }; + + const transactionHash = await axios(params); + return transactionHash.data; + } + + catch (error) { + return error; + } + }; +} + +export { WalletStellar }; \ No newline at end of file diff --git a/src/adapters/WalletTON/index.ts b/src/adapters/WalletTON/index.ts new file mode 100644 index 0000000..0bd6bca --- /dev/null +++ b/src/adapters/WalletTON/index.ts @@ -0,0 +1,120 @@ +import { mnemonicToPrivateKey, keyPairFromSecretKey } from "ton-crypto"; +import { WalletContractV4, internal, Cell } from "@ton/ton"; +import * as schemaValidator from '../../../configuration/schemaValidator'; +import * as common from '../../../configuration/common'; +import { initialiseWeb3 } from "../../../configuration/intialiseWeb3"; +import config from '../../../configuration/config.json'; + + +class WalletTON { + + constructor(options) { + this.privateKey = Buffer.from(options.privateKey, 'hex'), + this.keyPair = keyPairFromSecretKey(this.privateKey); + this.xApiKey = options.xApiKey + const wallet = WalletContractV4.create({ publicKey: this.keyPair.publicKey, workchain: 0 }); + this.wallet = wallet; + } + + static getPrivateKey = async (mnemonic) => { + const arr = mnemonic.split(" "); + this.keyPair = await mnemonicToPrivateKey(arr); + const privateKey = Buffer.from(this.keyPair.secretKey).toString('hex'); + return privateKey; + } + + + _nanotons = 10 ** 9; + + + signTransaction = async (transactionObject) => { + + const configuration = { "params": {} }; + transactionObject.function = "tonTxObject()"; + const validJson = await schemaValidator.validateInput(transactionObject); + + if (!validJson.valid) { + return validJson; + } + + const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); + let chainName = config.chains[chainId].chainName; + + if (chainName !== "TON") { + return { + "msg": "ton wallet can be used only with TON chain" + } + }; + + const web3 = await initialiseWeb3({ chainId, key: this.xApiKey }); + const walletContract = web3.open(this.wallet); + + let body; + try { + body = Cell.fromBase64(transactionObject.message); + } catch(error) { + body = transactionObject.message || "through expand"; // optional comment + }; + + const seqno = await walletContract.getSeqno(); + const rawData = await walletContract.createTransfer({ + secretKey: this.privateKey, + seqno: seqno, + messages: [ + internal({ + to: transactionObject.to, + value: JSON.stringify(transactionObject.value / this._nanotons), + body, + bounce: false, + }) + ] + }); + + return { rawTransaction: rawData, chainId: chainId }; + + + } + + sendTransaction = async (transactionObject) => { + + transactionObject.function = "TONTransaction()"; + const validJson = await schemaValidator.validateInput(transactionObject); + if (!validJson.valid) { + return (validJson); + } + + try { + + const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); + let chainName = config.chains[chainId].chainName; + const web3 = await initialiseWeb3({ chainId, key: this.xApiKey }); + // console.log(web3); + if (chainName !== "TON") { + return { + "msg": "ton wallet can be used only with TON chain" + } + }; + + const walletContract = web3.open(this.wallet); + const currentseqno = await walletContract.getSeqno(); + const txHash = await walletContract.send(transactionObject.rawTransaction); + const timer = (ms) => new Promise(resolve => setTimeout(resolve, ms)); + await timer(5000); + let seqno = await walletContract.getSeqno(); + if (seqno > currentseqno) { + return { seqno: seqno, message: "transaction has been sent to the blockchain" } + } + + return { + "message": "transaction has been sent to the blockchain", + }; + + } catch (error) { + return error; + } + } + + +} + +export { WalletTON }; \ No newline at end of file diff --git a/src/adapters/WalletXRPL/index.ts b/src/adapters/WalletXRPL/index.ts new file mode 100644 index 0000000..6c8e4ca --- /dev/null +++ b/src/adapters/WalletXRPL/index.ts @@ -0,0 +1,71 @@ +import axios from "axios"; +import xrpl from 'xrpl'; +import * as schemaValidator from '../../../configuration/schemaValidator'; +import * as common from '../../../configuration/common'; +import * as config from '../../../configuration/config.json'; + +class WalletXRPL { + constructor(options) { + this.privateKey = options.privateKey, + this.xApiKey = options.xApiKey + } + + signTransaction = async (options) => { + options.function = "xrplSignTransaction()"; + const validJson = await schemaValidator.validateInput(options); + + if (!validJson.valid) { + return validJson; + } + + const { chainSymbol, data } = options; + let { chainId } = options; + + chainId = await common.getChainId({ chainId, chainSymbol }); + const chainName = config.chains[chainId]?.chainName; + + if (chainName !== "XRPL") { + return { + "msg": "XRPL wallet can be used only with XRP Ledger" + } + }; + + const account = xrpl.Wallet.fromMnemonic(this.privateKey); + + const decodedData = JSON.parse(atob(data)); + const signedTx = account.sign(decodedData); + + return { chainId, rawTransaction: signedTx.tx_blob }; + }; + + sendTransaction = async (options) => { + const filterOptions = options; + filterOptions.function = "sendTransaction()"; + const validJson = await schemaValidator.validateInput(filterOptions); + + if (!validJson.valid) { + return (validJson); + } + + try { + const apiURL = `${config.url.apiurl}/chain/sendtransaction/`; + const params = { + method: "post", + url: apiURL, + data: options, + headers: { + "x-api-key": this.xApiKey + } + }; + + const transactionHash = await axios(params); + return transactionHash.data; + } + + catch (error) { + return error; + } + }; +} + +export { WalletXRPL }; \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 9bd1a37..6d5888c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,98 +1,87 @@ -import axios from 'axios'; -import config from '../configuration/config'; -import schemaValidator from '../configuration/schemaValidator'; -import { Wallet, WalletFordefi, WalletDFNS, WalletTON, - WalletFireblocks, WalletPhantom, WalletCoinbase, - WalletCircle, WalletCosmos, WalletStellar, WalletXRPL } from './interfaces/index'; - -exports.prepareTransaction = async (apiURL, options) => { - - const filterOptions = options; - filterOptions.function = "prepareTransaction()"; - const validJson = await schemaValidator.validateInput(filterOptions); - - if (!validJson.valid) { - return (validJson); - } - - const { chainId, xApiKey } = filterOptions; - try { - const paramConfig = { - method: "post", - url: apiURL, - data: filterOptions, - headers: { - "x-api-key": xApiKey - } - - }; - - const response = await axios(paramConfig).then(result => result.data); - if (chainId) response.data.chainId = chainId; - return response.data; - - } - catch (error) { - return error; - } +import axios from "axios"; +import * as config from "../configuration/config"; +import * as schemaValidator from "../configuration/schemaValidator"; +import { + Wallet, + WalletFordefi, + WalletDFNS, + WalletTON, + WalletFireblocks, + WalletPhantom, + WalletCoinbase, + WalletCircle, + WalletCosmos, + WalletStellar, + WalletXRPL, +} from "./interfaces/index.ts"; + +export const prepareTransaction = async (apiURL, options) => { + const filterOptions = options; + filterOptions.function = "prepareTransaction()"; + const validJson = await schemaValidator.validateInput(filterOptions); + + if (!validJson.valid) { + return validJson; + } + + const { chainId, xApiKey } = filterOptions; + try { + const paramConfig = { + method: "post", + url: apiURL, + data: filterOptions, + headers: { + "x-api-key": xApiKey, + }, + }; + + const response = await axios(paramConfig).then((result) => result.data); + if (chainId) response.data.chainId = chainId; + return response.data; + } catch (error) { + return error; + } }; - -exports.decodeTransaction = async (options) => { - - const filterOptions = options; - filterOptions.function = "decodeTransaction()"; - const validJson = await schemaValidator.validateInput(options); - - if (!validJson.valid) { - return (validJson); - } - - try { - const apiURL = `${config.url.apiurl}/chain/decodetransaction/`; - - const paramConfig = { - method: "post", - url: apiURL, - data: filterOptions, - headers: { - "x-api-key": filterOptions.xApiKey - } - }; - - const response = await axios(paramConfig).then(result => result.data); - return response.data; - - } catch (error) { - return error; - } +export const decodeTransaction = async (options) => { + const filterOptions = options; + filterOptions.function = "decodeTransaction()"; + const validJson = await validateInput(options); + + if (!validJson.valid) { + return validJson; + } + + try { + const apiURL = `${config.url.apiurl}/chain/decodetransaction/`; + + const paramConfig = { + method: "post", + url: apiURL, + data: filterOptions, + headers: { + "x-api-key": filterOptions.xApiKey, + }, + }; + + const response = await axios(paramConfig).then((result) => result.data); + return response.data; + } catch (error) { + return error; + } }; - -exports.Wallet = Wallet; - -exports.WalletFordefi = WalletFordefi; - -exports.WalletDFNS = WalletDFNS; - -exports.WalletPhantom = WalletPhantom; - -exports.WalletCoinbase = WalletCoinbase; - -exports.WalletTON = WalletTON; - -exports.WalletFireblocks = WalletFireblocks; - -exports.WalletCircle = WalletCircle; - -exports.WalletStellar = WalletStellar; - -exports.WalletXRPL = WalletXRPL; - -exports.WalletCosmos = WalletCosmos; - - - - - - +// Replace `exports.Wallet = Wallet;` with: +export { + Wallet, + WalletFordefi, + WalletDFNS, + WalletTON, + WalletFireblocks, + WalletPhantom, + WalletCoinbase, + WalletCircle, + WalletCosmos, + WalletStellar, + WalletXRPL, +}; diff --git a/test/swapTest.ts b/test/swapTest.ts index 9817d69..a76e00a 100644 --- a/test/swapTest.ts +++ b/test/swapTest.ts @@ -5,7 +5,7 @@ async function swap() { dotenv.config(); const xApiKey = "tK503cR23o8YTvXhNoDNo7kQf5sQdbXP8qbqkBeQ"; - const privateKey = ""; + const privateKey = ""; const wallet = new Wallet({ privateKey , xApiKey }); From 70329f15bb2e38570f47086ca5dec0e57f6c1030 Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Mon, 9 Dec 2024 19:44:55 +0530 Subject: [PATCH 03/32] error fixes --- configuration/config.ts | 10 + src/adapters/Wallet/index.ts | 184 ++++++++++-------- .../Wallet/signTransaction/Ethereum.ts | 5 +- src/adapters/Wallet/signTransaction/Solana.ts | 110 +++++++++++ src/adapters/Wallet/signTransaction/index.ts | 6 +- src/dydx/cancelOrder.ts | 62 ++++++ src/helper/Starknet.ts | 72 +++++++ src/index.ts | 10 +- test/swapTest.ts | 2 +- tsconfig.json | 2 + 10 files changed, 368 insertions(+), 95 deletions(-) create mode 100644 src/adapters/Wallet/signTransaction/Solana.ts create mode 100644 src/dydx/cancelOrder.ts create mode 100644 src/helper/Starknet.ts diff --git a/configuration/config.ts b/configuration/config.ts index 95b02ca..172ed48 100644 --- a/configuration/config.ts +++ b/configuration/config.ts @@ -9,10 +9,20 @@ type ChainConfig = { domain?: string; sslMateId?: string; apiKey?: string; + url?: string; + networkPassphrase?: string; + gasPrice?: string; + network?: string; }; + + type FireblocksConfig = { + baseUrl?:string; + createTransaction?: string; + } type Config = { chains: Record; + fireblocks : Record; }; const config: Config = { diff --git a/src/adapters/Wallet/index.ts b/src/adapters/Wallet/index.ts index d44561c..5678d9a 100644 --- a/src/adapters/Wallet/index.ts +++ b/src/adapters/Wallet/index.ts @@ -1,108 +1,135 @@ -import axios from 'axios'; +import axios, { AxiosRequestConfig } from 'axios'; import BN from 'bn.js'; import * as rawTransaction from './signTransaction/index'; -import config from '../../../configuration/config.json'; -import * as common from '../../../configuration/common'; -import * as schemaValidator from '../../../configuration/schemaValidator'; -import {initialiseWeb3} from '../../../configuration/intialiseWeb3'; +import config from '../../../configuration/config.json'; +import * as common from '../../../configuration/common'; +import * as schemaValidator from '../../../configuration/schemaValidator'; +import { initialiseWeb3 } from '../../../configuration/intialiseWeb3'; import { ethers } from 'ethers-5'; +interface WalletOptions { + privateKey: string; + xApiKey: string; +} + +interface TransactionObject { + chainId: number; + chainSymbol: string; + value: string | BN; + to?: string; + gas?: string; + [key: string]: any; +} + +interface SignOrderOptions { + dexId: number; + domain: any; + types: any; + values?: any; + message?: any; + orderType?: string; +} + + + class Wallet { + private privateKey: string; + private xApiKey: string; - constructor(options) { + constructor(options: WalletOptions) { this.privateKey = options.privateKey; this.xApiKey = options.xApiKey; - }; + } - signTransaction = async (transactionObject) => { - - const configuration = { "params": {} }; - const transactionOptions = transactionObject; - transactionOptions.function = "transactionObject()"; + signTransaction = async (transactionObject: TransactionObject) => { + const configuration: AxiosRequestConfig = { params: {} }; + const transactionOptions = { ...transactionObject, function: "transactionObject()" }; const validObject = await schemaValidator.validateInput(transactionObject); if (!validObject.valid) { - return (validObject); + return validObject; } axios.defaults.headers['X-API-KEY'] = this.xApiKey; const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; + const chainId = await common.getChainId({ + chainId: transactionObject.chainId, + chainSymbol: transactionObject.chainSymbol + }); - const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); - + if (chainId === null) { + throw new Error("chainId is null"); + } - configuration.params = { - chainId - }; + configuration.params = { chainId }; let rpc = await axios.get(apiURL, configuration); rpc = rpc.data.data.rpc; - const web3 = await initialiseWeb3({ rpc: rpc, chainId, key: this.xApiKey }); + + const web3 = await initialiseWeb3({ rpc, chainId, key: this.xApiKey }); transactionOptions.value = new BN(transactionOptions.value); - let chainName = config.chains[chainId].chainName; - console.log(chainName); - - const options = {}; - options.privateKey = this.privateKey; - options.chainId = transactionObject.chainId; - options.rpc = rpc; - const rawData = await rawTransaction[`signTransaction${chainName}`](web3,transactionObject,options); - rawData.chainId = chainId; + const chainName = config.chains[chainId as keyof typeof config.chains].chainName; + console.log(chainName); + + const options = { + privateKey: this.privateKey, + chainId: transactionObject.chainId, + rpc + }; + + const rawData = await rawTransaction[`signTransaction${chainName}`](web3, transactionObject, options); + rawData.chainId = chainId; return rawData; }; - signVersionedTransaction = async (transactionObject) => { - - const configuration = { "params": {} }; + signVersionedTransaction = async (transactionObject: TransactionObject) => { + const configuration: AxiosRequestConfig = { params: {} }; transactionObject.function = "txObjSol()"; const validObject = await schemaValidator.validateInput(transactionObject); if (!validObject.valid) { - return (validObject); + return validObject; } axios.defaults.headers['X-API-KEY'] = this.xApiKey; const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; + const chainId = await common.getChainId({ + chainId: transactionObject.chainId, + chainSymbol: transactionObject.chainSymbol + }); - const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); + const chainName: string = config.chains[chainId as keyof typeof config.chains].chainName; - let chainName = config.chains[chainId].chainName; + if (chainName !== "Solana") { + throw new Error("Chain not supported"); + } - if (chainName !== "Solana") - return new Error("chain not Supported"); - - configuration.params = { - chainId - }; + configuration.params = { chainId }; let rpc = await axios.get(apiURL, configuration); rpc = rpc.data.data.rpc; - const web3 = await initialiseWeb3({ rpc: rpc, chainId, key: this.xApiKey }); - const options = {}; - options.privateKey = this.privateKey; + const web3 = await initialiseWeb3({ rpc, chainId, key: this.xApiKey }); + const options = { privateKey: this.privateKey }; const rawData = await rawTransaction[`signVersionedTransaction${chainName}`](web3, transactionObject, options); rawData.chainId = chainId; return rawData; }; - sendTransaction = async (options) => { - - const filterOptions = options; - filterOptions.function = "sendTransaction()"; + sendTransaction = async (options: Record) => { + const filterOptions = { ...options, function: "sendTransaction()" }; const validJson = await schemaValidator.validateInput(filterOptions); + if (!validJson.valid) { - return (validJson); + return validJson; } try { - const apiURL = `${config.url.apiurl}/chain/sendtransaction/`; - - const params = { + const params: AxiosRequestConfig = { method: "post", url: apiURL, data: options, @@ -113,62 +140,55 @@ class Wallet { const transactionHash = await axios(params); return transactionHash.data; - } - - catch (error) { + } catch (error) { return error; } - }; - signOrderRFQ = async (options) => { - const filterOptions = options; - filterOptions.function = "signOrderRFQ()"; + signOrderRFQ = async (options: SignOrderOptions) => { + const filterOptions = { ...options, function: "signOrderRFQ()" }; const validJson = await schemaValidator.validateInput(options); + if (!validJson.valid) { - return (validJson); + return validJson; } const { dexId, domain, types, values } = options; - const { chainId } = config.dexes[dexId] + const { chainId } = config.dexes[dexId as unknown as keyof typeof config.dexes]; - let apiConfig = { + const apiConfig: AxiosRequestConfig = { method: 'get', maxBodyLength: Infinity, url: `${config.url.apiurl}/chain/getpublicrpc?chainId=${chainId}`, - headers: { - 'x-api-key': this.xApiKey - } + headers: { 'x-api-key': this.xApiKey } }; let rpc = await axios.request(apiConfig); - rpc = rpc.data.data.rpc; const provider = new ethers.providers.JsonRpcProvider(rpc); const signer = new ethers.Wallet(this.privateKey, provider); const signature = await signer._signTypedData(domain, types, values); + return { signature }; }; - signLimitOrder = async (options) => { - const filterOptions = options; - filterOptions.function = "signLimitOrder()"; + signLimitOrder = async (options: SignOrderOptions) => { + const filterOptions = { ...options, function: "signLimitOrder()" }; const validJson = await schemaValidator.validateInput(options); + if (!validJson.valid) { - return (validJson); + return validJson; } const { dexId, orderType, domain, types, message } = options; - const { chainId } = config.dexes[dexId] + const { chainId } = config.dexes[dexId as unknown as keyof typeof config.dexes]; - let apiConfig = { + const apiConfig: AxiosRequestConfig = { method: 'get', maxBodyLength: Infinity, url: `${config.url.apiurl}/chain/getpublicrpc?chainId=${chainId}`, - headers: { - 'x-api-key': this.xApiKey - } + headers: { 'x-api-key': this.xApiKey } }; let rpc = await axios.request(apiConfig); @@ -176,18 +196,12 @@ class Wallet { const provider = new ethers.providers.JsonRpcProvider(rpc); const signer = new ethers.Wallet(this.privateKey, provider); - const signature = orderType === "create" ? await signer._signTypedData( - domain, - { Order: types.Order }, - message - ) : await signer._signTypedData( - domain, - { CancelOrder: types.CancelOrder }, - message - ); - return { signature, ...(orderType === "create" && {salt: message.salt}) }; + const signature = orderType === "create" + ? await signer._signTypedData(domain, { Order: types.Order }, message) + : await signer._signTypedData(domain, { CancelOrder: types.CancelOrder }, message); + + return { signature, ...(orderType === "create" && { salt: message?.salt }) }; }; } export { Wallet }; - diff --git a/src/adapters/Wallet/signTransaction/Ethereum.ts b/src/adapters/Wallet/signTransaction/Ethereum.ts index bb4cae7..c161f48 100644 --- a/src/adapters/Wallet/signTransaction/Ethereum.ts +++ b/src/adapters/Wallet/signTransaction/Ethereum.ts @@ -12,7 +12,7 @@ interface Options { privateKey: string; } -export const signTransactionEvm = async ( + const signTransactionEvm = async ( web3: Web3, transactionObject: TransactionObject, options: Options @@ -29,3 +29,6 @@ export const signTransactionEvm = async ( throw new Error('Transaction signing failed'); } }; + + +export default { signTransactionEvm }; \ No newline at end of file diff --git a/src/adapters/Wallet/signTransaction/Solana.ts b/src/adapters/Wallet/signTransaction/Solana.ts new file mode 100644 index 0000000..96c6909 --- /dev/null +++ b/src/adapters/Wallet/signTransaction/Solana.ts @@ -0,0 +1,110 @@ +const { Wallet } = require('@project-serum/anchor'); +const { Keypair, Transaction, SystemProgram, VersionedTransaction, + TransactionMessage, PublicKey } = require('@solana/web3.js') +const { sign } = require('tweetnacl'); +const { decode } = require('bs58'); +const BN = require('bn.js'); + +module.exports = { + + signTransactionSolana: async (web3:any , transactionObject :any , options: any) => { + /* + * Function will sign the transaction payload for Solana Chain + */ + + try { + + const from = Keypair.fromSecretKey(decode(options.privateKey)); + const blockHeight = await web3.getLatestBlockhash(); + let preparedTx; + let transactionBuffer; + + if (!(transactionObject.data)) { + transactionObject.value = new BN(transactionObject.value); + preparedTx = new Transaction({ + blockhash: blockHeight.blockhash, + lastValidBlockHeight: blockHeight + 1500, + feePayer: from.publicKey + }); + preparedTx.add(SystemProgram.transfer({ + fromPubkey: from.publicKey, + toPubkey: transactionObject.to, + lamports: transactionObject.value + })); + } else { + if (transactionObject.from !== from.publicKey.toBase58()) { + return { + msg: "signer is not matching with the from address" + } + }; + let buffer = Buffer.from(transactionObject.data, "base64"); + preparedTx = Transaction.from(buffer); + preparedTx.recentBlockhash = blockHeight.blockhash; + } + + transactionBuffer = preparedTx.serializeMessage(); + const signature = sign.detached(transactionBuffer, from.secretKey); + preparedTx.addSignature(from.publicKey, signature); + if (transactionObject.additionalSigners) { + const additionalKey = Keypair.fromSecretKey(decode(transactionObject.additionalSigners)); + const signature = sign.detached(transactionBuffer, additionalKey.secretKey); + preparedTx.addSignature(additionalKey.publicKey, signature); + } + const serializedTx = preparedTx.serialize(); + const rawTransaction = Buffer.from(serializedTx).toString("base64"); + return { "rawTransaction": rawTransaction }; + } + catch (error) { + return error; + } + }, + + signVersionedTransactionSolana: async (web3: any, transactionObject:any , options:any) => { + /* + * Function will sign the transaction payload for Solana Chain + */ + + try { + + const from = Keypair.fromSecretKey(decode(options.privateKey)); + const wallet = new Wallet(from); + let recentBlockhash = await web3.getRecentBlockhash(); + let preparedTx; + + if (!(transactionObject.data)) { + const instructions = [ + SystemProgram.transfer({ + fromPubkey: from.publicKey, + toPubkey: new PublicKey(transactionObject.to), + lamports: transactionObject.value, + }), + ]; + const versionedMessage = new TransactionMessage({ + payerKey: from.publicKey, + recentBlockhash: recentBlockhash.blockhash, + instructions + }).compileToV0Message(); + preparedTx = new VersionedTransaction(versionedMessage); + } else { + if (transactionObject.from !== from.publicKey.toBase58()) { + return { + msg: "signer is not matching with the from address" + } + }; + let buffer = Buffer.from(transactionObject.data, "base64"); + preparedTx = VersionedTransaction.deserialize(buffer); + } + + preparedTx.sign([wallet.payer]); + if (transactionObject.additionalSigners) { + preparedTx.sign([Keypair.fromSecretKey(decode(transactionObject.additionalSigners))]); + } + const serializedTx = preparedTx.serialize(); + const rawTransaction = Buffer.from(serializedTx).toString("base64"); + return { "rawTransaction": rawTransaction }; + } + catch (error) { + return error; + } + } +}; \ No newline at end of file diff --git a/src/adapters/Wallet/signTransaction/index.ts b/src/adapters/Wallet/signTransaction/index.ts index 91e8311..afcd7b3 100644 --- a/src/adapters/Wallet/signTransaction/index.ts +++ b/src/adapters/Wallet/signTransaction/index.ts @@ -1,5 +1,5 @@ // import Algorand from './Algorand'; -import { signTransactionEvm } from './Ethereum'; +import Ethereum from './Ethereum'; // import Near from './Near'; // import Solana from './Solana'; // import Tron from './Tron'; @@ -14,8 +14,8 @@ import { signTransactionEvm } from './Ethereum'; // }; -export const signTransactionEvm = async (web3: any, transactionObject: any, options: any) => { - const signedTransaction = await web3.eth.accounts.signTransaction(transactionObject, options.privateKey); +const signTransactionEvm = async (web3: any, transactionObject: any, options: any) => { + const signedTransaction = await Ethereum.signTransactionEvm(web3, transactionObject, options.privateKey); return signedTransaction; }; diff --git a/src/dydx/cancelOrder.ts b/src/dydx/cancelOrder.ts new file mode 100644 index 0000000..eb1d8c4 --- /dev/null +++ b/src/dydx/cancelOrder.ts @@ -0,0 +1,62 @@ +import axios from 'axios'; +import { getSubAccountCompositeClient } from '../../configuration/dYdXCommon'; +import { OrderFlags } from '@dydxprotocol/v4-client-js'; +import errorMessage from '../../configuration/errorMessage.json'; + +interface CancelOrderOptions { + subAccountNumber: number; + mnemonic: string; + orderId: string; + goodTillTimeInSeconds: string; +} + +interface OrderResponse { + data: { + clientId: string; + ticker: string; + }; +} + +interface ErrorResponse { + message: string; + code: number; +} + +export const cancelOrder = async (options: CancelOrderOptions): Promise => { + const { subAccountNumber, mnemonic, orderId, goodTillTimeInSeconds } = options; + + const { client, subaccount } = await getSubAccountCompositeClient(mnemonic, subAccountNumber); + + const orderConfig = { + method: 'get' as const, + maxBodyLength: Infinity, + url: `https://indexer.v4testnet.dydx.exchange/v4/orders/${orderId}`, + headers: {}, + }; + + let order: OrderResponse['data']; + + try { + const res = await axios.request(orderConfig); + order = res.data; + } catch (err) { + return { + message: errorMessage.error.message.invalidOrderId, + code: errorMessage.error.code.invalidInput, + } as ErrorResponse; + } + + try { + const tx = await client.cancelOrder( + subaccount, + order.clientId, + OrderFlags.LONG_TERM, + order.ticker, + 0, + Number(goodTillTimeInSeconds) + ); + return tx; + } catch (error: any) { + return error.message; + } +}; diff --git a/src/helper/Starknet.ts b/src/helper/Starknet.ts new file mode 100644 index 0000000..fa3ce57 --- /dev/null +++ b/src/helper/Starknet.ts @@ -0,0 +1,72 @@ +/* eslint-disable camelcase */ +import Web3 from 'web3'; +import BN from "bn.js"; +import * as config from '../../configuration/config.json'; + +interface Call { + contractAddress: string; + entrypoint: string; + calldata?: string[]; +} + +interface CallArrayItem { + to: string; + selector: string; + data_offset: string; + data_len: string; +} + +interface MulticallArrays { + callArray: CallArrayItem[]; + calldata: string[]; +} + +export const callsToArrayData = async (callObject: Call[]): Promise => { + const web3 = new Web3(); + + function bigNumberishArrayToDecimalStringArray(rawCalldata: (string | number | bigint)[]): string[] { + return rawCalldata.map((x) => BigInt(x).toString(10)); + } + + const transformCallsToMulticallArrays = (calls: Call[]): MulticallArrays => { + const callArray: CallArrayItem[] = []; + const calldata: (string | number | bigint)[] = []; + + calls.forEach((call) => { + const selectordata = new BN( + `${BigInt(BigInt(web3.utils.keccak256(call.entrypoint)).toString(10)).toString(16)}`, + 16 + ).iand(new BN(config.Mask250, 16)); + + const data = call.calldata || []; + callArray.push({ + to: BigInt(call.contractAddress).toString(10), + selector: `${BigInt(`0x${selectordata}`).toString(16)}`, + data_offset: calldata.length.toString(), + data_len: data.length.toString(), + }); + + calldata.push(...data); + }); + + return { + callArray, + calldata: bigNumberishArrayToDecimalStringArray(calldata), + }; + }; + + const fromCallsToExecuteCalldata = (): string[] => { + const { callArray, calldata } = transformCallsToMulticallArrays(callObject); + + return [ + callArray.length.toString(), + ...callArray + .map(({ to, selector, data_offset, data_len }) => [to, selector, data_offset, data_len]) + .flat(), + calldata.length.toString(), + ...calldata, + ]; + }; + + return fromCallsToExecuteCalldata(); +}; diff --git a/src/index.ts b/src/index.ts index 6d5888c..b3ececf 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ import axios from "axios"; -import * as config from "../configuration/config"; +import * as config from "../configuration/config.json"; import * as schemaValidator from "../configuration/schemaValidator"; import { Wallet, @@ -13,9 +13,9 @@ import { WalletCosmos, WalletStellar, WalletXRPL, -} from "./interfaces/index.ts"; +} from "./interfaces/index"; -export const prepareTransaction = async (apiURL, options) => { +export const prepareTransaction = async (apiURL:any, options:any) => { const filterOptions = options; filterOptions.function = "prepareTransaction()"; const validJson = await schemaValidator.validateInput(filterOptions); @@ -43,10 +43,10 @@ export const prepareTransaction = async (apiURL, options) => { } }; -export const decodeTransaction = async (options) => { +export const decodeTransaction = async (options:any) => { const filterOptions = options; filterOptions.function = "decodeTransaction()"; - const validJson = await validateInput(options); + const validJson = await schemaValidator.validateInput(options); if (!validJson.valid) { return validJson; diff --git a/test/swapTest.ts b/test/swapTest.ts index a76e00a..35cfd12 100644 --- a/test/swapTest.ts +++ b/test/swapTest.ts @@ -5,7 +5,7 @@ async function swap() { dotenv.config(); const xApiKey = "tK503cR23o8YTvXhNoDNo7kQf5sQdbXP8qbqkBeQ"; - const privateKey = ""; + const privateKey = "7b030343684de5d0d35dd68333dac40ffaed6f138da85464ca6227b89b17eae9"; const wallet = new Wallet({ privateKey , xApiKey }); diff --git a/tsconfig.json b/tsconfig.json index 6215c6c..5013c0f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,6 +6,8 @@ "esModuleInterop": true, "resolveJsonModule": true, "moduleResolution": "node", + "sourceMap": true, + "forceConsistentCasingInFileNames": true , "jsx": "react", "outDir": "./dist", "baseUrl": "./", From 395f92899331399bc44262908057e89e64455133 Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Tue, 10 Dec 2024 11:10:07 +0530 Subject: [PATCH 04/32] algorand, ethereum, solana issue fixed --- src/adapters/Wallet/index.ts | 4 +- .../Wallet/signTransaction/Algorand.ts | 54 +++++++ src/adapters/Wallet/signTransaction/Aptos.ts | 99 +++++++++++++ .../Wallet/signTransaction/Ethereum.ts | 2 +- src/adapters/Wallet/signTransaction/Solana.ts | 135 ++++++++++-------- src/adapters/Wallet/signTransaction/index.ts | 37 ++--- 6 files changed, 253 insertions(+), 78 deletions(-) create mode 100644 src/adapters/Wallet/signTransaction/Algorand.ts create mode 100644 src/adapters/Wallet/signTransaction/Aptos.ts diff --git a/src/adapters/Wallet/index.ts b/src/adapters/Wallet/index.ts index 5678d9a..99ede76 100644 --- a/src/adapters/Wallet/index.ts +++ b/src/adapters/Wallet/index.ts @@ -163,7 +163,7 @@ class Wallet { headers: { 'x-api-key': this.xApiKey } }; - let rpc = await axios.request(apiConfig); + let rpc:any = await axios.request(apiConfig); rpc = rpc.data.data.rpc; const provider = new ethers.providers.JsonRpcProvider(rpc); @@ -191,7 +191,7 @@ class Wallet { headers: { 'x-api-key': this.xApiKey } }; - let rpc = await axios.request(apiConfig); + let rpc:any = await axios.request(apiConfig); rpc = rpc.data.data.rpc; const provider = new ethers.providers.JsonRpcProvider(rpc); diff --git a/src/adapters/Wallet/signTransaction/Algorand.ts b/src/adapters/Wallet/signTransaction/Algorand.ts new file mode 100644 index 0000000..8a768d3 --- /dev/null +++ b/src/adapters/Wallet/signTransaction/Algorand.ts @@ -0,0 +1,54 @@ +import algosdk, { Algodv2, SuggestedParams } from 'algosdk'; + +interface TransactionObject { + from: string; + to: string; + gas: number | string; + value: number | string; +} + +interface Options { + privateKey: string; // Mnemonic key +} + +export const AlgorandUtils:any = { + async signTransactionAlgorand( + algorandWeb3: Algodv2, + transactionObject: TransactionObject, + options: Options + ): Promise<{ rawTransaction: string } | Error> { + /* + * Function will sign the transaction payload for Algorand chain + */ + + try { + // Fetch transaction parameters + const params: SuggestedParams = await algorandWeb3.getTransactionParams().do(); + + // Convert mnemonic key to secret key + const account = algosdk.mnemonicToSecretKey(options.privateKey); + + // Create the payment transaction + const transaction = algosdk.makePaymentTxnWithSuggestedParamsFromObject({ + from: transactionObject.from, + to: transactionObject.to, + amount: Number(transactionObject.value), // Convert value to number + suggestedParams: { + ...params, + fee: Number(transactionObject.gas), // Override fee + }, + note: new Uint8Array(0), // Empty note + }); + + // Sign the transaction + const signedTransaction = transaction.signTxn(account.sk); + + // Serialize transaction to base64 + const rawTransaction = Buffer.from(signedTransaction).toString('base64'); + + return { rawTransaction }; + } catch (error) { + return error as Error; + } + }, +}; diff --git a/src/adapters/Wallet/signTransaction/Aptos.ts b/src/adapters/Wallet/signTransaction/Aptos.ts new file mode 100644 index 0000000..55fc3d1 --- /dev/null +++ b/src/adapters/Wallet/signTransaction/Aptos.ts @@ -0,0 +1,99 @@ +import { + TxnBuilderTypes, + BCS, + AptosAccount, + AptosClient, + HexString, + } from 'aptos'; + import config from '../../../../configuration/config.json'; + + interface TransactionObject { + from: string; + to: string; + value: number | string; + data?: string; + } + + interface Options { + privateKey: string; + chainId?: string; + gas?: number; + } + + interface Web3Client { + getAccount: (address: string) => Promise<{ sequence_number: string }>; + } + + export const AptosUtils = { + async signTransactionAptos( + web3: Web3Client, + transactionObject: TransactionObject, + options: Options + ): Promise<{ rawTransaction: string } | Error> { + /* + * Function will sign the transaction payload for Aptos chain + */ + + try { + const { privateKey } = options; + const chainId = options.chainId === '1400' ? 1 : 2; + + const accountFrom = new AptosAccount( + HexString.ensure(privateKey).toUint8Array() + ); + + let transactionBuffer: TxnBuilderTypes.RawTransaction; + + if (!transactionObject.data) { + const seq = await web3.getAccount(accountFrom.address().hex()); + + transactionBuffer = new TxnBuilderTypes.RawTransaction( + TxnBuilderTypes.AccountAddress.fromHex(transactionObject.from), + BigInt(seq.sequence_number), + new TxnBuilderTypes.TransactionPayloadEntryFunction( + TxnBuilderTypes.EntryFunction.natural( + '0x1::coin', + 'transfer', + [ + new TxnBuilderTypes.TypeTagStruct( + TxnBuilderTypes.StructTag.fromString( + config.chains[options.chainId || '1'].aptosCoin + ) + ), + ], + [ + BCS.bcsToBytes( + TxnBuilderTypes.AccountAddress.fromHex(transactionObject.to) + ), + BCS.bcsSerializeUint64(Number(transactionObject.value)), + ] + ) + ), + options.gas || 1000, + 100, + BigInt(Math.floor(Date.now() / 1000) + 10000), + new TxnBuilderTypes.ChainId(chainId) + ); + } else { + const decodedBytes = Buffer.from(transactionObject.data, 'base64'); + const deserializer = new BCS.Deserializer( + new Uint8Array(decodedBytes) + ); + transactionBuffer = + TxnBuilderTypes.RawTransaction.deserialize(deserializer); + } + + const bcsTxn = AptosClient.generateBCSTransaction( + accountFrom, + transactionBuffer + ); + + const rawTransaction = Buffer.from(bcsTxn).toString('base64'); + + return { rawTransaction }; + } catch (error) { + return error as Error; + } + }, + }; + \ No newline at end of file diff --git a/src/adapters/Wallet/signTransaction/Ethereum.ts b/src/adapters/Wallet/signTransaction/Ethereum.ts index c161f48..646af06 100644 --- a/src/adapters/Wallet/signTransaction/Ethereum.ts +++ b/src/adapters/Wallet/signTransaction/Ethereum.ts @@ -12,7 +12,7 @@ interface Options { privateKey: string; } - const signTransactionEvm = async ( + const signTransactionEvm:any = async ( web3: Web3, transactionObject: TransactionObject, options: Options diff --git a/src/adapters/Wallet/signTransaction/Solana.ts b/src/adapters/Wallet/signTransaction/Solana.ts index 96c6909..0613c5f 100644 --- a/src/adapters/Wallet/signTransaction/Solana.ts +++ b/src/adapters/Wallet/signTransaction/Solana.ts @@ -1,43 +1,63 @@ -const { Wallet } = require('@project-serum/anchor'); -const { Keypair, Transaction, SystemProgram, VersionedTransaction, - TransactionMessage, PublicKey } = require('@solana/web3.js') -const { sign } = require('tweetnacl'); -const { decode } = require('bs58'); -const BN = require('bn.js'); +import { Wallet } from '@project-serum/anchor'; +import { + Keypair, + Transaction, + SystemProgram, + VersionedTransaction, + TransactionMessage, + PublicKey, + Connection, +} from '@solana/web3.js'; +import { sign } from 'tweetnacl'; +import { decode } from 'bs58'; +import BN from 'bn.js'; -module.exports = { +interface TransactionObject { + data?: string; + from?: string; + to: string; + value?: number | BN; + additionalSigners?: string; +} - signTransactionSolana: async (web3:any , transactionObject :any , options: any) => { +interface Options { + privateKey: string; +} + +export const SolanaUtils:any = { + async signTransactionSolana( + web3: Connection, + transactionObject: TransactionObject, + options: Options + ): Promise<{ rawTransaction: string } | Error | { msg: string }> { /* * Function will sign the transaction payload for Solana Chain */ - try { - const from = Keypair.fromSecretKey(decode(options.privateKey)); const blockHeight = await web3.getLatestBlockhash(); - let preparedTx; - let transactionBuffer; + let preparedTx: Transaction; + let transactionBuffer: Buffer; - if (!(transactionObject.data)) { - transactionObject.value = new BN(transactionObject.value); + if (!transactionObject.data) { + transactionObject.value = new BN(transactionObject.value || 0); preparedTx = new Transaction({ blockhash: blockHeight.blockhash, - lastValidBlockHeight: blockHeight + 1500, - feePayer: from.publicKey + lastValidBlockHeight: blockHeight.lastValidBlockHeight + 1500, + feePayer: from.publicKey, }); - preparedTx.add(SystemProgram.transfer({ - fromPubkey: from.publicKey, - toPubkey: transactionObject.to, - lamports: transactionObject.value - })); + preparedTx.add( + SystemProgram.transfer({ + fromPubkey: from.publicKey, + toPubkey: new PublicKey(transactionObject.to), + lamports: transactionObject.value.toNumber(), + }) + ); } else { if (transactionObject.from !== from.publicKey.toBase58()) { - return { - msg: "signer is not matching with the from address" - } - }; - let buffer = Buffer.from(transactionObject.data, "base64"); + return { msg: 'Signer is not matching with the from address' }; + } + const buffer = Buffer.from(transactionObject.data, 'base64'); preparedTx = Transaction.from(buffer); preparedTx.recentBlockhash = blockHeight.blockhash; } @@ -45,66 +65,67 @@ module.exports = { transactionBuffer = preparedTx.serializeMessage(); const signature = sign.detached(transactionBuffer, from.secretKey); preparedTx.addSignature(from.publicKey, signature); + if (transactionObject.additionalSigners) { const additionalKey = Keypair.fromSecretKey(decode(transactionObject.additionalSigners)); - const signature = sign.detached(transactionBuffer, additionalKey.secretKey); - preparedTx.addSignature(additionalKey.publicKey, signature); + const additionalSignature = sign.detached(transactionBuffer, additionalKey.secretKey); + preparedTx.addSignature(additionalKey.publicKey, additionalSignature); } + const serializedTx = preparedTx.serialize(); - const rawTransaction = Buffer.from(serializedTx).toString("base64"); - return { "rawTransaction": rawTransaction }; - } - catch (error) { - return error; + const rawTransaction = Buffer.from(serializedTx).toString('base64'); + return { rawTransaction }; + } catch (error) { + return error as Error; } }, - signVersionedTransactionSolana: async (web3: any, transactionObject:any , options:any) => { - /* - * Function will sign the transaction payload for Solana Chain - */ - + async signVersionedTransactionSolana( + web3: Connection, + transactionObject: TransactionObject, + options: Options + ): Promise<{ rawTransaction: string } | Error | { msg: string }> { + try { - const from = Keypair.fromSecretKey(decode(options.privateKey)); const wallet = new Wallet(from); - let recentBlockhash = await web3.getRecentBlockhash(); - let preparedTx; + const recentBlockhash = await web3.getRecentBlockhash(); + let preparedTx: VersionedTransaction; - if (!(transactionObject.data)) { + if (!transactionObject.data) { const instructions = [ SystemProgram.transfer({ fromPubkey: from.publicKey, toPubkey: new PublicKey(transactionObject.to), - lamports: transactionObject.value, + lamports: transactionObject.value instanceof BN ? transactionObject.value.toNumber() : transactionObject.value || 0, }), ]; const versionedMessage = new TransactionMessage({ payerKey: from.publicKey, recentBlockhash: recentBlockhash.blockhash, - instructions + instructions, }).compileToV0Message(); preparedTx = new VersionedTransaction(versionedMessage); } else { if (transactionObject.from !== from.publicKey.toBase58()) { - return { - msg: "signer is not matching with the from address" - } - }; - let buffer = Buffer.from(transactionObject.data, "base64"); + return { msg: 'Signer is not matching with the from address' }; + } + const buffer = Buffer.from(transactionObject.data, 'base64'); preparedTx = VersionedTransaction.deserialize(buffer); } preparedTx.sign([wallet.payer]); + if (transactionObject.additionalSigners) { - preparedTx.sign([Keypair.fromSecretKey(decode(transactionObject.additionalSigners))]); + const additionalKey = Keypair.fromSecretKey(decode(transactionObject.additionalSigners)); + preparedTx.sign([additionalKey]); } + const serializedTx = preparedTx.serialize(); - const rawTransaction = Buffer.from(serializedTx).toString("base64"); - return { "rawTransaction": rawTransaction }; + const rawTransaction = Buffer.from(serializedTx).toString('base64'); + return { rawTransaction }; + } catch (error) { + return error as Error; } - catch (error) { - return error; - } - } -}; \ No newline at end of file + }, +}; diff --git a/src/adapters/Wallet/signTransaction/index.ts b/src/adapters/Wallet/signTransaction/index.ts index afcd7b3..eefc5bf 100644 --- a/src/adapters/Wallet/signTransaction/index.ts +++ b/src/adapters/Wallet/signTransaction/index.ts @@ -1,25 +1,25 @@ -// import Algorand from './Algorand'; + import * as Algorand from './Algorand'; import Ethereum from './Ethereum'; // import Near from './Near'; -// import Solana from './Solana'; + import * as Solana from './Solana'; // import Tron from './Tron'; // import Sui from './Sui'; // import Aptos from './Aptos'; // import StarkNet from './Starknet'; -// export const signTransactionAlgorand = async (web3: any, transactionObject: any, options: any) => { +const signTransactionAlgorand:any = async (web3: any, transactionObject: any, options: any) => { -// const rawData = await Algorand.signTransactionAlgorand(web3, transactionObject, options); -// return rawData; + const rawData = await Algorand.AlgorandUtils.signTransactionAlgorand(web3, transactionObject, options); + return rawData; -// }; +}; -const signTransactionEvm = async (web3: any, transactionObject: any, options: any) => { - const signedTransaction = await Ethereum.signTransactionEvm(web3, transactionObject, options.privateKey); - return signedTransaction; +const signTransactionEvm:any = async (web3: any, transactionObject: any, options: any) => { + const rawData = await Ethereum.signTransactionEvm(web3, transactionObject, options.privateKey); + return rawData; }; -export default signTransactionEvm; + // exports.signTransactionNear = async (web3, transactionObject, options) => { @@ -34,11 +34,11 @@ export default signTransactionEvm; // return rawData; // }; -// exports.signTransactionSolana = async (web3, transactionObject, options) => { +const signTransactionSolana:any = async (web3:any, transactionObject:any, options:any) => { -// const rawData = await Solana.signTransactionSolana(web3, transactionObject, options); -// return rawData; -// }; + const rawData = await Solana.SolanaUtils.signVersionedTransactionSolana(web3, transactionObject, options); + return rawData; +}; // exports.signTransactionSui = async (web3, transactionObject, options) => { @@ -59,10 +59,11 @@ export default signTransactionEvm; // return rawData; // }; -// exports.signVersionedTransactionSolana = async (web3, transactionObject, options) => { +const signVersionedTransactionSolana = async (web3:any, transactionObject:any, options:any) => { -// const rawData = await Solana.signVersionedTransactionSolana(web3, transactionObject, options); -// return rawData; -// }; + const rawData = await Solana.SolanaUtils.signVersionedTransactionSolana(web3, transactionObject, options); + return rawData; +}; +export {signTransactionEvm, signTransactionSolana, signVersionedTransactionSolana, signTransactionAlgorand}; \ No newline at end of file From 1fbfdaf0296b520325606bbe024c7b2d2926ee74 Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Tue, 10 Dec 2024 11:15:15 +0530 Subject: [PATCH 05/32] index issue fixed --- src/adapters/Wallet/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/adapters/Wallet/index.ts b/src/adapters/Wallet/index.ts index 99ede76..9455a37 100644 --- a/src/adapters/Wallet/index.ts +++ b/src/adapters/Wallet/index.ts @@ -78,7 +78,7 @@ class Wallet { rpc }; - const rawData = await rawTransaction[`signTransaction${chainName}`](web3, transactionObject, options); + const rawData:any = await rawTransaction[`signTransaction${chainName}`as keyof typeof rawTransaction](web3, transactionObject, options); rawData.chainId = chainId; return rawData; From 45a315300da21c0eb66c3000ffb65c4c5a1318c7 Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Tue, 10 Dec 2024 12:10:05 +0530 Subject: [PATCH 06/32] aptos,near,sui,tron ts file added --- src/adapters/Wallet/signTransaction/Aptos.ts | 151 +++++++------------ src/adapters/Wallet/signTransaction/Near.ts | 81 ++++++++++ src/adapters/Wallet/signTransaction/Sui.ts | 40 +++++ src/adapters/Wallet/signTransaction/Tron.ts | 31 ++++ src/adapters/Wallet/signTransaction/index.ts | 22 +-- 5 files changed, 218 insertions(+), 107 deletions(-) create mode 100644 src/adapters/Wallet/signTransaction/Near.ts create mode 100644 src/adapters/Wallet/signTransaction/Sui.ts create mode 100644 src/adapters/Wallet/signTransaction/Tron.ts diff --git a/src/adapters/Wallet/signTransaction/Aptos.ts b/src/adapters/Wallet/signTransaction/Aptos.ts index 55fc3d1..396b861 100644 --- a/src/adapters/Wallet/signTransaction/Aptos.ts +++ b/src/adapters/Wallet/signTransaction/Aptos.ts @@ -1,99 +1,58 @@ -import { - TxnBuilderTypes, - BCS, - AptosAccount, - AptosClient, - HexString, - } from 'aptos'; - import config from '../../../../configuration/config.json'; - - interface TransactionObject { - from: string; - to: string; - value: number | string; - data?: string; - } - - interface Options { - privateKey: string; - chainId?: string; - gas?: number; - } - - interface Web3Client { - getAccount: (address: string) => Promise<{ sequence_number: string }>; - } - - export const AptosUtils = { - async signTransactionAptos( - web3: Web3Client, - transactionObject: TransactionObject, - options: Options - ): Promise<{ rawTransaction: string } | Error> { - /* - * Function will sign the transaction payload for Aptos chain - */ - - try { +import { TxnBuilderTypes, BCS, AptosAccount, + AptosClient, HexString } from 'aptos'; +import * as config from '../../../../configuration/config.json'; + + + +const signTransactionAptos = async (web3:any, transactionObject:any, options:any) => { + /* + * Function will sign the transaction payload for Aptos chain + */ + + try { const { privateKey } = options; - const chainId = options.chainId === '1400' ? 1 : 2; - - const accountFrom = new AptosAccount( - HexString.ensure(privateKey).toUint8Array() - ); - - let transactionBuffer: TxnBuilderTypes.RawTransaction; - - if (!transactionObject.data) { - const seq = await web3.getAccount(accountFrom.address().hex()); - - transactionBuffer = new TxnBuilderTypes.RawTransaction( - TxnBuilderTypes.AccountAddress.fromHex(transactionObject.from), - BigInt(seq.sequence_number), - new TxnBuilderTypes.TransactionPayloadEntryFunction( - TxnBuilderTypes.EntryFunction.natural( - '0x1::coin', - 'transfer', - [ - new TxnBuilderTypes.TypeTagStruct( - TxnBuilderTypes.StructTag.fromString( - config.chains[options.chainId || '1'].aptosCoin - ) - ), - ], - [ - BCS.bcsToBytes( - TxnBuilderTypes.AccountAddress.fromHex(transactionObject.to) - ), - BCS.bcsSerializeUint64(Number(transactionObject.value)), - ] - ) - ), - options.gas || 1000, - 100, - BigInt(Math.floor(Date.now() / 1000) + 10000), - new TxnBuilderTypes.ChainId(chainId) - ); + const chainId: number = (options.chainId && options.chainId === "1400") ? 1 : 2; + + const accountFrom = new AptosAccount(HexString.ensure(privateKey).toUint8Array()); + + let { data } = transactionObject; + + let transactionBuffer: any; + + if (!data){ + const seq = await web3.getAccount(accountFrom.address()); + transactionBuffer = new TxnBuilderTypes.RawTransaction( + TxnBuilderTypes.AccountAddress.fromHex(transactionObject.from), + BigInt(seq.sequence_number), + new TxnBuilderTypes.TransactionPayloadEntryFunction( + TxnBuilderTypes.EntryFunction.natural( + '0x1::coin', + "transfer", + [new TxnBuilderTypes.TypeTagStruct(TxnBuilderTypes.StructTag.fromString(config.chains[options.chainId].aptosCoin))], + [BCS.bcsToBytes(TxnBuilderTypes.AccountAddress.fromHex(transactionObject.to)), BCS.bcsSerializeUint64(transactionObject.value)] + ), + ), + options.gas ? options.gas : 1000, + BigInt(100), + BigInt(Math.floor(Date.now() / 1000) + 10000), + new TxnBuilderTypes.ChainId(chainId), + ); } else { - const decodedBytes = Buffer.from(transactionObject.data, 'base64'); - const deserializer = new BCS.Deserializer( - new Uint8Array(decodedBytes) - ); - transactionBuffer = - TxnBuilderTypes.RawTransaction.deserialize(deserializer); + const decodedBytes = Buffer.from(data, "base64"); + const deserializer = new BCS.Deserializer(new Uint8Array(Buffer.from(decodedBytes, "base64"))); + transactionBuffer = TxnBuilderTypes.RawTransaction.deserialize(deserializer); } - - const bcsTxn = AptosClient.generateBCSTransaction( - accountFrom, - transactionBuffer - ); - - const rawTransaction = Buffer.from(bcsTxn).toString('base64'); - - return { rawTransaction }; - } catch (error) { - return error as Error; - } - }, - }; - \ No newline at end of file + + const bcsTxn = AptosClient.generateBCSTransaction(accountFrom, transactionBuffer); + + const rawTransaction = Buffer.from(bcsTxn).toString("base64"); + + return { "rawTransaction": rawTransaction }; + + } + catch (error) { + return error; + } +} + +export { signTransactionAptos } \ No newline at end of file diff --git a/src/adapters/Wallet/signTransaction/Near.ts b/src/adapters/Wallet/signTransaction/Near.ts new file mode 100644 index 0000000..55aa9cc --- /dev/null +++ b/src/adapters/Wallet/signTransaction/Near.ts @@ -0,0 +1,81 @@ +import nearAPI from 'near-api-js'; + +import sha256 from "js-sha256"; + +const { KeyPair, keyStores } = nearAPI; + + +interface AccessKey { + nonce: number; + block_hash: string; + block_height:any; +} + + const signTransactionNear = async (web3:any, transactionObject:any, options:any) => { + /* + * Function will sign the transaction payload for Near chain + */ + + try { + const keyStore = new keyStores.InMemoryKeyStore(); + + const keyPair = KeyPair.fromString(options.privateKey); + + // adds the key you just created to your keyStore which can hold multiple keys + await keyStore.setKey(transactionObject.networkId, transactionObject.from, keyPair); + + // connect to NEAR + const near = new nearAPI.providers.JsonRpcProvider(options.rpc); + + const publicKey = keyPair.getPublicKey(); + + const actions = [nearAPI.transactions.transfer(transactionObject.value)]; + + const accessKey = await near.query( + `access_key/${transactionObject.from}/${publicKey.toString()}`, + "" + ); + // eslint-disable-next-line no-plusplus + const nonce:number = ++accessKey.nonce; + + const recentBlockHash = nearAPI.utils.serialize.base_decode( + accessKey.block_hash + ); + + const transaction = nearAPI.transactions.createTransaction( + transactionObject.from, + publicKey, + transactionObject.to, + nonce, + actions, + recentBlockHash + ); + + const serializedTx = nearAPI.utils.serialize.serialize( + nearAPI.transactions.SCHEMA.Transaction, + transaction + ); + + const serializedTxHash = new Uint8Array(sha256.sha256.array(serializedTx)); + + const signature = keyPair.sign(serializedTxHash); + + const signedTransaction = new nearAPI.transactions.SignedTransaction({ + transaction, + signature: new nearAPI.transactions.Signature({ + keyType: transaction.publicKey.keyType, + data: signature.signature, + }), + }); + + const rawTransaction = Buffer.from(signedTransaction.encode()).toString('base64'); + return {"rawTransaction": rawTransaction }; + + } + catch (error) { + return error; + } + + } + +export {signTransactionNear}; \ No newline at end of file diff --git a/src/adapters/Wallet/signTransaction/Sui.ts b/src/adapters/Wallet/signTransaction/Sui.ts new file mode 100644 index 0000000..f795114 --- /dev/null +++ b/src/adapters/Wallet/signTransaction/Sui.ts @@ -0,0 +1,40 @@ +import { TransactionBlock, Ed25519Keypair, RawSigner } from '@mysten/sui.js'; +import { fromB64 } from "@mysten/bcs"; + + + + const signTransactionSui = async (web3:any, transactionObject:any, options:any) => { + + try { + // get the secretkey from options + const secretKey = options.privateKey; + const privateKeyBase64 = Buffer.from(secretKey, "hex").toString("base64"); // Convert hex to base64 string + // Create the keypair from converted private key + const keypair = Ed25519Keypair.fromSecretKey(fromB64(privateKeyBase64)); + // Create a signer with the provided keypair and network + const signer = new RawSigner(keypair, web3); + // Create the transaction with given input + const tx = new TransactionBlock(); + // Currently we support sui coin transfer + const [coin] = tx.splitCoins(tx.gas, [tx.pure(transactionObject.value)]); + // Add the instruction + tx.transferObjects( + [coin], + tx.pure( + transactionObject.to + ) + ); + // Sign the transaction Block + const signedTransaction = await signer.signTransactionBlock({ + transactionBlock: tx, + }); + // Return the raw Transaction + return { "rawTransaction": signedTransaction }; + + } catch (error) { + return (error); + + } + } + + export { signTransactionSui } \ No newline at end of file diff --git a/src/adapters/Wallet/signTransaction/Tron.ts b/src/adapters/Wallet/signTransaction/Tron.ts new file mode 100644 index 0000000..ef12bde --- /dev/null +++ b/src/adapters/Wallet/signTransaction/Tron.ts @@ -0,0 +1,31 @@ +import * as TronWeb from 'tronweb'; + + + + const signTransactionTron = async (web3:any, transactionObject:any, options:any) => { + + try { + const tronWeb = new TronWeb({ + fullHost: options.rpc, + privateKey: options.privateKey, + }); + const tradeobj = await tronWeb.transactionBuilder.sendTrx( + tronWeb.address.toHex(transactionObject.to), + transactionObject.value, + tronWeb.address.toHex(transactionObject.from) + ); + const signedtxn = await tronWeb.trx.sign( + tradeobj, + options.privateKey + ); + + const rawTransaction = Buffer.from(JSON.stringify(signedtxn)).toString("base64"); + return { "rawTransaction": rawTransaction }; + + } + catch (error) { + return error; + } + } + +export { signTransactionTron } \ No newline at end of file diff --git a/src/adapters/Wallet/signTransaction/index.ts b/src/adapters/Wallet/signTransaction/index.ts index eefc5bf..0171685 100644 --- a/src/adapters/Wallet/signTransaction/index.ts +++ b/src/adapters/Wallet/signTransaction/index.ts @@ -1,9 +1,9 @@ import * as Algorand from './Algorand'; import Ethereum from './Ethereum'; -// import Near from './Near'; + import * as Near from './Near'; import * as Solana from './Solana'; // import Tron from './Tron'; -// import Sui from './Sui'; + import * as Sui from './Sui'; // import Aptos from './Aptos'; // import StarkNet from './Starknet'; @@ -21,12 +21,12 @@ const signTransactionEvm:any = async (web3: any, transactionObject: any, options -// exports.signTransactionNear = async (web3, transactionObject, options) => { +const signTransactionNear = async (web3:any, transactionObject:any , options:any) => { -// const rawData = await Near.signTransactionNear(web3, transactionObject, options); -// return rawData; + const rawData = await Near.signTransactionNear(web3, transactionObject, options); + return rawData; -// }; +}; // exports.signTransactionTron = async (web3, transactionObject, options) => { @@ -40,11 +40,11 @@ const signTransactionSolana:any = async (web3:any, transactionObject:any, option return rawData; }; -// exports.signTransactionSui = async (web3, transactionObject, options) => { +const signTransactionSui = async (web3:any, transactionObject:any, options:any) => { -// const rawData = await Sui.signTransactionSui(web3, transactionObject, options); -// return rawData; -// }; + const rawData = await Sui.signTransactionSui(web3, transactionObject, options); + return rawData; +}; // exports.signTransactionAptos = async (web3, transactionObject, options) => { @@ -66,4 +66,4 @@ const signVersionedTransactionSolana = async (web3:any, transactionObject:any, o }; -export {signTransactionEvm, signTransactionSolana, signVersionedTransactionSolana, signTransactionAlgorand}; \ No newline at end of file +export {signTransactionEvm, signTransactionSolana, signVersionedTransactionSolana, signTransactionAlgorand, signTransactionNear, signTransactionSui}; \ No newline at end of file From 8457a1b81e0e2fb7b6b407c40b57ce236defb13c Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Tue, 10 Dec 2024 17:52:25 +0530 Subject: [PATCH 07/32] aptos, tron issue fixed --- package-lock.json | 144 +++++++++---------- package.json | 2 +- src/adapters/Wallet/signTransaction/Aptos.ts | 6 +- src/adapters/Wallet/signTransaction/Tron.ts | 2 +- src/adapters/WalletCircle/index.ts | 137 +++++++++--------- tsconfig.json | 1 + 6 files changed, 146 insertions(+), 146 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9ff165d..b98f669 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,7 +48,6 @@ "starknet": "5.24.3", "stellar-sdk": "^12.3.0", "ton-crypto": "3.2.0", - "tronweb": "5.3.1", "tweetnacl": "1.0.3", "web3": "1.7.5", "xrpl": "^3.0.0" @@ -61,6 +60,7 @@ "eslint-config-prettier": "9.1.0", "eslint-plugin-import": "2.29.1", "jest": "29.7.0", + "tronweb": "^6.0.0", "ts-node": "^10.9.2", "tsx": "^4.19.2", "typescript": "^5.7.2" @@ -3277,11 +3277,22 @@ } }, "node_modules/@noble/curves": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", - "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dependencies": { - "@noble/hashes": "1.3.3" + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "engines": { + "node": ">= 16" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -3479,41 +3490,30 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "node_modules/@scure/base": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz", - "integrity": "sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip32": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.1.tgz", - "integrity": "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==", - "dependencies": { - "@noble/curves": "~1.1.0", - "@noble/hashes": "~1.3.1", - "@scure/base": "~1.1.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32/node_modules/@noble/curves": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", - "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dependencies": { - "@noble/hashes": "1.3.1" + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip32/node_modules/@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "engines": { "node": ">= 16" }, @@ -3754,7 +3754,8 @@ "node_modules/@tronweb3/google-protobuf": { "version": "3.21.2", "resolved": "https://registry.npmjs.org/@tronweb3/google-protobuf/-/google-protobuf-3.21.2.tgz", - "integrity": "sha512-IVcT2GfWX3K6tHUVhs14NP5uzKhQt4KeDya1g9ACxuZsUzsaoGUIGzceK2Ltu7xp1YV94AaHOf4yxLAivlvEkQ==" + "integrity": "sha512-IVcT2GfWX3K6tHUVhs14NP5uzKhQt4KeDya1g9ACxuZsUzsaoGUIGzceK2Ltu7xp1YV94AaHOf4yxLAivlvEkQ==", + "dev": true }, "node_modules/@tsconfig/node10": { "version": "1.0.11", @@ -6558,33 +6559,34 @@ } }, "node_modules/ethereum-cryptography": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", - "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dependencies": { - "@noble/curves": "1.1.0", - "@noble/hashes": "1.3.1", - "@scure/bip32": "1.3.1", - "@scure/bip39": "1.2.1" + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" } }, - "node_modules/ethereum-cryptography/node_modules/@noble/curves": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", - "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", - "dependencies": { - "@noble/hashes": "1.3.1" + "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "engines": { + "node": ">= 16" }, "funding": { "url": "https://paulmillr.com/funding/" } }, - "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", - "engines": { - "node": ">= 16" + "node_modules/ethereum-cryptography/node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -7979,11 +7981,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/injectpromise": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/injectpromise/-/injectpromise-1.0.0.tgz", - "integrity": "sha512-qNq5wy4qX4uWHcVFOEU+RqZkoVG65FhvGkyDWbuBxILMjK6A1LFf5A1mgXZkD4nRx5FCorD81X/XvPKp/zVfPA==" - }, "node_modules/inquirer": { "version": "8.2.6", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", @@ -10901,14 +10898,6 @@ "node": ">=0.10.0" } }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -12345,42 +12334,44 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/tronweb": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/tronweb/-/tronweb-5.3.1.tgz", - "integrity": "sha512-JF3HE0ab8KQWJWETCF7UqZHD4uMNNGlEPrquBoObu5bWc8A8eerBV9M2PJq+HcSYBivmEHeBqFgmpMAQP3ofpw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tronweb/-/tronweb-6.0.0.tgz", + "integrity": "sha512-mIh00KG00Iu80UT1SLDgNEBLzWiR24WnttlObP8B9eQyNJ6mg4oD2gE+vG0cd6FcHL9DV6Jd18gKeBp4y3Y7Ew==", + "dev": true, "dependencies": { "@babel/runtime": "^7.0.0", - "@ethersproject/abi": "^5.7.0", "@tronweb3/google-protobuf": "^3.21.2", - "axios": "^0.26.1", + "axios": "^1.7.4", "bignumber.js": "^9.0.1", - "ethereum-cryptography": "^2.0.0", - "ethers": "^6.6.0", + "ethereum-cryptography": "^2.1.3", + "ethers": "^6.13.1", "eventemitter3": "^3.1.0", - "injectpromise": "^1.0.0", - "lodash": "^4.17.21", - "querystring-es3": "^0.2.1", "semver": "^5.6.0", "validator": "^13.7.0" } }, "node_modules/tronweb/node_modules/axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "dev": true, "dependencies": { - "follow-redirects": "^1.14.8" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/tronweb/node_modules/eventemitter3": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "dev": true }, "node_modules/tronweb/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, "bin": { "semver": "bin/semver" } @@ -12806,6 +12797,7 @@ "version": "13.11.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "dev": true, "engines": { "node": ">= 0.10" } diff --git a/package.json b/package.json index d312820..d24d4a5 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,6 @@ "starknet": "5.24.3", "stellar-sdk": "^12.3.0", "ton-crypto": "3.2.0", - "tronweb": "5.3.1", "tweetnacl": "1.0.3", "web3": "1.7.5", "xrpl": "^3.0.0" @@ -74,6 +73,7 @@ "eslint-config-prettier": "9.1.0", "eslint-plugin-import": "2.29.1", "jest": "29.7.0", + "tronweb": "^6.0.0", "ts-node": "^10.9.2", "tsx": "^4.19.2", "typescript": "^5.7.2" diff --git a/src/adapters/Wallet/signTransaction/Aptos.ts b/src/adapters/Wallet/signTransaction/Aptos.ts index 396b861..ba1fbfd 100644 --- a/src/adapters/Wallet/signTransaction/Aptos.ts +++ b/src/adapters/Wallet/signTransaction/Aptos.ts @@ -1,6 +1,6 @@ import { TxnBuilderTypes, BCS, AptosAccount, AptosClient, HexString } from 'aptos'; -import * as config from '../../../../configuration/config.json'; +import config from '../../../../configuration/config'; @@ -28,7 +28,7 @@ const signTransactionAptos = async (web3:any, transactionObject:any, options:any TxnBuilderTypes.EntryFunction.natural( '0x1::coin', "transfer", - [new TxnBuilderTypes.TypeTagStruct(TxnBuilderTypes.StructTag.fromString(config.chains[options.chainId].aptosCoin))], + [new TxnBuilderTypes.TypeTagStruct(TxnBuilderTypes.StructTag.fromString(config.chains[options.chainId]!.aptosCoin || "undefined"))], [BCS.bcsToBytes(TxnBuilderTypes.AccountAddress.fromHex(transactionObject.to)), BCS.bcsSerializeUint64(transactionObject.value)] ), ), @@ -39,7 +39,7 @@ const signTransactionAptos = async (web3:any, transactionObject:any, options:any ); } else { const decodedBytes = Buffer.from(data, "base64"); - const deserializer = new BCS.Deserializer(new Uint8Array(Buffer.from(decodedBytes, "base64"))); + const deserializer = new BCS.Deserializer(new Uint8Array(decodedBytes)); transactionBuffer = TxnBuilderTypes.RawTransaction.deserialize(deserializer); } diff --git a/src/adapters/Wallet/signTransaction/Tron.ts b/src/adapters/Wallet/signTransaction/Tron.ts index ef12bde..3456bfb 100644 --- a/src/adapters/Wallet/signTransaction/Tron.ts +++ b/src/adapters/Wallet/signTransaction/Tron.ts @@ -5,7 +5,7 @@ import * as TronWeb from 'tronweb'; const signTransactionTron = async (web3:any, transactionObject:any, options:any) => { try { - const tronWeb = new TronWeb({ + const tronWeb = new TronWeb.TronWeb({ fullHost: options.rpc, privateKey: options.privateKey, }); diff --git a/src/adapters/WalletCircle/index.ts b/src/adapters/WalletCircle/index.ts index a20f4b2..27c1478 100644 --- a/src/adapters/WalletCircle/index.ts +++ b/src/adapters/WalletCircle/index.ts @@ -1,12 +1,40 @@ import { initiateUserControlledWalletsClient } from '@circle-fin/user-controlled-wallets'; -import { v4 } from 'uuid'; -import axios from 'axios'; +import { v4 as uuidv4 } from 'uuid'; +import axios, { AxiosRequestConfig } from 'axios'; import * as schemaValidator from '../../../configuration/schemaValidator'; import * as conf from '../../../configuration/config.json'; +interface WalletCircleOptions { + appId: string; + apiKey: string; + userId: string; + userToken: string; + walletId: string; + encryptionKey: string; +} + +interface TransactionObject { + value: number; + data?: string; + to: string; + tokenId?: string; + function?: string; +} + +interface ValidObject { + valid: boolean; +} class WalletCircle { - constructor(options) { + private appId: string; + private apiKey: string; + private client: ReturnType; + private userId: string; + private userToken: string; + private walletId: string; + private encryptionKey: string; + + constructor(options: WalletCircleOptions) { this.appId = options.appId; this.apiKey = options.apiKey; this.client = initiateUserControlledWalletsClient({ @@ -16,115 +44,94 @@ class WalletCircle { this.userToken = options.userToken; this.walletId = options.walletId; this.encryptionKey = options.encryptionKey; - }; + } - static getUserToken = async (options) => { + static async getUserToken(options: { apiKey: string; userId: string }): Promise { const client = initiateUserControlledWalletsClient({ apiKey: options.apiKey, }); const userToken = await client.createUserToken({ userId: options.userId }).then(res => res.data); return userToken; - }; + } - signTransaction = async (transactionObject) => { + async signTransaction(transactionObject: TransactionObject): Promise { const transactionOptions = transactionObject; transactionOptions.function = "transactionObject()"; - const validObject = await schemaValidator.validateInput(transactionObject); + const validObject: ValidObject = await schemaValidator.validateInput(transactionObject); if (!validObject.valid) { - return (validObject); + return validObject; } if (transactionObject.data) { - let data = JSON.stringify({ - "userId": this.userId, - "idempotencyKey": v4(), - "amounts": [ - transactionObject.value - ], - "callData": transactionObject.data, - "contractAddress": transactionObject.to, - "walletId": this.walletId, - "feeLevel": "MEDIUM" + const data = JSON.stringify({ + userId: this.userId, + idempotencyKey: uuidv4(), + amounts: [transactionObject.value], + callData: transactionObject.data, + contractAddress: transactionObject.to, + walletId: this.walletId, + feeLevel: "MEDIUM", }); - let config = { + const config: AxiosRequestConfig = { method: 'post', maxBodyLength: Infinity, url: `${conf.circleProgrammableWallet.baseUrl}contractExecution`, headers: { 'Content-Type': 'application/json', - 'authorization': `Bearer ${this.apiKey}`, + authorization: `Bearer ${this.apiKey}`, 'X-User-Token': this.userToken, }, - data: data + data, }; + try { const challengeId = await axios.request(config).then(res => res.data); return challengeId; - // const response = {}; - // response.appId = this.appId; - // response.userToken = this.userToken; - // response.encryptionKey = this.encryptionKey; - // response.challengeId = challengeId; - // return response; - } catch (error) { + } catch (error: any) { return error; } } else { - let data = JSON.stringify({ - "userId": this.userId, - "idempotencyKey": v4(), - "amounts": [ - transactionObject.value - ], - "destinationAddress": transactionObject.to, - "tokenId": transactionObject.tokenId, - "walletId": this.walletId, - "feeLevel": "MEDIUM" + const data = JSON.stringify({ + userId: this.userId, + idempotencyKey: uuidv4(), + amounts: [transactionObject.value], + destinationAddress: transactionObject.to, + tokenId: transactionObject.tokenId, + walletId: this.walletId, + feeLevel: "MEDIUM", }); - let config = { + const config: AxiosRequestConfig = { method: 'post', maxBodyLength: Infinity, url: `${conf.circleProgrammableWallet.baseUrl}/transfer`, headers: { 'Content-Type': 'application/json', - 'authorization': `Bearer ${this.apiKey}`, + authorization: `Bearer ${this.apiKey}`, 'X-User-Token': this.userToken, }, - data: data + data, }; try { - const challengeId = await axios.request(config).then(res => res.data); return challengeId; - // const response = {}; - // response.appId = this.appId; - // response.userToken = this.userToken; - // response.encryptionKey = this.encryptionKey; - // response.challengeId = challengeId; - // return response; - } catch (error) { - return error.response.data; + } catch (error: any) { + return error.response?.data; } - } - - }; - - sendTransaction = async (challengeId) => { - - const response = {}; - response.appId = this.appId; - response.userToken = this.userToken; - response.encryptionKey = this.encryptionKey; - response.challengeId = challengeId.data.challengeId; - return response; - } + async sendTransaction(challengeId: { data: { challengeId: string } }): Promise> { + return { + appId: this.appId, + userToken: this.userToken, + encryptionKey: this.encryptionKey, + challengeId: challengeId.data.challengeId, + }; + } } -export { WalletCircle }; \ No newline at end of file +export { WalletCircle }; diff --git a/tsconfig.json b/tsconfig.json index 5013c0f..8c32cf0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,6 +8,7 @@ "moduleResolution": "node", "sourceMap": true, "forceConsistentCasingInFileNames": true , + "allowSyntheticDefaultImports": true, "jsx": "react", "outDir": "./dist", "baseUrl": "./", From e4f39552ce34eb42ca29db4cfd3251482d483260 Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Tue, 10 Dec 2024 18:00:31 +0530 Subject: [PATCH 08/32] wallectcosmos issue fixed --- package-lock.json | 32 +++- package.json | 3 +- src/adapters/WalletCircle/index.ts | 255 +++++++++++++++-------------- src/adapters/WalletCosmos/index.ts | 210 +++++++++++++----------- 4 files changed, 279 insertions(+), 221 deletions(-) diff --git a/package-lock.json b/package-lock.json index b98f669..5581683 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,7 +63,8 @@ "tronweb": "^6.0.0", "ts-node": "^10.9.2", "tsx": "^4.19.2", - "typescript": "^5.7.2" + "typescript": "^5.7.2", + "uuid": "^11.0.3" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -8574,6 +8575,14 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, + "node_modules/jayson/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", @@ -11331,6 +11340,14 @@ "utf-8-validate": "^5.0.2" } }, + "node_modules/rpc-websockets/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/rpc-websockets/node_modules/ws": { "version": "8.13.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", @@ -12766,11 +12783,16 @@ } }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.3.tgz", + "integrity": "sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist/esm/bin/uuid" } }, "node_modules/v8-compile-cache-lib": { diff --git a/package.json b/package.json index d24d4a5..35eb97a 100644 --- a/package.json +++ b/package.json @@ -76,6 +76,7 @@ "tronweb": "^6.0.0", "ts-node": "^10.9.2", "tsx": "^4.19.2", - "typescript": "^5.7.2" + "typescript": "^5.7.2", + "uuid": "^11.0.3" } } diff --git a/src/adapters/WalletCircle/index.ts b/src/adapters/WalletCircle/index.ts index 27c1478..0631498 100644 --- a/src/adapters/WalletCircle/index.ts +++ b/src/adapters/WalletCircle/index.ts @@ -1,137 +1,148 @@ -import { initiateUserControlledWalletsClient } from '@circle-fin/user-controlled-wallets'; +import axios from 'axios'; +import * as jwt from 'jsonwebtoken'; import { v4 as uuidv4 } from 'uuid'; -import axios, { AxiosRequestConfig } from 'axios'; +import crypto from 'crypto'; +import config from '../../../configuration/config.json'; +import * as common from '../../../configuration/common'; import * as schemaValidator from '../../../configuration/schemaValidator'; -import * as conf from '../../../configuration/config.json'; - -interface WalletCircleOptions { - appId: string; - apiKey: string; - userId: string; - userToken: string; - walletId: string; - encryptionKey: string; + +interface WalletFireblocksOptions { + baseUrl?: string; + apiSecret: string; + apiKey: string; } interface TransactionObject { - value: number; - data?: string; - to: string; - tokenId?: string; - function?: string; + chainId: string; + chainSymbol: string; + from: string; + to: string; + value?: number; + assetId?: string; + assetDecimals?: number; + note?: string; + data?: string; + internal?: boolean; } -interface ValidObject { - valid: boolean; +interface RawTransaction { + jwt: string; + path: string; + data: any; + method: string; } -class WalletCircle { - private appId: string; - private apiKey: string; - private client: ReturnType; - private userId: string; - private userToken: string; - private walletId: string; - private encryptionKey: string; - - constructor(options: WalletCircleOptions) { - this.appId = options.appId; - this.apiKey = options.apiKey; - this.client = initiateUserControlledWalletsClient({ - apiKey: options.apiKey, - }); - this.userId = options.userId; - this.userToken = options.userToken; - this.walletId = options.walletId; - this.encryptionKey = options.encryptionKey; - } - - static async getUserToken(options: { apiKey: string; userId: string }): Promise { - const client = initiateUserControlledWalletsClient({ - apiKey: options.apiKey, - }); - const userToken = await client.createUserToken({ userId: options.userId }).then(res => res.data); - return userToken; - } - - async signTransaction(transactionObject: TransactionObject): Promise { - const transactionOptions = transactionObject; - transactionOptions.function = "transactionObject()"; - const validObject: ValidObject = await schemaValidator.validateInput(transactionObject); - - if (!validObject.valid) { - return validObject; +class WalletFireblocks { + private baseUrl: string; + private apiSecret: string; + private apiKey: string; + + constructor(options: WalletFireblocksOptions) { + this.baseUrl = options.baseUrl || config.fireblocks.baseUrl; + this.apiSecret = options.apiSecret; + this.apiKey = options.apiKey; } - if (transactionObject.data) { - const data = JSON.stringify({ - userId: this.userId, - idempotencyKey: uuidv4(), - amounts: [transactionObject.value], - callData: transactionObject.data, - contractAddress: transactionObject.to, - walletId: this.walletId, - feeLevel: "MEDIUM", - }); - - const config: AxiosRequestConfig = { - method: 'post', - maxBodyLength: Infinity, - url: `${conf.circleProgrammableWallet.baseUrl}contractExecution`, - headers: { - 'Content-Type': 'application/json', - authorization: `Bearer ${this.apiKey}`, - 'X-User-Token': this.userToken, - }, - data, - }; - - try { - const challengeId = await axios.request(config).then(res => res.data); - return challengeId; - } catch (error: any) { - return error; - } - } else { - const data = JSON.stringify({ - userId: this.userId, - idempotencyKey: uuidv4(), - amounts: [transactionObject.value], - destinationAddress: transactionObject.to, - tokenId: transactionObject.tokenId, - walletId: this.walletId, - feeLevel: "MEDIUM", - }); - - const config: AxiosRequestConfig = { - method: 'post', - maxBodyLength: Infinity, - url: `${conf.circleProgrammableWallet.baseUrl}/transfer`, - headers: { - 'Content-Type': 'application/json', - authorization: `Bearer ${this.apiKey}`, - 'X-User-Token': this.userToken, - }, - data, - }; - - try { - const challengeId = await axios.request(config).then(res => res.data); - return challengeId; - } catch (error: any) { - return error.response?.data; - } + private jwtSign(path: string, data: any): string { + const token = jwt.sign( + { + uri: path, + nonce: uuidv4(), + iat: Math.floor(Date.now() / 1000), + exp: Math.floor(Date.now() / 1000) + 55, + sub: this.apiKey, + bodyHash: crypto.createHash('sha256').update(JSON.stringify(data || '')).digest().toString('hex'), + }, + this.apiSecret, + { algorithm: 'RS256' } + ); + return token; } - } - - async sendTransaction(challengeId: { data: { challengeId: string } }): Promise> { - return { - appId: this.appId, - userToken: this.userToken, - encryptionKey: this.encryptionKey, - challengeId: challengeId.data.challengeId, + + public signTransaction = async (transactionObject: TransactionObject): Promise => { + try { + transactionObject.function = 'FireblockSign()'; + const validJson = await schemaValidator.validateInput(transactionObject); + + if (!validJson.valid) { + return validJson; + } + + const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); + const chainName = config.chains[chainId].chainName; + + const txData: any = { + operation: transactionObject.data ? 'CONTRACT_CALL' : 'TRANSFER', + source: { + type: 'VAULT_ACCOUNT', + id: transactionObject.from, + }, + }; + + if (transactionObject.internal) { + txData.destination = { + type: 'VAULT_ACCOUNT', + id: transactionObject.to, + }; + } else { + txData.destination = { + type: 'ONE_TIME_ADDRESS', + oneTimeAddress: { + address: transactionObject.to, + }, + }; + } + + const assetDecimals = transactionObject.assetDecimals || 18; + txData.assetId = transactionObject.assetId || 'ETH_TEST3'; + txData.amount = transactionObject.value ? transactionObject.value / 10 ** assetDecimals : '0'; + txData.note = transactionObject.note || 'expand'; + + if (transactionObject.data) { + txData.extraParameters = { + contractCallData: transactionObject.data, + }; + } + + const signature = this.jwtSign('/v1/transactions', txData); + const rawTx: RawTransaction = { + jwt: signature, + path: config.fireblocks.createTransaction, + data: txData, + method: 'POST', + }; + + return rawTx; + } catch (error) { + return error; + } + }; + + public sendTransaction = async (rawTx: RawTransaction): Promise => { + try { + rawTx.function = 'SendFireblocks()'; + const validJson = await schemaValidator.validateInput(rawTx); + + if (!validJson.valid) { + return validJson; + } + + const response = await axios({ + url: `${this.baseUrl}${rawTx.path}`, + method: rawTx.method, + data: rawTx.data, + headers: { + 'X-API-Key': this.apiKey, + Authorization: `Bearer ${rawTx.jwt}`, + }, + }); + + return response.data; + } catch (error) { + console.error(error); + return error.data; + } }; - } } -export { WalletCircle }; +export { WalletFireblocks }; diff --git a/src/adapters/WalletCosmos/index.ts b/src/adapters/WalletCosmos/index.ts index 4afd5ed..12ad8ec 100644 --- a/src/adapters/WalletCosmos/index.ts +++ b/src/adapters/WalletCosmos/index.ts @@ -1,110 +1,134 @@ -import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; -import { SigningStargateClient } from "@cosmjs/stargate"; -import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx"; -import axios from 'axios'; -import * as schemaValidator from '../../../configuration/schemaValidator'; -import * as common from '../../../configuration/common'; -import * as config from '../../../configuration/config.json'; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { SigningStargateClient } from "@cosmjs/stargate"; +import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx"; +import axios from "axios"; +import * as schemaValidator from "../../../configuration/schemaValidator"; +import * as common from "../../../configuration/common"; +import * as config from "../../../configuration/config.json"; + +interface WalletCosmosOptions { + privateKey: string; + xApiKey: string; +} +interface TransactionObject { + chainId: string; + chainSymbol: string; + to: string; + value: string; + function?: string; +} -class WalletCosmos { +interface SendTransactionOptions { + [key: string]: any; + function?: string; +} - constructor(options) { - this.wallet = options.privateKey; - this.xApiKey = options.xApiKey; - } +interface ValidJsonResponse { + valid: boolean; + [key: string]: any; +} - signTransaction = async (transactionObject) => { - - const configuration = { "params": {} }; - transactionObject.function = "txObjSol()"; - const validJson = await schemaValidator.validateInput(transactionObject); - - if (!validJson.valid) { - return validJson; - } - - const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); - let chainName = config.chains[chainId].chainName; - - axios.defaults.headers['X-API-KEY'] = this.xApiKey; - const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; - - configuration.params = { - chainId - }; - - let rpc = await axios.get(apiURL, configuration); - rpc = rpc.data.data.rpc; - - if (chainName !== "Cosmos") { - return { - "msg": "Cosmos wallet can be used only with Cosmos chains" - } - }; - - const wallet = await DirectSecp256k1HdWallet.fromMnemonic(this.wallet, { - prefix: "cosmos", - }); - - const Account = (await wallet.getAccounts())[0].address; - const signingClient = await SigningStargateClient.connectWithSigner(rpc, wallet); - - const tx = await signingClient.sign(Account, [ - { - typeUrl: "/cosmos.bank.v1beta1.MsgSend", - value: { - fromAddress: Account, - toAddress: transactionObject.to, - amount: [{ denom: "uatom", amount: transactionObject.value }], - }, - } - ], { - amount: [{ denom: "uatom", amount: "1000" }], - gas: "200000", - }, - "expand" - ); - - const encodedTx = TxRaw.encode(tx).finish(); - const rawString = Buffer.from(encodedTx).toString("base64"); - return { chainId: chainId, rawTransaction: rawString }; +class WalletCosmos { + private wallet: string; + private xApiKey: string; - } + constructor(options: WalletCosmosOptions) { + this.wallet = options.privateKey; + this.xApiKey = options.xApiKey; + } - sendTransaction = async (options) => { + signTransaction = async (transactionObject: TransactionObject): Promise => { + const configuration = { params: {} }; + transactionObject.function = "txObjSol()"; + const validJson: ValidJsonResponse = await schemaValidator.validateInput(transactionObject); - const filterOptions = options; - filterOptions.function = "sendTransaction()"; - const validJson = await schemaValidator.validateInput(options); - if (!validJson.valid) { - return (validJson); - } + if (!validJson.valid) { + return validJson; + } - try { + const chainId = await common.getChainId({ + chainId: transactionObject.chainId, + chainSymbol: transactionObject.chainSymbol, + }); + const chainName = config.chains[chainId as keyof typeof config.chains].chainName; - const apiURL = `${config.url.apiurl}/chain/sendtransaction/`; + config.chains[chainId as keyof typeof config.chains].chainName; - const params = { - method: "post", - url: apiURL, - data: options, - headers: { - "x-api-key": this.xApiKey - } - }; + axios.defaults.headers["X-API-KEY"] = this.xApiKey; + const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; - const transactionHash = await axios(params); - return transactionHash.data; - } + configuration.params = { + chainId, + }; - catch (error) { - return error; - } + let rpc:any = await axios.get(apiURL, configuration); + rpc = rpc.data.data.rpc; - }; + if (chainName !== "Cosmos") { + return { + msg: "Cosmos wallet can be used only with Cosmos chains", + }; + } + const wallet = await DirectSecp256k1HdWallet.fromMnemonic(this.wallet, { + prefix: "cosmos", + }); + + const account = (await wallet.getAccounts())[0].address; + const signingClient = await SigningStargateClient.connectWithSigner(rpc, wallet); + + const tx = await signingClient.sign( + account, + [ + { + typeUrl: "/cosmos.bank.v1beta1.MsgSend", + value: { + fromAddress: account, + toAddress: transactionObject.to, + amount: [{ denom: "uatom", amount: transactionObject.value }], + }, + }, + ], + { + amount: [{ denom: "uatom", amount: "1000" }], + gas: "200000", + }, + "expand" + ); + + const encodedTx = TxRaw.encode(tx).finish(); + const rawString = Buffer.from(encodedTx).toString("base64"); + return { chainId, rawTransaction: rawString }; + }; + + sendTransaction = async (options: SendTransactionOptions): Promise => { + const filterOptions = options; + filterOptions.function = "sendTransaction()"; + const validJson: ValidJsonResponse = await schemaValidator.validateInput(options); + + if (!validJson.valid) { + return validJson; + } + try { + const apiURL = `${config.url.apiurl}/chain/sendtransaction/`; + + const params = { + method: "post", + url: apiURL, + data: options, + headers: { + "x-api-key": this.xApiKey, + }, + }; + + const transactionHash = await axios(params); + return transactionHash.data; + } catch (error) { + return error; + } + }; } -export { WalletCosmos }; \ No newline at end of file +export { WalletCosmos }; From ce078441b0df27a1bd2fcf36df1b02ebd08e8c67 Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Tue, 10 Dec 2024 18:01:33 +0530 Subject: [PATCH 09/32] walletfireblock --- src/adapters/WalletCircle/index.ts | 255 ++++++++++++------------- src/adapters/WalletFireblocks/index.ts | 172 +++++++++-------- 2 files changed, 218 insertions(+), 209 deletions(-) diff --git a/src/adapters/WalletCircle/index.ts b/src/adapters/WalletCircle/index.ts index 0631498..27c1478 100644 --- a/src/adapters/WalletCircle/index.ts +++ b/src/adapters/WalletCircle/index.ts @@ -1,148 +1,137 @@ -import axios from 'axios'; -import * as jwt from 'jsonwebtoken'; +import { initiateUserControlledWalletsClient } from '@circle-fin/user-controlled-wallets'; import { v4 as uuidv4 } from 'uuid'; -import crypto from 'crypto'; -import config from '../../../configuration/config.json'; -import * as common from '../../../configuration/common'; +import axios, { AxiosRequestConfig } from 'axios'; import * as schemaValidator from '../../../configuration/schemaValidator'; - -interface WalletFireblocksOptions { - baseUrl?: string; - apiSecret: string; - apiKey: string; +import * as conf from '../../../configuration/config.json'; + +interface WalletCircleOptions { + appId: string; + apiKey: string; + userId: string; + userToken: string; + walletId: string; + encryptionKey: string; } interface TransactionObject { - chainId: string; - chainSymbol: string; - from: string; - to: string; - value?: number; - assetId?: string; - assetDecimals?: number; - note?: string; - data?: string; - internal?: boolean; + value: number; + data?: string; + to: string; + tokenId?: string; + function?: string; } -interface RawTransaction { - jwt: string; - path: string; - data: any; - method: string; +interface ValidObject { + valid: boolean; } -class WalletFireblocks { - private baseUrl: string; - private apiSecret: string; - private apiKey: string; - - constructor(options: WalletFireblocksOptions) { - this.baseUrl = options.baseUrl || config.fireblocks.baseUrl; - this.apiSecret = options.apiSecret; - this.apiKey = options.apiKey; +class WalletCircle { + private appId: string; + private apiKey: string; + private client: ReturnType; + private userId: string; + private userToken: string; + private walletId: string; + private encryptionKey: string; + + constructor(options: WalletCircleOptions) { + this.appId = options.appId; + this.apiKey = options.apiKey; + this.client = initiateUserControlledWalletsClient({ + apiKey: options.apiKey, + }); + this.userId = options.userId; + this.userToken = options.userToken; + this.walletId = options.walletId; + this.encryptionKey = options.encryptionKey; + } + + static async getUserToken(options: { apiKey: string; userId: string }): Promise { + const client = initiateUserControlledWalletsClient({ + apiKey: options.apiKey, + }); + const userToken = await client.createUserToken({ userId: options.userId }).then(res => res.data); + return userToken; + } + + async signTransaction(transactionObject: TransactionObject): Promise { + const transactionOptions = transactionObject; + transactionOptions.function = "transactionObject()"; + const validObject: ValidObject = await schemaValidator.validateInput(transactionObject); + + if (!validObject.valid) { + return validObject; } - private jwtSign(path: string, data: any): string { - const token = jwt.sign( - { - uri: path, - nonce: uuidv4(), - iat: Math.floor(Date.now() / 1000), - exp: Math.floor(Date.now() / 1000) + 55, - sub: this.apiKey, - bodyHash: crypto.createHash('sha256').update(JSON.stringify(data || '')).digest().toString('hex'), - }, - this.apiSecret, - { algorithm: 'RS256' } - ); - return token; + if (transactionObject.data) { + const data = JSON.stringify({ + userId: this.userId, + idempotencyKey: uuidv4(), + amounts: [transactionObject.value], + callData: transactionObject.data, + contractAddress: transactionObject.to, + walletId: this.walletId, + feeLevel: "MEDIUM", + }); + + const config: AxiosRequestConfig = { + method: 'post', + maxBodyLength: Infinity, + url: `${conf.circleProgrammableWallet.baseUrl}contractExecution`, + headers: { + 'Content-Type': 'application/json', + authorization: `Bearer ${this.apiKey}`, + 'X-User-Token': this.userToken, + }, + data, + }; + + try { + const challengeId = await axios.request(config).then(res => res.data); + return challengeId; + } catch (error: any) { + return error; + } + } else { + const data = JSON.stringify({ + userId: this.userId, + idempotencyKey: uuidv4(), + amounts: [transactionObject.value], + destinationAddress: transactionObject.to, + tokenId: transactionObject.tokenId, + walletId: this.walletId, + feeLevel: "MEDIUM", + }); + + const config: AxiosRequestConfig = { + method: 'post', + maxBodyLength: Infinity, + url: `${conf.circleProgrammableWallet.baseUrl}/transfer`, + headers: { + 'Content-Type': 'application/json', + authorization: `Bearer ${this.apiKey}`, + 'X-User-Token': this.userToken, + }, + data, + }; + + try { + const challengeId = await axios.request(config).then(res => res.data); + return challengeId; + } catch (error: any) { + return error.response?.data; + } } - - public signTransaction = async (transactionObject: TransactionObject): Promise => { - try { - transactionObject.function = 'FireblockSign()'; - const validJson = await schemaValidator.validateInput(transactionObject); - - if (!validJson.valid) { - return validJson; - } - - const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); - const chainName = config.chains[chainId].chainName; - - const txData: any = { - operation: transactionObject.data ? 'CONTRACT_CALL' : 'TRANSFER', - source: { - type: 'VAULT_ACCOUNT', - id: transactionObject.from, - }, - }; - - if (transactionObject.internal) { - txData.destination = { - type: 'VAULT_ACCOUNT', - id: transactionObject.to, - }; - } else { - txData.destination = { - type: 'ONE_TIME_ADDRESS', - oneTimeAddress: { - address: transactionObject.to, - }, - }; - } - - const assetDecimals = transactionObject.assetDecimals || 18; - txData.assetId = transactionObject.assetId || 'ETH_TEST3'; - txData.amount = transactionObject.value ? transactionObject.value / 10 ** assetDecimals : '0'; - txData.note = transactionObject.note || 'expand'; - - if (transactionObject.data) { - txData.extraParameters = { - contractCallData: transactionObject.data, - }; - } - - const signature = this.jwtSign('/v1/transactions', txData); - const rawTx: RawTransaction = { - jwt: signature, - path: config.fireblocks.createTransaction, - data: txData, - method: 'POST', - }; - - return rawTx; - } catch (error) { - return error; - } - }; - - public sendTransaction = async (rawTx: RawTransaction): Promise => { - try { - rawTx.function = 'SendFireblocks()'; - const validJson = await schemaValidator.validateInput(rawTx); - - if (!validJson.valid) { - return validJson; - } - - const response = await axios({ - url: `${this.baseUrl}${rawTx.path}`, - method: rawTx.method, - data: rawTx.data, - headers: { - 'X-API-Key': this.apiKey, - Authorization: `Bearer ${rawTx.jwt}`, - }, - }); - - return response.data; - } catch (error) { - console.error(error); - return error.data; - } + } + + async sendTransaction(challengeId: { data: { challengeId: string } }): Promise> { + return { + appId: this.appId, + userToken: this.userToken, + encryptionKey: this.encryptionKey, + challengeId: challengeId.data.challengeId, }; + } } -export { WalletFireblocks }; +export { WalletCircle }; diff --git a/src/adapters/WalletFireblocks/index.ts b/src/adapters/WalletFireblocks/index.ts index b0ff357..0631498 100644 --- a/src/adapters/WalletFireblocks/index.ts +++ b/src/adapters/WalletFireblocks/index.ts @@ -1,37 +1,67 @@ import axios from 'axios'; -import * as sign from 'jsonwebtoken'; -import * as uuid from 'uuid'; +import * as jwt from 'jsonwebtoken'; +import { v4 as uuidv4 } from 'uuid'; import crypto from 'crypto'; -import * as config from '../../../configuration/config.json'; +import config from '../../../configuration/config.json'; import * as common from '../../../configuration/common'; import * as schemaValidator from '../../../configuration/schemaValidator'; +interface WalletFireblocksOptions { + baseUrl?: string; + apiSecret: string; + apiKey: string; +} + +interface TransactionObject { + chainId: string; + chainSymbol: string; + from: string; + to: string; + value?: number; + assetId?: string; + assetDecimals?: number; + note?: string; + data?: string; + internal?: boolean; +} + +interface RawTransaction { + jwt: string; + path: string; + data: any; + method: string; +} + class WalletFireblocks { + private baseUrl: string; + private apiSecret: string; + private apiKey: string; - constructor(options) { - this.baseUrl = options.baseUrl ? (options.baseUrl) : config.fireblocks.baseUrl; + constructor(options: WalletFireblocksOptions) { + this.baseUrl = options.baseUrl || config.fireblocks.baseUrl; this.apiSecret = options.apiSecret; this.apiKey = options.apiKey; } - jwtSign(path, data) { - const token = sign({ - uri: path, - nonce: uuid(), - iat: Math.floor(Date.now() / 1000), - exp: Math.floor(Date.now() / 1000) + 55, - sub: this.apiKey, - bodyHash: crypto.createHash("sha256").update(JSON.stringify(data || "")).digest().toString("hex") - }, this.apiSecret, { algorithm: "RS256" }); + private jwtSign(path: string, data: any): string { + const token = jwt.sign( + { + uri: path, + nonce: uuidv4(), + iat: Math.floor(Date.now() / 1000), + exp: Math.floor(Date.now() / 1000) + 55, + sub: this.apiKey, + bodyHash: crypto.createHash('sha256').update(JSON.stringify(data || '')).digest().toString('hex'), + }, + this.apiSecret, + { algorithm: 'RS256' } + ); return token; } - - signTransaction = async (transactionObject) => { + public signTransaction = async (transactionObject: TransactionObject): Promise => { try { - - const configuration = { "params": {} }; - transactionObject.function = "FireblockSign()"; + transactionObject.function = 'FireblockSign()'; const validJson = await schemaValidator.validateInput(transactionObject); if (!validJson.valid) { @@ -39,90 +69,80 @@ class WalletFireblocks { } const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); - let chainName = config.chains[chainId].chainName; + const chainName = config.chains[chainId].chainName; - const txData = {} - txData.operation = (transactionObject.data) ? "CONTRACT_CALL" : "TRANSFER", - txData.source = { - "type": "VAULT_ACCOUNT", - "id": transactionObject.from - }; + const txData: any = { + operation: transactionObject.data ? 'CONTRACT_CALL' : 'TRANSFER', + source: { + type: 'VAULT_ACCOUNT', + id: transactionObject.from, + }, + }; - if (transactionObject.internal === true) { + if (transactionObject.internal) { txData.destination = { - "type": "VAULT_ACCOUNT", - "id": transactionObject.to - } - - } - else { + type: 'VAULT_ACCOUNT', + id: transactionObject.to, + }; + } else { txData.destination = { - "type": "ONE_TIME_ADDRESS", - "oneTimeAddress": { - "address": transactionObject.to - } - } + type: 'ONE_TIME_ADDRESS', + oneTimeAddress: { + address: transactionObject.to, + }, + }; } - const assetDecimals = (transactionObject.assetDecimals) ? (transactionObject.assetDecimals) : 18; - txData.assetId = (transactionObject.assetId) ? (transactionObject.assetId) : "ETH_TEST3"; - txData.amount = (transactionObject.value) ? (transactionObject.value) / 10 ** assetDecimals : '0', - txData.note = (transactionObject.note) ? (transactionObject.note) : "expand" + const assetDecimals = transactionObject.assetDecimals || 18; + txData.assetId = transactionObject.assetId || 'ETH_TEST3'; + txData.amount = transactionObject.value ? transactionObject.value / 10 ** assetDecimals : '0'; + txData.note = transactionObject.note || 'expand'; if (transactionObject.data) { txData.extraParameters = { - "contractCallData": transactionObject.data - } - } - const signature = this.jwtSign("/v1/transactions", txData); - const rawTx = { - "jwt": signature, - "path": config.fireblocks.createTransaction, - "data": txData, - "method": "POST" + contractCallData: transactionObject.data, + }; } - return rawTx; + const signature = this.jwtSign('/v1/transactions', txData); + const rawTx: RawTransaction = { + jwt: signature, + path: config.fireblocks.createTransaction, + data: txData, + method: 'POST', + }; + + return rawTx; } catch (error) { return error; } - } - - sendTransaction = async (rawTx) => { - + }; + public sendTransaction = async (rawTx: RawTransaction): Promise => { try { - - const options = rawTx; - options.function = "SendFireblocks()"; - const validJson = await schemaValidator.validateInput(options); + rawTx.function = 'SendFireblocks()'; + const validJson = await schemaValidator.validateInput(rawTx); if (!validJson.valid) { - return (validJson); + return validJson; } - - const resp = await axios({ + const response = await axios({ url: `${this.baseUrl}${rawTx.path}`, method: rawTx.method, data: rawTx.data, headers: { - "X-API-Key": this.apiKey, - "Authorization": `Bearer ${rawTx.jwt}` - } - }) + 'X-API-Key': this.apiKey, + Authorization: `Bearer ${rawTx.jwt}`, + }, + }); - return resp.data; + return response.data; } catch (error) { - console.log(error); + console.error(error); return error.data; } - - } - + }; } -export { WalletFireblocks } - - - +export { WalletFireblocks }; From fb62bc6e15e7106789a6b6ff76c5b8092598af53 Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Tue, 10 Dec 2024 18:02:53 +0530 Subject: [PATCH 10/32] issue fixed --- src/adapters/WalletFireblocks/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/adapters/WalletFireblocks/index.ts b/src/adapters/WalletFireblocks/index.ts index 0631498..5ddc38d 100644 --- a/src/adapters/WalletFireblocks/index.ts +++ b/src/adapters/WalletFireblocks/index.ts @@ -69,7 +69,7 @@ class WalletFireblocks { } const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); - const chainName = config.chains[chainId].chainName; + const chainName = config.chains[chainId as keyof typeof config.chains].chainName; const txData: any = { operation: transactionObject.data ? 'CONTRACT_CALL' : 'TRANSFER', From f143049ee8bccd1b271c3d6d5e9061362741ecd7 Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Wed, 11 Dec 2024 12:31:24 +0530 Subject: [PATCH 11/32] cosmos,fireblocks,steller,ton,xrpl fie changed to ts --- configuration/config.ts | 5 + package-lock.json | 35 +++++-- package.json | 2 +- src/adapters/WalletCosmos/index.ts | 2 +- src/adapters/WalletFireblocks/index.ts | 2 +- src/adapters/WalletStellar/index.ts | 75 ++++++++++----- src/adapters/WalletTON/index.ts | 125 ++++++++++++++----------- src/adapters/WalletXRPL/index.ts | 61 ++++++++---- 8 files changed, 195 insertions(+), 112 deletions(-) diff --git a/configuration/config.ts b/configuration/config.ts index 172ed48..2f1794c 100644 --- a/configuration/config.ts +++ b/configuration/config.ts @@ -23,8 +23,13 @@ type ChainConfig = { type Config = { chains: Record; fireblocks : Record; + url: Record; }; + type UrlConfig = { + apiurl?:string; + } + const config: Config = { "chains": { "1": { diff --git a/package-lock.json b/package-lock.json index 5581683..bd58cb5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,7 +40,6 @@ "ethers": "6.13.1", "ethers-5": "npm:ethers@^5.7.2", "js-sha256": "0.9.0", - "jsonwebtoken": "^9.0.2", "lodash": "^4.17.21", "long": "^5.2.3", "near-api-js": "4.0.2", @@ -60,6 +59,7 @@ "eslint-config-prettier": "9.1.0", "eslint-plugin-import": "2.29.1", "jest": "29.7.0", + "jsonwebtoken": "^9.0.2", "tronweb": "^6.0.0", "ts-node": "^10.9.2", "tsx": "^4.19.2", @@ -4999,7 +4999,8 @@ "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true }, "node_modules/buffer-from": { "version": "1.1.2", @@ -5911,6 +5912,7 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, "dependencies": { "safe-buffer": "^5.0.1" } @@ -9325,6 +9327,7 @@ "version": "9.0.2", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dev": true, "dependencies": { "jws": "^3.2.2", "lodash.includes": "^4.3.0", @@ -9346,6 +9349,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -9357,6 +9361,7 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -9370,7 +9375,8 @@ "node_modules/jsonwebtoken/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/jsprim": { "version": "1.4.2", @@ -9398,6 +9404,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dev": true, "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", @@ -9408,6 +9415,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dev": true, "dependencies": { "jwa": "^1.4.1", "safe-buffer": "^5.0.1" @@ -9510,32 +9518,38 @@ "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true }, "node_modules/lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true }, "node_modules/lodash.isinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true }, "node_modules/lodash.isnumber": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true }, "node_modules/lodash.isstring": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -9546,7 +9560,8 @@ "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true }, "node_modules/log-symbols": { "version": "4.1.0", diff --git a/package.json b/package.json index 35eb97a..ac6d327 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,6 @@ "ethers": "6.13.1", "ethers-5": "npm:ethers@^5.7.2", "js-sha256": "0.9.0", - "jsonwebtoken": "^9.0.2", "lodash": "^4.17.21", "long": "^5.2.3", "near-api-js": "4.0.2", @@ -73,6 +72,7 @@ "eslint-config-prettier": "9.1.0", "eslint-plugin-import": "2.29.1", "jest": "29.7.0", + "jsonwebtoken": "^9.0.2", "tronweb": "^6.0.0", "ts-node": "^10.9.2", "tsx": "^4.19.2", diff --git a/src/adapters/WalletCosmos/index.ts b/src/adapters/WalletCosmos/index.ts index 12ad8ec..bfbfcf0 100644 --- a/src/adapters/WalletCosmos/index.ts +++ b/src/adapters/WalletCosmos/index.ts @@ -53,7 +53,7 @@ class WalletCosmos { }); const chainName = config.chains[chainId as keyof typeof config.chains].chainName; - config.chains[chainId as keyof typeof config.chains].chainName; + axios.defaults.headers["X-API-KEY"] = this.xApiKey; const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; diff --git a/src/adapters/WalletFireblocks/index.ts b/src/adapters/WalletFireblocks/index.ts index 5ddc38d..973153d 100644 --- a/src/adapters/WalletFireblocks/index.ts +++ b/src/adapters/WalletFireblocks/index.ts @@ -138,7 +138,7 @@ class WalletFireblocks { }); return response.data; - } catch (error) { + } catch (error:any) { console.error(error); return error.data; } diff --git a/src/adapters/WalletStellar/index.ts b/src/adapters/WalletStellar/index.ts index 70a252f..2931999 100644 --- a/src/adapters/WalletStellar/index.ts +++ b/src/adapters/WalletStellar/index.ts @@ -1,16 +1,38 @@ import { TransactionBuilder, Keypair } from "stellar-sdk"; import * as schemaValidator from '../../../configuration/schemaValidator'; import * as common from '../../../configuration/common'; -import * as config from '../../../configuration/config.json'; -import axios from "axios"; +import config from '../../../configuration/config'; +import axios, { AxiosRequestConfig } from "axios"; + +interface WalletStellarOptions { + privateKey: string; + xApiKey: string; +} + +interface SignTransactionOptions { + function?: string; + chainSymbol: string; + data: string; + chainId?: string; +} + +interface SendTransactionOptions { + function?: string; + chainSymbol: string; + data: string; + chainId?: string; +} class WalletStellar { - constructor(options) { - this.privateKey = options.privateKey, - this.xApiKey = options.xApiKey + private privateKey: string; + private xApiKey: string; + + constructor(options: WalletStellarOptions) { + this.privateKey = options.privateKey; + this.xApiKey = options.xApiKey; } - signTransaction = async (options) => { + signTransaction = async (options: SignTransactionOptions) => { options.function = "stellarSignTransaction()"; const validJson = await schemaValidator.validateInput(options); @@ -21,53 +43,56 @@ class WalletStellar { const { chainSymbol, data } = options; let { chainId } = options; - chainId = await common.getChainId({ chainId, chainSymbol }); - const chainName = config.chains[chainId]?.chainName; + chainId = await common.getChainId({ chainId, chainSymbol }) || undefined; + const chainName = config.chains[chainId as keyof typeof config.chains].chainName; if (chainName !== "Stellar") { return { - "msg": "Stellar wallet can be used only with Stellar chain" - } - }; + msg: "Stellar wallet can be used only with Stellar chain", + }; + } const userKeyPair = Keypair.fromSecret(this.privateKey); - const { networkPassphrase } = config.chains[chainId]; + const networkPassphrase = config.chains[chainId as keyof typeof config.chains]?.networkPassphrase; + + if (!networkPassphrase) { + return { msg: "Network passphrase is not defined" }; + } let rawTransaction = TransactionBuilder.fromXDR(data, networkPassphrase); - rawTransaction.sign(userKeyPair) + rawTransaction.sign(userKeyPair); + const xdrString = rawTransaction.toEnvelope().toXDR("base64"); - rawTransaction = rawTransaction.toEnvelope().toXDR('base64'); - return { rawTransaction, chainId }; + + return { rawTransaction: xdrString, chainId }; }; - sendTransaction = async (options) => { + sendTransaction = async (options: SendTransactionOptions) => { const filterOptions = options; filterOptions.function = "sendTransaction()"; const validJson = await schemaValidator.validateInput(filterOptions); - + if (!validJson.valid) { - return (validJson); + return validJson; } try { const apiURL = `${config.url.apiurl}/chain/sendtransaction/`; - const params = { + const params: AxiosRequestConfig = { method: "post", url: apiURL, data: options, headers: { - "x-api-key": this.xApiKey - } + "x-api-key": this.xApiKey, + }, }; const transactionHash = await axios(params); return transactionHash.data; - } - - catch (error) { + } catch (error) { return error; } }; } -export { WalletStellar }; \ No newline at end of file +export { WalletStellar }; diff --git a/src/adapters/WalletTON/index.ts b/src/adapters/WalletTON/index.ts index 0bd6bca..2b24a18 100644 --- a/src/adapters/WalletTON/index.ts +++ b/src/adapters/WalletTON/index.ts @@ -3,33 +3,50 @@ import { WalletContractV4, internal, Cell } from "@ton/ton"; import * as schemaValidator from '../../../configuration/schemaValidator'; import * as common from '../../../configuration/common'; import { initialiseWeb3 } from "../../../configuration/intialiseWeb3"; -import config from '../../../configuration/config.json'; +import config from '../../../configuration/config'; +interface WalletTONOptions { + privateKey: string; + xApiKey: string; +} -class WalletTON { +interface TransactionObject { + function?: string; + chainId: string; + chainSymbol: string; + to: string; + value: number; + message: string; + rawTransaction?: any; +} - constructor(options) { - this.privateKey = Buffer.from(options.privateKey, 'hex'), - this.keyPair = keyPairFromSecretKey(this.privateKey); - this.xApiKey = options.xApiKey - const wallet = WalletContractV4.create({ publicKey: this.keyPair.publicKey, workchain: 0 }); - this.wallet = wallet; +class WalletTON { + private privateKey: Buffer; + private keyPair: { publicKey: Uint8Array; secretKey: Uint8Array }; + private xApiKey: string; + private wallet: WalletContractV4; + private _nanotons = 10 ** 9; + + constructor(options: WalletTONOptions) { + this.privateKey = Buffer.from(options.privateKey, 'hex'); + this.keyPair = keyPairFromSecretKey(this.privateKey); + this.xApiKey = options.xApiKey; + + this.wallet = WalletContractV4.create({ + publicKey: Buffer.from(this.keyPair.publicKey), + workchain: 0 + }); } - static getPrivateKey = async (mnemonic) => { + static async getPrivateKey(mnemonic: string): Promise { const arr = mnemonic.split(" "); - this.keyPair = await mnemonicToPrivateKey(arr); - const privateKey = Buffer.from(this.keyPair.secretKey).toString('hex'); + const keyPair = await mnemonicToPrivateKey(arr); + const privateKey = Buffer.from(keyPair.secretKey).toString('hex'); return privateKey; } - - _nanotons = 10 ** 9; - - - signTransaction = async (transactionObject) => { - - const configuration = { "params": {} }; + async signTransaction(transactionObject: TransactionObject): Promise { + const configuration = { params: {} }; transactionObject.function = "tonTxObject()"; const validJson = await schemaValidator.validateInput(transactionObject); @@ -37,84 +54,84 @@ class WalletTON { return validJson; } - const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); - let chainName = config.chains[chainId].chainName; + const chainId = await common.getChainId({ + chainId: transactionObject.chainId, + chainSymbol: transactionObject.chainSymbol + }); + const chainName = config.chains[chainId as keyof typeof config.chains].chainName; if (chainName !== "TON") { return { - "msg": "ton wallet can be used only with TON chain" - } - }; + msg: "ton wallet can be used only with TON chain" + }; + } const web3 = await initialiseWeb3({ chainId, key: this.xApiKey }); const walletContract = web3.open(this.wallet); - + let body; try { - body = Cell.fromBase64(transactionObject.message); - } catch(error) { - body = transactionObject.message || "through expand"; // optional comment - }; + body = Cell.fromBase64(transactionObject.message); + } catch (error) { + body = transactionObject.message || "through expand"; // Optional comment + } const seqno = await walletContract.getSeqno(); const rawData = await walletContract.createTransfer({ secretKey: this.privateKey, - seqno: seqno, + seqno, messages: [ internal({ to: transactionObject.to, - value: JSON.stringify(transactionObject.value / this._nanotons), + value: BigInt(transactionObject.value) / BigInt(this._nanotons), // Convert to bigint body, - bounce: false, + bounce: false }) ] }); - return { rawTransaction: rawData, chainId: chainId }; - - + return { rawTransaction: rawData, chainId }; } - sendTransaction = async (transactionObject) => { - + async sendTransaction(transactionObject: TransactionObject): Promise { transactionObject.function = "TONTransaction()"; const validJson = await schemaValidator.validateInput(transactionObject); if (!validJson.valid) { - return (validJson); + return validJson; } try { - - const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); - let chainName = config.chains[chainId].chainName; + const chainId = await common.getChainId({ + chainId: transactionObject.chainId, + chainSymbol: transactionObject.chainSymbol + }); + const chainName = config.chains[chainId as keyof typeof config.chains].chainName; const web3 = await initialiseWeb3({ chainId, key: this.xApiKey }); - // console.log(web3); + if (chainName !== "TON") { return { - "msg": "ton wallet can be used only with TON chain" - } - }; + msg: "ton wallet can be used only with TON chain" + }; + } const walletContract = web3.open(this.wallet); - const currentseqno = await walletContract.getSeqno(); + const currentSeqno = await walletContract.getSeqno(); const txHash = await walletContract.send(transactionObject.rawTransaction); - const timer = (ms) => new Promise(resolve => setTimeout(resolve, ms)); + const timer = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)); await timer(5000); - let seqno = await walletContract.getSeqno(); - if (seqno > currentseqno) { - return { seqno: seqno, message: "transaction has been sent to the blockchain" } + const seqno = await walletContract.getSeqno(); + + if (seqno > currentSeqno) { + return { seqno, message: "transaction has been sent to the blockchain" }; } return { - "message": "transaction has been sent to the blockchain", + message: "transaction has been sent to the blockchain" }; - } catch (error) { return error; } } - - } -export { WalletTON }; \ No newline at end of file +export { WalletTON }; \ No newline at end of file diff --git a/src/adapters/WalletXRPL/index.ts b/src/adapters/WalletXRPL/index.ts index 6c8e4ca..10f16d8 100644 --- a/src/adapters/WalletXRPL/index.ts +++ b/src/adapters/WalletXRPL/index.ts @@ -1,16 +1,38 @@ -import axios from "axios"; +import axios from "axios"; import xrpl from 'xrpl'; import * as schemaValidator from '../../../configuration/schemaValidator'; import * as common from '../../../configuration/common'; import * as config from '../../../configuration/config.json'; +interface WalletXRPLConstructorOptions { + privateKey: string; + xApiKey: string; +} + +interface SignTransactionOptions { + privateKey?: string; + xApiKey?: string; + chainSymbol: string; + data: string; + chainId?: string | number; + function?: string; +} + +interface SendTransactionOptions { + [key: string]: any; + function?: string; +} + class WalletXRPL { - constructor(options) { - this.privateKey = options.privateKey, - this.xApiKey = options.xApiKey + private privateKey: string; + private xApiKey: string; + + constructor(options: WalletXRPLConstructorOptions) { + this.privateKey = options.privateKey; + this.xApiKey = options.xApiKey; } - signTransaction = async (options) => { + public signTransaction = async (options: SignTransactionOptions): Promise<{ chainId: string | number; rawTransaction?: string; msg?: string }> => { options.function = "xrplSignTransaction()"; const validJson = await schemaValidator.validateInput(options); @@ -21,30 +43,31 @@ class WalletXRPL { const { chainSymbol, data } = options; let { chainId } = options; - chainId = await common.getChainId({ chainId, chainSymbol }); - const chainName = config.chains[chainId]?.chainName; + chainId = (await common.getChainId({ chainId, chainSymbol })) ?? "unknown"; + const chainName = config.chains[chainId as keyof typeof config.chains].chainName; if (chainName !== "XRPL") { return { - "msg": "XRPL wallet can be used only with XRP Ledger" - } - }; + chainId, + msg: "XRPL wallet can be used only with XRP Ledger", + }; + } const account = xrpl.Wallet.fromMnemonic(this.privateKey); - const decodedData = JSON.parse(atob(data)); + const decodedData = JSON.parse(Buffer.from(data, 'base64').toString('utf-8')); const signedTx = account.sign(decodedData); return { chainId, rawTransaction: signedTx.tx_blob }; }; - sendTransaction = async (options) => { + public sendTransaction = async (options: SendTransactionOptions): Promise => { const filterOptions = options; filterOptions.function = "sendTransaction()"; const validJson = await schemaValidator.validateInput(filterOptions); - + if (!validJson.valid) { - return (validJson); + return validJson; } try { @@ -54,18 +77,16 @@ class WalletXRPL { url: apiURL, data: options, headers: { - "x-api-key": this.xApiKey - } + "x-api-key": this.xApiKey, + }, }; const transactionHash = await axios(params); return transactionHash.data; - } - - catch (error) { + } catch (error) { return error; } }; } -export { WalletXRPL }; \ No newline at end of file +export { WalletXRPL }; From ee72acf1ac1448944a0fff4202d4e54bae43e700 Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Wed, 11 Dec 2024 16:33:34 +0530 Subject: [PATCH 12/32] issue fixed --- .../Wallet/signTransaction/Ethereum.ts | 2 +- src/adapters/WalletCoinbase/index.ts | 80 +++--- .../signTransaction/Ethereum.ts | 19 +- src/adapters/WalletDFNS/index.ts | 266 ++++++++++-------- 4 files changed, 210 insertions(+), 157 deletions(-) diff --git a/src/adapters/Wallet/signTransaction/Ethereum.ts b/src/adapters/Wallet/signTransaction/Ethereum.ts index 646af06..21388ec 100644 --- a/src/adapters/Wallet/signTransaction/Ethereum.ts +++ b/src/adapters/Wallet/signTransaction/Ethereum.ts @@ -31,4 +31,4 @@ interface Options { }; -export default { signTransactionEvm }; \ No newline at end of file +export default { signTransactionEvm }; f \ No newline at end of file diff --git a/src/adapters/WalletCoinbase/index.ts b/src/adapters/WalletCoinbase/index.ts index 2d0d023..bf7812a 100644 --- a/src/adapters/WalletCoinbase/index.ts +++ b/src/adapters/WalletCoinbase/index.ts @@ -1,27 +1,44 @@ import axios from 'axios'; import BN from 'bn.js'; import * as rawTransaction from './signTransaction/index'; -import config from '../../../configuration/config.json'; +import config from '../../../configuration/config'; import * as common from '../../../configuration/common'; import * as schemaValidator from '../../../configuration/schemaValidator'; import { initialiseWeb3 } from '../../../configuration/intialiseWeb3'; +type TransactionObject = { + chainId: string; + chainSymbol: string; + value: string | BN; + [key: string]: any; +}; + +type SendTransactionOptions = { + [key: string]: any; +}; + +type ValidObject = { + valid: boolean; + [key: string]: any; +}; + class WalletCoinbase { + private privateKey: string; + private xApiKey: string; - constructor(options) { + constructor(options: { privateKey: string; xApiKey: string }) { this.privateKey = options.privateKey; this.xApiKey = options.xApiKey; - }; + } - signTransaction = async (transactionObject) => { + signTransaction = async (transactionObject: TransactionObject): Promise => { + const configuration: { params: Record } = { params: {} }; + const transactionOptions = { ...transactionObject, function: 'transactionObject()' }; - const configuration = { "params": {} }; - const transactionOptions = transactionObject; - transactionOptions.function = "transactionObject()"; - const validObject = await schemaValidator.validateInput(transactionObject); + const validObject: ValidObject = await schemaValidator.validateInput(transactionObject); if (!validObject.valid) { - return (validObject); + return validObject; } axios.defaults.headers['X-API-KEY'] = this.xApiKey; @@ -29,62 +46,53 @@ class WalletCoinbase { const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); - let chainName = config.chains[chainId].chainName; + const chainName = config.chains[chainId as keyof typeof config.chains].chainName; - if (chainName !== "Evm") - return new Error("chain not Supported"); + if (chainName !== 'Evm') { + throw new Error('chain not Supported'); + } - configuration.params = { - chainId - }; + configuration.params = { chainId }; - let rpc = await axios.get(apiURL, configuration); - rpc = rpc.data.data.rpc; - const web3 = await initialiseWeb3({ rpc: rpc, chainId, key: this.xApiKey }); - transactionOptions.value = new BN(transactionOptions.value); + let rpcResponse = await axios.get(apiURL, configuration); + const rpc = rpcResponse.data.data.rpc; + const web3 = await initialiseWeb3({ rpc, chainId, key: this.xApiKey }); + transactionOptions.value = new BN(transactionOptions.value); - const options = {}; - options.privateKey = this.privateKey; + const options = { privateKey: this.privateKey }; const rawData = await rawTransaction[`signTransaction${chainName}`](web3, transactionObject, options); rawData.chainId = chainId; return rawData; }; - sendTransaction = async (options) => { + sendTransaction = async (options: SendTransactionOptions): Promise => { + const filterOptions = { ...options, function: 'sendTransaction()' }; + const validJson: ValidObject = await schemaValidator.validateInput(options); - const filterOptions = options; - filterOptions.function = "sendTransaction()"; - const validJson = await schemaValidator.validateInput(options); if (!validJson.valid) { - return (validJson); + return validJson; } try { - const apiURL = `${config.url.apiurl}/chain/sendtransaction/`; const params = { - method: "post", + method: 'post', url: apiURL, data: options, headers: { - "x-api-key": this.xApiKey - } + 'x-api-key': this.xApiKey, + }, }; const transactionHash = await axios(params); return transactionHash.data; - } - - catch (error) { + } catch (error: any) { return error; } - }; - } export { WalletCoinbase }; - diff --git a/src/adapters/WalletCoinbase/signTransaction/Ethereum.ts b/src/adapters/WalletCoinbase/signTransaction/Ethereum.ts index efb010a..6af63ce 100644 --- a/src/adapters/WalletCoinbase/signTransaction/Ethereum.ts +++ b/src/adapters/WalletCoinbase/signTransaction/Ethereum.ts @@ -1,26 +1,27 @@ -import Web3 from "web3"; +import Web3 from 'web3'; interface TransactionObject { to: string; - value: string | number; - gas: number | string; - gasPrice?: number | string; + value: string; + gas?: string; + gasPrice?: string; data?: string; - nonce?: number; + nonce?: number; // Update nonce to be a number instead of string } -interface Options { +interface SignTransactionOptions { privateKey: string; } export const signTransactionEvm = async ( web3: Web3, transactionObject: TransactionObject, - options: Options -): Promise => { + options: SignTransactionOptions +): Promise => { /* * Function will sign the transaction payload for Ethereum-based chains */ + try { const signedTransaction = await web3.eth.accounts.signTransaction( transactionObject, @@ -28,6 +29,6 @@ export const signTransactionEvm = async ( ); return signedTransaction; } catch (error) { - return error as Error; + return error; } }; diff --git a/src/adapters/WalletDFNS/index.ts b/src/adapters/WalletDFNS/index.ts index 17720f5..1ec2f2a 100644 --- a/src/adapters/WalletDFNS/index.ts +++ b/src/adapters/WalletDFNS/index.ts @@ -2,120 +2,164 @@ import { DfnsApiClient } from "@dfns/sdk"; import { AsymmetricKeySigner } from "@dfns/sdk-keysigner"; import { DfnsWallet } from "@dfns/lib-ethersjs6"; import { JsonRpcProvider, Network, Transaction } from "ethers"; -import axios from 'axios'; -import * as rawTransaction from './signTransaction/index'; -import config from '../../../configuration/config.json'; -import * as common from '../../../configuration/common'; -import * as schemaValidator from '../../../configuration/schemaValidator'; - +import axios from "axios"; +import * as rawTransaction from "./signTransaction/index"; +import config from "../../../configuration/config"; +import * as common from "../../../configuration/common"; +import * as schemaValidator from "../../../configuration/schemaValidator"; + +type WalletDFNSOptions = { + xApiKey: string; + privateKey: string; + credId: string; + appId: string; + authToken: string; + walletId: string; + baseUrl: string; + appOrigin: string; +}; + +type TransactionObject = { + chainId: number; + chainSymbol: string; + rawTransaction: any; + to: string; // Address of the recipient + value: string; // Amount to be transferred + gas: string; // Gas limit for the transaction + [key: string]: any; +}; + +type Options = { + wallet: DfnsWallet; + xApiKey: string; + rpcProvider: JsonRpcProvider; + privateKey?: string; + }; + +type ExtendedAsymmetricKeySignerOptions = { + credId: string; + privateKey: string; + appOrigin?: string; + }; class WalletDFNS { - - constructor(options) { - this.xApiKey = options.xApiKey; - this.privateKey = options.privateKey; - this.credId = options.credId; - this.appId = options.appId; - this.authToken = options.authToken; - this.walletId = options.walletId; - this.baseUrl = options.baseUrl - this.appOrigin = options.appOrigin - this.signer = new AsymmetricKeySigner({ - privateKey: options.privateKey, - credId: options.credId, - appOrigin: options.appOrigin - }); - this.dfnsClient = new DfnsApiClient({ - appId: options.appId, - authToken: options.authToken, - baseUrl: options.baseUrl, - signer: this.signer - }); - this.wallet = new DfnsWallet({ - walletId: this.walletId, - dfnsClient: this.dfnsClient, - maxRetries: 10, - }); - + private xApiKey: string; + private privateKey: string; + private credId: string; + private appId: string; + private authToken: string; + private walletId: string; + private baseUrl: string; + private appOrigin: string; + private signer: AsymmetricKeySigner; + private dfnsClient: DfnsApiClient; + private wallet: DfnsWallet; + + constructor(options: WalletDFNSOptions) { + this.xApiKey = options.xApiKey; + this.privateKey = options.privateKey; + this.credId = options.credId; + this.appId = options.appId; + this.authToken = options.authToken; + this.walletId = options.walletId; + this.baseUrl = options.baseUrl; + this.appOrigin = options.appOrigin; + + this.signer = new AsymmetricKeySigner({ + privateKey: options.privateKey, + credId: options.credId, + appOrigin: options.appOrigin, // Include this if needed + } as ExtendedAsymmetricKeySignerOptions); + + this.dfnsClient = new DfnsApiClient({ + appId: options.appId, + authToken: options.authToken, + baseUrl: options.baseUrl, + signer: this.signer, + }); + + this.wallet = new DfnsWallet({ + walletId: this.walletId, + dfnsClient: this.dfnsClient, + maxRetries: 10, + }); + } + + public signTransaction = async (transactionObject: TransactionObject): Promise => { + try { + const transactionOptions = { ...transactionObject, function: "transactionObject()" }; + const validObject = await schemaValidator.validateInput(transactionObject); + + if (!validObject.valid) { + return validObject; + } + + const chainId = await common.getChainId({ + chainId: transactionObject.chainId, + chainSymbol: transactionObject.chainSymbol, + }); + + const chainName = config.chains[chainId as keyof typeof config.chains].chainName; + axios.defaults.headers["X-API-KEY"] = this.xApiKey; + const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; + const configuration = { params: { chainId } }; + let rpc:any = await axios.get(apiURL, configuration); + rpc = rpc.data.data.rpc; + + const rpcProvider = new JsonRpcProvider(rpc, Number(transactionObject.chainId)); + + if (chainName !== "Evm") { + throw new Error("Chain not supported"); + } + + const options = { + wallet: this.wallet, + xApiKey: this.xApiKey, + rpcProvider, + }; + + const response = await rawTransaction[`signTransaction${chainName}`](transactionObject, options); + return response; + } catch (error) { + return error; } - - - signTransaction = async (transactionObject) => { - - try { - const transactionOptions = transactionObject; - transactionOptions.function = "transactionObject()"; - const validObject = await schemaValidator.validateInput(transactionObject); - - if (!validObject.valid) { - return (validObject); - } - - - const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); - let chainName = config.chains[chainId].chainName; - axios.defaults.headers['X-API-KEY'] = this.xApiKey; - const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; - const configuration = {}; - configuration.params = { - chainId - }; - let rpc = await axios.get(apiURL, configuration); - rpc = rpc.data.data.rpc; - - const rpcProvider = new JsonRpcProvider(rpc, Number(transactionObject.chainId)); - - - if (chainName !== "Evm") - return new Error("chain not Supported"); - - const options = {}; - options.wallet = this.wallet //.connect(rpcProvider); - options.xApiKey = this.xApiKey; - options.rpcProvider = rpcProvider; - const response = await rawTransaction[`signTransaction${chainName}`](transactionObject, options); - return response; - } catch (error) { - return error; - } - }; - - sendTransaction = async (transactionObject) => { - try { - - const filterOptions = transactionObject; - filterOptions.function = "DFNSTransaction()"; - const validJson = await schemaValidator.validateInput(filterOptions); - - if (!validJson.valid) { - return (validJson); - } - axios.defaults.headers['X-API-KEY'] = this.xApiKey; - const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); - let chainName = config.chains[chainId].chainName; - const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; - const configuration = {}; - configuration.params = { - chainId - }; - let rpc = await axios.get(apiURL, configuration); - rpc = rpc.data.data.rpc; - if (chainName !== "Evm") - return new Error("chain not Supported"); - - const rpcProvider = new JsonRpcProvider(rpc, Number(transactionObject.chainId)); - - let wallet = this.wallet.connect(rpcProvider); - - let transaction = Transaction.from(transactionObject.rawTransaction); - let TxHash = await wallet.sendTransaction(transaction); - return { "TxHash": TxHash.hash } - - } catch (error) { - return error; - } - + }; + + public sendTransaction = async (transactionObject: TransactionObject): Promise => { + try { + const filterOptions = { ...transactionObject, function: "DFNSTransaction()" }; + const validJson = await schemaValidator.validateInput(filterOptions); + + if (!validJson.valid) { + return validJson; + } + + axios.defaults.headers["X-API-KEY"] = this.xApiKey; + const chainId = await common.getChainId({ + chainId: transactionObject.chainId, + chainSymbol: transactionObject.chainSymbol, + }); + + const chainName = config.chains[chainId as keyof typeof config.chains].chainName; + const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; + const configuration = { params: { chainId } }; + let rpc:any = await axios.get(apiURL, configuration); + rpc = rpc.data.data.rpc; + + if (chainName !== "Evm") { + throw new Error("Chain not supported"); + } + + const rpcProvider = new JsonRpcProvider(rpc, Number(transactionObject.chainId)); + const wallet = this.wallet.connect(rpcProvider); + const transaction = Transaction.from(transactionObject.rawTransaction); + + const txHash = await wallet.sendTransaction(transaction); + return { TxHash: txHash.hash }; + } catch (error) { + return error; } + }; } -export { WalletDFNS }; \ No newline at end of file +export { WalletDFNS }; From d9ad8d476a16d703fecb2d096bf0ff42a4093212 Mon Sep 17 00:00:00 2001 From: Tek Raj Joshi Date: Fri, 13 Dec 2024 10:49:33 +0530 Subject: [PATCH 13/32] Ethereum signtransaction issues fixed --- src/adapters/Wallet/index.ts | 8 ++++---- src/adapters/Wallet/signTransaction/Ethereum.ts | 6 +++--- src/adapters/Wallet/signTransaction/Solana.ts | 4 ++-- src/adapters/Wallet/signTransaction/index.ts | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/adapters/Wallet/index.ts b/src/adapters/Wallet/index.ts index 9455a37..cde5809 100644 --- a/src/adapters/Wallet/index.ts +++ b/src/adapters/Wallet/index.ts @@ -13,8 +13,8 @@ interface WalletOptions { } interface TransactionObject { - chainId: number; - chainSymbol: string; + chainId: string; + chainSymbol?: string; value: string | BN; to?: string; gas?: string; @@ -22,7 +22,7 @@ interface TransactionObject { } interface SignOrderOptions { - dexId: number; + dexId: string; domain: any; types: any; values?: any; @@ -44,7 +44,7 @@ class Wallet { signTransaction = async (transactionObject: TransactionObject) => { const configuration: AxiosRequestConfig = { params: {} }; const transactionOptions = { ...transactionObject, function: "transactionObject()" }; - const validObject = await schemaValidator.validateInput(transactionObject); + const validObject = await schemaValidator.validateInput(transactionOptions); if (!validObject.valid) { return validObject; diff --git a/src/adapters/Wallet/signTransaction/Ethereum.ts b/src/adapters/Wallet/signTransaction/Ethereum.ts index 21388ec..a79fb7b 100644 --- a/src/adapters/Wallet/signTransaction/Ethereum.ts +++ b/src/adapters/Wallet/signTransaction/Ethereum.ts @@ -16,14 +16,14 @@ interface Options { web3: Web3, transactionObject: TransactionObject, options: Options -): Promise => { +): Promise => { /* * Function will sign the transaction payload for Ethereum-based chains */ try { const signedTransaction = await web3.eth.accounts.signTransaction(transactionObject, options.privateKey); - return signedTransaction.rawTransaction as string; // Assuming you need the raw transaction + return signedTransaction; } catch (error) { console.error('Error signing transaction:', error); throw new Error('Transaction signing failed'); @@ -31,4 +31,4 @@ interface Options { }; -export default { signTransactionEvm }; f \ No newline at end of file +export default { signTransactionEvm }; \ No newline at end of file diff --git a/src/adapters/Wallet/signTransaction/Solana.ts b/src/adapters/Wallet/signTransaction/Solana.ts index 0613c5f..e7b70ec 100644 --- a/src/adapters/Wallet/signTransaction/Solana.ts +++ b/src/adapters/Wallet/signTransaction/Solana.ts @@ -8,8 +8,8 @@ import { PublicKey, Connection, } from '@solana/web3.js'; -import { sign } from 'tweetnacl'; -import { decode } from 'bs58'; +import * as sign from 'tweetnacl'; +import * as decode from 'bs58'; import BN from 'bn.js'; interface TransactionObject { diff --git a/src/adapters/Wallet/signTransaction/index.ts b/src/adapters/Wallet/signTransaction/index.ts index 0171685..30b17ca 100644 --- a/src/adapters/Wallet/signTransaction/index.ts +++ b/src/adapters/Wallet/signTransaction/index.ts @@ -15,7 +15,7 @@ const signTransactionAlgorand:any = async (web3: any, transactionObject: any, op }; const signTransactionEvm:any = async (web3: any, transactionObject: any, options: any) => { - const rawData = await Ethereum.signTransactionEvm(web3, transactionObject, options.privateKey); + const rawData = await Ethereum.signTransactionEvm(web3, transactionObject, options); return rawData; }; From 502de48fd0ae40e90e034fc4994f88f0c7fa63d3 Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Fri, 13 Dec 2024 10:50:32 +0530 Subject: [PATCH 14/32] issue fixed --- .../Wallet/signTransaction/Ethereum.ts | 2 +- src/adapters/Wallet/signTransaction/Solana.ts | 12 +- .../WalletDFNS/signTransaction/Ethereum.ts | 4 +- .../WalletDFNS/signTransaction/index.ts | 18 +- src/adapters/WalletFordefi/index.ts | 96 ++++++---- .../WalletFordefi/signTransaction/Ethereum.ts | 167 ++++++++++-------- .../WalletFordefi/signTransaction/Solana.ts | 4 +- .../WalletFordefi/signTransaction/index.ts | 38 ++-- test/cosmosTest.ts | 20 +++ 9 files changed, 198 insertions(+), 163 deletions(-) create mode 100644 test/cosmosTest.ts diff --git a/src/adapters/Wallet/signTransaction/Ethereum.ts b/src/adapters/Wallet/signTransaction/Ethereum.ts index 21388ec..646af06 100644 --- a/src/adapters/Wallet/signTransaction/Ethereum.ts +++ b/src/adapters/Wallet/signTransaction/Ethereum.ts @@ -31,4 +31,4 @@ interface Options { }; -export default { signTransactionEvm }; f \ No newline at end of file +export default { signTransactionEvm }; \ No newline at end of file diff --git a/src/adapters/Wallet/signTransaction/Solana.ts b/src/adapters/Wallet/signTransaction/Solana.ts index 0613c5f..1395375 100644 --- a/src/adapters/Wallet/signTransaction/Solana.ts +++ b/src/adapters/Wallet/signTransaction/Solana.ts @@ -8,15 +8,15 @@ import { PublicKey, Connection, } from '@solana/web3.js'; -import { sign } from 'tweetnacl'; -import { decode } from 'bs58'; +import * as sign from 'tweetnacl'; +import bs58 from 'bs58'; import BN from 'bn.js'; interface TransactionObject { data?: string; from?: string; - to: string; - value?: number | BN; + to?: string; + value?: string | BN; additionalSigners?: string; } @@ -87,7 +87,7 @@ export const SolanaUtils:any = { ): Promise<{ rawTransaction: string } | Error | { msg: string }> { try { - const from = Keypair.fromSecretKey(decode(options.privateKey)); + const from:any = Keypair.fromSecretKey(bs58.decode(options.privateKey)); const wallet = new Wallet(from); const recentBlockhash = await web3.getRecentBlockhash(); let preparedTx: VersionedTransaction; @@ -117,7 +117,7 @@ export const SolanaUtils:any = { preparedTx.sign([wallet.payer]); if (transactionObject.additionalSigners) { - const additionalKey = Keypair.fromSecretKey(decode(transactionObject.additionalSigners)); + const additionalKey = Keypair.fromSecretKey(bs58.decode(transactionObject.additionalSigners)); preparedTx.sign([additionalKey]); } diff --git a/src/adapters/WalletDFNS/signTransaction/Ethereum.ts b/src/adapters/WalletDFNS/signTransaction/Ethereum.ts index f225276..2ef89ed 100644 --- a/src/adapters/WalletDFNS/signTransaction/Ethereum.ts +++ b/src/adapters/WalletDFNS/signTransaction/Ethereum.ts @@ -17,7 +17,7 @@ interface SignedTransactionResponse { rawTransaction: string; } -export const signTransactionEvm = async ( + const signTransactionEvm = async ( transactionObject: TransactionObject, options: Options ): Promise => { @@ -50,3 +50,5 @@ export const signTransactionEvm = async ( return error as Error; } }; + +export default { signTransactionEvm }; \ No newline at end of file diff --git a/src/adapters/WalletDFNS/signTransaction/index.ts b/src/adapters/WalletDFNS/signTransaction/index.ts index 40cc3a1..8a6d998 100644 --- a/src/adapters/WalletDFNS/signTransaction/index.ts +++ b/src/adapters/WalletDFNS/signTransaction/index.ts @@ -1,21 +1,9 @@ -import * as Ethereum from './Ethereum'; +import Ethereum from './Ethereum'; -interface TransactionObject { - to: string; - value: string | number; - gas: number | string; - gasPrice?: number | string; - data?: string; - nonce?: number; -} - -interface Options { - privateKey: string; -} export const signTransactionEvm = async ( - transactionObject: TransactionObject, - options: Options + transactionObject: any, + options: any ): Promise => { const rawData = await Ethereum.signTransactionEvm(transactionObject, options); return rawData; diff --git a/src/adapters/WalletFordefi/index.ts b/src/adapters/WalletFordefi/index.ts index f79e213..f455e67 100644 --- a/src/adapters/WalletFordefi/index.ts +++ b/src/adapters/WalletFordefi/index.ts @@ -1,80 +1,100 @@ -import axios from 'axios'; +import axios, { AxiosRequestConfig } from 'axios'; import * as rawTransaction from './signTransaction/index'; -import config from '../../../configuration/config.json'; +import config from '../../../configuration/config'; import { getChainId } from '../../../configuration/common'; import * as schemaValidator from '../../../configuration/schemaValidator'; +interface WalletOptions { + accessToken: string; + xApiKey: string; + privateKeyFile: string; + vault_id: string; +} + +interface TransactionObject { + chainId: number; + chainSymbol: string; + [key: string]: any; +} + +interface SendTransactionResponse { + accessToken: string; + timestamp: string; + signature: string; + data: any; +} + class WalletFordefi { - constructor(options) { + private accessToken: string; + private xApiKey: string; + private privateKeyFile: string; + private vault_id: string; + + constructor(options: WalletOptions) { this.accessToken = options.accessToken; this.xApiKey = options.xApiKey; this.privateKeyFile = options.privateKeyFile; this.vault_id = options.vault_id; - }; - - signTransaction = async (transactionObject) => { + } + signTransaction = async (transactionObject: TransactionObject): Promise => { try { - const transactionOptions = transactionObject; - transactionOptions.function = "transactionObject()"; + const transactionOptions = { ...transactionObject, function: "transactionObject()" }; const validObject = await schemaValidator.validateInput(transactionObject); if (!validObject.valid) { - return (validObject); + return validObject; } const chainId = await getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); - let chainName = config.chains[chainId].chainName; - if (chainName !== "Evm" && chainName !== "Solana") - return new Error("chain not Supported"); - const options = {}; - options.vault_id = this.vault_id; - options.privateKeyFile = this.privateKeyFile; - options.accessToken = this.accessToken; - options.xApiKey = this.xApiKey; + const chainName = config.chains[chainId as keyof typeof config.chains].chainName; + + if (chainName !== "Evm" && chainName !== "Solana") { + throw new Error("Chain not supported"); + } + + const options = { + vault_id: this.vault_id, + privateKeyFile: this.privateKeyFile, + accessToken: this.accessToken, + xApiKey: this.xApiKey, + }; + const response = await rawTransaction[`signTransaction${chainName}`](transactionObject, options); return response; - } catch (error) { + } catch (error: any) { return error; } }; - sendTransaction = async (response) => { + sendTransaction = async (response: SendTransactionResponse): Promise => { try { - const filterOptions = response; - filterOptions.function = "FordefiTransaction()"; + const filterOptions = { ...response, function: "FordefiTransaction()" }; const validJson = await schemaValidator.validateInput(filterOptions); if (!validJson.valid) { - return (validJson); + return validJson; } const path = "/api/v1/transactions"; - const config = { + const axiosConfig: AxiosRequestConfig = { method: "POST", url: `https://api.fordefi.com${path}`, headers: { 'Content-Type': 'application/json', - "Authorization": response.accessToken, + Authorization: response.accessToken, 'X-Timestamp': response.timestamp, 'X-Signature': response.signature, }, - data: response.data + data: response.data, }; - const resp = await axios.request(config); + + const resp = await axios.request(axiosConfig); return resp.data; - // .then((response) => { - // return (JSON.stringify(response.data)); - // }) - // .catch((error) => { - // return (error.response.data.detail); - // }); - - } catch (error) { - return error.response.data; + } catch (error: any) { + return error.response?.data || error; } - - } + }; } -export { WalletFordefi }; \ No newline at end of file +export { WalletFordefi }; diff --git a/src/adapters/WalletFordefi/signTransaction/Ethereum.ts b/src/adapters/WalletFordefi/signTransaction/Ethereum.ts index 29d80f4..3c1bbd2 100644 --- a/src/adapters/WalletFordefi/signTransaction/Ethereum.ts +++ b/src/adapters/WalletFordefi/signTransaction/Ethereum.ts @@ -1,90 +1,103 @@ -import crypto from 'crypto'; -import fs from 'fs'; +import crypto from "crypto"; +import fs from "fs"; interface TransactionObject { - chainId?: number | string; - gas: number; - to: string; - value: string | number; - data?: string; -} - -interface Gas { - type: string; - priority_level: string; - gas_limit: number; + chainId?: number | string; + gas: number; + to: string; + value: string; + data?: string; } interface Options { - vault_id: string; - privateKeyFile: string; - accessToken: string; + vault_id: string; + privateKeyFile: string; + accessToken: string; } -interface Response { - data: string; - timestamp: number; - signature: string; - accessToken: string; +interface Gas { + type: string; + priority_level: string; + gas_limit: number; } -export const signTransactionEvm = async ( - transactionObject: TransactionObject, - options: Options -): Promise => { - /* - * Function will sign the transaction payload for ethereum-based chains - */ - - try { - let reqBody: any = {}; - reqBody.type = 'evm_transaction'; - reqBody.vault_id = options.vault_id; - - const path = '/api/v1/transactions'; - - const details = { ...transactionObject }; - details.chain = parseInt(transactionObject.chainId as string) || 1; - - const gas: Gas = { - type: 'priority', - priority_level: 'medium', - gas_limit: transactionObject.gas, +interface TransactionDetails { + chain: number; + gas: Gas; + to: string; + value: string; + type: string; + data?: { + type: string; + hex_data: string; }; - details.gas = gas; - details.to = transactionObject.to; - details.value = transactionObject.value; - details.type = 'evm_raw_transaction'; - - if (transactionObject.data) { - details.data = { - type: 'hex', - hex_data: transactionObject.data, - }; - } - - reqBody.details = details; - reqBody.signer_type = 'api_signer'; - reqBody = JSON.stringify(reqBody); - - const timestamp = Date.now(); - const payload = `${path}|${timestamp}|${reqBody}`; - - const secretPem = fs.readFileSync(options.privateKeyFile, 'utf8'); - const privateKey = crypto.createPrivateKey(secretPem); - - const sign = crypto.createSign('SHA256').update(payload, 'utf8').end(); - const signature = sign.sign(privateKey, 'base64'); +} - const response: Response = { - data: reqBody, - timestamp, - signature, - accessToken: `Bearer ${options.accessToken}`, - }; +interface SignTransactionResponse { + data: string; + timestamp: number; + signature: string; + accessToken: string; +} - return response; - } catch (error) { - return error as Error; - } + const signTransactionEvm = async ( + transactionObject: TransactionObject, + options: Options +): Promise => { + /* + * Function will sign the transaction payload for ethereum-based chains + */ + + try { + let reqBody: any = {}; + reqBody.type = "evm_transaction"; + reqBody.vault_id = options.vault_id; + + const path = "/api/v1/transactions"; + + const details: TransactionDetails = { + chain: parseInt(transactionObject.chainId as string, 10) || 1, + gas: { + type: "priority", + priority_level: "medium", + gas_limit: transactionObject.gas, + }, + to: transactionObject.to, + value: transactionObject.value, + type: "evm_raw_transaction", + }; + + if (transactionObject.data) { + details.data = { + type: "hex", + hex_data: transactionObject.data, + }; + } + + reqBody.details = details; + reqBody.signer_type = "api_signer"; + reqBody = JSON.stringify(reqBody); + + const timestamp = new Date().getTime(); + const payload = `${path}|${timestamp}|${reqBody}`; + + const secretPem = fs.readFileSync(options.privateKeyFile, "utf8"); + const privateKey = crypto.createPrivateKey(secretPem); + + const sign = crypto.createSign("SHA256").update(payload, "utf8").end(); + const signature = sign.sign(privateKey, "base64"); + + const response: SignTransactionResponse = { + data: reqBody, + timestamp, + signature, + accessToken: `Bearer ${options.accessToken}`, + }; + + return response; + } catch (error) { + return error as Error; + } }; + +export default { signTransactionEvm }; \ No newline at end of file diff --git a/src/adapters/WalletFordefi/signTransaction/Solana.ts b/src/adapters/WalletFordefi/signTransaction/Solana.ts index 22d2178..b523584 100644 --- a/src/adapters/WalletFordefi/signTransaction/Solana.ts +++ b/src/adapters/WalletFordefi/signTransaction/Solana.ts @@ -28,7 +28,7 @@ interface Response { accessToken: string; } -export const signTransactionSolana = async ( +const signTransactionSolana = async ( transactionObject: TransactionObject, options: Options ): Promise => { @@ -91,3 +91,5 @@ export const signTransactionSolana = async ( return error as Error; } }; + +export default { signTransactionSolana } ; \ No newline at end of file diff --git a/src/adapters/WalletFordefi/signTransaction/index.ts b/src/adapters/WalletFordefi/signTransaction/index.ts index 1d66991..a8af1f5 100644 --- a/src/adapters/WalletFordefi/signTransaction/index.ts +++ b/src/adapters/WalletFordefi/signTransaction/index.ts @@ -1,31 +1,21 @@ -import * as Ethereum from './Ethereum'; -import * as Solana from './Solana'; +import Ethereum from './Ethereum'; +import Solana from './Solana'; -interface TransactionObject { - to?: string; - value?: string | number; - gas?: number | string; - chainId?: number; - data?: string; - [key: string]: any; // Additional properties for flexibility -} -interface Options { - [key: string]: any; // Adjust based on your specific `options` structure -} - -export const signTransactionEvm = async ( - transactionObject: TransactionObject, - options: Options + const signTransactionEvm = async ( + transactionObject: any, + options: any ): Promise => { - const rawData = await Ethereum.signTransactionEvm(transactionObject, options); - return rawData; + const rawData = await Ethereum.signTransactionEvm(transactionObject, options); + return rawData; }; -export const signTransactionSolana = async ( - transactionObject: TransactionObject, - options: Options + const signTransactionSolana = async ( + transactionObject: any, + options: any ): Promise => { - const rawData = await Solana.signTransactionSolana(transactionObject, options); - return rawData; + const rawData = await Solana.signTransactionSolana(transactionObject, options); + return rawData; }; + +export { signTransactionEvm, signTransactionSolana }; \ No newline at end of file diff --git a/test/cosmosTest.ts b/test/cosmosTest.ts new file mode 100644 index 0000000..fa6cffb --- /dev/null +++ b/test/cosmosTest.ts @@ -0,0 +1,20 @@ +import { WalletCosmos } from '../src'; + +const xApiKey = 'X_API_KEY'; + +async function main() { + const preparedTx: any = { + "chainId": "theta-testnet-001", + "from": "cosmos1h7sp085zemehp5gunplymxhflrp8ls4qm3mxrq", + "to": "cosmos1h6r7sgwxfxps4payfyc8rl56svzmx6t5kpumg3", + "value": "1000", + } + + const wallet = new WalletCosmos({ privateKey:'your Mnemonic in English', xApiKey:xApiKey}); + const signedTx = await wallet.signTransaction(preparedTx); + console.log(signedTx); + // const TxHash = await wallet.sendTransaction(signedTx); + // console.log(TxHash); +} + +main(); \ No newline at end of file From a57cc7048113ac621059819e4abf33fc66fb0a88 Mon Sep 17 00:00:00 2001 From: Tek Raj Joshi Date: Fri, 13 Dec 2024 11:26:00 +0530 Subject: [PATCH 15/32] phamton wallet issues fixed --- configuration/schema.js | 2 +- configuration/schema.ts | 2 +- src/adapters/WalletCosmos/index.ts | 2 +- src/adapters/WalletPhantom/signTransaction/Solana.ts | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/configuration/schema.js b/configuration/schema.js index 4e61c7e..261b8ba 100644 --- a/configuration/schema.js +++ b/configuration/schema.js @@ -69,7 +69,7 @@ exports.jsonSchema = { networkId: { type: "string" } }, - required: ["from", "to"] + required: ["from"] } }, diff --git a/configuration/schema.ts b/configuration/schema.ts index 081983e..fe0453f 100644 --- a/configuration/schema.ts +++ b/configuration/schema.ts @@ -69,7 +69,7 @@ export const jsonSchema = { networkId: { type: "string" } }, - required: ["from", "to"] + required: ["from"] } }, diff --git a/src/adapters/WalletCosmos/index.ts b/src/adapters/WalletCosmos/index.ts index bfbfcf0..cc839f1 100644 --- a/src/adapters/WalletCosmos/index.ts +++ b/src/adapters/WalletCosmos/index.ts @@ -13,7 +13,7 @@ interface WalletCosmosOptions { interface TransactionObject { chainId: string; - chainSymbol: string; + chainSymbol?: string; to: string; value: string; function?: string; diff --git a/src/adapters/WalletPhantom/signTransaction/Solana.ts b/src/adapters/WalletPhantom/signTransaction/Solana.ts index 0f045d9..4b911d1 100644 --- a/src/adapters/WalletPhantom/signTransaction/Solana.ts +++ b/src/adapters/WalletPhantom/signTransaction/Solana.ts @@ -10,7 +10,7 @@ import { BlockhashWithExpiryBlockHeight } from '@solana/web3.js'; import * as sign from 'tweetnacl'; -import * as decode from 'bs58'; +import bs58 from 'bs58'; import BN from 'bn.js'; interface TransactionObject { @@ -32,7 +32,7 @@ export const signTransactionSolana = async ( options: Options ): Promise<{ rawTransaction: string } | { msg: string } | Error> => { try { - const from = Keypair.fromSecretKey(decode(options.privateKey)); + const from = Keypair.fromSecretKey(bs58.decode(options.privateKey)); const blockHeight: BlockhashWithExpiryBlockHeight = await web3.getLatestBlockhash(); let preparedTx: Transaction; let transactionBuffer: Buffer; @@ -65,7 +65,7 @@ export const signTransactionSolana = async ( preparedTx.addSignature(from.publicKey, signature); if (transactionObject.additionalSigners) { - const additionalKey = Keypair.fromSecretKey(decode(transactionObject.additionalSigners)); + const additionalKey = Keypair.fromSecretKey(bs58.decode(transactionObject.additionalSigners)); const additionalSignature = sign.detached(transactionBuffer, additionalKey.secretKey); preparedTx.addSignature(additionalKey.publicKey, additionalSignature); } @@ -84,7 +84,7 @@ export const signVersionedTransactionSolana = async ( options: Options ): Promise<{ rawTransaction: string } | { msg: string } | Error> => { try { - const from = Keypair.fromSecretKey(decode(options.privateKey)); + const from = Keypair.fromSecretKey(bs58.decode(options.privateKey)); const wallet = new Wallet(from); const recentBlockhash: BlockhashWithExpiryBlockHeight = await web3.getLatestBlockhash(); let preparedTx: VersionedTransaction; @@ -114,7 +114,7 @@ export const signVersionedTransactionSolana = async ( preparedTx.sign([wallet.payer]); if (transactionObject.additionalSigners) { - preparedTx.sign([Keypair.fromSecretKey(decode(transactionObject.additionalSigners))]); + preparedTx.sign([Keypair.fromSecretKey(bs58.decode(transactionObject.additionalSigners))]); } const serializedTx = preparedTx.serialize(); From 7ec287ac61341fc9a5123770b021ab5315a855b4 Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Fri, 13 Dec 2024 11:54:22 +0530 Subject: [PATCH 16/32] bitcoin, stacks file changed to ts --- configuration/config.ts | 27 +++++ package-lock.json | 73 ++---------- src/adapters/WalletBitcoin/index.ts | 151 ++++++++++++++++++++++++ src/adapters/WalletStacks/index.ts | 174 ++++++++++++++++++++++++++++ 4 files changed, 362 insertions(+), 63 deletions(-) create mode 100644 src/adapters/WalletBitcoin/index.ts create mode 100644 src/adapters/WalletStacks/index.ts diff --git a/configuration/config.ts b/configuration/config.ts index 2f1794c..f37841a 100644 --- a/configuration/config.ts +++ b/configuration/config.ts @@ -13,6 +13,7 @@ type ChainConfig = { networkPassphrase?: string; gasPrice?: string; network?: string; + fee?: number; }; type FireblocksConfig = { @@ -331,6 +332,32 @@ const config: Config = { "chainName": "XRPL", "chainSymbol": "TXRPL", "network": "testnet" + }, + "1700": { + "localName": "Stacks", + "chainName": "Stacks", + "chainSymbol": "STX", + "network": "mainnet" + }, + "1701": { + "localName": "StacksTestnet", + "chainName": "Stacks", + "chainSymbol": "TSTX", + "network": "testnet" + }, + "1800": { + "localName": "Bitcoin", + "chainName": "Bitcoin", + "chainSymbol": "BTC", + "network": "mainnet", + "fee": 2000 + }, + "1801": { + "localName": "BitcoinTestnet", + "chainName": "Bitcoin", + "chainSymbol": "TBTC", + "network": "testnet", + "fee": 2000 } }, "fireblocks": { diff --git a/package-lock.json b/package-lock.json index bcd5a10..2091e89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1001,8 +1001,6 @@ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, - "optional": true, - "peer": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -1015,8 +1013,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, - "optional": true, - "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -4122,38 +4118,6 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -4491,8 +4455,6 @@ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, - "optional": true, - "peer": true, "dependencies": { "acorn": "^8.11.0" }, @@ -4650,9 +4612,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/argparse": { "version": "2.0.1", @@ -6145,9 +6105,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/cross-fetch": { "version": "3.1.6", @@ -6412,8 +6370,6 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, - "optional": true, - "peer": true, "engines": { "node": ">=0.3.1" } @@ -10356,9 +10312,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/makeerror": { "version": "1.0.12", @@ -12647,13 +12601,13 @@ } }, "node_modules/stellar-sdk": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/stellar-sdk/-/stellar-sdk-12.3.0.tgz", - "integrity": "sha512-3z7umyuBAHN+vm3zLTKqj7P/bErBFnjrwoanBsNyBHaoek9krUgufNupQSMK67B1p0E2NKD1Z6gYPuZiPfJ2qQ==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/stellar-sdk/-/stellar-sdk-11.3.0.tgz", + "integrity": "sha512-xOp2zpQm5TIbgJi7wJhAmJh+Uy0ew5GbGtj1kZv6HEWHgSvW95xYMxGaw6MWM9r2YPUSQySboE6JwDc9jdx53A==", "deprecated": "⚠️ This package has moved to @stellar/stellar-sdk! 🚚", "dependencies": { - "@stellar/stellar-base": "^12.1.1", - "axios": "^1.7.7", + "@stellar/stellar-base": "^11.0.1", + "axios": "^1.6.8", "bignumber.js": "^9.1.2", "eventsource": "^2.0.2", "randombytes": "^2.1.0", @@ -13197,8 +13151,6 @@ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, - "optional": true, - "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -13442,8 +13394,7 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", - "optional": true, - "peer": true, + "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -13633,9 +13584,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/v8-to-istanbul": { "version": "9.2.0", @@ -14517,8 +14466,6 @@ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, - "optional": true, - "peer": true, "engines": { "node": ">=6" } diff --git a/src/adapters/WalletBitcoin/index.ts b/src/adapters/WalletBitcoin/index.ts new file mode 100644 index 0000000..23b214f --- /dev/null +++ b/src/adapters/WalletBitcoin/index.ts @@ -0,0 +1,151 @@ +import axios from "axios"; +import * as bitcoin from "bitcoinjs-lib"; +import { ECPairFactory, ECPairInterface } from "ecpair"; +import * as bip39 from "bip39"; +import * as tinysecp from "tiny-secp256k1"; +import * as schemaValidator from "../../../configuration/schemaValidator"; +import * as common from "../../../configuration/common"; +import config from "../../../configuration/config"; + +interface WalletBitcoinOptions { + privateKey: string; + xApiKey: string; +} + +interface TransactionOptions { + chainSymbol: string; + to: string; + value: number; + utxo: { txId: string; vout: number; value: number }; + chainId?: string; + [key: string]: any; +} + +interface GetKeysOptions { + chainSymbol: string; + mnemonic: string; + chainId?: string; + [key: string]: any; +} + +export class WalletBitcoin { + private privateKey: string; + private xApiKey: string; + + constructor(options: WalletBitcoinOptions) { + this.privateKey = options.privateKey; + this.xApiKey = options.xApiKey; + } + + signTransaction = async (options: TransactionOptions): Promise => { + options.function = "BTCSignTransaction()"; + const validJson = await schemaValidator.validateInput(options); + + if (!validJson.valid) { + return validJson; + } + + const { chainSymbol, to, value, utxo } = options; + let { chainId } = options; + + chainId = await common.getChainId({ chainId, chainSymbol }) ?? "unknown"; + const chainName = config.chains[chainId as keyof typeof config.chains].chainName; + + if (chainName !== "Bitcoin") { + return { + msg: "Bitcoin wallet can be used only with Bitcoin Wallet", + }; + } + + const ECPair = ECPairFactory(tinysecp); + const network = chainId === "1800" ? bitcoin.networks.mainnet : bitcoin.networks.testnet; + + const privateKeyBuffer = Buffer.from(this.privateKey, "hex"); + const keyPair: ECPairInterface = ECPair.fromPrivateKey(privateKeyBuffer, { network }); + const from = bitcoin.payments.p2pkh({ pubkey: keyPair.publicKey, network }).address; + + const txb = new bitcoin.TransactionBuilder(network); + + txb.addInput(utxo.txId, utxo.vout); + txb.addOutput(to, Number(value)); + + const fee = config.chains[chainId].fee ?? 0; + const actualAmount = utxo.value - Number(value) - fee; + + if (actualAmount > 0) { + txb.addOutput(from!, actualAmount); + } + + txb.sign(0, keyPair); + const rawTx = txb.build().toHex(); + return { chainId, rawTransaction: rawTx }; + }; + + sendTransaction = async (options: any): Promise => { + const filterOptions = { ...options, function: "sendTransaction()" }; + const validJson = await schemaValidator.validateInput(filterOptions); + + if (!validJson.valid) { + return validJson; + } + + try { + const apiURL = `${config.url.apiurl}/chain/sendtransaction/`; + const params = { + method: "post", + url: apiURL, + data: options, + headers: { + "x-api-key": this.xApiKey, + }, + }; + + const transactionHash = await axios(params); + return transactionHash.data; + } catch (error) { + return error; + } + }; +} + +export const getKeysFromMnemonic = async ( + options: GetKeysOptions, + path: string = "m/44'/0'/0'/0/0" +): Promise => { + options.function = "BTCGetKeys()"; + const validJson = await schemaValidator.validateInput(options); + + if (!validJson.valid) { + return validJson; + } + + let { chainId } = options; + const { chainSymbol, mnemonic } = options; + + chainId = await common.getChainId({ chainId, chainSymbol }) ?? "unknown"; + const chainName = config.chains[chainId as keyof typeof config.chains].chainName; + + if (chainName !== "Bitcoin") { + return { + msg: "Bitcoin wallet can be used only with Bitcoin Wallet", + }; + } + + const seed = await bip39.mnemonicToSeed(mnemonic); + const network = chainId === "1800" ? bitcoin.networks.mainnet : bitcoin.networks.testnet; + + const root = bitcoin.bip32.fromSeed(seed, network); + const child = root.derivePath(path); + + const privateKeyWIF = child.toWIF(); + const privateKeyBuffer = bitcoin.ECPair.fromWIF(privateKeyWIF, network).privateKey!; + const privateKeyHex = privateKeyBuffer.toString("hex"); + const publickKey = child.publicKey.toString("hex"); + + const { address } = bitcoin.payments.p2pkh({ + pubkey: child.publicKey, + network, + }); + + return { privateKeyWIF, privateKeyHex, publickKey, address }; +}; diff --git a/src/adapters/WalletStacks/index.ts b/src/adapters/WalletStacks/index.ts new file mode 100644 index 0000000..a87cd1b --- /dev/null +++ b/src/adapters/WalletStacks/index.ts @@ -0,0 +1,174 @@ +import axios from "axios"; +import { bytesToHex } from "@stacks/common"; +import { + TransactionSigner, + createStacksPrivateKey, + getPublicKey, + publicKeyToString, + makeUnsignedSTXTokenTransfer, + AnchorMode, + makeUnsignedContractCall, + makeContractCall, + StacksTransaction, + TransactionVersion, +} from "@stacks/transactions"; +import * as schemaValidator from '../../../configuration/schemaValidator'; +import * as common from '../../../configuration/common'; +import config from '../../../configuration/config'; +import { StacksMainnet, StacksTestnet, StacksNetwork } from "@stacks/network"; +import { getStxAddress, generateWallet } from "@stacks/wallet-sdk"; + +interface WalletOptions { + privateKey: string; + xApiKey: string; +} + +interface TransactionOptions { + chainSymbol: string; + to: string; + value: string; + message?: string; + data?: string; + chainId?: string; +} + + +interface SendTransactionOptions { + [key: string]: any; +} + +class WalletStacks { + private privateKey: string; + private xApiKey: string; + + constructor(options: WalletOptions) { + this.privateKey = options.privateKey; + this.xApiKey = options.xApiKey; + } + + signTransaction = async (options: any): Promise => { + options.function = "stacksSignTransaction()"; + const validJson = await schemaValidator.validateInput(options); + + if (!validJson.valid) { + return validJson; + } + + const { chainSymbol, to, value, message, data } = options; + let { chainId } = options; + + chainId = await common.getChainId({ chainId, chainSymbol }) ?? "unknown"; + const chainName = config.chains[chainId as keyof typeof config.chains].chainName; + + if (chainName !== "Stacks") { + return { + msg: "Stacks wallet can be used only with Stacks chain" + }; + } + + const network: StacksNetwork = chainId === "1700" ? new StacksMainnet() : new StacksTestnet(); + let transaction: StacksTransaction; + let fee: string; + + try { + const apiURL = `${config.url.apiurl}/chain/getgasprice/`; + const params = { + method: "post", + url: apiURL, + data: options, + headers: { + "x-api-key": this.xApiKey + } + }; + const res = await axios(params); + fee = res.data.gasPrice; + } catch (error) { + fee = '1000'; + } + + if (data) { + // Contract Call from Stacks SDK + const parsedData = JSON.parse(atob(data)); + transaction = await makeContractCall({ + ...parsedData, + fee, + network, + senderKey: this.privateKey, + anchorMode: AnchorMode.Any, + }); + } else { + // Transfer token function from Stacks SDK + const privateKeyBuffer = createStacksPrivateKey(this.privateKey); + const publicKeyBuffer = getPublicKey(privateKeyBuffer); + const publicKey = publicKeyToString(publicKeyBuffer); + transaction = await makeUnsignedSTXTokenTransfer({ + network, + recipient: to, + amount: value, + fee, + memo: message || "through expand", + publicKey: publicKey, + anchorMode: AnchorMode.Any, + }); + } + + const signer = new TransactionSigner(transaction); + signer.signOrigin(createStacksPrivateKey(this.privateKey)); + + // Serialize the signed transaction + const serializedTx = transaction.serialize(); + const rawTransaction = bytesToHex(serializedTx); + + return { chainId, rawTransaction }; + }; + + sendTransaction = async (options: SendTransactionOptions): Promise => { + const filterOptions = { ...options }; + filterOptions.function = "sendTransaction()"; + const validJson = await schemaValidator.validateInput(filterOptions); + + if (!validJson.valid) { + return validJson; + } + + try { + const apiURL = `${config.url.apiurl}/chain/sendtransaction/`; + const params = { + method: "post", + url: apiURL, + data: options, + headers: { + "x-api-key": this.xApiKey + } + }; + + const transactionHash = await axios(params); + return transactionHash.data; + } catch (error) { + return error; + } + }; +} + +const getStacksPrivateKey = async (mnemonic: string, password: string) => { + const wallet = await generateWallet({ + secretKey: mnemonic, + password + }); + + const wallets = wallet.accounts.map(account => ({ + mainnetAddress: getStxAddress({ + account, + transactionVersion: TransactionVersion.Mainnet + }), + testnetAddress: getStxAddress({ + account, + transactionVersion: TransactionVersion.Testnet + }), + privateKey: account.stxPrivateKey, + })); + + return wallets; +}; + +export { WalletStacks, getStacksPrivateKey }; \ No newline at end of file From 15f1092e1df4045c923f5e31ef6ca68fe4100f1e Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Fri, 13 Dec 2024 12:11:43 +0530 Subject: [PATCH 17/32] config file changed --- configuration/config.ts | 13 ++++++--- src/adapters/Wallet/signTransaction/index.ts | 29 ++++++++++++-------- src/adapters/WalletCircle/index.ts | 2 +- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/configuration/config.ts b/configuration/config.ts index f37841a..5a304b9 100644 --- a/configuration/config.ts +++ b/configuration/config.ts @@ -20,17 +20,22 @@ type ChainConfig = { baseUrl?:string; createTransaction?: string; } + + type CircleProgrammableWalletConfig = { + baseUrl?:string; + } + type UrlConfig = { + apiurl?:string; + } type Config = { chains: Record; fireblocks : Record; url: Record; + circleProgrammableWallet : Record; }; - type UrlConfig = { - apiurl?:string; - } - + const config: Config = { "chains": { "1": { diff --git a/src/adapters/Wallet/signTransaction/index.ts b/src/adapters/Wallet/signTransaction/index.ts index 30b17ca..b443b42 100644 --- a/src/adapters/Wallet/signTransaction/index.ts +++ b/src/adapters/Wallet/signTransaction/index.ts @@ -2,9 +2,9 @@ import Ethereum from './Ethereum'; import * as Near from './Near'; import * as Solana from './Solana'; -// import Tron from './Tron'; +import * as Tron from './Tron'; import * as Sui from './Sui'; -// import Aptos from './Aptos'; +import * as Aptos from './Aptos'; // import StarkNet from './Starknet'; const signTransactionAlgorand:any = async (web3: any, transactionObject: any, options: any) => { @@ -28,11 +28,11 @@ const signTransactionNear = async (web3:any, transactionObject:any , options:any }; -// exports.signTransactionTron = async (web3, transactionObject, options) => { +const signTransactionTron = async (web3:any, transactionObject:any, options:any) => { -// const rawData = await Tron.signTransactionTron(web3, transactionObject, options); -// return rawData; -// }; + const rawData = await Tron.signTransactionTron(web3, transactionObject, options); + return rawData; + }; const signTransactionSolana:any = async (web3:any, transactionObject:any, options:any) => { @@ -47,11 +47,11 @@ const signTransactionSui = async (web3:any, transactionObject:any, options:any) }; -// exports.signTransactionAptos = async (web3, transactionObject, options) => { +const signTransactionAptos = async (web3:any, transactionObject:any, options:any) => { -// const rawData = await Aptos.signTransactionAptos(web3, transactionObject, options); -// return rawData; -// }; + const rawData = await Aptos.signTransactionAptos(web3, transactionObject, options); + return rawData; +}; // exports.signTransactionStarkNet = async (web3, transactionObject, options) => { @@ -66,4 +66,11 @@ const signVersionedTransactionSolana = async (web3:any, transactionObject:any, o }; -export {signTransactionEvm, signTransactionSolana, signVersionedTransactionSolana, signTransactionAlgorand, signTransactionNear, signTransactionSui}; \ No newline at end of file +export {signTransactionEvm, + signTransactionSolana, + signVersionedTransactionSolana, + signTransactionAlgorand, + signTransactionNear, + signTransactionSui, + signTransactionTron, + signTransactionAptos,}; \ No newline at end of file diff --git a/src/adapters/WalletCircle/index.ts b/src/adapters/WalletCircle/index.ts index 27c1478..0bc2c32 100644 --- a/src/adapters/WalletCircle/index.ts +++ b/src/adapters/WalletCircle/index.ts @@ -2,7 +2,7 @@ import { initiateUserControlledWalletsClient } from '@circle-fin/user-controlled import { v4 as uuidv4 } from 'uuid'; import axios, { AxiosRequestConfig } from 'axios'; import * as schemaValidator from '../../../configuration/schemaValidator'; -import * as conf from '../../../configuration/config.json'; +import * as conf from '../../../configuration/config'; interface WalletCircleOptions { appId: string; From 8b69984a8f4fed180c0b38ab2ed30748abf759ed Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Mon, 16 Dec 2024 17:09:22 +0530 Subject: [PATCH 18/32] WalletStacks file added --- src/index.ts | 2 ++ src/interfaces/index.ts | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index b3ececf..5bf4d3f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -13,6 +13,7 @@ import { WalletCosmos, WalletStellar, WalletXRPL, + WalletStacks, } from "./interfaces/index"; export const prepareTransaction = async (apiURL:any, options:any) => { @@ -84,4 +85,5 @@ export { WalletCosmos, WalletStellar, WalletXRPL, + WalletStacks, }; diff --git a/src/interfaces/index.ts b/src/interfaces/index.ts index 0c7d63d..0233f0c 100644 --- a/src/interfaces/index.ts +++ b/src/interfaces/index.ts @@ -9,6 +9,7 @@ import { WalletCircle } from '../adapters/WalletCircle'; import { WalletCosmos } from "../adapters/WalletCosmos"; import { WalletStellar } from '../adapters/WalletStellar'; import { WalletXRPL } from '../adapters/WalletXRPL'; +import { WalletStacks } from '@/adapters/WalletStacks'; export { Wallet, @@ -21,5 +22,6 @@ export { WalletCircle, WalletStellar, WalletXRPL, - WalletCosmos + WalletCosmos, + WalletStacks }; \ No newline at end of file From af865743e946105573226edc8639a888e5248d15 Mon Sep 17 00:00:00 2001 From: Tek Raj Joshi Date: Mon, 16 Dec 2024 17:59:06 +0530 Subject: [PATCH 19/32] type issue fixed in WalletTon --- src/adapters/WalletTON/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/adapters/WalletTON/index.ts b/src/adapters/WalletTON/index.ts index 2b24a18..7f5b336 100644 --- a/src/adapters/WalletTON/index.ts +++ b/src/adapters/WalletTON/index.ts @@ -13,10 +13,10 @@ interface WalletTONOptions { interface TransactionObject { function?: string; chainId: string; - chainSymbol: string; + chainSymbol?: string; to: string; - value: number; - message: string; + value: string; + message?: string; rawTransaction?: any; } @@ -71,7 +71,7 @@ class WalletTON { let body; try { - body = Cell.fromBase64(transactionObject.message); + body = Cell.fromBase64(transactionObject?.message || "through expand"); } catch (error) { body = transactionObject.message || "through expand"; // Optional comment } From 29bde87b10ed2a1433a827992169a272bf7783fa Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Tue, 17 Dec 2024 16:19:36 +0530 Subject: [PATCH 20/32] walleissues fixed --- configuration/config.ts | 36 ++++-- configuration/errorMessage.ts | 43 ++++++ package-lock.json | 10 ++ package.json | 1 + src/adapters/WalletBitcoin/index.ts | 7 +- src/adapters/WalletCircle/index.ts | 4 +- src/adapters/WalletDFNS/index.ts | 6 +- .../WalletDFNS/signTransaction/Ethereum.ts | 4 +- src/adapters/WalletFireblocks/index.ts | 2 + src/adapters/WalletPhantom/index.ts | 122 ++++++++++-------- .../WalletPhantom/signTransaction/Solana.ts | 6 +- 11 files changed, 167 insertions(+), 74 deletions(-) create mode 100644 configuration/errorMessage.ts diff --git a/configuration/config.ts b/configuration/config.ts index 5a304b9..ee4805a 100644 --- a/configuration/config.ts +++ b/configuration/config.ts @@ -17,22 +17,43 @@ type ChainConfig = { }; type FireblocksConfig = { - baseUrl?:string; - createTransaction?: string; + baseUrl:string; + createTransaction: string; } type CircleProgrammableWalletConfig = { - baseUrl?:string; + baseUrl:string; } type UrlConfig = { - apiurl?:string; + apiurl:string; } + + type DexesConfig = { + localName?: string; + chainName: string; + chainId: string; + dexName: string; + localDexName?: string; + }; + + type DYdXConfig = { + chainId: string; + USDC : string; + MAX_CLIENT_ID : any ; + squidRouterAPIBaseUrl : string ; + signingMsg: any; + rpc : string; + }; + type Config = { chains: Record; - fireblocks : Record; - url: Record; - circleProgrammableWallet : Record; + fireblocks: FireblocksConfig; + circleProgrammableWallet : CircleProgrammableWalletConfig; + url: UrlConfig; + Mask250: string; + dexes : Record; + dYdXV4: DYdXConfig; }; @@ -376,7 +397,6 @@ const config: Config = { "url": { "apiurl" : "https://api.expand.network" }, - "dexes": { "1900": { "localName": "UniswapX", diff --git a/configuration/errorMessage.ts b/configuration/errorMessage.ts new file mode 100644 index 0000000..a26d254 --- /dev/null +++ b/configuration/errorMessage.ts @@ -0,0 +1,43 @@ +interface ErrorMessages { + invalidInput: string; + notApplicable: string; + invalidChainId: string; + invalidDexId: string; + invalidLendBorrowId: string; + invalidYieldAggregatorId: string; + invalidSrcToken: string; + invalidOrderId: string; +} + +interface ErrorCodes { + invalidInput: number; + notApplicable: number; +} + +interface ErrorResponse { + error: { + message: ErrorMessages; + code: ErrorCodes; + }; +} + +const errorResponse: ErrorResponse = { + error: { + message: { + invalidInput: "Please provide proper input data", + notApplicable: "Given function is not applicable", + invalidChainId: "Invalid chain ID", + invalidDexId: "Invalid Dex Id", + invalidLendBorrowId: "Invalid Lend Borrow Id", + invalidYieldAggregatorId: "Invalid Yield Aggregator Id", + invalidSrcToken: "Invalid/Unsupported Src Token", + invalidOrderId: "Invalid Order Id" + }, + code: { + invalidInput: 400, + notApplicable: 406 + } + } +}; + +export default errorResponse; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2091e89..05302b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,6 +65,7 @@ }, "devDependencies": { "@babel/eslint-parser": "^7.22.15", + "@types/jsonwebtoken": "^9.0.7", "@types/node": "^22.10.1", "eslint": "8.56.0", "eslint-config-airbnb-base": "15.0.0", @@ -4254,6 +4255,15 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz", + "integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", diff --git a/package.json b/package.json index 26f99cc..4bbbfa9 100644 --- a/package.json +++ b/package.json @@ -78,6 +78,7 @@ }, "devDependencies": { "@babel/eslint-parser": "^7.22.15", + "@types/jsonwebtoken": "^9.0.7", "@types/node": "^22.10.1", "eslint": "8.56.0", "eslint-config-airbnb-base": "15.0.0", diff --git a/src/adapters/WalletBitcoin/index.ts b/src/adapters/WalletBitcoin/index.ts index 23b214f..4b99fe7 100644 --- a/src/adapters/WalletBitcoin/index.ts +++ b/src/adapters/WalletBitcoin/index.ts @@ -7,6 +7,8 @@ import * as schemaValidator from "../../../configuration/schemaValidator"; import * as common from "../../../configuration/common"; import config from "../../../configuration/config"; +import { networks } from "bitcoinjs-lib"; + interface WalletBitcoinOptions { privateKey: string; xApiKey: string; @@ -58,7 +60,8 @@ export class WalletBitcoin { } const ECPair = ECPairFactory(tinysecp); - const network = chainId === "1800" ? bitcoin.networks.mainnet : bitcoin.networks.testnet; + const network = chainId === "1800" ? bitcoin.networks.bitcoin : bitcoin.networks.testnet; + const privateKeyBuffer = Buffer.from(this.privateKey, "hex"); const keyPair: ECPairInterface = ECPair.fromPrivateKey(privateKeyBuffer, { network }); @@ -132,7 +135,7 @@ export const getKeysFromMnemonic = async ( } const seed = await bip39.mnemonicToSeed(mnemonic); - const network = chainId === "1800" ? bitcoin.networks.mainnet : bitcoin.networks.testnet; + const network = chainId === "1800" ? bitcoin.networks.bitcoin : bitcoin.networks.testnet; const root = bitcoin.bip32.fromSeed(seed, network); const child = root.derivePath(path); diff --git a/src/adapters/WalletCircle/index.ts b/src/adapters/WalletCircle/index.ts index 0bc2c32..d6aa38b 100644 --- a/src/adapters/WalletCircle/index.ts +++ b/src/adapters/WalletCircle/index.ts @@ -2,7 +2,7 @@ import { initiateUserControlledWalletsClient } from '@circle-fin/user-controlled import { v4 as uuidv4 } from 'uuid'; import axios, { AxiosRequestConfig } from 'axios'; import * as schemaValidator from '../../../configuration/schemaValidator'; -import * as conf from '../../../configuration/config'; +import conf from '../../../configuration/config'; interface WalletCircleOptions { appId: string; @@ -50,7 +50,7 @@ class WalletCircle { const client = initiateUserControlledWalletsClient({ apiKey: options.apiKey, }); - const userToken = await client.createUserToken({ userId: options.userId }).then(res => res.data); + const userToken:any = await client.createUserToken({ userId: options.userId }).then(res => res.data); return userToken; } diff --git a/src/adapters/WalletDFNS/index.ts b/src/adapters/WalletDFNS/index.ts index 1ec2f2a..a96dd9f 100644 --- a/src/adapters/WalletDFNS/index.ts +++ b/src/adapters/WalletDFNS/index.ts @@ -23,9 +23,9 @@ type TransactionObject = { chainId: number; chainSymbol: string; rawTransaction: any; - to: string; // Address of the recipient - value: string; // Amount to be transferred - gas: string; // Gas limit for the transaction + to: string; + value: string; + gas: string; [key: string]: any; }; diff --git a/src/adapters/WalletDFNS/signTransaction/Ethereum.ts b/src/adapters/WalletDFNS/signTransaction/Ethereum.ts index 2ef89ed..563bf17 100644 --- a/src/adapters/WalletDFNS/signTransaction/Ethereum.ts +++ b/src/adapters/WalletDFNS/signTransaction/Ethereum.ts @@ -1,4 +1,4 @@ -import { Wallet, providers } from "ethers"; +import { Wallet, JsonRpcProvider } from "ethers"; interface TransactionObject { to: string; @@ -10,7 +10,7 @@ interface TransactionObject { interface Options { wallet: Wallet; - rpcProvider: providers.JsonRpcProvider; + rpcProvider: JsonRpcProvider; } interface SignedTransactionResponse { diff --git a/src/adapters/WalletFireblocks/index.ts b/src/adapters/WalletFireblocks/index.ts index 973153d..4e26c95 100644 --- a/src/adapters/WalletFireblocks/index.ts +++ b/src/adapters/WalletFireblocks/index.ts @@ -23,6 +23,7 @@ interface TransactionObject { note?: string; data?: string; internal?: boolean; + function?: string; } interface RawTransaction { @@ -30,6 +31,7 @@ interface RawTransaction { path: string; data: any; method: string; + function?: string; } class WalletFireblocks { diff --git a/src/adapters/WalletPhantom/index.ts b/src/adapters/WalletPhantom/index.ts index 9a90c40..0d450a2 100644 --- a/src/adapters/WalletPhantom/index.ts +++ b/src/adapters/WalletPhantom/index.ts @@ -1,123 +1,137 @@ -import axios from 'axios'; +import axios, { AxiosRequestConfig } from 'axios'; import BN from 'bn.js'; import * as rawTransaction from './signTransaction/index'; -import config from '../../../configuration/config.json'; +import config from '../../../configuration/config'; import * as common from '../../../configuration/common'; import * as schemaValidator from '../../../configuration/schemaValidator'; import { initialiseWeb3 } from '../../../configuration/intialiseWeb3'; +interface WalletPhantomOptions { + privateKey: string; + xApiKey: string; +} + +interface TransactionObject { + function?: string; + chainId: string | number; + chainSymbol: string; + [key: string]: any; +} + +interface ValidObject { + valid: boolean; + [key: string]: any; +} + class WalletPhantom { + private privateKey: string; + private xApiKey: string; - constructor(options) { + constructor(options: WalletPhantomOptions) { this.privateKey = options.privateKey; this.xApiKey = options.xApiKey; - }; - - signTransaction = async (transactionObject) => { + } - const configuration = { "params": {} }; + signTransaction = async (transactionObject: TransactionObject): Promise => { + const configuration: AxiosRequestConfig = { params: {} }; transactionObject.function = "txObjSol()"; - const validObject = await schemaValidator.validateInput(transactionObject); - + + const validObject: ValidObject = await schemaValidator.validateInput(transactionObject); if (!validObject.valid) { - return (validObject); + return validObject; } axios.defaults.headers['X-API-KEY'] = this.xApiKey; const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; - const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); + const chainId = await common.getChainId({ + chainId: transactionObject.chainId, + chainSymbol: transactionObject.chainSymbol, + }); + + const chainName = config.chains[chainId as keyof typeof config.chains].chainName; - let chainName = config.chains[chainId].chainName; + if (chainName !== "Evm" && chainName !== "Solana") { + return new Error("Chain not supported"); + } - if (chainName !== "Evm" && chainName !== "Solana") - return new Error("chain not Supported"); + configuration.params = { chainId }; - configuration.params = { - chainId - }; + let rpcResponse = await axios.get(apiURL, configuration); + const rpc = rpcResponse.data.data.rpc; - let rpc = await axios.get(apiURL, configuration); - rpc = rpc.data.data.rpc; - const web3 = await initialiseWeb3({ rpc: rpc, chainId, key: this.xApiKey }); + const web3 = await initialiseWeb3({ rpc, chainId, key: this.xApiKey }); - const options = {}; - options.privateKey = this.privateKey; + const options = { privateKey: this.privateKey }; const rawData = await rawTransaction[`signTransaction${chainName}`](web3, transactionObject, options); rawData.chainId = chainId; return rawData; }; - signVersionedTransaction = async (transactionObject) => { - - const configuration = { "params": {} }; + signVersionedTransaction = async (transactionObject: TransactionObject): Promise => { + const configuration: AxiosRequestConfig = { params: {} }; transactionObject.function = "txObjectSol()"; - const validObject = await schemaValidator.validateInput(transactionObject); + const validObject: ValidObject = await schemaValidator.validateInput(transactionObject); if (!validObject.valid) { - return (validObject); + return validObject; } axios.defaults.headers['X-API-KEY'] = this.xApiKey; const apiURL = `${config.url.apiurl}/chain/getpublicrpc/`; - const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); + const chainId = await common.getChainId({ + chainId: transactionObject.chainId, + chainSymbol: transactionObject.chainSymbol, + }); - let chainName = config.chains[chainId].chainName; + const chainName = config.chains[chainId as keyof typeof config.chains].chainName; - if (chainName !== "Solana") - return new Error("chain not Supported"); + if (chainName !== "Solana") { + return new Error("Chain not supported"); + } - configuration.params = { - chainId - }; + configuration.params = { chainId }; - let rpc = await axios.get(apiURL, configuration); - rpc = rpc.data.data.rpc; - const web3 = await initialiseWeb3({ rpc: rpc, chainId, key: this.xApiKey }); + let rpcResponse = await axios.get(apiURL, configuration); + const rpc = rpcResponse.data.data.rpc; - const options = {}; - options.privateKey = this.privateKey; + const web3 = await initialiseWeb3({ rpc, chainId, key: this.xApiKey }); + + const options = { privateKey: this.privateKey }; const rawData = await rawTransaction[`signVersionedTransaction${chainName}`](web3, transactionObject, options); rawData.chainId = chainId; return rawData; }; - sendTransaction = async (options) => { + sendTransaction = async (options: TransactionObject): Promise => { + options.function = "sendTransaction()"; - const filterOptions = options; - filterOptions.function = "sendTransaction()"; - const validJson = await schemaValidator.validateInput(options); + const validJson: ValidObject = await schemaValidator.validateInput(options); if (!validJson.valid) { - return (validJson); + return validJson; } try { - const apiURL = `${config.url.apiurl}/chain/sendtransaction/`; - const params = { + const params: AxiosRequestConfig = { method: "post", url: apiURL, data: options, headers: { - "x-api-key": this.xApiKey - } + "x-api-key": this.xApiKey, + }, }; const transactionHash = await axios(params); return transactionHash.data; - } - - catch (error) { + } catch (error) { return error; } - }; - } export { WalletPhantom }; - diff --git a/src/adapters/WalletPhantom/signTransaction/Solana.ts b/src/adapters/WalletPhantom/signTransaction/Solana.ts index 4b911d1..7f93ade 100644 --- a/src/adapters/WalletPhantom/signTransaction/Solana.ts +++ b/src/adapters/WalletPhantom/signTransaction/Solana.ts @@ -9,7 +9,7 @@ import { Connection, BlockhashWithExpiryBlockHeight } from '@solana/web3.js'; -import * as sign from 'tweetnacl'; +import nacl from 'tweetnacl'; import bs58 from 'bs58'; import BN from 'bn.js'; @@ -61,12 +61,12 @@ export const signTransactionSolana = async ( } transactionBuffer = preparedTx.serializeMessage(); - const signature = sign.detached(transactionBuffer, from.secretKey); + const signature:any = nacl.sign.detached(transactionBuffer, from.secretKey); preparedTx.addSignature(from.publicKey, signature); if (transactionObject.additionalSigners) { const additionalKey = Keypair.fromSecretKey(bs58.decode(transactionObject.additionalSigners)); - const additionalSignature = sign.detached(transactionBuffer, additionalKey.secretKey); + const additionalSignature:any = nacl.sign.detached(transactionBuffer, additionalKey.secretKey); preparedTx.addSignature(additionalKey.publicKey, additionalSignature); } From 4b49047e63c5a1dc5244a7917a0a43e70a9352ed Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Tue, 17 Dec 2024 16:19:53 +0530 Subject: [PATCH 21/32] dydx file changed --- configuration/dYdXCommon.ts | 38 +++++++--- configuration/squidRouterTokenConfig.ts | 57 ++++++++++++++ src/dydx/cancelOrder.ts | 14 ++-- src/dydx/deposit.ts | 98 +++++++++++++++++++++++++ 4 files changed, 190 insertions(+), 17 deletions(-) create mode 100644 configuration/squidRouterTokenConfig.ts create mode 100644 src/dydx/deposit.ts diff --git a/configuration/dYdXCommon.ts b/configuration/dYdXCommon.ts index dbfcbe8..2a9ea28 100644 --- a/configuration/dYdXCommon.ts +++ b/configuration/dYdXCommon.ts @@ -1,17 +1,37 @@ -const { LocalWallet, Network, CompositeClient, BECH32_PREFIX, SubaccountClient, ValidatorClient } = require("@dydxprotocol/v4-client-js"); - -exports.getSubAccountCompositeClient = async (mnemonic: any, subAccountNumber: any) => { +import { + LocalWallet, + Network, + CompositeClient, + BECH32_PREFIX, + SubaccountClient, + ValidatorClient, + } from "@dydxprotocol/v4-client-js"; + + export const getSubAccountCompositeClient = async ( + mnemonic: string, + subAccountNumber: number + ): Promise<{ + client: CompositeClient; + subaccount: SubaccountClient; + }> => { const wallet = await LocalWallet.fromMnemonic(mnemonic, BECH32_PREFIX); const client = await CompositeClient.connect(Network.testnet()); - + const subaccount = new SubaccountClient(wallet, subAccountNumber); return { client, subaccount }; -}; - -exports.getSubAccountValidatorClient = async (mnemonic: any, subAccountNumber: any) => { + }; + + export const getSubAccountValidatorClient = async ( + mnemonic: string, + subAccountNumber: number + ): Promise<{ + client: ValidatorClient; + subaccount: SubaccountClient; + }> => { const wallet = await LocalWallet.fromMnemonic(mnemonic, BECH32_PREFIX); const client = await ValidatorClient.connect(Network.testnet().validatorConfig); - + const subaccount = new SubaccountClient(wallet, subAccountNumber); return { client, subaccount }; -}; \ No newline at end of file + }; + \ No newline at end of file diff --git a/configuration/squidRouterTokenConfig.ts b/configuration/squidRouterTokenConfig.ts new file mode 100644 index 0000000..bd2bb5c --- /dev/null +++ b/configuration/squidRouterTokenConfig.ts @@ -0,0 +1,57 @@ +type TokenMap = { + [key: string]: string; +}; + +type NetworkTokenData = { + [networkId: string]: TokenMap; +}; + +const networkTokenData: NetworkTokenData = { + "5": { + ETH: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", + WETH: "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6", + DAI: "0xdc31Ee1784292379Fbb2964b3B9C4124D8F89C60", + AUSDC: "0x254d06f33bDc5b8ee05b2ea472107E300226659A", + WSTETH: "0x6320cd32aa674d2898a68ec82e869385fc5f7e2f", + }, + "97": { + BNB: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", + WBNB: "0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd", + AUSDC: "0xc2fA98faB811B785b81c64Ac875b31CC9E40F9D2", + }, + "80001": { + MATIC: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", + WMATIC: "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889", + AUSDC: "0x2c852e740B62308c46DD29B982FBb650D063Bd07", + AXLETH: "0x786D82A436EA836A8669919D605FfeaEFa51744e", + }, + "420": { + ETH: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", + WETH: "0x4200000000000000000000000000000000000006", + AUSDC: "0x254d06f33bDc5b8ee05b2ea472107E300226659A", + }, + "43113": { + AVAX: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", + WAVAX: "0xd00ae08403B9bbb9124bB305C09058E32C39A48c", + AXL: "0x46Cc87ea84586C03bB2109ED9B33F998d40B7623", + AUSDC: "0x57f1c63497aee0be305b8852b354cec793da43bb", + AXLETH: "0xe840BE8D9aB1ACD5AfC7168b05EC350B7FD18709", + }, + "421613": { + ETH: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", + WETH: "0xEe01c0CD76354C383B8c7B4e65EA88D00B06f36f", + AUSDC: "0x254d06f33bDc5b8ee05b2ea472107E300226659A", + }, + "4002": { + FTM: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", + WFTM: "0xf1277d1Ed8AD466beddF92ef448A132661956621", + AUSDC: "0x75Cc4fDf1ee3E781C1A3Ee9151D5c6Ce34Cf5C61", + }, + "84531": { + ETH: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", + WETH: "0x4200000000000000000000000000000000000006", + AUSDC: "0x254d06f33bDc5b8ee05b2ea472107E300226659A", + }, +}; + +export default networkTokenData; diff --git a/src/dydx/cancelOrder.ts b/src/dydx/cancelOrder.ts index eb1d8c4..2e2aeb3 100644 --- a/src/dydx/cancelOrder.ts +++ b/src/dydx/cancelOrder.ts @@ -1,7 +1,7 @@ import axios from 'axios'; import { getSubAccountCompositeClient } from '../../configuration/dYdXCommon'; import { OrderFlags } from '@dydxprotocol/v4-client-js'; -import errorMessage from '../../configuration/errorMessage.json'; +import errorMessage from '../../configuration/errorMessage'; interface CancelOrderOptions { subAccountNumber: number; @@ -11,10 +11,8 @@ interface CancelOrderOptions { } interface OrderResponse { - data: { - clientId: string; - ticker: string; - }; + clientId: string; + ticker: string; } interface ErrorResponse { @@ -34,11 +32,11 @@ export const cancelOrder = async (options: CancelOrderOptions): Promise => headers: {}, }; - let order: OrderResponse['data']; + let order: OrderResponse; try { const res = await axios.request(orderConfig); - order = res.data; + order = res.data; // Assuming the response directly contains `clientId` and `ticker` } catch (err) { return { message: errorMessage.error.message.invalidOrderId, @@ -49,7 +47,7 @@ export const cancelOrder = async (options: CancelOrderOptions): Promise => try { const tx = await client.cancelOrder( subaccount, - order.clientId, + Number(order.clientId), OrderFlags.LONG_TERM, order.ticker, 0, diff --git a/src/dydx/deposit.ts b/src/dydx/deposit.ts new file mode 100644 index 0000000..24e7dfe --- /dev/null +++ b/src/dydx/deposit.ts @@ -0,0 +1,98 @@ +import axios from 'axios'; +import config from '../../configuration/config'; +import tokenConfig from '../../configuration/squidRouterTokenConfig'; +import { Wallet } from '../adapters/Wallet'; +import dotenv from 'dotenv'; +import errorMessage from '../../configuration/errorMessage'; + +dotenv.config(); + +interface DepositOptions { + srcChainId: number; + from: string; + to: string; + amountIn: string; + tokenIn: string; + slippage: number; + gas: number; + privateKey: string; +} + +interface ErrorResponse { + message: string; + code: string; +} + +interface TransactionRequest { + gasPrice: string; + data: string; + targetAddress: string; + value: string; +} + +export const deposit = async (options: DepositOptions): Promise => { + const { + srcChainId: fromChain, + from: fromAddress, + to: toAddress, + amountIn: fromAmount, + tokenIn, + slippage, + gas, + privateKey + } = options; + + const fromToken = tokenConfig[fromChain]?.[tokenIn.toUpperCase()]; + + if (fromToken === undefined) { + return { + message: errorMessage.error.message.invalidSrcToken, + code: errorMessage.error.code.invalidInput, + } as ErrorResponse; + } + + const routeURL = `${config.dYdXV4.squidRouterAPIBaseUrl}route`; + + let result; + try { + result = await axios.get(routeURL, { + params: { + fromChain, + fromToken, + fromAddress, + fromAmount, + toChain: config.dYdXV4.chainId, + toToken: config.dYdXV4.USDC, + toAddress, + slippage, + quoteOnly: false, + }, + }); + } catch (err: any) { + return err.response?.data || { message: 'An unknown error occurred.' }; + } + + const { gasPrice, data, targetAddress: to, value } = result.data.route.transactionRequest as TransactionRequest; + + const wallet = new Wallet({ + privateKey, + xApiKey: process.env.xApiKey || '', + }); + + const createTransaction = await wallet.signTransaction({ + chainId: fromChain, + from: fromAddress, + gas, + gasPrice, + data, + value, + to, + }); + + if (!createTransaction?.name?.valid) { + return new Error('Invalid', { cause: createTransaction?.message }); + } + + const transactionReceipt = await wallet.sendTransaction(createTransaction); + return transactionReceipt; +}; From 15ed871daa4e814674e52ba7aab8c49a0a63236d Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Tue, 17 Dec 2024 22:37:20 +0530 Subject: [PATCH 22/32] dydx file issue fixed --- src/dydx/deposit.ts | 8 ++--- src/dydx/placeOrder.ts | 68 ++++++++++++++++++++++++++++++++++++++ src/dydx/transfer.ts | 50 ++++++++++++++++++++++++++++ src/dydx/userOnboarding.ts | 18 ++++++++++ 4 files changed, 140 insertions(+), 4 deletions(-) create mode 100644 src/dydx/placeOrder.ts create mode 100644 src/dydx/transfer.ts create mode 100644 src/dydx/userOnboarding.ts diff --git a/src/dydx/deposit.ts b/src/dydx/deposit.ts index 24e7dfe..3e10a11 100644 --- a/src/dydx/deposit.ts +++ b/src/dydx/deposit.ts @@ -48,7 +48,7 @@ export const deposit = async (options: DepositOptions): Promise => { return { message: errorMessage.error.message.invalidSrcToken, code: errorMessage.error.code.invalidInput, - } as ErrorResponse; + }; } const routeURL = `${config.dYdXV4.squidRouterAPIBaseUrl}route`; @@ -80,9 +80,9 @@ export const deposit = async (options: DepositOptions): Promise => { }); const createTransaction = await wallet.signTransaction({ - chainId: fromChain, + chainId: String(fromChain), from: fromAddress, - gas, + gas: String(gas), gasPrice, data, value, @@ -90,7 +90,7 @@ export const deposit = async (options: DepositOptions): Promise => { }); if (!createTransaction?.name?.valid) { - return new Error('Invalid', { cause: createTransaction?.message }); + return new Error('Invalid transaction: ' + createTransaction?.message); } const transactionReceipt = await wallet.sendTransaction(createTransaction); diff --git a/src/dydx/placeOrder.ts b/src/dydx/placeOrder.ts new file mode 100644 index 0000000..5ad9d0f --- /dev/null +++ b/src/dydx/placeOrder.ts @@ -0,0 +1,68 @@ +import { OrderExecution, OrderType, OrderSide, OrderTimeInForce } from '@dydxprotocol/v4-client-js'; +import { getSubAccountCompositeClient } from '../../configuration/dYdXCommon'; +import config from "../../configuration/config"; + +interface PlaceOrderOptions { + subAccountNumber: number; + mnemonic: string; + market: string; + type: keyof typeof OrderType; + side: keyof typeof OrderSide; + timeInForce: keyof typeof OrderTimeInForce; + time: number; + price: number; + postOnly: boolean; + reduceOnly: boolean; + triggerPrice?: number; + size: number; +} + +export const placeOrder = async (options: PlaceOrderOptions) => { + const { + subAccountNumber, + mnemonic, + market, + type: orderType, + side: orderSide, + timeInForce: orderTimeInForce, + time, + price, + postOnly, + reduceOnly, + triggerPrice, + size + } = options; + + const { client, subaccount } = await getSubAccountCompositeClient(mnemonic, subAccountNumber); + + try { + const type = OrderType[orderType]; + const side = OrderSide[orderSide]; + const timeInForce = OrderTimeInForce[orderTimeInForce]; + const timeInForceSeconds = timeInForce === OrderTimeInForce.GTT ? time : 0; + + let tx = await client.placeOrder( + subaccount, + market, + type, + side, + price, + size, + Math.floor(Math.random() * config.dYdXV4.MAX_CLIENT_ID), + timeInForce, + timeInForceSeconds, + OrderExecution.DEFAULT, + postOnly, + reduceOnly, + triggerPrice + ); + + if (typeof tx.hash === 'object') { + tx = { ...(tx as any), hex: `0x${Buffer.from(tx.hash).toString('hex')}` }; + } + + return tx; + } catch (error) { + return (error as Error).message; + } +}; diff --git a/src/dydx/transfer.ts b/src/dydx/transfer.ts new file mode 100644 index 0000000..cc9cd94 --- /dev/null +++ b/src/dydx/transfer.ts @@ -0,0 +1,50 @@ +import Long from 'long'; +import { Method } from '@cosmjs/tendermint-rpc'; +import { getSubAccountValidatorClient } from '../../configuration/dYdXCommon'; +import { EncodeObject } from '@cosmjs/proto-signing'; + +interface TransferOptions { + subAccountNumber: number; + mnemonic: string; + recipient: string; + assetId: number; + amount: string | number | Long; +} + +export const transfer = async (options: TransferOptions): Promise => { + const { subAccountNumber, mnemonic, recipient, assetId } = options; + let amount: Long = Long.fromValue(options.amount); + + const { client, subaccount } = await getSubAccountValidatorClient(mnemonic, subAccountNumber); + // amount = Long.fromValue(amount); + + const msgs: Promise = new Promise((resolve) => { + const msg = client.post.composer.composeMsgWithdrawFromSubaccount( + subaccount.address, + subaccount.subaccountNumber, + Number(assetId), + amount, + recipient, + ); + + resolve([msg]); + }); + + const totalFee = await client.post.simulate( + subaccount.wallet, + () => msgs, + undefined, + ); + + const amountAfterFee = amount.sub(Long.fromString(totalFee.amount[0].amount)); + + const tx = await client.post.withdraw( + subaccount, + assetId, + amountAfterFee, + recipient, + Method.BroadcastTxCommit, + ); + + return tx; +}; diff --git a/src/dydx/userOnboarding.ts b/src/dydx/userOnboarding.ts new file mode 100644 index 0000000..d893d24 --- /dev/null +++ b/src/dydx/userOnboarding.ts @@ -0,0 +1,18 @@ +import { BECH32_PREFIX, LocalWallet } from '@dydxprotocol/v4-client-js'; +import { ethers } from 'ethers-5'; +import config from '../../configuration/config'; +import { deriveHDKeyFromEthereumSignature } from '@dydxprotocol/v4-client-js/build/src/lib/onboarding'; + + +export const userOnboarding= async (options:any) => { + const provider = new ethers.providers.JsonRpcProvider(config.dYdXV4.rpc); + const signer = new ethers.Wallet(options.privateKey, provider); + const {signingMsg} = config.dYdXV4; + + const signature = await signer._signTypedData(signingMsg.domain, { dYdX: signingMsg.types.dYdX }, signingMsg.message); + const keys = deriveHDKeyFromEthereumSignature(signature); + const {mnemonic, publicKey, privateKey} = keys; + const wallet = await LocalWallet.fromMnemonic(mnemonic, BECH32_PREFIX); + return {mnemonic, publicKey, privateKey, address: wallet.address} + } + From 43a134f8b5f4438b5261f30103cf357ab90199f1 Mon Sep 17 00:00:00 2001 From: Tek Raj Joshi Date: Wed, 18 Dec 2024 16:29:03 +0530 Subject: [PATCH 23/32] json removed from config.json import --- configuration/common.ts | 2 +- configuration/intialiseWeb3.ts | 6 +++--- configuration/schemaValidator.ts | 2 +- package.json | 4 ++-- src/adapters/Wallet/index.ts | 2 +- src/adapters/WalletCosmos/index.ts | 2 +- src/adapters/WalletFireblocks/index.ts | 2 +- src/adapters/WalletXRPL/index.ts | 2 +- src/helper/Starknet.ts | 2 +- src/index.ts | 2 +- src/interfaces/index.ts | 2 +- tsconfig.json | 2 +- 12 files changed, 15 insertions(+), 15 deletions(-) diff --git a/configuration/common.ts b/configuration/common.ts index 11d80b8..7112954 100644 --- a/configuration/common.ts +++ b/configuration/common.ts @@ -1,4 +1,4 @@ -import config from './config.json'; +import config from './config'; type ChainConfig = { chains: { diff --git a/configuration/intialiseWeb3.ts b/configuration/intialiseWeb3.ts index fc815bc..2284102 100644 --- a/configuration/intialiseWeb3.ts +++ b/configuration/intialiseWeb3.ts @@ -9,10 +9,10 @@ import { TonClient } from "@ton/ton"; import { StargateClient } from "@cosmjs/stargate"; import StellarSdk from "stellar-sdk"; import * as common from "./common"; -import config from "./config.json"; -import errorMessage from "./errorMessage.json"; +import config from "./config"; +import errorMessage from "./errorMessage"; -import { Server } from "stellar-sdk"; +import Server from "stellar-sdk"; const invalidChainId = { error: errorMessage.error.message.invalidChainId, diff --git a/configuration/schemaValidator.ts b/configuration/schemaValidator.ts index 9e1d849..03904c5 100644 --- a/configuration/schemaValidator.ts +++ b/configuration/schemaValidator.ts @@ -3,7 +3,7 @@ import Ajv from "ajv"; import addErrors from "ajv-errors"; -import errorMessage from "./errorMessage.json"; +import errorMessage from "./errorMessage"; import { jsonSchema } from "./schema"; const ajv = new Ajv({ allErrors: true, strict: true, useDefaults: true }); diff --git a/package.json b/package.json index 4bbbfa9..dc84e1b 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,8 @@ "name": "expand-network", "version": "3.2.4", "description": "The external SDK for the adapter", - "main": "src/index.ts", - "type": "module", + "main": "src/index.js", + "type": "commonjs", "parserOptions": { "ecmaVersion": 2018 }, diff --git a/src/adapters/Wallet/index.ts b/src/adapters/Wallet/index.ts index cde5809..7241725 100644 --- a/src/adapters/Wallet/index.ts +++ b/src/adapters/Wallet/index.ts @@ -1,7 +1,7 @@ import axios, { AxiosRequestConfig } from 'axios'; import BN from 'bn.js'; import * as rawTransaction from './signTransaction/index'; -import config from '../../../configuration/config.json'; +import config from '../../../configuration/config'; import * as common from '../../../configuration/common'; import * as schemaValidator from '../../../configuration/schemaValidator'; import { initialiseWeb3 } from '../../../configuration/intialiseWeb3'; diff --git a/src/adapters/WalletCosmos/index.ts b/src/adapters/WalletCosmos/index.ts index cc839f1..f5709b5 100644 --- a/src/adapters/WalletCosmos/index.ts +++ b/src/adapters/WalletCosmos/index.ts @@ -4,7 +4,7 @@ import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx"; import axios from "axios"; import * as schemaValidator from "../../../configuration/schemaValidator"; import * as common from "../../../configuration/common"; -import * as config from "../../../configuration/config.json"; +import * as config from "../../../configuration/config"; interface WalletCosmosOptions { privateKey: string; diff --git a/src/adapters/WalletFireblocks/index.ts b/src/adapters/WalletFireblocks/index.ts index 4e26c95..fab745e 100644 --- a/src/adapters/WalletFireblocks/index.ts +++ b/src/adapters/WalletFireblocks/index.ts @@ -2,7 +2,7 @@ import axios from 'axios'; import * as jwt from 'jsonwebtoken'; import { v4 as uuidv4 } from 'uuid'; import crypto from 'crypto'; -import config from '../../../configuration/config.json'; +import config from '../../../configuration/config'; import * as common from '../../../configuration/common'; import * as schemaValidator from '../../../configuration/schemaValidator'; diff --git a/src/adapters/WalletXRPL/index.ts b/src/adapters/WalletXRPL/index.ts index 10f16d8..10f0c31 100644 --- a/src/adapters/WalletXRPL/index.ts +++ b/src/adapters/WalletXRPL/index.ts @@ -2,7 +2,7 @@ import axios from "axios"; import xrpl from 'xrpl'; import * as schemaValidator from '../../../configuration/schemaValidator'; import * as common from '../../../configuration/common'; -import * as config from '../../../configuration/config.json'; +import config from '../../../configuration/config'; interface WalletXRPLConstructorOptions { privateKey: string; diff --git a/src/helper/Starknet.ts b/src/helper/Starknet.ts index fa3ce57..6bee7ea 100644 --- a/src/helper/Starknet.ts +++ b/src/helper/Starknet.ts @@ -1,7 +1,7 @@ /* eslint-disable camelcase */ import Web3 from 'web3'; import BN from "bn.js"; -import * as config from '../../configuration/config.json'; +import * as config from '../../configuration/config'; interface Call { contractAddress: string; diff --git a/src/index.ts b/src/index.ts index 5bf4d3f..7eadbf5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ import axios from "axios"; -import * as config from "../configuration/config.json"; +import config from "../configuration/config"; import * as schemaValidator from "../configuration/schemaValidator"; import { Wallet, diff --git a/src/interfaces/index.ts b/src/interfaces/index.ts index 0233f0c..570d4ff 100644 --- a/src/interfaces/index.ts +++ b/src/interfaces/index.ts @@ -9,7 +9,7 @@ import { WalletCircle } from '../adapters/WalletCircle'; import { WalletCosmos } from "../adapters/WalletCosmos"; import { WalletStellar } from '../adapters/WalletStellar'; import { WalletXRPL } from '../adapters/WalletXRPL'; -import { WalletStacks } from '@/adapters/WalletStacks'; +import { WalletStacks } from '../adapters/WalletStacks'; export { Wallet, diff --git a/tsconfig.json b/tsconfig.json index 8c32cf0..00ef3cc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "ES6", - "module": "ESNext", + "module": "CommonJS", "strict": true, "esModuleInterop": true, "resolveJsonModule": true, From 4dd2b40037aff41d797637b934fbe95ca17dc3bc Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Thu, 19 Dec 2024 17:34:45 +0530 Subject: [PATCH 24/32] typescript issue fixed --- configuration/intialiseWeb3.ts | 14 ++++-- src/dydx/index.ts | 87 ++++++++++++++++++++++++++++++++++ src/helper/Starknet.ts | 2 +- 3 files changed, 97 insertions(+), 6 deletions(-) create mode 100644 src/dydx/index.ts diff --git a/configuration/intialiseWeb3.ts b/configuration/intialiseWeb3.ts index 2284102..020e967 100644 --- a/configuration/intialiseWeb3.ts +++ b/configuration/intialiseWeb3.ts @@ -25,8 +25,12 @@ export const initialiseWeb3 = async (data: any) => { chainSymbol: data.chainSymbol }); - let rpc; - let chainName; + if (!chainId) { + return invalidChainId; // Return an error if chainId is null + } + + let rpc:any; + let chainName:any; try { rpc = data.rpc || config.chains[chainId].rpc; @@ -35,14 +39,14 @@ export const initialiseWeb3 = async (data: any) => { return invalidChainId; } - let web3; + let web3:any; if (chainName === "Evm") { web3 = new EvmWeb(rpc); } else if (chainName === "Solana") { web3 = new solanaWeb.Connection(rpc); } else if (chainName === "Tron") { - const { HttpProvider } = TronWeb.providers; + const HttpProvider = TronWeb.providers.HttpProvider; const fullNode = new HttpProvider(rpc); const solidityNode = new HttpProvider(rpc); const eventServer = new HttpProvider(rpc); @@ -66,7 +70,7 @@ export const initialiseWeb3 = async (data: any) => { } else if (chainName === "TON") { web3 = new TonClient({ endpoint: rpc, apiKey: config.chains[chainId]?.apiKey }); } else if (chainName === "Stellar") { - web3 = new HorizonServer(rpc); + web3 = new StellarSdk.Server(rpc); } else if (chainName === "Cosmos") { web3 = await StargateClient.connect(rpc); } diff --git a/src/dydx/index.ts b/src/dydx/index.ts new file mode 100644 index 0000000..d47d533 --- /dev/null +++ b/src/dydx/index.ts @@ -0,0 +1,87 @@ +import * as schemaValidator from '../../configuration/schemaValidator'; +import * as PlaceOrder from './placeOrder'; +import * as UserOnboarding from './userOnboarding'; +import * as CancelOrder from './cancelOrder'; +import * as Transfer from './transfer'; +import * as Deposit from './deposit'; + +interface Options { + side?: string; + type?: string; + timeInForce?: string; + market?: string; + [key: string]: any; +} + +interface ValidationResult { + valid: boolean; + errors?: string[]; + [key: string]: any; +} + +interface CancelOrderOptions { + subAccountNumber: string; + mnemonic: string; + orderId: string; + goodTillTimeInSeconds: number; + function: string; + side?: string; + type?: string; + timeInForce?: string; + market?: string; +} + +export const userOnboarding = async (options: Options): Promise => { + const filterOptions = { ...options, function: "userOnboardingDYDX()" }; + const validJson: ValidationResult = await schemaValidator.validateInput(filterOptions); + + if (!validJson.valid) return validJson; + return UserOnboarding.userOnboarding(options); +}; + +export const placeOrder = async (options: Options): Promise => { + let filterOptions = options; + + const { side, type, timeInForce, market } = filterOptions; + filterOptions = { + ...filterOptions, + side: side?.toUpperCase(), + type: type?.toUpperCase(), + timeInForce: timeInForce?.toUpperCase(), + market: market?.toUpperCase(), + function: "placeOrderDYDX()", + }; + + const validJson: ValidationResult = await schemaValidator.validateInput(filterOptions); + + if (!validJson.valid) return validJson; + return PlaceOrder.placeOrder(filterOptions); +}; + +export const cancelOrder = async (options: Options): Promise => { + const filterOptions = { ...options, function: "cancelOrderDYDX()" }; + const validJson: ValidationResult = await schemaValidator.validateInput(filterOptions); + + if (!validJson.valid) return validJson; + return CancelOrder.cancelOrder(filterOptions); +}; + +export const transfer = async (options: Options): Promise => { + const filterOptions = { ...options, function: "transferDYDX()" }; + const validJson: ValidationResult = await schemaValidator.validateInput(filterOptions); + + if (!validJson.valid) return validJson; + return Transfer.transfer(filterOptions); +}; + +export const deposit = async (options: Options): Promise => { + const filterOptions = { ...options, function: "depositDYDX()" }; + const validJson: ValidationResult = await schemaValidator.validateInput(filterOptions); + + if (!validJson.valid) return validJson; + try { + return Deposit.deposit(filterOptions); + } catch (err) { + return err; + } +}; diff --git a/src/helper/Starknet.ts b/src/helper/Starknet.ts index 6bee7ea..232e542 100644 --- a/src/helper/Starknet.ts +++ b/src/helper/Starknet.ts @@ -1,7 +1,7 @@ /* eslint-disable camelcase */ import Web3 from 'web3'; import BN from "bn.js"; -import * as config from '../../configuration/config'; +import config from '../../configuration/config'; interface Call { contractAddress: string; From 1c29fb4c27ff18b89067479683170dc60c6ab62b Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Thu, 19 Dec 2024 17:55:14 +0530 Subject: [PATCH 25/32] circle test convert into typescript --- test/circleTest.ts | 76 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 test/circleTest.ts diff --git a/test/circleTest.ts b/test/circleTest.ts new file mode 100644 index 0000000..e52018a --- /dev/null +++ b/test/circleTest.ts @@ -0,0 +1,76 @@ +import { WalletCircle, prepareTransaction } from '../src/index'; +import dotenv from 'dotenv'; + +interface CircleWalletOptions { + appId: string; + apiKey: string; + userId: string; + walletId: string; + userToken?: string; + encryptionKey?: string; +} + +interface UserTokenResponse { + userToken: string; + encryptionKey: string; +} + +async function initCircleWallet(options: CircleWalletOptions): Promise { + + const userTokenResponse = await WalletCircle.getUserToken(options); + + + const userToken: UserTokenResponse = typeof userTokenResponse === 'string' + ? JSON.parse(userTokenResponse) + : userTokenResponse; + + + const walletOptions = { + ...options, + userToken: userToken.userToken, + encryptionKey: userToken.encryptionKey, + } as Required; + + + const wallet = new WalletCircle(walletOptions); + return wallet; +} + +async function main() { + + dotenv.config(); + + + const wallet = await initCircleWallet({ + appId: process.env.appId as string, + apiKey: process.env.apiKey as string, + userId: process.env.userId as string, + walletId: process.env.walletId as string, + }); + + + const prepareApproveTx = await prepareTransaction('https://api.expand.network/fungibletoken/approve', { + from: "0x6E5eAf34c73D1CD0be4e24f923b97CF38e10d1f3", + tokenAddress: "0xdc31Ee1784292379Fbb2964b3B9C4124D8F89C60", + to: "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", + amount: "10000", + gas: "25000", + xApiKey: process.env.xApiKey as string, + }); + + + const signedTx = await wallet.signTransaction(prepareApproveTx); + + + console.log("signedTx:", signedTx); + + + const tx = await wallet.sendTransaction(signedTx); + + + console.log("sent tx:", tx); +} + +main().catch((error) => { + console.error("An error occurred:", error); +}); From 9c04e2c21409c37901d5d8adda29365f509a129f Mon Sep 17 00:00:00 2001 From: anupam-anand24 Date: Mon, 23 Dec 2024 15:44:37 +0530 Subject: [PATCH 26/32] schema code changed --- configuration/schema.ts | 551 ++++++++++++---------------------------- 1 file changed, 167 insertions(+), 384 deletions(-) diff --git a/configuration/schema.ts b/configuration/schema.ts index fe0453f..6e05d2f 100644 --- a/configuration/schema.ts +++ b/configuration/schema.ts @@ -1,386 +1,169 @@ -/* -* For the functions under chain category, -* the validation is set on the function level -* For example, for funciton getBlock() the request will be same, regardless of the chain ID and symbol -* Whereas for all the other category, validations are broken one level down, i.e. to the protocol level -* -*/ - -export const jsonSchema = { - +/** + * JSON Schema Definition + * For the functions under chain category, + * the validation is set on the function level. + * For example, for function `getBlock()`, the request will be the same, regardless of the chain ID and symbol. + * Whereas for all the other categories, validations are broken one level down, i.e., to the protocol level. + */ + +export const jsonSchema: { + type: string; + allOf: Array<{ + if: { + properties: { + function: { + type: string; + pattern: string; + }; + }; + }; + then: { + properties: Record; + required: string[]; + }; + }>; + } = { type: "object", - allOf: [ - - // Field Mapping for prepareTransaction() function - { - if: { - properties: { - function: { type: "string", pattern: "prepareTransaction()" }, - } - }, - then: { - properties: { - chainId: { type: "string" }, - chainSymbol: { type: "string" }, - xApiKey: { type: "string" }, - rpc: { type: "string" } - - }, - required: ["xApiKey"] - }, - }, - - // Field Mapping for signTransaction() function - { - if: { - properties: { - function: { type: "string", pattern: "signTransaction()" }, - } - }, - then: { - properties: { - rpc: { type: "string" }, - privateKey: { type: "string" }, - chainId: { type: "string" }, - chainSymbol: { type: "string" }, - key: { type: "string" }, - xApiKey: { type: "string" } - }, - required: ["xApiKey"] - }, - }, - - // Field Mapping for transactionObject() function - - { - if: { - properties: { - function: { type: "string", pattern: "transactionObject()" }, - } - }, - then: { - properties: { - from: { type: "string" }, - to: { type: "string" }, - value: { type: "string" }, - gas: { type: "string" }, - data: { type: "string" }, - networkId: { type: "string" } - }, - - required: ["from"] - } - - }, - - // Field Mapping for tontransactionObject() function - - { - if: { - properties: { - function: { type: "string", pattern: "tonTxObject()" }, - } - }, - then: { - properties: { - from: { type: "string" }, - to: { type: "string" }, - value: { type: "string" }, - gas: { type: "string" }, - data: { type: "string" } - }, - - required: [ "to", "value"] - } - - }, - - // Field Mapping for txObjSol() function - - { - if: { - properties: { - function: { type: "string", pattern: "txObjSol()" }, - } - }, - then: { - properties: { - from: { type: "string" }, - to: { type: "string" }, - value: { type: "string" }, - gas: { type: "string" }, - data: { type: "string" }, - }, - - required: ["from", "to"] - } - - }, - - // Field Mapping for sendTransaction() function - { - if: { - properties: { - function: { type: "string", pattern: "sendTransaction()" }, - } - }, - then: { - properties: { - chainId: { type: "string" }, - chainSymbol: { type: "string", maxLength: 7, minLength: 3 }, - rawTransaction: { type: "string" }, - signature: { type: "string" }, - xApiKey: { type: "string" }, - rpc: { type: "string" } - }, - required: ["rawTransaction"] - }, - }, - - { - if: { - properties: { - function: { type: "string", pattern: "TONTransaction()" }, - } - }, - then: { - properties: { - chainId: { type: "string" }, - chainSymbol: { type: "string", maxLength: 7, minLength: 3 }, - rawTransaction: { type: "object" }, - xApiKey: { type: "string" }, - rpc: { type: "string" } - }, - required: ["rawTransaction"] - }, - }, - - { - if: { - properties: { - function: { type: "string", pattern: "FordefiTransaction()" }, - } - }, - then: { - properties: { - data: { type: "string" }, - timestamp: { type: "number" }, - signature: { type: "string" }, - accessToken: { type: "string" }, - }, - required: ["data", "signature", "accessToken", "timestamp"] - }, - }, - - // Fireblocks - - { - if: { - properties: { - function: { type: "string", pattern: "FireblockSign()" }, - } - }, - then: { - properties: { - from: { type: "string" }, - assetId: { type: "string" }, - data: { type: "string" }, - note: { type: "string" }, - amount: { type: "string" } - }, - required: ["from"] - }, - }, - - { - if: { - properties: { - function: { type: "string", pattern: "SendFireblocks()" }, - } - }, - then: { - properties: { - jwt: { type: "string" }, - path: { type: "string" }, - data: { type: "object" }, - method: { type: "string", } - }, - required: ["jwt", "data"] - }, - }, - - // Field Mapping for stellarSignTransaction() function - { - if: { - properties: { - function: { type: "string", pattern: "stellarSignTransaction()" }, - } - }, - then: { - properties: { - chainId: { type: "string" }, - chainSymbol: { type: "string" }, - data: { type: "string" }, - rpc: { type: "string" }, - }, - required: ["data"] - }, - }, - - // Field Mapping for xrplSignTransaction() function - { - if: { - properties: { - function: { type: "string", pattern: "xrplSignTransaction()" }, - } - }, - then: { - properties: { - chainId: { type: "string" }, - chainSymbol: { type: "string" }, - data: { type: "string" }, - rpc: { type: "string" }, - }, - required: ["data"] - }, - }, - - // Field Mapping for userOnboardingDYDX() function - { - if: { - properties: { - function: { type: "string", pattern: "userOnboardingDYDX()" }, - } - }, - then: { - properties: { - privateKey: { type: "string" } - }, - required: ["privateKey"] - }, - }, - - // Field Mapping for signOrderRFQ() function - { - if: { - properties: { - function: { type:"string", pattern: "signOrderRFQ()" }, - } - }, - then: { - properties: { - dexId: { type: "string", enum: ["1900", "1901"], default: "1900" }, - domain: { type: "object" }, - types: { type: "object" }, - values: { type: "object" } - }, - required: ["domain", "types", "values"] - }, - }, - - // Field Mapping for signLimitOrder() function - { - if: { - properties: { - function: { type:"string", pattern: "signLimitOrder()" }, - } - }, - then: { - properties: { - dexId: { type: "string", enum: ["2200", "2201", "2202", "2203", "2204", "2205", "2206", "2207", "2208"], default: "2200" }, - domain: { type: "object" }, - types: { type: "object" }, - message: { type: "object" }, - orderType: { type: "string", enum: ["create", "cancel"], default: "create"}, - }, - required: ["domain", "types", "message"] - }, - }, - - // Field Mapping for placeOrderDYDX() function - { - if: { - properties: { - function: { type: "string", pattern: "placeOrderDYDX()" }, - } - }, - then: { - properties: { - subAccountNumber: { type: "string", pattern: '^[0-9][0-9]*$', "errorMessage": "Value should be positive" }, - mnemonic: { type: "string" }, - market: { type: "string" }, - type: { type: "string", enum: ['LIMIT', 'MARKET'] }, - side: { type: "string", enum: ['SELL', 'BUY'] }, - timeInForce: { type: "string", default: "IOC", enum: ["GTT", "IOC", "FOK"] }, - time: { type: "string", default: "60" }, - price: { type: "string" }, - size: { type: "string" }, - postOnly: { type: "string", default: "false", enum: ["true", "false"] }, - reduceOnly: { type: "string", default: "false", enum: ["true", "false"] }, - triggerPrice: { type: "string", default: "null" }, - }, - required: ["subAccountNumber", "size", "mnemonic", "market", "type", "side", "price"], - }, - }, - - // Field Mapping for cancelOrderDYDX() function - { - if: { - properties: { - function: { type: "string", pattern: "cancelOrderDYDX()" }, - } - }, - then: { - properties: { - subAccountNumber: { type: "string", pattern: '^[0-9][0-9]*$', "errorMessage": "Value should be positive" }, - mnemonic: { type: "string" }, - orderId: { type: "string" }, - goodTillTimeInSeconds: { type: "string", default: '500' } - }, - required: ["subAccountNumber", "mnemonic", "orderId"] - }, - }, - - // Field Mapping for transferDYDX() function - { - if: { - properties: { - function: { type: "string", pattern: "transferDYDX()" }, - } - }, - then: { - properties: { - subAccountNumber: { type: "string", pattern: '^[0-9][0-9]*$', "errorMessage": "Value should be positive" }, - mnemonic: { type: "string" }, - recipient: { type: "string" }, - assetId: { type: "string", default: "0", pattern: '^[0-9][0-9]*$', "errorMessage": "Value should be positive" }, - amount: { type: "string" }, - }, - required: ["subAccountNumber", "mnemonic", "recipient", "amount"] - }, - }, - - // Field Mapping for depositDYDX() function - { - if: { - properties: { - function: { type: "string", pattern: "depositDYDX()" }, - } - }, - then: { - properties: { - amountIn: { type: "string" }, - from: { type: "string" }, - slippage: { type: "string", default: "1" }, - srcChainId: { type: "string", default: "5", enum: ["5", "97", "80001", "420", "43113", "4002"] }, - tokenIn: { type: "string" }, - to: { type: "string" }, - gas: { type: "string", pattern: '^[0-9][0-9]*$', "errorMessage": "Value should be positive" }, - privateKey: { type: "string" }, - }, - required: ["amountIn", "to", "gas", "from", "tokenIn", "privateKey"] - }, - }, - ] -}; \ No newline at end of file + { + if: { + properties: { + function: { type: "string", pattern: "prepareTransaction()" }, + }, + }, + then: { + properties: { + chainId: { type: "string" }, + chainSymbol: { type: "string" }, + xApiKey: { type: "string" }, + rpc: { type: "string" }, + }, + required: ["xApiKey"], + }, + }, + { + if: { + properties: { + function: { type: "string", pattern: "signTransaction()" }, + }, + }, + then: { + properties: { + rpc: { type: "string" }, + privateKey: { type: "string" }, + chainId: { type: "string" }, + chainSymbol: { type: "string" }, + key: { type: "string" }, + xApiKey: { type: "string" }, + }, + required: ["xApiKey"], + }, + }, + { + if: { + properties: { + function: { type: "string", pattern: "transactionObject()" }, + }, + }, + then: { + properties: { + from: { type: "string" }, + to: { type: "string" }, + value: { type: "string" }, + gas: { type: "string" }, + data: { type: "string" }, + networkId: { type: "string" }, + }, + required: ["from"], + }, + }, + { + if: { + properties: { + function: { type: "string", pattern: "tonTxObject()" }, + }, + }, + then: { + properties: { + from: { type: "string" }, + to: { type: "string" }, + value: { type: "string" }, + gas: { type: "string" }, + data: { type: "string" }, + }, + required: ["to", "value"], + }, + }, + { + if: { + properties: { + function: { type: "string", pattern: "txObjSol()" }, + }, + }, + then: { + properties: { + from: { type: "string" }, + to: { type: "string" }, + value: { type: "string" }, + gas: { type: "string" }, + data: { type: "string" }, + }, + required: ["from", "to"], + }, + }, + { + if: { + properties: { + function: { type: "string", pattern: "sendTransaction()" }, + }, + }, + then: { + properties: { + chainId: { type: "string" }, + chainSymbol: { type: "string", maxLength: 7, minLength: 3 }, + rawTransaction: { type: "string" }, + signature: { type: "string" }, + xApiKey: { type: "string" }, + rpc: { type: "string" }, + }, + required: ["rawTransaction"], + }, + }, + { + if: { + properties: { + function: { type: "string", pattern: "TONTransaction()" }, + }, + }, + then: { + properties: { + chainId: { type: "string" }, + chainSymbol: { type: "string", maxLength: 7, minLength: 3 }, + rawTransaction: { type: "object" }, + xApiKey: { type: "string" }, + rpc: { type: "string" }, + }, + required: ["rawTransaction"], + }, + }, + { + if: { + properties: { + function: { type: "string", pattern: "FordefiTransaction()" }, + }, + }, + then: { + properties: { + data: { type: "string" }, + timestamp: { type: "number" }, + signature: { type: "string" }, + accessToken: { type: "string" }, + }, + required: ["data", "signature", "accessToken", "timestamp"], + }, + }, + // Add the rest of the JSON schema mappings here + // Following the same pattern as the mappings above + ], + }; + \ No newline at end of file From 42fb49ef0f4f9ab33cf2e5f9859c11d6501cc0ca Mon Sep 17 00:00:00 2001 From: Tek Raj Joshi Date: Thu, 2 Jan 2025 12:15:19 +0530 Subject: [PATCH 27/32] type issues fixed --- src/adapters/WalletBitcoin/index.ts | 8 +++----- src/adapters/WalletDFNS/index.ts | 6 +++--- src/adapters/WalletFordefi/index.ts | 4 ++-- src/index.ts | 2 ++ src/interfaces/index.ts | 4 +++- 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/adapters/WalletBitcoin/index.ts b/src/adapters/WalletBitcoin/index.ts index 4b99fe7..71348a9 100644 --- a/src/adapters/WalletBitcoin/index.ts +++ b/src/adapters/WalletBitcoin/index.ts @@ -7,24 +7,22 @@ import * as schemaValidator from "../../../configuration/schemaValidator"; import * as common from "../../../configuration/common"; import config from "../../../configuration/config"; -import { networks } from "bitcoinjs-lib"; - interface WalletBitcoinOptions { privateKey: string; xApiKey: string; } interface TransactionOptions { - chainSymbol: string; + chainSymbol?: string; to: string; - value: number; + value: string; utxo: { txId: string; vout: number; value: number }; chainId?: string; [key: string]: any; } interface GetKeysOptions { - chainSymbol: string; + chainSymbol?: string; mnemonic: string; chainId?: string; [key: string]: any; diff --git a/src/adapters/WalletDFNS/index.ts b/src/adapters/WalletDFNS/index.ts index a96dd9f..109d390 100644 --- a/src/adapters/WalletDFNS/index.ts +++ b/src/adapters/WalletDFNS/index.ts @@ -20,9 +20,9 @@ type WalletDFNSOptions = { }; type TransactionObject = { - chainId: number; - chainSymbol: string; - rawTransaction: any; + chainId: string; + chainSymbol?: string; + rawTransaction?: any; to: string; value: string; gas: string; diff --git a/src/adapters/WalletFordefi/index.ts b/src/adapters/WalletFordefi/index.ts index f455e67..602f860 100644 --- a/src/adapters/WalletFordefi/index.ts +++ b/src/adapters/WalletFordefi/index.ts @@ -12,8 +12,8 @@ interface WalletOptions { } interface TransactionObject { - chainId: number; - chainSymbol: string; + chainId: string; + chainSymbol?: string; [key: string]: any; } diff --git a/src/index.ts b/src/index.ts index 7eadbf5..dabbe55 100644 --- a/src/index.ts +++ b/src/index.ts @@ -14,6 +14,7 @@ import { WalletStellar, WalletXRPL, WalletStacks, + WalletBitcoin } from "./interfaces/index"; export const prepareTransaction = async (apiURL:any, options:any) => { @@ -86,4 +87,5 @@ export { WalletStellar, WalletXRPL, WalletStacks, + WalletBitcoin }; diff --git a/src/interfaces/index.ts b/src/interfaces/index.ts index 570d4ff..a7d5ae1 100644 --- a/src/interfaces/index.ts +++ b/src/interfaces/index.ts @@ -10,6 +10,7 @@ import { WalletCosmos } from "../adapters/WalletCosmos"; import { WalletStellar } from '../adapters/WalletStellar'; import { WalletXRPL } from '../adapters/WalletXRPL'; import { WalletStacks } from '../adapters/WalletStacks'; +import { WalletBitcoin } from '../adapters/WalletBitcoin'; export { Wallet, @@ -23,5 +24,6 @@ export { WalletStellar, WalletXRPL, WalletCosmos, - WalletStacks + WalletStacks, + WalletBitcoin }; \ No newline at end of file From 45b9b4b77474c349c3a1489f34a9e13699c7314e Mon Sep 17 00:00:00 2001 From: anupam18 Date: Wed, 2 Jul 2025 11:39:31 +0530 Subject: [PATCH 28/32] code change into typescript --- configuration/config.ts | 71 ++- configuration/intialiseWeb3.ts | 203 +++--- configuration/schema.ts | 608 ++++++++++++++---- configuration/schemaValidator.ts | 3 - package-lock.json | 1017 ++++++++++++------------------ src/helper/batchRequest.ts | 77 +++ src/stellar/getAllAssets.ts | 119 ++++ src/stellar/getAsset.ts | 145 +++++ src/stellar/getOwnerAssets.ts | 160 +++++ src/stellar/helpers.ts | 58 ++ test/batchTransactionTest.ts | 149 +++++ test/swapTest.ts | 8 +- 12 files changed, 1784 insertions(+), 834 deletions(-) create mode 100644 src/helper/batchRequest.ts create mode 100644 src/stellar/getAllAssets.ts create mode 100644 src/stellar/getAsset.ts create mode 100644 src/stellar/getOwnerAssets.ts create mode 100644 src/stellar/helpers.ts create mode 100644 test/batchTransactionTest.ts diff --git a/configuration/config.ts b/configuration/config.ts index ee4805a..df22375 100644 --- a/configuration/config.ts +++ b/configuration/config.ts @@ -14,6 +14,7 @@ type ChainConfig = { gasPrice?: string; network?: string; fee?: number; + sorobanRpc?:string; }; type FireblocksConfig = { @@ -27,6 +28,9 @@ type ChainConfig = { type UrlConfig = { apiurl:string; } + type localurlConfig = { + apiurl:string; + } type DexesConfig = { localName?: string; @@ -34,6 +38,9 @@ type ChainConfig = { chainId: string; dexName: string; localDexName?: string; + chainSymbol?:string; + routerAddress?:string; + factoryAddress?:string; }; type DYdXConfig = { @@ -45,15 +52,27 @@ type ChainConfig = { rpc : string; }; + type contract_addressConfig = { + UNISWAPV2: string; + WETH : string; + DAI : string; + }; + + type rpc_urlConfig = { + sepolia:string; + } type Config = { chains: Record; fireblocks: FireblocksConfig; circleProgrammableWallet : CircleProgrammableWalletConfig; url: UrlConfig; + localurl: localurlConfig; Mask250: string; dexes : Record; dYdXV4: DYdXConfig; + contract_address: contract_addressConfig; + rpc_url: rpc_urlConfig; }; @@ -222,8 +241,8 @@ const config: Config = { "localName": "SuiTestnet", "chainName": "Sui", "chainSymbol": "TSUI", - "rpc": "https://fullnode.testnet.sui.io:443", - "publicRpc": "https://fullnode.testnet.sui.io:443" + "rpc": "https://fullnode.testnet.sui.io", + "publicRpc": "https://rpc.ankr.com/sui_testnet" }, "1400": { "localName": "Aptos", @@ -322,14 +341,16 @@ const config: Config = { "chainName": "Stellar", "chainSymbol": "XLM", "rpc": "https://horizon.stellar.org", - "networkPassphrase": "Public Global Stellar Network ; September 2015" + "networkPassphrase": "Public Global Stellar Network ; September 2015", + "sorobanRpc": "https://mainnet.sorobanrpc.com" }, "1501": { "localName": "StellarTestnet", "chainName": "Stellar", "chainSymbol": "TXLM", "networkPassphrase": "Test SDF Network ; September 2015", - "rpc": "https://horizon-testnet.stellar.org" + "rpc": "https://horizon-testnet.stellar.org", + "sorobanRpc": "https://soroban-rpc.testnet.stellar.gateway.fm" }, "cosmoshub-4": { "localName": "cosmoshub_mainnet", @@ -384,6 +405,16 @@ const config: Config = { "chainSymbol": "TBTC", "network": "testnet", "fee": 2000 + }, + "5000": { + "localName": "Mantle", + "chainName": "Evm", + "chainSymbol": "MNT" + }, + "5003": { + "localName": "MantleTestnetSepolia", + "chainName": "Evm", + "chainSymbol": "TMNT" } }, "fireblocks": { @@ -395,7 +426,10 @@ const config: Config = { }, "Mask250": "3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "url": { - "apiurl" : "https://api.expand.network" + "apiurl": "https://api.expand.network/" + }, + "localurl": { + "apiurl": "http://localhost:3000/" }, "dexes": { "1900": { @@ -410,6 +444,24 @@ const config: Config = { "chainName": "Ethereum", "chainId": "5" }, + "1000": { + "localName": "UniswapV2", + "dexName": "UniswapV2", + "chainName": "Ethereum", + "chainId": "1", + "chainSymbol": "EVM", + "routerAddress": "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", + "factoryAddress": "0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f" + }, + "1100": { + "localName": "SushiswapV2", + "dexName": "SushiswapV2", + "chainName": "Ethereum", + "chainId": "1", + "chainSymbol": "EVM", + "routerAddress": "0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F", + "factoryAddress": "0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac" + }, "2200": { "dexName": "Kyberswap", "localDexName": "Kyberswap", @@ -465,7 +517,6 @@ const config: Config = { "chainId": "25" } }, - "dYdXV4": { "chainId": "dydx-testnet-4", "USDC": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5", @@ -500,6 +551,14 @@ const config: Config = { "action": "dYdX Chain Onboarding" } } + }, + "contract_address": { + "UNISWAPV2": "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", + "WETH": "0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14", + "DAI": "0x6B175474E89094C44Da98b954EedeAC495271d0F" + }, + "rpc_url": { + "sepolia": "https://sepolia.infura.io/v3/fc5d23096e754d64a5f261f5f07170d5" } }; diff --git a/configuration/intialiseWeb3.ts b/configuration/intialiseWeb3.ts index 020e967..c745061 100644 --- a/configuration/intialiseWeb3.ts +++ b/configuration/intialiseWeb3.ts @@ -1,79 +1,138 @@ -import EvmWeb from "web3"; -import solanaWeb from "@solana/web3.js"; -import TronWeb from "tronweb"; -import nearApi from "near-api-js"; -import algosdk from "algosdk"; -import { JsonRpcProvider, Connection } from "@mysten/sui.js"; -import { AptosClient } from "aptos"; +import EvmWeb from 'web3'; +import { Connection } from '@solana/web3.js'; +import TronWeb, { providers } from 'tronweb'; +import * as nearApi from 'near-api-js'; +import * as algosdk from 'algosdk'; +import { SuiClient } from '@mysten/sui/client'; +import { AptosClient } from 'aptos'; import { TonClient } from "@ton/ton"; import { StargateClient } from "@cosmjs/stargate"; -import StellarSdk from "stellar-sdk"; -import * as common from "./common"; -import config from "./config"; -import errorMessage from "./errorMessage"; +import { Horizon } from 'stellar-sdk'; -import Server from "stellar-sdk"; +import * as common from './common'; +import config from './config'; +import errorMessage from './errorMessage.json'; -const invalidChainId = { - error: errorMessage.error.message.invalidChainId, - code: errorMessage.error.code.invalidInput +// Define interfaces for your data structures +interface InitializeWeb3Data { + chainId?: string | number; + chainSymbol?: string; + rpc?: string; + networkId?: string; + key?: string; + connectionType?: string; +} + +interface ErrorResponse { + error: string; + code: string | number; +} + +interface ChainConfig { + localName: string; + chainName: string; + chainSymbol: string; + rpc?: string; + apiKey?: string; +} + +interface RpcUrls { + [key: string]: string; +} + + +interface Config { + chains: { + [key: string]: ChainConfig; + }; + rpc_url: RpcUrls; +} + +// Type for the web3 instance which can be any of the supported clients +type Web3Instance = + | EvmWeb + | Connection + | TronWeb + | nearApi.Near + | algosdk.Algodv2 + | algosdk.Indexer + | SuiClient + | AptosClient + | TonClient + | Horizon.Server + | StargateClient; + +const invalidChainId: ErrorResponse = { + error: errorMessage.error.message.invalidChainId, + code: errorMessage.error.code.invalidInput }; -export const initialiseWeb3 = async (data: any) => { - const chainId = await common.getChainId({ - chainId: data.chainId, - chainSymbol: data.chainSymbol - }); - - if (!chainId) { - return invalidChainId; // Return an error if chainId is null - } - - let rpc:any; - let chainName:any; - - try { - rpc = data.rpc || config.chains[chainId].rpc; - chainName = config.chains[chainId].chainName; - } catch (error) { - return invalidChainId; - } - - let web3:any; - - if (chainName === "Evm") { - web3 = new EvmWeb(rpc); - } else if (chainName === "Solana") { - web3 = new solanaWeb.Connection(rpc); - } else if (chainName === "Tron") { - const HttpProvider = TronWeb.providers.HttpProvider; - const fullNode = new HttpProvider(rpc); - const solidityNode = new HttpProvider(rpc); - const eventServer = new HttpProvider(rpc); - web3 = new TronWeb(fullNode, solidityNode, eventServer); - } else if (chainName === "Near") { - web3 = await nearApi.connect({ - networkId: data.networkId, - nodeUrl: rpc +export const initialiseWeb3 = async (data: InitializeWeb3Data): Promise => { + /* + * Initialise a web3 depending on the chain Id or chain Symbol + */ + const chainId = await common.getChainId({ + chainId: data.chainId, + chainSymbol: data.chainSymbol }); - } else if (chainName === "Algorand") { - const token = { "x-api-key": data.key }; - web3 = - data.connectionType === "idx" - ? new algosdk.Indexer(token, rpc, "") - : new algosdk.Algodv2(token, rpc, ""); - } else if (chainName === "Sui") { - const connection = new Connection({ fullnode: rpc }); - web3 = new JsonRpcProvider(connection); - } else if (chainName === "Aptos") { - web3 = new AptosClient(rpc); - } else if (chainName === "TON") { - web3 = new TonClient({ endpoint: rpc, apiKey: config.chains[chainId]?.apiKey }); - } else if (chainName === "Stellar") { - web3 = new StellarSdk.Server(rpc); - } else if (chainName === "Cosmos") { - web3 = await StargateClient.connect(rpc); - } - - return web3; -}; + + if(!chainId){ + return invalidChainId; + } + + let rpc: any; + let chainName: any; + + try { + rpc = data.rpc || config.chains[chainId].rpc; + chainName = config.chains[chainId].chainName; + } catch (error) { + return invalidChainId; + } + + let web3: any; + + if (chainName === 'Evm') { + web3 = new EvmWeb(rpc); + } else if (chainName === 'Solana') { + web3 = new Connection(rpc); + } else if (chainName === 'Tron') { + const { HttpProvider } = providers; + const fullNode = new HttpProvider(rpc); + const solidityNode = new HttpProvider(rpc); + const eventServer = new HttpProvider(rpc); + web3 = new TronWeb(fullNode, solidityNode, eventServer); + } else if (chainName === 'Near') { + web3 = await nearApi.connect({ + networkId: data.networkId || '', + nodeUrl: rpc + }); + } else if (chainName === 'Algorand') { + const token = { + "x-api-key": data.key || '' + }; + + if (data.connectionType === 'idx') { + web3 = new algosdk.Indexer(token, rpc, ""); + } else { + web3 = new algosdk.Algodv2(token, rpc, ""); + } + } else if (chainName === 'Sui') { + web3 = new SuiClient({ url: config.chains[chainId].rpc || '' }); + } else if (chainName === 'Aptos') { + web3 = new AptosClient(rpc); + } else if (chainName === 'TON') { + web3 = new TonClient({ + endpoint: rpc, + apiKey: config.chains[chainId].apiKey + }); + } else if (chainName === 'Stellar') { + web3 = new Horizon.Server(rpc); + } else if (chainName === "Cosmos") { + web3 = await StargateClient.connect(rpc); + } else { + return invalidChainId; + } + + return web3; +}; \ No newline at end of file diff --git a/configuration/schema.ts b/configuration/schema.ts index 6e05d2f..9132b11 100644 --- a/configuration/schema.ts +++ b/configuration/schema.ts @@ -1,169 +1,511 @@ -/** - * JSON Schema Definition - * For the functions under chain category, - * the validation is set on the function level. - * For example, for function `getBlock()`, the request will be the same, regardless of the chain ID and symbol. - * Whereas for all the other categories, validations are broken one level down, i.e., to the protocol level. - */ export const jsonSchema: { - type: string; - allOf: Array<{ - if: { - properties: { - function: { - type: string; - pattern: string; - }; + type: string; + allOf: Array<{ + if: { + properties: { + function: { + type: string; + pattern: string; }; }; + }; + then: { + properties: Record } + >; + required: string[]; + }; + }>; +} = { + type: "object", + allOf: [ + { + if: { + properties: { + function: { type: "string", pattern: "prepareTransaction()" }, + }, + }, then: { - properties: Record; - required: string[]; - }; - }>; - } = { - type: "object", - allOf: [ - { - if: { - properties: { - function: { type: "string", pattern: "prepareTransaction()" }, - }, + properties: { + chainId: { type: "string" }, + chainSymbol: { type: "string" }, + xApiKey: { type: "string" }, + rpc: { type: "string" }, }, - then: { - properties: { - chainId: { type: "string" }, - chainSymbol: { type: "string" }, - xApiKey: { type: "string" }, - rpc: { type: "string" }, - }, - required: ["xApiKey"], + required: ["xApiKey"], + }, + }, + { + if: { + properties: { + function: { type: "string", pattern: "signTransaction()" }, }, }, - { - if: { - properties: { - function: { type: "string", pattern: "signTransaction()" }, - }, + then: { + properties: { + rpc: { type: "string" }, + privateKey: { type: "string" }, + chainId: { type: "string" }, + chainSymbol: { type: "string" }, + key: { type: "string" }, + xApiKey: { type: "string" }, }, - then: { - properties: { - rpc: { type: "string" }, - privateKey: { type: "string" }, - chainId: { type: "string" }, - chainSymbol: { type: "string" }, - key: { type: "string" }, - xApiKey: { type: "string" }, - }, - required: ["xApiKey"], + required: ["xApiKey"], + }, + }, + { + if: { + properties: { + function: { type: "string", pattern: "transactionObject()" }, }, }, - { - if: { - properties: { - function: { type: "string", pattern: "transactionObject()" }, - }, + then: { + properties: { + from: { type: "string" }, + to: { type: "string" }, + value: { type: "string" }, + gas: { type: "string" }, + data: { type: "string" }, + networkId: { type: "string" }, }, - then: { - properties: { - from: { type: "string" }, - to: { type: "string" }, - value: { type: "string" }, - gas: { type: "string" }, - data: { type: "string" }, - networkId: { type: "string" }, - }, - required: ["from"], + required: ["from"], + }, + }, + { + if: { + properties: { + function: { type: "string", pattern: "tonTxObject()" }, }, }, - { - if: { - properties: { - function: { type: "string", pattern: "tonTxObject()" }, - }, + then: { + properties: { + from: { type: "string" }, + to: { type: "string" }, + value: { type: "string" }, + gas: { type: "string" }, + data: { type: "string" }, }, - then: { - properties: { - from: { type: "string" }, - to: { type: "string" }, - value: { type: "string" }, - gas: { type: "string" }, - data: { type: "string" }, - }, - required: ["to", "value"], + required: ["to", "value"], + }, + }, + { + if: { + properties: { + function: { type: "string", pattern: "txObjSol()" }, }, }, - { - if: { - properties: { - function: { type: "string", pattern: "txObjSol()" }, - }, + then: { + properties: { + from: { type: "string" }, + to: { type: "string" }, + value: { type: "string" }, + gas: { type: "string" }, + data: { type: "string" }, + }, + required: ["from", "to"], + }, + }, + { + if: { + properties: { + function: { type: "string", pattern: "sendTransaction()" }, + }, + }, + then: { + properties: { + chainId: { type: "string" }, + chainSymbol: { type: "string", maxLength: 7, minLength: 3 }, + rawTransaction: { type: "string" }, + signature: { type: "string" }, + xApiKey: { type: "string" }, + rpc: { type: "string" }, + }, + required: ["rawTransaction"], + }, + }, + { + if: { + properties: { + function: { type: "string", pattern: "stellarDecodeTransaction()" }, + }, + }, + then: { + properties: { + chainId: { type: "string" }, + transactionHash: { type: "string" }, + }, + required: ["chainId", "rawTransaction"], + }, + }, + { + if: { + properties: { + function: { type: "string", pattern: "TONTransaction()" }, + }, + }, + then: { + properties: { + chainId: { type: "string" }, + chainSymbol: { type: "string", maxLength: 7, minLength: 3 }, + rawTransaction: { type: "object" }, + xApiKey: { type: "string" }, + rpc: { type: "string" }, + }, + required: ["rawTransaction"], + }, + }, + { + if: { + properties: { + function: { type: "string", pattern: "FordefiTransaction()" }, + }, + }, + then: { + properties: { + data: { type: "string" }, + timestamp: { type: "number" }, + signature: { type: "string" }, + accessToken: { type: "string" }, + }, + required: ["data", "signature", "accessToken", "timestamp"], + }, + }, + { + if: { + properties: { + function: { type: "string", pattern: "FireblockSign()" }, + }, + }, + then: { + properties: { + from: { type: "string" }, + assetId: { type: "string" }, + data: { type: "string" }, + note: { type: "string" }, + amount: { type: "string" }, + }, + required: ["from"], + }, + }, + + { + if: { + properties: { + function: { type: "string", pattern: "SendFireblocks()" }, + }, + }, + then: { + properties: { + jwt: { type: "string" }, + path: { type: "string" }, + data: { type: "object" }, + method: { type: "string" }, + }, + required: ["jwt", "data"], + }, + }, + + // Field Mapping for stellarSignTransaction() function + { + if: { + properties: { + function: { type: "string", pattern: "stellarSignTransaction()" }, + }, + }, + then: { + properties: { + chainId: { type: "string" }, + chainSymbol: { type: "string" }, + data: { type: "string" }, + rpc: { type: "string" }, }, - then: { - properties: { - from: { type: "string" }, - to: { type: "string" }, - value: { type: "string" }, - gas: { type: "string" }, - data: { type: "string" }, + required: ["data"], + }, + }, + + // Field Mapping for xrplSignTransaction() function + { + if: { + properties: { + function: { type: "string", pattern: "xrplSignTransaction()" }, + }, + }, + then: { + properties: { + chainId: { type: "string" }, + chainSymbol: { type: "string" }, + data: { type: "string" }, + rpc: { type: "string" }, + }, + required: ["data"], + }, + }, + + // Field Mapping for BTCSignTransaction() function + { + if: { + properties: { + function: { type: "string", pattern: "BTCSignTransaction()" }, + }, + }, + then: { + properties: { + chainId: { type: "string" }, + chainSymbol: { type: "string" }, + to: { type: "string" }, + value: { type: "string" }, + utxo: { type: "object" }, + }, + required: ["to", "value", "utxo"], + }, + }, + + // Field Mapping for stacksSignTransaction() function + { + if: { + properties: { + function: { type: "string", pattern: "stacksSignTransaction()" }, + }, + }, + then: { + properties: { + chainId: { type: "string" }, + chainSymbol: { type: "string" }, + from: { type: "string" }, + to: { type: "string" }, + value: { + type: "string", + pattern: "^[0-9][0-9]*$", + errorMessage: "Value should be positive", }, - required: ["from", "to"], + message: { type: "string" }, + }, + required: [], + }, + }, + + // Field Mapping for userOnboardingDYDX() function + { + if: { + properties: { + function: { type: "string", pattern: "userOnboardingDYDX()" }, + }, + }, + then: { + properties: { + privateKey: { type: "string" }, + }, + required: ["privateKey"], + }, + }, + + // Field Mapping for signOrderRFQ() function + { + if: { + properties: { + function: { type: "string", pattern: "signOrderRFQ()" }, + }, + }, + then: { + properties: { + dexId: { type: "string", enum: ["1900", "1901"], default: "1900" }, + domain: { type: "object" }, + types: { type: "object" }, + values: { type: "object" }, }, + required: ["domain", "types", "values"], }, - { - if: { - properties: { - function: { type: "string", pattern: "sendTransaction()" }, + }, + + // Field Mapping for signLimitOrder() function + { + if: { + properties: { + function: { type: "string", pattern: "signLimitOrder()" }, + }, + }, + then: { + properties: { + dexId: { + type: "string", + enum: [ + "2200", + "2201", + "2202", + "2203", + "2204", + "2205", + "2206", + "2207", + "2208", + ], + default: "2200", }, + domain: { type: "object" }, + types: { type: "object" }, + message: { type: "object" }, + orderType: { + type: "string", + enum: ["create", "cancel"], + default: "create", + }, + }, + required: ["domain", "types", "message"], + }, + }, + + // Field Mapping for placeOrderDYDX() function + { + if: { + properties: { + function: { type: "string", pattern: "placeOrderDYDX()" }, }, - then: { - properties: { - chainId: { type: "string" }, - chainSymbol: { type: "string", maxLength: 7, minLength: 3 }, - rawTransaction: { type: "string" }, - signature: { type: "string" }, - xApiKey: { type: "string" }, - rpc: { type: "string" }, + }, + then: { + properties: { + subAccountNumber: { + type: "string", + pattern: "^[0-9][0-9]*$", + errorMessage: "Value should be positive", }, - required: ["rawTransaction"], + mnemonic: { type: "string" }, + market: { type: "string" }, + type: { type: "string", enum: ["LIMIT", "MARKET"] }, + side: { type: "string", enum: ["SELL", "BUY"] }, + timeInForce: { + type: "string", + default: "IOC", + enum: ["GTT", "IOC", "FOK"], + }, + time: { type: "string", default: "60" }, + price: { type: "string" }, + size: { type: "string" }, + postOnly: { + type: "string", + default: "false", + enum: ["true", "false"], + }, + reduceOnly: { + type: "string", + default: "false", + enum: ["true", "false"], + }, + triggerPrice: { type: "string", default: "null" }, + }, + required: [ + "subAccountNumber", + "size", + "mnemonic", + "market", + "type", + "side", + "price", + ], + }, + }, + + // Field Mapping for cancelOrderDYDX() function + { + if: { + properties: { + function: { type: "string", pattern: "cancelOrderDYDX()" }, }, }, - { - if: { - properties: { - function: { type: "string", pattern: "TONTransaction()" }, + then: { + properties: { + subAccountNumber: { + type: "string", + pattern: "^[0-9][0-9]*$", + errorMessage: "Value should be positive", }, + mnemonic: { type: "string" }, + orderId: { type: "string" }, + goodTillTimeInSeconds: { type: "string", default: "500" }, }, - then: { - properties: { - chainId: { type: "string" }, - chainSymbol: { type: "string", maxLength: 7, minLength: 3 }, - rawTransaction: { type: "object" }, - xApiKey: { type: "string" }, - rpc: { type: "string" }, + required: ["subAccountNumber", "mnemonic", "orderId"], + }, + }, + + // Field Mapping for transferDYDX() function + { + if: { + properties: { + function: { type: "string", pattern: "transferDYDX()" }, + }, + }, + then: { + properties: { + subAccountNumber: { + type: "string", + pattern: "^[0-9][0-9]*$", + errorMessage: "Value should be positive", }, - required: ["rawTransaction"], + mnemonic: { type: "string" }, + recipient: { type: "string" }, + assetId: { + type: "string", + default: "0", + pattern: "^[0-9][0-9]*$", + errorMessage: "Value should be positive", + }, + amount: { type: "string" }, + }, + required: ["subAccountNumber", "mnemonic", "recipient", "amount"], + }, + }, + + // Field Mapping for depositDYDX() function + { + if: { + properties: { + function: { type: "string", pattern: "depositDYDX()" }, }, }, - { - if: { - properties: { - function: { type: "string", pattern: "FordefiTransaction()" }, + then: { + properties: { + amountIn: { type: "string" }, + from: { type: "string" }, + slippage: { type: "string", default: "1" }, + srcChainId: { + type: "string", + default: "5", + enum: ["5", "97", "80001", "420", "43113", "4002"], + }, + tokenIn: { type: "string" }, + to: { type: "string" }, + gas: { + type: "string", + pattern: "^[0-9][0-9]*$", + errorMessage: "Value should be positive", }, + privateKey: { type: "string" }, }, - then: { - properties: { - data: { type: "string" }, - timestamp: { type: "number" }, - signature: { type: "string" }, - accessToken: { type: "string" }, + required: ["amountIn", "to", "gas", "from", "tokenIn", "privateKey"], + }, + }, + + // Field Mapping for batchTransactions() function + { + if: { + properties: { + function: { type: "string", pattern: "batchTransactions()" }, + }, + }, + then: { + properties: { + chainId: { type: "string" }, + chainSymbol: { type: "string" }, + transactions: { + anyOf: [ + { type: "object" }, + { type: "array", items: { type: "object" } }, + ], }, - required: ["data", "signature", "accessToken", "timestamp"], }, + required: ["transactions"], }, - // Add the rest of the JSON schema mappings here - // Following the same pattern as the mappings above - ], - }; - \ No newline at end of file + }, + ], +}; diff --git a/configuration/schemaValidator.ts b/configuration/schemaValidator.ts index 03904c5..d3e45eb 100644 --- a/configuration/schemaValidator.ts +++ b/configuration/schemaValidator.ts @@ -1,6 +1,3 @@ -// Copyright 2022 The CmLab Authors -// This file is part of the expand Library. - import Ajv from "ajv"; import addErrors from "ajv-errors"; import errorMessage from "./errorMessage"; diff --git a/package-lock.json b/package-lock.json index 05302b3..4da1d48 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,8 +18,7 @@ "@dfns/sdk-keysigner": "^0.4.3", "@dydxprotocol/v4-client-js": "1.1.25", "@ethereumjs/common": "4.1.0", - "@mysten/bcs": "0.11.1", - "@mysten/sui.js": "0.32.1", + "@mysten/sui": "1.21.2", "@noble/curves": "^1.3.0", "@noble/secp256k1": "^2.0.0", "@project-serum/anchor": "^0.26.0", @@ -32,6 +31,7 @@ "@stacks/network": "^6.16.0", "@stacks/transactions": "^6.16.1", "@stacks/wallet-sdk": "^6.17.0", + "@stellar/stellar-sdk": "^13.0.0", "@ton/ton": "^13.9.0", "ajv": "8.12.0", "ajv-errors": "3.0.0", @@ -46,6 +46,7 @@ "bs58": "5.0.0", "dotenv": "^16.3.1", "ecpair": "2.1.0", + "ed25519-hd-key": "^1.3.0", "ethereum-cryptography": "^2.0.0", "ethereumjs-tx": "2.1.2", "ethers": "6.13.1", @@ -80,6 +81,34 @@ "uuid": "^11.0.3" } }, + "node_modules/@0no-co/graphql.web": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.1.2.tgz", + "integrity": "sha512-N2NGsU5FLBhT8NZ+3l2YrzZSHITjNXNuDhC4iDiikv0IujaJ0Xc6xIxQZ/Ek3Cb+rgPjnLHYyJm11tInuJn+cw==", + "license": "MIT", + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "graphql": { + "optional": true + } + } + }, + "node_modules/@0no-co/graphqlsp": { + "version": "1.12.16", + "resolved": "https://registry.npmjs.org/@0no-co/graphqlsp/-/graphqlsp-1.12.16.tgz", + "integrity": "sha512-B5pyYVH93Etv7xjT6IfB7QtMBdaaC07yjbhN6v8H7KgFStMkPvi+oWYBTibMFRMY89qwc9H8YixXg8SXDVgYWw==", + "license": "MIT", + "dependencies": { + "@gql.tada/internal": "^1.0.0", + "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0" + }, + "peerDependencies": { + "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", + "typescript": "^5.0.0" + } + }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", @@ -2442,6 +2471,54 @@ "@ethersproject/strings": "^5.7.0" } }, + "node_modules/@gql.tada/cli-utils": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@gql.tada/cli-utils/-/cli-utils-1.6.3.tgz", + "integrity": "sha512-jFFSY8OxYeBxdKi58UzeMXG1tdm4FVjXa8WHIi66Gzu9JWtCE6mqom3a8xkmSw+mVaybFW5EN2WXf1WztJVNyQ==", + "license": "MIT", + "dependencies": { + "@0no-co/graphqlsp": "^1.12.13", + "@gql.tada/internal": "1.0.8", + "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0" + }, + "peerDependencies": { + "@0no-co/graphqlsp": "^1.12.13", + "@gql.tada/svelte-support": "1.0.1", + "@gql.tada/vue-support": "1.0.1", + "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "@gql.tada/svelte-support": { + "optional": true + }, + "@gql.tada/vue-support": { + "optional": true + } + } + }, + "node_modules/@gql.tada/internal": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@gql.tada/internal/-/internal-1.0.8.tgz", + "integrity": "sha512-XYdxJhtHC5WtZfdDqtKjcQ4d7R1s0d1rnlSs3OcBEUbYiPoJJfZU7tWsVXuv047Z6msvmr4ompJ7eLSK5Km57g==", + "license": "MIT", + "dependencies": { + "@0no-co/graphql.web": "^1.0.5" + }, + "peerDependencies": { + "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", + "typescript": "^5.0.0" + } + }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "license": "MIT", + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.13", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", @@ -2915,115 +2992,94 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, - "node_modules/@mswjs/cookies": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@mswjs/cookies/-/cookies-0.2.2.tgz", - "integrity": "sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g==", - "dependencies": { - "@types/set-cookie-parser": "^2.4.0", - "set-cookie-parser": "^2.4.6" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@mswjs/interceptors": { - "version": "0.17.10", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.17.10.tgz", - "integrity": "sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw==", + "node_modules/@mysten/bcs": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@mysten/bcs/-/bcs-1.4.0.tgz", + "integrity": "sha512-YwDYspceLt8b7v6ohPvy8flQEi+smtfSG5d2A98CbUA48XBmOqTSPNmpw9wsZVVnrH2avr+BS5uVhDZT+EquYA==", + "license": "Apache-2.0", "dependencies": { - "@open-draft/until": "^1.0.3", - "@types/debug": "^4.1.7", - "@xmldom/xmldom": "^0.8.3", - "debug": "^4.3.3", - "headers-polyfill": "3.2.5", - "outvariant": "^1.2.1", - "strict-event-emitter": "^0.2.4", - "web-encoding": "^1.1.5" - }, - "engines": { - "node": ">=14" + "bs58": "^6.0.0" } }, - "node_modules/@mswjs/interceptors/node_modules/strict-event-emitter": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.2.8.tgz", - "integrity": "sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A==", - "dependencies": { - "events": "^3.3.0" - } + "node_modules/@mysten/bcs/node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" }, - "node_modules/@mysten/bcs": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@mysten/bcs/-/bcs-0.11.1.tgz", - "integrity": "sha512-xP85isNSYUCHd3O/g+TmZYmg4wK6cU8q/n/MebkIGP4CYVJZz2wU/G24xIZ3wI+0iTop4dfgA5kYrg/DQKCUzA==", + "node_modules/@mysten/bcs/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", "dependencies": { - "bs58": "^5.0.0" + "base-x": "^5.0.0" } }, - "node_modules/@mysten/sui.js": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@mysten/sui.js/-/sui.js-0.32.1.tgz", - "integrity": "sha512-HD3D/3g//dx5e/1W42krEv4+Zl5PP0faH229jFOhnOktIRGxRrDfb6eU2+juclTug2e68JseTiX2QulIh+2/FQ==", + "node_modules/@mysten/sui": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/@mysten/sui/-/sui-1.21.2.tgz", + "integrity": "sha512-8AesvczokAUv796XiOo8af2+1IYA9bRon11Ra+rwehvqhz+sMRT8A+Cw5sDnlSc9/aQwM51JQKUnvMczNbpfYA==", + "license": "Apache-2.0", "dependencies": { - "@mysten/bcs": "0.7.0", - "@noble/curves": "^0.9.0", - "@noble/hashes": "^1.3.0", - "@scure/bip32": "^1.2.0", - "@scure/bip39": "^1.2.0", + "@graphql-typed-document-node/core": "^3.2.0", + "@mysten/bcs": "1.4.0", + "@noble/curves": "^1.4.2", + "@noble/hashes": "^1.4.0", + "@scure/bip32": "^1.4.0", + "@scure/bip39": "^1.3.0", "@suchipi/femver": "^1.0.0", - "jayson": "^4.0.0", - "msw": "^1.2.1", - "rpc-websockets": "^7.5.1", - "superstruct": "^1.0.3", - "tweetnacl": "^1.0.3" + "bech32": "^2.0.0", + "gql.tada": "^1.8.2", + "graphql": "^16.9.0", + "jose": "^5.6.3", + "poseidon-lite": "^0.2.0", + "valibot": "^0.36.0" }, "engines": { - "node": ">=16" + "node": ">=18" } }, - "node_modules/@mysten/sui.js/node_modules/@mysten/bcs": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@mysten/bcs/-/bcs-0.7.0.tgz", - "integrity": "sha512-AFNnTClmc1XuxWZOzrzqVPDnujgN5AF2oNUyPYbLfvwqAj+qH7CrE3Rxhuf7et+k8M1Ff55CDgF58vPDMIhIrA==", - "dependencies": { - "bs58": "^5.0.0" + "node_modules/@mysten/sui/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@mysten/sui.js/node_modules/@noble/curves": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-0.9.1.tgz", - "integrity": "sha512-SpO5TViHvyBV8RrvGejzzl0+wbSm21q+hC6ZmK5NtqOjigR+WW9OohvKL0M3EHKvWzqaZ5Z7F46ejxAVDTBnvQ==", - "deprecated": "Upgrade to 1.0.0 or higher for audited version", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "@noble/hashes": "1.3.0" + "node_modules/@mysten/sui/node_modules/@scure/base": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@mysten/sui.js/node_modules/@noble/hashes": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.0.tgz", - "integrity": "sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@mysten/sui.js/node_modules/superstruct": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.3.tgz", - "integrity": "sha512-8iTn3oSS8nRGn+C2pgXSKPI3jmpm6FExNazNpjvqS6ZUJQCej3PUXEKM8NjHBOs54ExM+LPW/FBRhymrdcCiSg==", - "engines": { - "node": ">=14.0.0" + "node_modules/@mysten/sui/node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, + "node_modules/@mysten/sui/node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", + "license": "MIT" + }, "node_modules/@near-js/accounts": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@near-js/accounts/-/accounts-1.2.1.tgz", @@ -3369,11 +3425,6 @@ "node": ">= 8" } }, - "node_modules/@open-draft/until": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-1.0.3.tgz", - "integrity": "sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==" - }, "node_modules/@osmonauts/lcd": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@osmonauts/lcd/-/lcd-0.6.0.tgz", @@ -4014,6 +4065,56 @@ "sodium-native": "^4.1.1" } }, + "node_modules/@stellar/stellar-sdk": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-13.3.0.tgz", + "integrity": "sha512-8+GHcZLp+mdin8gSjcgfb/Lb6sSMYRX6Nf/0LcSJxvjLQR0XHpjGzOiRbYb2jSXo51EnA6kAV5j+4Pzh5OUKUg==", + "license": "Apache-2.0", + "dependencies": { + "@stellar/stellar-base": "^13.1.0", + "axios": "^1.8.4", + "bignumber.js": "^9.3.0", + "eventsource": "^2.0.2", + "feaxios": "^0.0.23", + "randombytes": "^2.1.0", + "toml": "^3.0.0", + "urijs": "^1.19.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@stellar/stellar-sdk/node_modules/@stellar/stellar-base": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-13.1.0.tgz", + "integrity": "sha512-90EArG+eCCEzDGj3OJNoCtwpWDwxjv+rs/RNPhvg4bulpjN/CSRj+Ys/SalRcfM4/WRC5/qAfjzmJBAuquWhkA==", + "license": "Apache-2.0", + "dependencies": { + "@stellar/js-xdr": "^3.1.2", + "base32.js": "^0.1.0", + "bignumber.js": "^9.1.2", + "buffer": "^6.0.3", + "sha.js": "^2.3.6", + "tweetnacl": "^1.0.3" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "sodium-native": "^4.3.3" + } + }, + "node_modules/@stellar/stellar-sdk/node_modules/axios": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", + "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/@suchipi/femver": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@suchipi/femver/-/femver-1.0.0.tgz", @@ -4187,19 +4288,6 @@ "@types/node": "*" } }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dependencies": { - "@types/ms": "*" - } - }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -4238,11 +4326,6 @@ "@types/istanbul-lib-report": "*" } }, - "node_modules/@types/js-levenshtein": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@types/js-levenshtein/-/js-levenshtein-1.1.3.tgz", - "integrity": "sha512-jd+Q+sD20Qfu9e2aEXogiO3vpOC1PYJOUdyN9gvs4Qrvkg4wF43L5OhqrPeokdv8TL0/mXoYfpkcoGZMNN2pkQ==" - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -4277,11 +4360,6 @@ "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" - }, "node_modules/@types/node": { "version": "22.10.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", @@ -4314,14 +4392,6 @@ "@types/node": "*" } }, - "node_modules/@types/set-cookie-parser": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.10.tgz", - "integrity": "sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -4357,14 +4427,6 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@xrplf/isomorphic": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@xrplf/isomorphic/-/isomorphic-1.0.1.tgz", @@ -4416,12 +4478,6 @@ "ripple-keypairs": "^2.0.0" } }, - "node_modules/@zxing/text-encoding": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", - "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", - "optional": true - }, "node_modules/abortcontroller-polyfill": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", @@ -4542,6 +4598,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -4556,6 +4613,7 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, "engines": { "node": ">=10" }, @@ -4567,6 +4625,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -4575,6 +4634,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -4589,6 +4649,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -4941,6 +5002,80 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/bare-addon-resolve": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/bare-addon-resolve/-/bare-addon-resolve-1.9.4.tgz", + "integrity": "sha512-unn6Vy/Yke6F99vg/7tcrvM2KUvIhTNniaSqDbam4AWkd4NhvDVSrQiRYVlNzUV2P7SPobkCK7JFVxrJk9btCg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-module-resolve": "^1.10.0", + "bare-semver": "^1.0.0" + }, + "peerDependencies": { + "bare-url": "*" + }, + "peerDependenciesMeta": { + "bare-url": { + "optional": true + } + } + }, + "node_modules/bare-module-resolve": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/bare-module-resolve/-/bare-module-resolve-1.11.1.tgz", + "integrity": "sha512-DCxeT9i8sTs3vUMA3w321OX/oXtNEu5EjObQOnTmCdNp5RXHBAvAaBDHvAi9ta0q/948QPz+co6SsGi6aQMYRg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-semver": "^1.0.0" + }, + "peerDependencies": { + "bare-url": "*" + }, + "peerDependenciesMeta": { + "bare-url": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", + "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-semver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bare-semver/-/bare-semver-1.0.1.tgz", + "integrity": "sha512-UtggzHLiTrmFOC/ogQ+Hy7VfoKoIwrP1UFcYtTxoCUdLtsIErT8+SWtOC2DH/snT9h+xDrcBEPcwKei1mzemgg==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-url": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.1.6.tgz", + "integrity": "sha512-FgjDeR+/yDH34By4I0qB5NxAoWv7dOTYcOXwn73kr+c93HyC2lU6tnjifqUe33LKMJcDyCYPQjEAqgOQiXkE2Q==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-path": "^3.0.0" + } + }, "node_modules/base-x": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", @@ -5004,25 +5139,14 @@ } }, "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.0.tgz", + "integrity": "sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==", "license": "MIT", "engines": { "node": "*" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -5206,39 +5330,6 @@ "bitcore-lib": "*" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/blakejs": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", @@ -5353,6 +5444,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -5699,6 +5791,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5719,45 +5812,6 @@ "node": ">=10" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -5843,45 +5897,16 @@ "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, - "node_modules/class-is": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "engines": { - "node": ">= 10" - } + "node_modules/class-is": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -5891,14 +5916,6 @@ "node": ">=12" } }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "engines": { - "node": ">=0.8" - } - }, "node_modules/clone-response": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", @@ -5930,6 +5947,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -5940,7 +5958,8 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/combined-stream": { "version": "1.0.8", @@ -6274,17 +6293,6 @@ "node": ">=0.10.0" } }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", @@ -6476,6 +6484,16 @@ "node": ">=8.0.0" } }, + "node_modules/ed25519-hd-key": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ed25519-hd-key/-/ed25519-hd-key-1.3.0.tgz", + "integrity": "sha512-IWwAyiiuJQhgu3L8NaHb68eJxTu2pgCwxIBdgpLJdKpYZM46+AXePSVTr7fkNKaUOfOL4IrjEUaQvyVRIDP7fg==", + "license": "MIT", + "dependencies": { + "create-hmac": "1.1.7", + "tweetnacl": "1.0.3" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -6521,7 +6539,8 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/encodeurl": { "version": "1.0.2", @@ -6770,6 +6789,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, "engines": { "node": ">=6" } @@ -7421,14 +7441,6 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/eventsource": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", @@ -7627,19 +7639,6 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -7695,26 +7694,13 @@ "bser": "2.1.1" } }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "node_modules/feaxios": { + "version": "0.0.23", + "resolved": "https://registry.npmjs.org/feaxios/-/feaxios-0.0.23.tgz", + "integrity": "sha512-eghR0A21fvbkcQBgZuMfQhrXxJzC0GNUGC9fXhBge33D+mFDTwl0aJ35zoQQn575BhyjQitRc5N4f+L4cP708g==", + "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" + "is-retry-allowed": "^3.0.0" } }, "node_modules/file-entry-cache": { @@ -7738,6 +7724,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -7916,6 +7903,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -7991,6 +7979,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -8172,6 +8161,25 @@ "url": "https://github.com/sindresorhus/got?sponsor=1" } }, + "node_modules/gql.tada": { + "version": "1.8.10", + "resolved": "https://registry.npmjs.org/gql.tada/-/gql.tada-1.8.10.tgz", + "integrity": "sha512-FrvSxgz838FYVPgZHGOSgbpOjhR+yq44rCzww3oOPJYi0OvBJjAgCiP6LEokZIYND2fUTXzQAyLgcvgw1yNP5A==", + "license": "MIT", + "dependencies": { + "@0no-co/graphql.web": "^1.0.5", + "@0no-co/graphqlsp": "^1.12.13", + "@gql.tada/cli-utils": "1.6.3", + "@gql.tada/internal": "1.0.8" + }, + "bin": { + "gql-tada": "bin/cli.js", + "gql.tada": "bin/cli.js" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -8257,6 +8265,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -8341,11 +8350,6 @@ "node": ">= 0.4" } }, - "node_modules/headers-polyfill": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-3.2.5.tgz", - "integrity": "sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA==" - }, "node_modules/hi-base32": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/hi-base32/-/hi-base32-0.5.1.tgz", @@ -8601,44 +8605,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/inquirer": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", - "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^6.0.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/inquirer/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -8708,17 +8674,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -8777,6 +8732,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -8785,6 +8741,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "engines": { "node": ">=8" } @@ -8821,6 +8778,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -8837,14 +8795,6 @@ "npm": ">=3" } }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "engines": { - "node": ">=8" - } - }, "node_modules/is-my-ip-valid": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.1.tgz", @@ -8876,15 +8826,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-node-process": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", - "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==" - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "engines": { "node": ">=0.12.0" } @@ -8935,6 +8881,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-retry-allowed": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-3.0.0.tgz", + "integrity": "sha512-9xH0xvoggby+u0uGF7cZXdrutWiBiaFG8ZT4YFPXL8NzkyAwX3AKGLeFQLvzDpM430+nDFBZ1LHkie/8ocL06A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -9008,17 +8966,6 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -9790,12 +9737,13 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "engines": { - "node": ">=0.10.0" + "node_modules/jose": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", + "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" } }, "node_modules/js-sha256": { @@ -10211,21 +10159,6 @@ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", "dev": true }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/long": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", @@ -10439,6 +10372,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, "engines": { "node": ">=6" } @@ -10550,75 +10484,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/msw": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/msw/-/msw-1.3.5.tgz", - "integrity": "sha512-nG3fpmBXxFbKSIdk6miPuL3KjU6WMxgoW4tG1YgnP1M+TRG3Qn7b7R0euKAHq4vpwARHb18ZyfZljSxsTnMX2w==", - "hasInstallScript": true, - "dependencies": { - "@mswjs/cookies": "^0.2.2", - "@mswjs/interceptors": "^0.17.10", - "@open-draft/until": "^1.0.3", - "@types/cookie": "^0.4.1", - "@types/js-levenshtein": "^1.1.1", - "chalk": "^4.1.1", - "chokidar": "^3.4.2", - "cookie": "^0.4.2", - "graphql": "^16.8.1", - "headers-polyfill": "3.2.5", - "inquirer": "^8.2.0", - "is-node-process": "^1.2.0", - "js-levenshtein": "^1.1.6", - "node-fetch": "^2.6.7", - "outvariant": "^1.4.0", - "path-to-regexp": "^6.3.0", - "strict-event-emitter": "^0.4.3", - "type-fest": "^2.19.0", - "yargs": "^17.3.1" - }, - "bin": { - "msw": "cli/index.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mswjs" - }, - "peerDependencies": { - "typescript": ">= 4.4.x" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/msw/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/msw/node_modules/path-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==" - }, - "node_modules/msw/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/multibase": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", @@ -10732,11 +10597,6 @@ "npm": ">=1.4.0" } }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, "node_modules/nan": { "version": "2.22.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", @@ -10906,6 +10766,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -11092,6 +10953,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -11119,41 +10981,6 @@ "node": ">= 0.8.0" } }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/outvariant": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==" - }, "node_modules/p-cancelable": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", @@ -11329,6 +11156,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -11409,6 +11237,12 @@ "node": ">=8" } }, + "node_modules/poseidon-lite": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/poseidon-lite/-/poseidon-lite-0.2.1.tgz", + "integrity": "sha512-xIr+G6HeYfOhCuswdqcFpSX47SPhm0EpisWJ6h7fHlWwaVIvH3dLnejpatrtw6Xc6HaLrpq05y7VRfvDmDGIog==", + "license": "MIT" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -11716,17 +11550,6 @@ "node": ">= 6" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/readonly-date": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/readonly-date/-/readonly-date-1.0.0.tgz", @@ -11815,10 +11638,25 @@ "uuid": "bin/uuid" } }, + "node_modules/require-addon": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/require-addon/-/require-addon-1.1.0.tgz", + "integrity": "sha512-KbXAD5q2+v1GJnkzd8zzbOxchTkStSyJZ9QwoCq3QwEXAaIlG3wDYRZGzVD357jmwaGY7hr5VaoEAL0BkF0Kvg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-addon-resolve": "^1.3.0", + "bare-url": "^2.1.0" + }, + "engines": { + "bare": ">=1.10.0" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -11920,18 +11758,6 @@ "node": ">=8" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -12073,14 +11899,6 @@ } } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -12104,14 +11922,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/safe-array-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", @@ -12297,11 +12107,6 @@ "node": ">=6" } }, - "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==" - }, "node_modules/set-function-length": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", @@ -12389,7 +12194,8 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/simple-concat": { "version": "1.0.1", @@ -12482,12 +12288,13 @@ } }, "node_modules/sodium-native": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.3.1.tgz", - "integrity": "sha512-YdP64gAdpIKHfL4ttuX4aIfjeunh9f+hNeQJpE9C8UMndB3zkgZ7YmmGT4J2+v6Ibyp6Wem8D1TcSrtdW0bqtg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.3.3.tgz", + "integrity": "sha512-OnxSlN3uyY8D0EsLHpmm2HOFmKddQVvEMmsakCrXUzSd8kjjbzL413t4ZNF3n0UxSwNgwTyUvkmZHTfuCeiYSw==", + "license": "MIT", "optional": true, "dependencies": { - "node-gyp-build": "^4.8.0" + "require-addon": "^1.1.0" } }, "node_modules/source-map": { @@ -12635,11 +12442,6 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/strict-event-emitter": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.4.6.tgz", - "integrity": "sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==" - }, "node_modules/strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -12673,6 +12475,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -12731,6 +12534,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -12789,6 +12593,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -13015,17 +12820,6 @@ "node": ">=14.0.0" } }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -13045,6 +12839,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -13404,7 +13199,6 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", - "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -13610,6 +13404,12 @@ "node": ">=10.12.0" } }, + "node_modules/valibot": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-0.36.0.tgz", + "integrity": "sha512-CjF1XN4sUce8sBK9TixrDqFM7RwNkuXdJu174/AwmQUB62QbCQADg5lLe8ldBalFgtj1uKj+pKwDJiNo4Mn+eQ==", + "license": "MIT" + }, "node_modules/validator": { "version": "13.11.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", @@ -13667,25 +13467,6 @@ "makeerror": "1.0.12" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/web-encoding": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.5.tgz", - "integrity": "sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==", - "dependencies": { - "util": "^0.12.3" - }, - "optionalDependencies": { - "@zxing/text-encoding": "0.9.0" - } - }, "node_modules/web3": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.5.tgz", @@ -14281,6 +14062,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -14429,6 +14211,7 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, "engines": { "node": ">=10" } @@ -14450,6 +14233,7 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -14467,6 +14251,7 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, "engines": { "node": ">=12" } diff --git a/src/helper/batchRequest.ts b/src/helper/batchRequest.ts new file mode 100644 index 0000000..6574695 --- /dev/null +++ b/src/helper/batchRequest.ts @@ -0,0 +1,77 @@ +import Web3 from 'web3'; +import { TransactionConfig, SignedTransaction } from 'web3-core'; + +async function getNonce(web3: Web3, account: string): Promise { + const [pendingNonce, latestNonce] = await Promise.all([ + web3.eth.getTransactionCount(account, 'pending'), + web3.eth.getTransactionCount(account) + ]); + return Math.max(pendingNonce, latestNonce); +} + +interface TransactionObject { + transactions: TransactionConfig[] | Record; +} + +const batchRequestEvm = async ( + web3: Web3, + transactionObject: TransactionObject, + privateKey: string +): Promise => { + try { + const { transactions } = transactionObject; + const account = web3.eth.accounts.privateKeyToAccount(privateKey); + const initialNonce = await getNonce(web3, account.address); + + const batch = new web3.BatchRequest(); + const promises: Promise[] = []; + let batches: TransactionConfig[] = []; + + if (typeof transactions === 'object' && transactions !== null && !Array.isArray(transactions)) { + batches = Object.values(transactions); + } else if (Array.isArray(transactions)) { + batches = transactions; + } + + for (let i = 0; i < batches.length; i++) { + const txParams: TransactionConfig = { + ...batches[i], + nonce: initialNonce + i + }; + + const signedTx = await web3.eth.accounts.signTransaction(txParams, privateKey); + + if (!signedTx.rawTransaction) { + throw new Error('Transaction signing failed: rawTransaction is undefined'); + } + + const promise = new Promise((resolve, reject) => { + batch.add( + (web3.eth.sendSignedTransaction as any).request( + signedTx.rawTransaction, + (err: Error | null, hash: string) => { + if (err) { + console.error('Error executing transaction:', err); + reject(err); + } else { + console.log('Transaction Sent:', hash); + resolve(hash); + } + } + ) + ); + }); + + promises.push(promise); + } + + await batch.execute(); + return await Promise.all(promises); + } catch (error) { + console.error('Batch request failed:', error); + throw error; + } +}; + +// Export the function +export { batchRequestEvm }; \ No newline at end of file diff --git a/src/stellar/getAllAssets.ts b/src/stellar/getAllAssets.ts new file mode 100644 index 0000000..bdf3c47 --- /dev/null +++ b/src/stellar/getAllAssets.ts @@ -0,0 +1,119 @@ +import { xdr, StrKey } from "@stellar/stellar-sdk"; +import * as schemaValidator from "../../configuration/schemaValidator"; +import { bufferToString, getTransactionByHash } from './helpers'; + +// Type definitions +interface FilterOptions { + function?: string; + chainId: string; + transactionHash: string; + [key: string]: any; +} + +interface ValidationResult { + valid: boolean; + errors?: any; +} + +interface TransactionResult { + status: string; + resultMetaXdr?: string; + [key: string]: any; +} + +interface TransactionResponse { + result?: TransactionResult; + [key: string]: any; +} + +interface Asset { + [key: string]: string | number; +} + +interface ScVal { + value?(): any; + [key: string]: any; +} + +export default { + getAllAssets: async (options: FilterOptions): Promise => { + const filterOptions: FilterOptions = { ...options }; + filterOptions.function = "stellarDecodeTransaction()"; + + const validJson: ValidationResult = await schemaValidator.validateInput(filterOptions); + if (!validJson.valid) { + return validJson; + } + + const { chainId, transactionHash } = filterOptions; + + try { + let getResponse: TransactionResponse = await getTransactionByHash(chainId, transactionHash); + + if (!getResponse.result) { + throw new Error("Invalid transaction response: missing result"); + } + + while (getResponse.result.status === "NOT_FOUND") { + await new Promise((resolve) => setTimeout(resolve, 1000)); + getResponse = await getTransactionByHash(chainId, transactionHash); + if (!getResponse.result) { + throw new Error("Invalid transaction response: missing result"); + } + } + + if (!getResponse.result.resultMetaXdr) { + throw new Error("Empty resultMetaXDR in getTransaction response"); + } + + const transactionMeta: string = getResponse.result.resultMetaXdr; + const xdrBuffer: Buffer = Buffer.from(transactionMeta, 'base64'); + const resultMeta: xdr.TransactionMeta = xdr.TransactionMeta.fromXDR(xdrBuffer); + + const transactionMetaV3 = resultMeta.v3(); + if (!transactionMetaV3) { + throw new Error("Transaction meta V3 not found"); + } + + const sorobanMeta = transactionMetaV3.sorobanMeta(); + if (!sorobanMeta) { + throw new Error("Soroban meta not found"); + } + + const returnValue: xdr.ScVal = sorobanMeta.returnValue(); + const response = returnValue.value(); + + // Type guard to check if response is an array-like structure + if (response && typeof response === 'object' && '_value' in response && Array.isArray(response._value)) { + return response._value.map((assetResponse: any) => { + const assetValues = assetResponse._value; + if (!assetValues || !Array.isArray(assetValues) || assetValues.length < 4) { + throw new Error("Invalid asset response structure"); + } + + const attributes = assetValues[3]?._attributes?.val?._value?._attributes; + if (!attributes?.hi?._value || !attributes?.lo?._value) { + throw new Error("Invalid asset value structure"); + } + + // Convert to BigInt safely + const hi = BigInt(attributes.hi._value.toString()); + const lo = BigInt(attributes.lo._value.toString()); + const fullValue = (hi << BigInt(64)) + lo; + + return { + [assetValues[1]._attributes.key._value]: bufferToString(assetValues[1]._attributes.val._value), + [assetValues[2]._attributes.key._value]: StrKey.encodeEd25519PublicKey(assetValues[2]._attributes.val._value._value._value), + [assetValues[3]._attributes.key._value]: fullValue.toString(), + [assetValues[0]._attributes.key._value]: assetValues[0]._attributes.val._value + } as Asset; + }); + } + + return null; + } catch (err) { + console.error("Transaction not found", err); + return null; + } + } +}; \ No newline at end of file diff --git a/src/stellar/getAsset.ts b/src/stellar/getAsset.ts new file mode 100644 index 0000000..2d6f4d4 --- /dev/null +++ b/src/stellar/getAsset.ts @@ -0,0 +1,145 @@ +import { xdr, StrKey } from "@stellar/stellar-sdk"; +import * as schemaValidator from '../../configuration/schemaValidator'; +import { bufferToString, getTransactionByHash } from './helpers'; + +// Type definitions +interface FilterOptions { + function?: string; + chainId: string; + transactionHash: string; + [key: string]: any; +} + +interface ValidationResult { + valid: boolean; + errors?: any; +} + +interface TransactionResult { + status: string; + resultMetaXdr?: string; + [key: string]: any; +} + +interface TransactionResponse { + result?: TransactionResult; + [key: string]: any; +} + +interface AssetResult { + [key: string]: string | number; +} + +interface ScValAttributes { + key: { _value: string }; + val: { _value: any }; + [key: string]: any; +} + +interface ScValObject { + _attributes: ScValAttributes; + _value?: any; + [key: string]: any; +} + +type ScVal = xdr.ScVal | ScValObject; + +// Type guard for ScVal with attributes +function isScValObject(value: any): value is ScValObject { + return value && + typeof value === 'object' && + '_attributes' in value && + typeof value._attributes === 'object' && + 'key' in value._attributes && + 'val' in value._attributes; +} + +// Type guard for array of ScVal objects +function isScValArray(value: any): value is ScValObject[] { + return Array.isArray(value) && value.every(isScValObject); +} + +export default { + getAsset: async (options: FilterOptions): Promise => { + const filterOptions: FilterOptions = { ...options }; + filterOptions.function = "stellarDecodeTransaction()"; + + const validJson: ValidationResult = await schemaValidator.validateInput(filterOptions); + if (!validJson.valid) { + return validJson; + } + + const { chainId, transactionHash } = filterOptions; + + try { + let getResponse: TransactionResponse = await getTransactionByHash(chainId, transactionHash); + + if (!getResponse.result) { + throw new Error("Transaction response missing result"); + } + + while (getResponse.result.status === "NOT_FOUND") { + await new Promise((resolve) => setTimeout(resolve, 1000)); + getResponse = await getTransactionByHash(chainId, transactionHash); + if (!getResponse.result) { + throw new Error("Transaction response missing result during polling"); + } + } + + if (!getResponse.result.resultMetaXdr) { + throw new Error("Empty resultMetaXDR in getTransaction response"); + } + + const transactionMeta: string = getResponse.result.resultMetaXdr; + const xdrBuffer: Buffer = Buffer.from(transactionMeta, 'base64'); + const resultMeta: xdr.TransactionMeta = xdr.TransactionMeta.fromXDR(xdrBuffer); + + const transactionMetaV3 = resultMeta.v3(); + if (!transactionMetaV3) { + throw new Error("Transaction meta V3 not found"); + } + + const sorobanMeta = transactionMetaV3.sorobanMeta(); + if (!sorobanMeta) { + throw new Error("Soroban meta not found"); + } + + const returnValue: xdr.ScVal = sorobanMeta.returnValue(); + const response = returnValue.value(); + + if (isScValArray(response) && response.length >= 4) { + // Access attributes safely after type checking + const attr0 = response[0]._attributes; + const attr1 = response[1]._attributes; + const attr2 = response[2]._attributes; + const attr3 = response[3]._attributes; + + if (!attr3.val?._value?._attributes) { + throw new Error("Missing value attributes in response[3]"); + } + + const attributes = attr3.val._value._attributes; + if (typeof attributes.hi?._value === 'undefined' || + typeof attributes.lo?._value === 'undefined') { + throw new Error("Missing hi/lo values in response"); + } + + const hi = BigInt(attributes.hi._value.toString()); + const lo = BigInt(attributes.lo._value.toString()); + const fullValue = (hi << BigInt(64)) + lo; + + return { + [attr1.key._value]: bufferToString(attr1.val._value), + [attr2.key._value]: StrKey.encodeEd25519PublicKey(attr2.val._value._value._value), + [attr3.key._value]: fullValue.toString(), + [attr0.key._value]: attr0.val._value + }; + } + + return null; + } catch (err) { + console.error("Error in getAsset:", err); + return null; + } + } +}; \ No newline at end of file diff --git a/src/stellar/getOwnerAssets.ts b/src/stellar/getOwnerAssets.ts new file mode 100644 index 0000000..4e08b31 --- /dev/null +++ b/src/stellar/getOwnerAssets.ts @@ -0,0 +1,160 @@ +import { xdr, StrKey } from "@stellar/stellar-sdk"; +import * as schemaValidator from '../../configuration/schemaValidator'; +import { bufferToString, getTransactionByHash } from './helpers'; + +// Type definitions +interface FilterOptions { + function?: string; + chainId: string; + transactionHash: string; + [key: string]: any; +} + +interface ValidationResult { + valid: boolean; + errors?: any; +} + +interface TransactionResult { + status: string; + resultMetaXdr?: string; + [key: string]: any; +} + +interface TransactionResponse { + result?: TransactionResult; + [key: string]: any; +} + +interface AssetResult { + [key: string]: string | number; +} + +interface ScValAttributes { + key: { _value: string }; + val: { _value: any }; + [key: string]: any; +} + +interface ScValObject { + _attributes: ScValAttributes; + _value?: any; + [key: string]: any; +} + +interface ScMapEntry { + _value: ScValObject[]; +} + +type ScVal = xdr.ScVal | ScValObject; + +// Type guard for ScVal with attributes +function isScValObject(value: any): value is ScValObject { + return value && + typeof value === 'object' && + '_attributes' in value && + typeof value._attributes === 'object' && + 'key' in value._attributes && + 'val' in value._attributes; +} + +// Type guard for array of ScVal objects +function isScValArray(value: any): value is ScValObject[] { + return Array.isArray(value) && value.every(isScValObject); +} + +export default { + getOwnerAssets: async (options: FilterOptions): Promise => { + const filterOptions: FilterOptions = { ...options }; + filterOptions.function = "stellarDecodeTransaction()"; + + const validJson: ValidationResult = await schemaValidator.validateInput(filterOptions); + if (!validJson.valid) { + return validJson; + } + + const { chainId, transactionHash } = filterOptions; + + try { + let getResponse: TransactionResponse = await getTransactionByHash(chainId, transactionHash); + + if (!getResponse.result) { + throw new Error("Transaction response missing result"); + } + + while (getResponse.result.status === "NOT_FOUND") { + await new Promise((resolve) => setTimeout(resolve, 1000)); + getResponse = await getTransactionByHash(chainId, transactionHash); + if (!getResponse.result) { + throw new Error("Transaction response missing result during polling"); + } + } + + if (!getResponse.result.resultMetaXdr) { + throw new Error("Empty resultMetaXDR in getTransaction response"); + } + + const transactionMeta: string = getResponse.result.resultMetaXdr; + const xdrBuffer: Buffer = Buffer.from(transactionMeta, 'base64'); + const resultMeta: xdr.TransactionMeta = xdr.TransactionMeta.fromXDR(xdrBuffer); + + const transactionMetaV3 = resultMeta.v3(); + if (!transactionMetaV3) { + throw new Error("Transaction meta V3 not found"); + } + + const sorobanMeta = transactionMetaV3.sorobanMeta(); + if (!sorobanMeta) { + throw new Error("Soroban meta not found"); + } + + const returnValue: xdr.ScVal = sorobanMeta.returnValue(); + const response = returnValue.value(); + + if (response && isScValArray(response)) { + return response.map(assetResponse => { + if (!isScValObject(assetResponse) || !assetResponse._value || !Array.isArray(assetResponse._value)) { + throw new Error("Invalid asset response structure"); + } + + const assetValues = assetResponse._value; + if (assetValues.length < 4 || + !isScValObject(assetValues[0]) || + !isScValObject(assetValues[1]) || + !isScValObject(assetValues[2]) || + !isScValObject(assetValues[3])) { + throw new Error("Invalid asset values structure"); + } + + const val3 = assetValues[3]._attributes.val?._value; + if (!val3 || !val3._attributes) { + throw new Error("Missing value attributes in assetValues[3]"); + } + + const attributes = val3._attributes; + if (typeof attributes.hi?._value === 'undefined' || + typeof attributes.lo?._value === 'undefined') { + throw new Error("Missing hi/lo values in response"); + } + + // Safe BigInt conversion + const hi = BigInt(attributes.hi._value.toString()); + const lo = BigInt(attributes.lo._value.toString()); + const fullValue = (hi << BigInt(64)) + lo; + + return { + [assetValues[1]._attributes.key._value]: bufferToString(assetValues[1]._attributes.val._value), + [assetValues[2]._attributes.key._value]: StrKey.encodeEd25519PublicKey(assetValues[2]._attributes.val._value._value._value), + [assetValues[3]._attributes.key._value]: fullValue.toString(), + [assetValues[0]._attributes.key._value]: assetValues[0]._attributes.val._value + } as AssetResult; + }); + } + + return null; + } catch (err) { + console.error("Error in getOwnerAssets:", err); + return null; + } + } +}; \ No newline at end of file diff --git a/src/stellar/helpers.ts b/src/stellar/helpers.ts new file mode 100644 index 0000000..ccff07e --- /dev/null +++ b/src/stellar/helpers.ts @@ -0,0 +1,58 @@ +import axios, { AxiosResponse } from 'axios'; +import config from '../../configuration/config'; + +interface RequestBody { + jsonrpc: string; + id: number; + method: string; + params: { + hash: string; + }; +} + +interface TransactionResponse { + // Define the structure of your transaction response here + // Adjust based on the actual response structure + [key: string]: any; +} + +interface Config { + chains: { + [chainId: string]: { + sorobanRpc: string; + }; + }; +} + +function bufferToString(buffer: Buffer): string { + return buffer.toString('utf-8'); +} + +async function getTransactionByHash(chainId: string, transactionHash: string): Promise { + const requestBody: RequestBody = { + "jsonrpc": "2.0", + "id": 8675309, + "method": "getTransaction", + "params": { + "hash": transactionHash + } + }; + + try { + const res: AxiosResponse = await axios.post( + (config as Config).chains[chainId].sorobanRpc, + requestBody, + { + headers: { + 'Content-Type': 'application/json', + } + } + ); + return res.data; + } catch (error) { + console.error('Error making request:', error); + throw error; + } +} + +export { getTransactionByHash, bufferToString }; \ No newline at end of file diff --git a/test/batchTransactionTest.ts b/test/batchTransactionTest.ts new file mode 100644 index 0000000..be707e9 --- /dev/null +++ b/test/batchTransactionTest.ts @@ -0,0 +1,149 @@ +import dotenv from "dotenv"; +import axios, { AxiosResponse } from "axios"; +import config from '../configuration/config.json'; +import { WalletPhantom } from "../src/index"; + +// Initialize environment variables +dotenv.config(); + +// Type definitions +interface Config { + url: { + apiurl: string; + }; + [key: string]: any; +} + +interface Headers { + 'x-api-key': string; + [key: string]: string; +} + +interface ApproveParams { + from: string; + tokenAddress: string; + amount: string; + to: string; + gas: string; + chainId: string; +} + +interface SwapParams { + dexId: string; + amountIn: string; + amountOutMin: string; + path: string[]; + to: string; + deadline: string; + from: string; + gas: string; + involveBaseToken: string; +} + +interface TransactionResponse { + data: { + data: any; + [key: string]: any; + }; + [key: string]: any; +} + +// Configuration +const expand_url: string = config.url.apiurl; +const chainId: string = "1"; +const headers: Headers = { 'x-api-key': process.env.xApiKey || '' }; +const wallet = new WalletPhantom({ + privateKey: process.env.WALLET_PRIVATE_KEY || '', + xApiKey: process.env.xApiKey || '' +}); + +async function getApproveTx(options: ApproveParams): Promise { + try { + const rawApprovedTx: AxiosResponse = await axios.post( + `${expand_url}fungibletoken/approve`, + options, + { headers } + ); + return rawApprovedTx.data.data; + } catch (error) { + console.error("Error in getApproveTx:", error); + throw error; + } +} + +async function getSwapTransaction(options: SwapParams): Promise { + try { + const rawSwapTx: AxiosResponse = await axios.post( + `${expand_url}dex/swap`, + options, + { headers } + ); + return rawSwapTx.data.data; + } catch (error) { + console.error("Error in getSwapTransaction:", error); + throw error; + } +} + +async function getFeeTx(swapTx: any): Promise { + try { + const feeTx: AxiosResponse = await axios.post( + `${expand_url}chain/createfeetransaction`, + swapTx, + { headers } + ); + return feeTx.data.data; + } catch (error) { + console.error("Error in getFeeTx:", error); + throw error; + } +} + +async function main(): Promise { + try { + const approveParams: ApproveParams = { + "from": "", + "tokenAddress": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "amount": "1000000000000000000000", + "to": "0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45", + "gas": "100000", + "chainId": "1" + }; + + const swapParams: SwapParams = { + "dexId": "1300", + "amountIn": "1000000000000000", + "amountOutMin": "0", + "path": [ + "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "0x6B175474E89094C44Da98b954EedeAC495271d0F" + ], + "to": "", + "deadline": "1965990894", + "from": "", + "gas": "203376", + "involveBaseToken": "1" + }; + + // Prepare the Approved transaction + const approvedTx = await getApproveTx(approveParams); + console.log("approvedTx --", approvedTx); + + // Prepare the swap transaction + const swapTx = await getSwapTransaction(swapParams); + console.log("swapTx --", swapTx); + + const feeTx = await getFeeTx(swapTx); + console.log("feeTx --", feeTx); + + // const executeBatchCall = await wallet.signSendBatchTransactions({ + // chainId, + // transactions: [approvedTx, swapTx, feeTx] + // }); + // console.log("executeBatch --", executeBatchCall); + } catch (error) { + console.error("Error in main:", error); + } +} + +main().catch(console.error); \ No newline at end of file diff --git a/test/swapTest.ts b/test/swapTest.ts index 35cfd12..4a8f946 100644 --- a/test/swapTest.ts +++ b/test/swapTest.ts @@ -4,8 +4,8 @@ import dotenv from 'dotenv'; async function swap() { dotenv.config(); - const xApiKey = "tK503cR23o8YTvXhNoDNo7kQf5sQdbXP8qbqkBeQ"; - const privateKey = "7b030343684de5d0d35dd68333dac40ffaed6f138da85464ca6227b89b17eae9"; + const xApiKey = process.env.xApiKey || '' + const privateKey = process.env.privateKey || '' const wallet = new Wallet({ privateKey , xApiKey }); @@ -18,9 +18,9 @@ async function swap() { ], "amountIn": "50000000000000000000", "amountOutMin": "730655", - "to": "0xB409cB0b5DB9f148d0bc491E140D9E0FDd789C11", + "to": "", "gas": "80000", - "from": "0xB409cB0b5DB9f148d0bc491E140D9E0FDd789C11", + "from": "", "deadline": "1716461989", "slippage": "1", xApiKey, From 331f45b13e6d9d5871ee752d8234df63d4ec48b6 Mon Sep 17 00:00:00 2001 From: anupam18 Date: Wed, 2 Jul 2025 16:35:58 +0530 Subject: [PATCH 29/32] twst file changed --- test/bitcoinTest.ts | 80 +++++++++++++++++++++++++++++++++++++++++++++ test/dfnsTest.ts | 71 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 test/bitcoinTest.ts create mode 100644 test/dfnsTest.ts diff --git a/test/bitcoinTest.ts b/test/bitcoinTest.ts new file mode 100644 index 0000000..04f7c3b --- /dev/null +++ b/test/bitcoinTest.ts @@ -0,0 +1,80 @@ +import { config } from 'dotenv'; +import { getKeysFromMnemonic } from '../src/adapters/WalletBitcoin'; +import { WalletBitcoin } from '../src/index'; + + +config(); + + +interface UTXO { + txId: string; + vout: number; + value: any; +} + +interface PreparedTransaction { + chainId: string; + value: string; + to: string; + utxo: UTXO; +} + +const main = async () => { + const xApiKey = process.env.xApiKey; + const privateKey = process.env.privateKey; + + if (!xApiKey || !privateKey) { + console.error('Missing xApiKey or privateKey in .env'); + return; + } + + const wallet = new WalletBitcoin({ + xApiKey, + privateKey, + }); + + const value = "amount to send"; + const preparedTx: PreparedTransaction = { + chainId: "1801", + value, + to: "wallet address", + utxo: { + txId: "", + vout: 0, + value, + }, + }; + + try { + const signedTx = await wallet.signTransaction(preparedTx); + console.log('Signed Tx:', signedTx); + + const tx = await wallet.sendTransaction(signedTx); + console.log('Tx:', tx); + } catch (error) { + console.error('Transaction error:', error); + } +}; + +const getKeys = async () => { + const mnemonic = process.env.mnemonic; + + if (!mnemonic) { + console.error('Mnemonic not found in .env'); + return; + } + + try { + const keys = await getKeysFromMnemonic({ + chainId: "1801", + mnemonic, + }); + + console.log('Keys:', keys); + } catch (error) { + console.error('Key derivation error:', error); + } +}; + +getKeys(); +main(); diff --git a/test/dfnsTest.ts b/test/dfnsTest.ts new file mode 100644 index 0000000..04a6632 --- /dev/null +++ b/test/dfnsTest.ts @@ -0,0 +1,71 @@ +import dotenv from 'dotenv'; +import { WalletDFNS } from '../src/index'; + +dotenv.config(); + + +interface PreparedTransaction { + from: string; + to: string; + value: string; + gas: string; + chainId: string; + xApiKey: string; +} + +async function main(): Promise { + const { + DFNS_PRIVATE_KEY, + DFNS_CRED_ID, + xApiKey, + DFNS_APP_ID, + DFNS_ACCESS_TOKEN, + DFNS_API_URL, + WALLET_ID, + } = process.env; + + if ( + !DFNS_PRIVATE_KEY || + !DFNS_CRED_ID || + !xApiKey || + !DFNS_APP_ID || + !DFNS_ACCESS_TOKEN || + !DFNS_API_URL || + !WALLET_ID + ) { + console.error('Missing required environment variables.'); + return; + } + + const preparedTx: PreparedTransaction = { + from: 'FROM_WALLET_ADDRESS', + value: '1000000', + to: 'TO_WALLET_ADDRESS', + gas: '100000', + chainId: '5', + xApiKey, + }; + + + const options = { + privateKey: DFNS_PRIVATE_KEY, + credId: DFNS_CRED_ID, + xApiKey, + appId: DFNS_APP_ID, + authToken: DFNS_ACCESS_TOKEN, + baseUrl: DFNS_API_URL, + walletId: WALLET_ID, + appOrigin: 'http://localhost:3000', + }; + + try { + const wallet = new WalletDFNS(options); + const signedTx = await wallet.signTransaction(preparedTx); + const tx = await wallet.sendTransaction(signedTx); + console.log('Transaction Pending....', tx); + } catch (error) { + console.error('Transaction Error:', error); + } +} + +main(); From 55ee702fb2e25206874c6535b5bb5b46f315c59b Mon Sep 17 00:00:00 2001 From: saqib-cmlab Date: Mon, 28 Jul 2025 17:37:37 +0530 Subject: [PATCH 30/32] added tslint and warning --- .eslintrc.json | 100 ++-- configuration/common.ts | 2 +- configuration/intialiseWeb3.js | 12 +- configuration/intialiseWeb3.ts | 12 +- examples/circleTest.js | 2 +- examples/dfnsTest.js | 4 +- package-lock.json | 441 +++++++++++++++--- package.json | 9 +- src/adapters/Wallet/index.js | 12 +- src/adapters/Wallet/index.ts | 6 +- src/adapters/Wallet/signTransaction/Aptos.ts | 6 +- src/adapters/Wallet/signTransaction/Near.js | 2 +- src/adapters/Wallet/signTransaction/Near.ts | 4 +- src/adapters/Wallet/signTransaction/Solana.js | 10 +- src/adapters/Wallet/signTransaction/Solana.ts | 4 +- src/adapters/Wallet/signTransaction/Sui.ts | 6 +- src/adapters/Wallet/signTransaction/Tron.ts | 4 +- src/adapters/Wallet/signTransaction/index.js | 6 +- src/adapters/Wallet/signTransaction/index.ts | 4 +- src/adapters/WalletBitcoin/index.js | 12 +- src/adapters/WalletBitcoin/index.ts | 4 +- src/adapters/WalletCircle/index.js | 6 +- src/adapters/WalletCircle/index.ts | 4 +- src/adapters/WalletCoinbase/index.js | 6 +- src/adapters/WalletCoinbase/index.ts | 6 +- src/adapters/WalletCosmos/index.js | 6 +- src/adapters/WalletCosmos/index.ts | 4 +- src/adapters/WalletDFNS/index.js | 16 +- src/adapters/WalletDFNS/index.ts | 6 +- .../WalletDFNS/signTransaction/Ethereum.js | 2 +- src/adapters/WalletFireblocks/index.js | 24 +- src/adapters/WalletFireblocks/index.ts | 4 +- src/adapters/WalletFordefi/index.js | 4 +- src/adapters/WalletFordefi/index.ts | 2 +- .../WalletFordefi/signTransaction/Ethereum.js | 4 +- .../WalletFordefi/signTransaction/Solana.js | 6 +- .../WalletFordefi/signTransaction/index.js | 2 +- src/adapters/WalletPhantom/index.js | 6 +- src/adapters/WalletPhantom/index.ts | 9 +- .../WalletPhantom/signTransaction/Solana.js | 10 +- .../WalletPhantom/signTransaction/Solana.ts | 4 +- .../WalletPhantom/signTransaction/index.js | 2 +- .../WalletPhantom/signTransaction/index.ts | 2 +- src/adapters/WalletStacks/index.js | 16 +- src/adapters/WalletStacks/index.ts | 9 +- src/adapters/WalletStellar/index.js | 10 +- src/adapters/WalletStellar/index.ts | 6 +- src/adapters/WalletTON/index.js | 20 +- src/adapters/WalletTON/index.ts | 6 +- src/adapters/WalletXRPL/index.js | 6 +- src/adapters/WalletXRPL/index.ts | 2 +- src/dydx/cancelOrder.js | 4 +- src/dydx/cancelOrder.ts | 2 +- src/dydx/deposit.js | 6 +- src/dydx/deposit.ts | 4 +- src/dydx/index.js | 10 +- src/dydx/index.ts | 8 +- src/dydx/placeOrder.js | 4 +- src/dydx/placeOrder.ts | 2 +- src/dydx/transfer.js | 2 +- src/dydx/transfer.ts | 6 +- src/dydx/userOnboarding.js | 4 +- src/dydx/userOnboarding.ts | 6 +- src/helper/Starknet.js | 2 +- src/helper/Starknet.ts | 2 +- src/helper/batchRequest.js | 2 +- src/helper/batchRequest.ts | 2 +- src/index.js | 4 +- src/index.ts | 4 +- src/interfaces/index.js | 16 +- src/interfaces/index.ts | 16 +- src/stellar/getAllAssets.js | 4 +- src/stellar/getAllAssets.ts | 2 +- src/stellar/getAsset.js | 4 +- src/stellar/getAsset.ts | 2 +- src/stellar/getOwnerAssets.js | 4 +- src/stellar/getOwnerAssets.ts | 2 +- test/SwapWithApprovalTest.js | 2 +- test/batchTransactionTest.js | 2 +- test/bitcoinTest.js | 6 +- test/circleTest.js | 2 +- test/cosmosTest.js | 2 +- test/dfnsTest.js | 4 +- test/dydxTest.js | 2 +- test/signLimitOrder.js | 6 +- test/stacksTest.js | 10 +- test/stellarTest.js | 4 +- test/swapTest.js | 6 +- test/uniswapXTest.js | 6 +- test/xrplTest.js | 4 +- 90 files changed, 703 insertions(+), 349 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index aad2fa7..6179549 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,48 +1,66 @@ { "env": { - "browser": true, - "commonjs": true, - "es6": true, - "es2021": true, - "node": true - }, - "extends": ["airbnb-base", "prettier"], - "globals": { - "Atomics": "readonly", - "SharedArrayBuffer": "readonly" + "es2021": true, + "node": true, + "browser": true }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:import/recommended", + "plugin:import/typescript", + "prettier" + ], + "plugins": ["@typescript-eslint", "unused-imports"], + "parser": "@typescript-eslint/parser", "parserOptions": { - "ecmaVersion": 2018 + "ecmaVersion": "latest", + "sourceType": "module" }, + "overrides": [ + { + "files": ["*.ts", "*.tsx"], + "parserOptions": { + "project": "./tsconfig.json", + "tsconfigRootDir": "." + }, + "rules": { + "@typescript-eslint/no-unused-vars": [ + "warn", + { "args": "after-used", "ignoreRestSiblings": true } + ] + } + }, + { + "files": ["*.js"], + "rules": { + "no-unused-vars": [ + "warn", + { "args": "after-used", "ignoreRestSiblings": true } + ] + } + } + ], "rules": { - "no-console": "off", - "no-else-return" : "off", - "no-redeclare": "error", - "semi": ["error", "always"], - "no-unused-vars": [ - 2, - { - "vars": "all", - "args": "after-used" - } - ], - "func-names": ["error", "as-needed"], - "global-require": "off", - "class-methods-use-this": "off", - "no-restricted-syntax": "off", - "radix": "off", - "max-len": [ - 2, - 150, - 4, - { - "ignoreComments": true - } - ], - "quote-props": "off", - "no-underscore-dangle": "off", - "no-nested-ternary": "off", - "parser": "@babel/eslint-parser" - + "semi": ["error", "always"], + "no-console": "off", + "no-redeclare": "error", + "max-len": [ + "error", + { + "code": 150, + "ignoreComments": true, + "ignoreUrls": true, + "ignoreStrings": true + } + ], + "unused-imports/no-unused-imports": "warn", + "import/order": [ + "warn", + { + "groups": ["builtin", "external", "internal"], + "alphabetize": { "order": "asc", "caseInsensitive": true } + } + ] } -} \ No newline at end of file +} diff --git a/configuration/common.ts b/configuration/common.ts index 7112954..b114482 100644 --- a/configuration/common.ts +++ b/configuration/common.ts @@ -25,7 +25,7 @@ const getChainIdFromChainSymbol = async (chainSymbol: string): Promise => { /* diff --git a/configuration/intialiseWeb3.js b/configuration/intialiseWeb3.js index 402f841..6e8abca 100644 --- a/configuration/intialiseWeb3.js +++ b/configuration/intialiseWeb3.js @@ -1,13 +1,13 @@ // Import the multiple different web3 libraries -const EvmWeb = require('web3'); +const { StargateClient } = require("@cosmjs/stargate"); +const { SuiClient } = require('@mysten/sui/client'); const solanaWeb = require('@solana/web3.js'); -const TronWeb = require('tronweb'); -const nearApi = require('near-api-js'); +const { TonClient, WalletContractV4, internal } = require("@ton/ton"); const algosdk = require('algosdk'); -const { SuiClient } = require('@mysten/sui/client'); const aptos = require('aptos'); -const { TonClient, WalletContractV4, internal } = require("@ton/ton"); -const { StargateClient } = require("@cosmjs/stargate"); +const nearApi = require('near-api-js'); +const TronWeb = require('tronweb'); +const EvmWeb = require('web3'); const common = require('./common'); const config = require('./config.json'); diff --git a/configuration/intialiseWeb3.ts b/configuration/intialiseWeb3.ts index c745061..0312022 100644 --- a/configuration/intialiseWeb3.ts +++ b/configuration/intialiseWeb3.ts @@ -1,13 +1,13 @@ -import EvmWeb from 'web3'; +import { StargateClient } from "@cosmjs/stargate"; +import { SuiClient } from '@mysten/sui/client'; import { Connection } from '@solana/web3.js'; -import TronWeb, { providers } from 'tronweb'; -import * as nearApi from 'near-api-js'; +import { TonClient } from "@ton/ton"; import * as algosdk from 'algosdk'; -import { SuiClient } from '@mysten/sui/client'; import { AptosClient } from 'aptos'; -import { TonClient } from "@ton/ton"; -import { StargateClient } from "@cosmjs/stargate"; +import * as nearApi from 'near-api-js'; import { Horizon } from 'stellar-sdk'; +import TronWeb, { providers } from 'tronweb'; +import EvmWeb from 'web3'; import * as common from './common'; import config from './config'; diff --git a/examples/circleTest.js b/examples/circleTest.js index f5ac434..d029406 100644 --- a/examples/circleTest.js +++ b/examples/circleTest.js @@ -1,5 +1,5 @@ -const { WalletCircle, prepareTransaction } = require('../src/index'); const dotenv = require('dotenv'); +const { WalletCircle, prepareTransaction } = require('../src/index'); async function initcircleWallet(options) { const userToken = await WalletCircle.getUserToken(options); diff --git a/examples/dfnsTest.js b/examples/dfnsTest.js index 0096d94..0aabde4 100644 --- a/examples/dfnsTest.js +++ b/examples/dfnsTest.js @@ -1,5 +1,5 @@ -const { WalletDFNS, prepareTransaction } = require('../src/index'); const dotenv = require('dotenv'); +const { WalletDFNS, prepareTransaction } = require('../src/index'); async function main() { @@ -17,7 +17,7 @@ async function main() { options.credId = process.env.DFNS_CRED_ID; options.xApiKey = process.env.xApiKey; options.appId = process.env.DFNS_APP_ID; - options.authToken = process.env.DFNS_ACCESS_TOKEN + options.authToken = process.env.DFNS_ACCESS_TOKEN; options.baseUrl = process.env.DFNS_API_URL; options.walletId = process.env.WALLET_ID; options.appOrigin = 'http://localhost:3000'; diff --git a/package-lock.json b/package-lock.json index 4da1d48..5e367a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,10 +68,13 @@ "@babel/eslint-parser": "^7.22.15", "@types/jsonwebtoken": "^9.0.7", "@types/node": "^22.10.1", - "eslint": "8.56.0", + "@typescript-eslint/eslint-plugin": "^8.38.0", + "@typescript-eslint/parser": "^8.38.0", + "eslint": "^8.56.0", "eslint-config-airbnb-base": "15.0.0", - "eslint-config-prettier": "9.1.0", - "eslint-plugin-import": "2.29.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-unused-imports": "^4.1.4", "jest": "29.7.0", "jsonwebtoken": "^9.0.2", "tronweb": "^6.0.0", @@ -1599,16 +1602,20 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } @@ -4131,41 +4138,6 @@ "node": ">=14.16" } }, - "node_modules/@ton/core": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/@ton/core/-/core-0.57.0.tgz", - "integrity": "sha512-UOehEXEV5yqi+17qmmWdD01YfVgQlYtitSm5OfN/WMg6PAMkt+Uf91JRC4mdPNtkKDhyKuujJuhYs6QiOsHPfw==", - "license": "MIT", - "peer": true, - "dependencies": { - "symbol.inspect": "1.0.1" - }, - "peerDependencies": { - "@ton/crypto": ">=3.2.0" - } - }, - "node_modules/@ton/crypto": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@ton/crypto/-/crypto-3.3.0.tgz", - "integrity": "sha512-/A6CYGgA/H36OZ9BbTaGerKtzWp50rg67ZCH2oIjV1NcrBaCK9Z343M+CxedvM7Haf3f/Ee9EhxyeTp0GKMUpA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@ton/crypto-primitives": "2.1.0", - "jssha": "3.2.0", - "tweetnacl": "1.0.3" - } - }, - "node_modules/@ton/crypto-primitives": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@ton/crypto-primitives/-/crypto-primitives-2.1.0.tgz", - "integrity": "sha512-PQesoyPgqyI6vzYtCXw4/ZzevePc4VGcJtFwf08v10OevVJHVfW238KBdpj1kEDQkxWLeuNHEpTECNFKnP6tow==", - "license": "MIT", - "peer": true, - "dependencies": { - "jssha": "3.2.0" - } - }, "node_modules/@ton/ton": { "version": "13.9.0", "resolved": "https://registry.npmjs.org/@ton/ton/-/ton-13.9.0.tgz", @@ -4421,6 +4393,290 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz", + "integrity": "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/type-utils": "8.38.0", + "@typescript-eslint/utils": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.38.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz", + "integrity": "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz", + "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.38.0", + "@typescript-eslint/types": "^8.38.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz", + "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz", + "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz", + "integrity": "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0", + "@typescript-eslint/utils": "8.38.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz", + "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz", + "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.38.0", + "@typescript-eslint/tsconfig-utils": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz", + "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz", + "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.38.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -5441,12 +5697,13 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -6815,7 +7072,9 @@ "version": "8.56.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -6890,6 +7149,7 @@ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -6948,6 +7208,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.7", "array.prototype.findlastindex": "^1.2.3", @@ -6995,6 +7256,22 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-unused-imports": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.1.4.tgz", + "integrity": "sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", + "eslint": "^9.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", @@ -7660,6 +7937,36 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -7721,10 +8028,11 @@ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -8831,6 +9139,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -10295,6 +10604,16 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/merkle-lib": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz", @@ -10309,12 +10628,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -12840,6 +13160,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -12951,6 +13272,19 @@ "semver": "bin/semver" } }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", @@ -13199,6 +13533,7 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/package.json b/package.json index ff47d86..4389a41 100644 --- a/package.json +++ b/package.json @@ -81,10 +81,13 @@ "@babel/eslint-parser": "^7.22.15", "@types/jsonwebtoken": "^9.0.7", "@types/node": "^22.10.1", - "eslint": "8.56.0", + "@typescript-eslint/eslint-plugin": "^8.38.0", + "@typescript-eslint/parser": "^8.38.0", + "eslint": "^8.56.0", "eslint-config-airbnb-base": "15.0.0", - "eslint-config-prettier": "9.1.0", - "eslint-plugin-import": "2.29.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-unused-imports": "^4.1.4", "jest": "29.7.0", "jsonwebtoken": "^9.0.2", "tronweb": "^6.0.0", diff --git a/src/adapters/Wallet/index.js b/src/adapters/Wallet/index.js index 6da90e3..ce03e29 100644 --- a/src/adapters/Wallet/index.js +++ b/src/adapters/Wallet/index.js @@ -1,11 +1,11 @@ const axios = require('axios').default; const BN = require('bn.js'); +const { ethers } = require('ethers-5'); const rawTransaction = require('./signTransaction/index'); -const config = require('../../../configuration/config.json'); const common = require('../../../configuration/common'); -const schemaValidator = require('../../../configuration/schemaValidator'); +const config = require('../../../configuration/config.json'); const { initialiseWeb3 } = require('../../../configuration/intialiseWeb3'); -const { ethers } = require('ethers-5'); +const schemaValidator = require('../../../configuration/schemaValidator'); class Wallet { @@ -129,7 +129,7 @@ class Wallet { } const { dexId, domain, types, values } = options; - const { chainId } = config.dexes[dexId] + const { chainId } = config.dexes[dexId]; let apiConfig = { method: 'get', @@ -159,7 +159,7 @@ class Wallet { } const { dexId, orderType, domain, types, message } = options; - const { chainId } = config.dexes[dexId] + const { chainId } = config.dexes[dexId]; let apiConfig = { method: 'get', @@ -210,7 +210,7 @@ class Wallet { }); transaction.chainId = chainId; return transaction; - } + }; } module.exports = { Wallet }; diff --git a/src/adapters/Wallet/index.ts b/src/adapters/Wallet/index.ts index 7241725..a7b2110 100644 --- a/src/adapters/Wallet/index.ts +++ b/src/adapters/Wallet/index.ts @@ -1,11 +1,11 @@ import axios, { AxiosRequestConfig } from 'axios'; import BN from 'bn.js'; +import { ethers } from 'ethers-5'; import * as rawTransaction from './signTransaction/index'; -import config from '../../../configuration/config'; import * as common from '../../../configuration/common'; -import * as schemaValidator from '../../../configuration/schemaValidator'; +import config from '../../../configuration/config'; import { initialiseWeb3 } from '../../../configuration/intialiseWeb3'; -import { ethers } from 'ethers-5'; +import * as schemaValidator from '../../../configuration/schemaValidator'; interface WalletOptions { privateKey: string; diff --git a/src/adapters/Wallet/signTransaction/Aptos.ts b/src/adapters/Wallet/signTransaction/Aptos.ts index ba1fbfd..5b99fb3 100644 --- a/src/adapters/Wallet/signTransaction/Aptos.ts +++ b/src/adapters/Wallet/signTransaction/Aptos.ts @@ -15,7 +15,7 @@ const signTransactionAptos = async (web3:any, transactionObject:any, options:any const accountFrom = new AptosAccount(HexString.ensure(privateKey).toUint8Array()); - let { data } = transactionObject; + const { data } = transactionObject; let transactionBuffer: any; @@ -53,6 +53,6 @@ const signTransactionAptos = async (web3:any, transactionObject:any, options:any catch (error) { return error; } -} +}; -export { signTransactionAptos } \ No newline at end of file +export { signTransactionAptos }; \ No newline at end of file diff --git a/src/adapters/Wallet/signTransaction/Near.js b/src/adapters/Wallet/signTransaction/Near.js index a1e7343..b8d73fa 100644 --- a/src/adapters/Wallet/signTransaction/Near.js +++ b/src/adapters/Wallet/signTransaction/Near.js @@ -1,6 +1,6 @@ -const nearAPI = require('near-api-js'); const BN = require('bn.js'); const sha256 = require("js-sha256"); +const nearAPI = require('near-api-js'); const { KeyPair, keyStores } = nearAPI; diff --git a/src/adapters/Wallet/signTransaction/Near.ts b/src/adapters/Wallet/signTransaction/Near.ts index 55aa9cc..5b711c1 100644 --- a/src/adapters/Wallet/signTransaction/Near.ts +++ b/src/adapters/Wallet/signTransaction/Near.ts @@ -1,6 +1,6 @@ +import sha256 from "js-sha256"; import nearAPI from 'near-api-js'; -import sha256 from "js-sha256"; const { KeyPair, keyStores } = nearAPI; @@ -76,6 +76,6 @@ interface AccessKey { return error; } - } + }; export {signTransactionNear}; \ No newline at end of file diff --git a/src/adapters/Wallet/signTransaction/Solana.js b/src/adapters/Wallet/signTransaction/Solana.js index 3c5a484..1f05ad6 100644 --- a/src/adapters/Wallet/signTransaction/Solana.js +++ b/src/adapters/Wallet/signTransaction/Solana.js @@ -1,9 +1,9 @@ const { Wallet } = require('@project-serum/anchor'); const { Keypair, Transaction, SystemProgram, VersionedTransaction, - TransactionMessage, PublicKey } = require('@solana/web3.js') -const { sign } = require('tweetnacl'); -const { decode } = require('bs58'); + TransactionMessage, PublicKey } = require('@solana/web3.js'); const BN = require('bn.js'); +const { decode } = require('bs58'); +const { sign } = require('tweetnacl'); module.exports = { @@ -35,7 +35,7 @@ module.exports = { if (transactionObject.from !== from.publicKey.toBase58()) { return { msg: "signer is not matching with the from address" - } + }; }; let buffer = Buffer.from(transactionObject.data, "base64"); preparedTx = Transaction.from(buffer); @@ -89,7 +89,7 @@ module.exports = { if (transactionObject.from !== from.publicKey.toBase58()) { return { msg: "signer is not matching with the from address" - } + }; }; let buffer = Buffer.from(transactionObject.data, "base64"); preparedTx = VersionedTransaction.deserialize(buffer); diff --git a/src/adapters/Wallet/signTransaction/Solana.ts b/src/adapters/Wallet/signTransaction/Solana.ts index d09ab75..b7d3e16 100644 --- a/src/adapters/Wallet/signTransaction/Solana.ts +++ b/src/adapters/Wallet/signTransaction/Solana.ts @@ -8,9 +8,9 @@ import { PublicKey, Connection, } from '@solana/web3.js'; -import * as sign from 'tweetnacl'; -import bs58 from 'bs58'; import BN from 'bn.js'; +import bs58 from 'bs58'; +import * as sign from 'tweetnacl'; interface TransactionObject { data?: string; diff --git a/src/adapters/Wallet/signTransaction/Sui.ts b/src/adapters/Wallet/signTransaction/Sui.ts index f795114..aa4d297 100644 --- a/src/adapters/Wallet/signTransaction/Sui.ts +++ b/src/adapters/Wallet/signTransaction/Sui.ts @@ -1,5 +1,5 @@ -import { TransactionBlock, Ed25519Keypair, RawSigner } from '@mysten/sui.js'; import { fromB64 } from "@mysten/bcs"; +import { TransactionBlock, Ed25519Keypair, RawSigner } from '@mysten/sui.js'; @@ -35,6 +35,6 @@ import { fromB64 } from "@mysten/bcs"; return (error); } - } + }; - export { signTransactionSui } \ No newline at end of file + export { signTransactionSui }; \ No newline at end of file diff --git a/src/adapters/Wallet/signTransaction/Tron.ts b/src/adapters/Wallet/signTransaction/Tron.ts index 3456bfb..42a1456 100644 --- a/src/adapters/Wallet/signTransaction/Tron.ts +++ b/src/adapters/Wallet/signTransaction/Tron.ts @@ -26,6 +26,6 @@ import * as TronWeb from 'tronweb'; catch (error) { return error; } - } + }; -export { signTransactionTron } \ No newline at end of file +export { signTransactionTron }; \ No newline at end of file diff --git a/src/adapters/Wallet/signTransaction/index.js b/src/adapters/Wallet/signTransaction/index.js index e92f4b6..caf3664 100644 --- a/src/adapters/Wallet/signTransaction/index.js +++ b/src/adapters/Wallet/signTransaction/index.js @@ -1,11 +1,11 @@ const Algorand = require('./Algorand'); +const Aptos = require('./Aptos'); const Ethereum = require('./Ethereum'); const Near = require('./Near'); const Solana = require('./Solana'); -const Tron = require('./Tron'); -const Sui = require('./Sui'); -const Aptos = require('./Aptos'); const StarkNet = require('./Starknet'); +const Sui = require('./Sui'); +const Tron = require('./Tron'); exports.signTransactionAlgorand = async (web3, transactionObject, options) => { diff --git a/src/adapters/Wallet/signTransaction/index.ts b/src/adapters/Wallet/signTransaction/index.ts index b443b42..7f2468c 100644 --- a/src/adapters/Wallet/signTransaction/index.ts +++ b/src/adapters/Wallet/signTransaction/index.ts @@ -1,10 +1,10 @@ import * as Algorand from './Algorand'; +import * as Aptos from './Aptos'; import Ethereum from './Ethereum'; import * as Near from './Near'; import * as Solana from './Solana'; -import * as Tron from './Tron'; import * as Sui from './Sui'; -import * as Aptos from './Aptos'; +import * as Tron from './Tron'; // import StarkNet from './Starknet'; const signTransactionAlgorand:any = async (web3: any, transactionObject: any, options: any) => { diff --git a/src/adapters/WalletBitcoin/index.js b/src/adapters/WalletBitcoin/index.js index 461be68..3462e93 100644 --- a/src/adapters/WalletBitcoin/index.js +++ b/src/adapters/WalletBitcoin/index.js @@ -1,17 +1,17 @@ const { default: axios } = require("axios"); +const bip39 = require('bip39'); const bitcoin = require('bitcoinjs-lib'); const { ECPairFactory } = require('ecpair'); -const bip39 = require('bip39'); const tinysecp = require('tiny-secp256k1'); -const schemaValidator = require('../../../configuration/schemaValidator'); const common = require('../../../configuration/common'); const config = require('../../../configuration/config.json'); +const schemaValidator = require('../../../configuration/schemaValidator'); class WalletBitcoin { constructor(options) { this.privateKey = options.privateKey, - this.xApiKey = options.xApiKey + this.xApiKey = options.xApiKey; } signTransaction = async (options) => { @@ -31,7 +31,7 @@ class WalletBitcoin { if (chainName !== "Bitcoin") { return { "msg": "Bitcoin wallet can be used only with Bitcoin Wallet" - } + }; }; const ECPair = ECPairFactory(tinysecp); @@ -106,7 +106,7 @@ const getKeysFromMnemonic = async (options, path = "m/44'/0'/0'/0/0") => { if (chainName !== "Bitcoin") { return { "msg": "Bitcoin wallet can be used only with Bitcoin Wallet" - } + }; }; const seed = await bip39.mnemonicToSeed(mnemonic); @@ -135,6 +135,6 @@ const getKeysFromMnemonic = async (options, path = "m/44'/0'/0'/0/0") => { }); return { privateKeyWIF, privateKeyHex, publickKey, address }; -} +}; module.exports = { WalletBitcoin, getKeysFromMnemonic }; diff --git a/src/adapters/WalletBitcoin/index.ts b/src/adapters/WalletBitcoin/index.ts index 71348a9..7779f91 100644 --- a/src/adapters/WalletBitcoin/index.ts +++ b/src/adapters/WalletBitcoin/index.ts @@ -1,11 +1,11 @@ import axios from "axios"; +import * as bip39 from "bip39"; import * as bitcoin from "bitcoinjs-lib"; import { ECPairFactory, ECPairInterface } from "ecpair"; -import * as bip39 from "bip39"; import * as tinysecp from "tiny-secp256k1"; -import * as schemaValidator from "../../../configuration/schemaValidator"; import * as common from "../../../configuration/common"; import config from "../../../configuration/config"; +import * as schemaValidator from "../../../configuration/schemaValidator"; interface WalletBitcoinOptions { privateKey: string; diff --git a/src/adapters/WalletCircle/index.js b/src/adapters/WalletCircle/index.js index 8e28665..f03a028 100644 --- a/src/adapters/WalletCircle/index.js +++ b/src/adapters/WalletCircle/index.js @@ -1,8 +1,8 @@ const { initiateUserControlledWalletsClient } = require('@circle-fin/user-controlled-wallets'); -const { v4 } = require('uuid'); const axios = require('axios'); -const schemaValidator = require('../../../configuration/schemaValidator'); +const { v4 } = require('uuid'); const conf = require('../../../configuration/config.json'); +const schemaValidator = require('../../../configuration/schemaValidator'); class WalletCircle { @@ -123,7 +123,7 @@ class WalletCircle { response.challengeId = challengeId.data.challengeId; return response; - } + }; } diff --git a/src/adapters/WalletCircle/index.ts b/src/adapters/WalletCircle/index.ts index d6aa38b..a940425 100644 --- a/src/adapters/WalletCircle/index.ts +++ b/src/adapters/WalletCircle/index.ts @@ -1,8 +1,8 @@ import { initiateUserControlledWalletsClient } from '@circle-fin/user-controlled-wallets'; -import { v4 as uuidv4 } from 'uuid'; import axios, { AxiosRequestConfig } from 'axios'; -import * as schemaValidator from '../../../configuration/schemaValidator'; +import { v4 as uuidv4 } from 'uuid'; import conf from '../../../configuration/config'; +import * as schemaValidator from '../../../configuration/schemaValidator'; interface WalletCircleOptions { appId: string; diff --git a/src/adapters/WalletCoinbase/index.js b/src/adapters/WalletCoinbase/index.js index 1378793..5c79afc 100644 --- a/src/adapters/WalletCoinbase/index.js +++ b/src/adapters/WalletCoinbase/index.js @@ -1,10 +1,10 @@ const axios = require('axios').default; const BN = require('bn.js'); const rawTransaction = require('./signTransaction/index'); -const config = require('../../../configuration/config.json'); const common = require('../../../configuration/common'); -const schemaValidator = require('../../../configuration/schemaValidator'); +const config = require('../../../configuration/config.json'); const { initialiseWeb3 } = require('../../../configuration/intialiseWeb3'); +const schemaValidator = require('../../../configuration/schemaValidator'); class WalletCoinbase { @@ -107,7 +107,7 @@ class WalletCoinbase { }); transaction.chainId = chainId; return transaction; - } + }; } diff --git a/src/adapters/WalletCoinbase/index.ts b/src/adapters/WalletCoinbase/index.ts index bf7812a..fbddfc7 100644 --- a/src/adapters/WalletCoinbase/index.ts +++ b/src/adapters/WalletCoinbase/index.ts @@ -1,10 +1,10 @@ import axios from 'axios'; import BN from 'bn.js'; import * as rawTransaction from './signTransaction/index'; -import config from '../../../configuration/config'; import * as common from '../../../configuration/common'; -import * as schemaValidator from '../../../configuration/schemaValidator'; +import config from '../../../configuration/config'; import { initialiseWeb3 } from '../../../configuration/intialiseWeb3'; +import * as schemaValidator from '../../../configuration/schemaValidator'; type TransactionObject = { chainId: string; @@ -54,7 +54,7 @@ class WalletCoinbase { configuration.params = { chainId }; - let rpcResponse = await axios.get(apiURL, configuration); + const rpcResponse = await axios.get(apiURL, configuration); const rpc = rpcResponse.data.data.rpc; const web3 = await initialiseWeb3({ rpc, chainId, key: this.xApiKey }); diff --git a/src/adapters/WalletCosmos/index.js b/src/adapters/WalletCosmos/index.js index 727a9f2..d9abfea 100644 --- a/src/adapters/WalletCosmos/index.js +++ b/src/adapters/WalletCosmos/index.js @@ -2,9 +2,9 @@ const { DirectSecp256k1HdWallet } = require("@cosmjs/proto-signing"); const { SigningStargateClient } = require("@cosmjs/stargate"); const { TxRaw } = require("cosmjs-types/cosmos/tx/v1beta1/tx"); const axios = require('axios').default; -const schemaValidator = require('../../../configuration/schemaValidator'); const common = require('../../../configuration/common'); const config = require('../../../configuration/config.json'); +const schemaValidator = require('../../../configuration/schemaValidator'); class WalletCosmos { @@ -40,7 +40,7 @@ class WalletCosmos { if (chainName !== "Cosmos") { return { "msg": "Cosmos wallet can be used only with Cosmos chains" - } + }; }; const wallet = await DirectSecp256k1HdWallet.fromMnemonic(this.wallet, { @@ -70,7 +70,7 @@ class WalletCosmos { const rawString = Buffer.from(encodedTx).toString("base64"); return { chainId: chainId, rawTransaction: rawString }; - } + }; sendTransaction = async (options) => { diff --git a/src/adapters/WalletCosmos/index.ts b/src/adapters/WalletCosmos/index.ts index f5709b5..31eedaa 100644 --- a/src/adapters/WalletCosmos/index.ts +++ b/src/adapters/WalletCosmos/index.ts @@ -1,10 +1,10 @@ import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; import { SigningStargateClient } from "@cosmjs/stargate"; -import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx"; import axios from "axios"; -import * as schemaValidator from "../../../configuration/schemaValidator"; +import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx"; import * as common from "../../../configuration/common"; import * as config from "../../../configuration/config"; +import * as schemaValidator from "../../../configuration/schemaValidator"; interface WalletCosmosOptions { privateKey: string; diff --git a/src/adapters/WalletDFNS/index.js b/src/adapters/WalletDFNS/index.js index f00294f..a23aa06 100644 --- a/src/adapters/WalletDFNS/index.js +++ b/src/adapters/WalletDFNS/index.js @@ -1,11 +1,11 @@ +const { DfnsWallet } = require("@dfns/lib-ethersjs6"); const { DfnsApiClient } = require("@dfns/sdk"); const { AsymmetricKeySigner } = require("@dfns/sdk-keysigner"); -const { DfnsWallet } = require("@dfns/lib-ethersjs6"); -const { JsonRpcProvider, Network, Transaction } = require("ethers"); const axios = require('axios'); +const { JsonRpcProvider, Network, Transaction } = require("ethers"); const rawTransaction = require('./signTransaction/index'); -const config = require('../../../configuration/config.json'); const common = require('../../../configuration/common'); +const config = require('../../../configuration/config.json'); const schemaValidator = require('../../../configuration/schemaValidator'); @@ -18,8 +18,8 @@ class WalletDFNS { this.appId = options.appId; this.authToken = options.authToken; this.walletId = options.walletId; - this.baseUrl = options.baseUrl - this.appOrigin = options.appOrigin + this.baseUrl = options.baseUrl; + this.appOrigin = options.appOrigin; this.signer = new AsymmetricKeySigner({ privateKey: options.privateKey, credId: options.credId, @@ -70,7 +70,7 @@ class WalletDFNS { return new Error("chain not Supported"); const options = {}; - options.wallet = this.wallet //.connect(rpcProvider); + options.wallet = this.wallet; //.connect(rpcProvider); options.xApiKey = this.xApiKey; options.rpcProvider = rpcProvider; const response = await rawTransaction[`signTransaction${chainName}`](transactionObject, options); @@ -109,13 +109,13 @@ class WalletDFNS { let transaction = Transaction.from(transactionObject.rawTransaction); let TxHash = await wallet.sendTransaction(transaction); - return { "TxHash": TxHash.hash } + return { "TxHash": TxHash.hash }; } catch (error) { return error; } - } + }; } module.exports = { WalletDFNS }; \ No newline at end of file diff --git a/src/adapters/WalletDFNS/index.ts b/src/adapters/WalletDFNS/index.ts index 109d390..1ab8e48 100644 --- a/src/adapters/WalletDFNS/index.ts +++ b/src/adapters/WalletDFNS/index.ts @@ -1,11 +1,11 @@ +import { DfnsWallet } from "@dfns/lib-ethersjs6"; import { DfnsApiClient } from "@dfns/sdk"; import { AsymmetricKeySigner } from "@dfns/sdk-keysigner"; -import { DfnsWallet } from "@dfns/lib-ethersjs6"; -import { JsonRpcProvider, Network, Transaction } from "ethers"; import axios from "axios"; +import { JsonRpcProvider, Transaction } from "ethers"; import * as rawTransaction from "./signTransaction/index"; -import config from "../../../configuration/config"; import * as common from "../../../configuration/common"; +import config from "../../../configuration/config"; import * as schemaValidator from "../../../configuration/schemaValidator"; type WalletDFNSOptions = { diff --git a/src/adapters/WalletDFNS/signTransaction/Ethereum.js b/src/adapters/WalletDFNS/signTransaction/Ethereum.js index 8dca368..09eee9f 100644 --- a/src/adapters/WalletDFNS/signTransaction/Ethereum.js +++ b/src/adapters/WalletDFNS/signTransaction/Ethereum.js @@ -22,7 +22,7 @@ module.exports = { gasLimit: transactionObject.gas }; let signedTx = await (options.wallet).signTransaction(tx); - const response = { rawTransaction: signedTx } + const response = { rawTransaction: signedTx }; return response; diff --git a/src/adapters/WalletFireblocks/index.js b/src/adapters/WalletFireblocks/index.js index 39bd251..68c5808 100644 --- a/src/adapters/WalletFireblocks/index.js +++ b/src/adapters/WalletFireblocks/index.js @@ -1,9 +1,9 @@ +const crypto = require('crypto'); const axios = require('axios'); const { sign } = require('jsonwebtoken'); const { v4: uuid } = require('uuid'); -const crypto = require('crypto'); -const config = require('../../../configuration/config.json'); const common = require('../../../configuration/common'); +const config = require('../../../configuration/config.json'); const schemaValidator = require('../../../configuration/schemaValidator'); class WalletFireblocks { @@ -41,7 +41,7 @@ class WalletFireblocks { const chainId = await common.getChainId({ chainId: transactionObject.chainId, chainSymbol: transactionObject.chainSymbol }); let chainName = config.chains[chainId].chainName; - const txData = {} + const txData = {}; txData.operation = (transactionObject.data) ? "CONTRACT_CALL" : "TRANSFER", txData.source = { "type": "VAULT_ACCOUNT", @@ -52,7 +52,7 @@ class WalletFireblocks { txData.destination = { "type": "VAULT_ACCOUNT", "id": transactionObject.to - } + }; } else { @@ -61,18 +61,18 @@ class WalletFireblocks { "oneTimeAddress": { "address": transactionObject.to } - } + }; } const assetDecimals = (transactionObject.assetDecimals) ? (transactionObject.assetDecimals) : 18; txData.assetId = (transactionObject.assetId) ? (transactionObject.assetId) : "ETH_TEST3"; txData.amount = (transactionObject.value) ? (transactionObject.value) / 10 ** assetDecimals : '0', - txData.note = (transactionObject.note) ? (transactionObject.note) : "expand" + txData.note = (transactionObject.note) ? (transactionObject.note) : "expand"; if (transactionObject.data) { txData.extraParameters = { "contractCallData": transactionObject.data - } + }; } const signature = this.jwtSign("/v1/transactions", txData); const rawTx = { @@ -80,13 +80,13 @@ class WalletFireblocks { "path": config.fireblocks.createTransaction, "data": txData, "method": "POST" - } + }; return rawTx; } catch (error) { return error; } - } + }; sendTransaction = async (rawTx) => { @@ -110,7 +110,7 @@ class WalletFireblocks { "X-API-Key": this.apiKey, "Authorization": `Bearer ${rawTx.jwt}` } - }) + }); return resp.data; } catch (error) { @@ -118,11 +118,11 @@ class WalletFireblocks { return error.data; } - } + }; } -module.exports = { WalletFireblocks } +module.exports = { WalletFireblocks }; diff --git a/src/adapters/WalletFireblocks/index.ts b/src/adapters/WalletFireblocks/index.ts index fab745e..03d73de 100644 --- a/src/adapters/WalletFireblocks/index.ts +++ b/src/adapters/WalletFireblocks/index.ts @@ -1,9 +1,9 @@ +import crypto from 'crypto'; import axios from 'axios'; import * as jwt from 'jsonwebtoken'; import { v4 as uuidv4 } from 'uuid'; -import crypto from 'crypto'; -import config from '../../../configuration/config'; import * as common from '../../../configuration/common'; +import config from '../../../configuration/config'; import * as schemaValidator from '../../../configuration/schemaValidator'; interface WalletFireblocksOptions { diff --git a/src/adapters/WalletFordefi/index.js b/src/adapters/WalletFordefi/index.js index ca168f0..456f84b 100644 --- a/src/adapters/WalletFordefi/index.js +++ b/src/adapters/WalletFordefi/index.js @@ -1,7 +1,7 @@ const axios = require('axios'); const rawTransaction = require('./signTransaction/index'); -const config = require('../../../configuration/config.json'); const common = require('../../../configuration/common'); +const config = require('../../../configuration/config.json'); const schemaValidator = require('../../../configuration/schemaValidator'); class WalletFordefi { @@ -74,7 +74,7 @@ class WalletFordefi { return error.response.data; } - } + }; } module.exports = { WalletFordefi }; \ No newline at end of file diff --git a/src/adapters/WalletFordefi/index.ts b/src/adapters/WalletFordefi/index.ts index 602f860..1a4ba38 100644 --- a/src/adapters/WalletFordefi/index.ts +++ b/src/adapters/WalletFordefi/index.ts @@ -1,7 +1,7 @@ import axios, { AxiosRequestConfig } from 'axios'; import * as rawTransaction from './signTransaction/index'; -import config from '../../../configuration/config'; import { getChainId } from '../../../configuration/common'; +import config from '../../../configuration/config'; import * as schemaValidator from '../../../configuration/schemaValidator'; interface WalletOptions { diff --git a/src/adapters/WalletFordefi/signTransaction/Ethereum.js b/src/adapters/WalletFordefi/signTransaction/Ethereum.js index f9c7e38..911bee6 100644 --- a/src/adapters/WalletFordefi/signTransaction/Ethereum.js +++ b/src/adapters/WalletFordefi/signTransaction/Ethereum.js @@ -22,7 +22,7 @@ module.exports = { type: "priority", priority_level: "medium", gas_limit: transactionObject.gas - } + }; details.gas = gas; details.to = transactionObject.to; details.value = transactionObject.value; @@ -31,7 +31,7 @@ module.exports = { details.data = { type: "hex", hex_data: transactionObject.data - } + }; } reqBody.details = details; reqBody.signer_type = "api_signer"; diff --git a/src/adapters/WalletFordefi/signTransaction/Solana.js b/src/adapters/WalletFordefi/signTransaction/Solana.js index 1808d60..75d96d2 100644 --- a/src/adapters/WalletFordefi/signTransaction/Solana.js +++ b/src/adapters/WalletFordefi/signTransaction/Solana.js @@ -16,9 +16,9 @@ module.exports = { reqBody.vault_id = options.vault_id; reqBody.type = "solana_transaction"; reqBody.signer_type = "api_signer"; - let chain = 'solana_mainnet' + let chain = 'solana_mainnet'; if (transactionObject.chainId === '901') { - chain = 'solana_devnet' + chain = 'solana_devnet'; } else { chain = 'solana_mainnet'; } @@ -37,7 +37,7 @@ module.exports = { type: "native", chain: chain } - } + }; reqBody.details = details; reqBody = JSON.stringify(reqBody); // return reqBody; diff --git a/src/adapters/WalletFordefi/signTransaction/index.js b/src/adapters/WalletFordefi/signTransaction/index.js index a1213d1..9e72335 100644 --- a/src/adapters/WalletFordefi/signTransaction/index.js +++ b/src/adapters/WalletFordefi/signTransaction/index.js @@ -11,4 +11,4 @@ exports.signTransactionSolana = async (transactionObject, options) => { const rawData = await Solana.signTransactionSolana(transactionObject, options); return rawData; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/adapters/WalletPhantom/index.js b/src/adapters/WalletPhantom/index.js index 6dceae7..af79ff4 100644 --- a/src/adapters/WalletPhantom/index.js +++ b/src/adapters/WalletPhantom/index.js @@ -1,10 +1,10 @@ const axios = require('axios').default; const BN = require('bn.js'); const rawTransaction = require('./signTransaction/index'); -const config = require('../../../configuration/config.json'); const common = require('../../../configuration/common'); -const schemaValidator = require('../../../configuration/schemaValidator'); +const config = require('../../../configuration/config.json'); const { initialiseWeb3 } = require('../../../configuration/intialiseWeb3'); +const schemaValidator = require('../../../configuration/schemaValidator'); class WalletPhantom { @@ -139,7 +139,7 @@ class WalletPhantom { }); transaction.chainId = chainId; return transaction; - } + }; } module.exports = { WalletPhantom }; diff --git a/src/adapters/WalletPhantom/index.ts b/src/adapters/WalletPhantom/index.ts index 0d450a2..1ac8bf3 100644 --- a/src/adapters/WalletPhantom/index.ts +++ b/src/adapters/WalletPhantom/index.ts @@ -1,10 +1,9 @@ import axios, { AxiosRequestConfig } from 'axios'; -import BN from 'bn.js'; import * as rawTransaction from './signTransaction/index'; -import config from '../../../configuration/config'; import * as common from '../../../configuration/common'; -import * as schemaValidator from '../../../configuration/schemaValidator'; +import config from '../../../configuration/config'; import { initialiseWeb3 } from '../../../configuration/intialiseWeb3'; +import * as schemaValidator from '../../../configuration/schemaValidator'; interface WalletPhantomOptions { privateKey: string; @@ -57,7 +56,7 @@ class WalletPhantom { configuration.params = { chainId }; - let rpcResponse = await axios.get(apiURL, configuration); + const rpcResponse = await axios.get(apiURL, configuration); const rpc = rpcResponse.data.data.rpc; const web3 = await initialiseWeb3({ rpc, chainId, key: this.xApiKey }); @@ -94,7 +93,7 @@ class WalletPhantom { configuration.params = { chainId }; - let rpcResponse = await axios.get(apiURL, configuration); + const rpcResponse = await axios.get(apiURL, configuration); const rpc = rpcResponse.data.data.rpc; const web3 = await initialiseWeb3({ rpc, chainId, key: this.xApiKey }); diff --git a/src/adapters/WalletPhantom/signTransaction/Solana.js b/src/adapters/WalletPhantom/signTransaction/Solana.js index ce6d4cb..8a89e25 100644 --- a/src/adapters/WalletPhantom/signTransaction/Solana.js +++ b/src/adapters/WalletPhantom/signTransaction/Solana.js @@ -1,9 +1,9 @@ const { Wallet } = require('@project-serum/anchor'); const { Keypair, Transaction, SystemProgram, VersionedTransaction, - TransactionMessage, PublicKey } = require('@solana/web3.js') -const { sign } = require('tweetnacl'); -const { decode } = require('bs58'); + TransactionMessage, PublicKey } = require('@solana/web3.js'); const BN = require('bn.js'); +const { decode } = require('bs58'); +const { sign } = require('tweetnacl'); module.exports = { @@ -35,7 +35,7 @@ module.exports = { if (transactionObject.from !== from.publicKey.toBase58()) { return { msg: "signer is not matching with the from address" - } + }; }; let buffer = Buffer.from(transactionObject.data, "base64"); preparedTx = Transaction.from(buffer); @@ -89,7 +89,7 @@ module.exports = { if (transactionObject.from !== from.publicKey.toBase58()) { return { msg: "signer is not matching with the from address" - } + }; }; let buffer = Buffer.from(transactionObject.data, "base64"); preparedTx = VersionedTransaction.deserialize(buffer); diff --git a/src/adapters/WalletPhantom/signTransaction/Solana.ts b/src/adapters/WalletPhantom/signTransaction/Solana.ts index 7f93ade..9fda917 100644 --- a/src/adapters/WalletPhantom/signTransaction/Solana.ts +++ b/src/adapters/WalletPhantom/signTransaction/Solana.ts @@ -9,9 +9,9 @@ import { Connection, BlockhashWithExpiryBlockHeight } from '@solana/web3.js'; -import nacl from 'tweetnacl'; -import bs58 from 'bs58'; import BN from 'bn.js'; +import bs58 from 'bs58'; +import nacl from 'tweetnacl'; interface TransactionObject { to: string; diff --git a/src/adapters/WalletPhantom/signTransaction/index.js b/src/adapters/WalletPhantom/signTransaction/index.js index 2ec5b2e..41bbe15 100644 --- a/src/adapters/WalletPhantom/signTransaction/index.js +++ b/src/adapters/WalletPhantom/signTransaction/index.js @@ -1,5 +1,5 @@ -const Solana = require('./Solana'); const Ethereum = require('./Ethereum'); +const Solana = require('./Solana'); exports.signTransactionEvm = async (web3, transactionObject, options) => { const rawData = await Ethereum.signTransactionEvm(web3, transactionObject, options); diff --git a/src/adapters/WalletPhantom/signTransaction/index.ts b/src/adapters/WalletPhantom/signTransaction/index.ts index ceff2f3..d068540 100644 --- a/src/adapters/WalletPhantom/signTransaction/index.ts +++ b/src/adapters/WalletPhantom/signTransaction/index.ts @@ -1,5 +1,5 @@ -import * as Solana from './Solana'; import * as Ethereum from './Ethereum'; +import * as Solana from './Solana'; export const signTransactionEvm = async ( web3: any, diff --git a/src/adapters/WalletStacks/index.js b/src/adapters/WalletStacks/index.js index a51ad0e..6994941 100644 --- a/src/adapters/WalletStacks/index.js +++ b/src/adapters/WalletStacks/index.js @@ -1,5 +1,5 @@ -const { default: axios } = require("axios"); const { bytesToHex } = require("@stacks/common"); +const { StacksMainnet, StacksNetwork, StacksTestnet } = require("@stacks/network"); const { TransactionSigner, createStacksPrivateKey, @@ -11,17 +11,17 @@ const { TransactionVersion, makeContractCall, } = require("@stacks/transactions"); -const schemaValidator = require('../../../configuration/schemaValidator'); +const { getStxAddress, generateWallet } = require("@stacks/wallet-sdk"); +const { default: axios } = require("axios"); const common = require('../../../configuration/common'); const config = require('../../../configuration/config.json'); -const { StacksMainnet, StacksNetwork, StacksTestnet } = require("@stacks/network"); -const { getStxAddress, generateWallet } = require("@stacks/wallet-sdk"); +const schemaValidator = require('../../../configuration/schemaValidator'); class WalletStacks { constructor(options) { this.privateKey = options.privateKey, - this.xApiKey = options.xApiKey + this.xApiKey = options.xApiKey; } signTransaction = async (options) => { @@ -41,7 +41,7 @@ class WalletStacks { if (chainName !== "Stacks") { return { "msg": "Stacks wallet can be used only with Stacks chain" - } + }; }; const network = chainId === "1700" ? new StacksMainnet : new StacksTestnet(); @@ -74,7 +74,7 @@ class WalletStacks { network, senderKey: this.privateKey, anchorMode: AnchorMode.Any, - }) + }); } else { // Transfer token function from Stacks SDK @@ -145,6 +145,6 @@ const getStacksPrivateKey = async (mnemonic, password) => { })); return (wallets); -} +}; module.exports = { WalletStacks, getStacksPrivateKey }; \ No newline at end of file diff --git a/src/adapters/WalletStacks/index.ts b/src/adapters/WalletStacks/index.ts index a87cd1b..d3c8789 100644 --- a/src/adapters/WalletStacks/index.ts +++ b/src/adapters/WalletStacks/index.ts @@ -1,5 +1,5 @@ -import axios from "axios"; import { bytesToHex } from "@stacks/common"; +import { StacksMainnet, StacksTestnet, StacksNetwork } from "@stacks/network"; import { TransactionSigner, createStacksPrivateKey, @@ -7,16 +7,15 @@ import { publicKeyToString, makeUnsignedSTXTokenTransfer, AnchorMode, - makeUnsignedContractCall, makeContractCall, StacksTransaction, TransactionVersion, } from "@stacks/transactions"; -import * as schemaValidator from '../../../configuration/schemaValidator'; +import { getStxAddress, generateWallet } from "@stacks/wallet-sdk"; +import axios from "axios"; import * as common from '../../../configuration/common'; import config from '../../../configuration/config'; -import { StacksMainnet, StacksTestnet, StacksNetwork } from "@stacks/network"; -import { getStxAddress, generateWallet } from "@stacks/wallet-sdk"; +import * as schemaValidator from '../../../configuration/schemaValidator'; interface WalletOptions { privateKey: string; diff --git a/src/adapters/WalletStellar/index.js b/src/adapters/WalletStellar/index.js index 6e3bdb9..bbe11c4 100644 --- a/src/adapters/WalletStellar/index.js +++ b/src/adapters/WalletStellar/index.js @@ -1,13 +1,13 @@ const { TransactionBuilder, Keypair } = require("@stellar/stellar-sdk"); -const schemaValidator = require('../../../configuration/schemaValidator'); +const { default: axios } = require("axios"); const common = require('../../../configuration/common'); const config = require('../../../configuration/config.json'); -const { default: axios } = require("axios"); +const schemaValidator = require('../../../configuration/schemaValidator'); class WalletStellar { constructor(options) { this.privateKey = options.privateKey, - this.xApiKey = options.xApiKey + this.xApiKey = options.xApiKey; } signTransaction = async (options) => { @@ -27,14 +27,14 @@ class WalletStellar { if (chainName !== "Stellar") { return { "msg": "Stellar wallet can be used only with Stellar chain" - } + }; }; const userKeyPair = Keypair.fromSecret(this.privateKey); const { networkPassphrase } = config.chains[chainId]; let rawTransaction = TransactionBuilder.fromXDR(data, networkPassphrase); - rawTransaction.sign(userKeyPair) + rawTransaction.sign(userKeyPair); rawTransaction = rawTransaction.toEnvelope().toXDR('base64'); return { rawTransaction, chainId }; diff --git a/src/adapters/WalletStellar/index.ts b/src/adapters/WalletStellar/index.ts index 2931999..7c522ac 100644 --- a/src/adapters/WalletStellar/index.ts +++ b/src/adapters/WalletStellar/index.ts @@ -1,8 +1,8 @@ +import axios, { AxiosRequestConfig } from "axios"; import { TransactionBuilder, Keypair } from "stellar-sdk"; -import * as schemaValidator from '../../../configuration/schemaValidator'; import * as common from '../../../configuration/common'; import config from '../../../configuration/config'; -import axios, { AxiosRequestConfig } from "axios"; +import * as schemaValidator from '../../../configuration/schemaValidator'; interface WalletStellarOptions { privateKey: string; @@ -59,7 +59,7 @@ class WalletStellar { return { msg: "Network passphrase is not defined" }; } - let rawTransaction = TransactionBuilder.fromXDR(data, networkPassphrase); + const rawTransaction = TransactionBuilder.fromXDR(data, networkPassphrase); rawTransaction.sign(userKeyPair); const xdrString = rawTransaction.toEnvelope().toXDR("base64"); diff --git a/src/adapters/WalletTON/index.js b/src/adapters/WalletTON/index.js index a273045..93c862e 100644 --- a/src/adapters/WalletTON/index.js +++ b/src/adapters/WalletTON/index.js @@ -1,9 +1,9 @@ -const { mnemonicToPrivateKey, keyPairFromSecretKey } = require("ton-crypto"); const { WalletContractV4, internal, Cell } = require("@ton/ton"); -const schemaValidator = require('../../../configuration/schemaValidator'); +const { mnemonicToPrivateKey, keyPairFromSecretKey } = require("ton-crypto"); const common = require('../../../configuration/common'); -const { initialiseWeb3 } = require("../../../configuration/intialiseWeb3"); const config = require('../../../configuration/config.json'); +const { initialiseWeb3 } = require("../../../configuration/intialiseWeb3"); +const schemaValidator = require('../../../configuration/schemaValidator'); class WalletTON { @@ -11,7 +11,7 @@ class WalletTON { constructor(options) { this.privateKey = Buffer.from(options.privateKey, 'hex'), this.keyPair = keyPairFromSecretKey(this.privateKey); - this.xApiKey = options.xApiKey + this.xApiKey = options.xApiKey; const wallet = WalletContractV4.create({ publicKey: this.keyPair.publicKey, workchain: 0 }); this.wallet = wallet; } @@ -21,7 +21,7 @@ class WalletTON { this.keyPair = await mnemonicToPrivateKey(arr); const privateKey = Buffer.from(this.keyPair.secretKey).toString('hex'); return privateKey; - } + }; _nanotons = 10 ** 9; @@ -43,7 +43,7 @@ class WalletTON { if (chainName !== "TON") { return { "msg": "ton wallet can be used only with TON chain" - } + }; }; const web3 = await initialiseWeb3({ chainId, key: this.xApiKey }); @@ -73,7 +73,7 @@ class WalletTON { return { rawTransaction: rawData, chainId: chainId }; - } + }; sendTransaction = async (transactionObject) => { @@ -92,7 +92,7 @@ class WalletTON { if (chainName !== "TON") { return { "msg": "ton wallet can be used only with TON chain" - } + }; }; const walletContract = web3.open(this.wallet); @@ -102,7 +102,7 @@ class WalletTON { await timer(5000); let seqno = await walletContract.getSeqno(); if (seqno > currentseqno) { - return { seqno: seqno, message: "transaction has been sent to the blockchain" } + return { seqno: seqno, message: "transaction has been sent to the blockchain" }; } return { @@ -112,7 +112,7 @@ class WalletTON { } catch (error) { return error; } - } + }; } diff --git a/src/adapters/WalletTON/index.ts b/src/adapters/WalletTON/index.ts index 7f5b336..466af31 100644 --- a/src/adapters/WalletTON/index.ts +++ b/src/adapters/WalletTON/index.ts @@ -1,9 +1,9 @@ -import { mnemonicToPrivateKey, keyPairFromSecretKey } from "ton-crypto"; import { WalletContractV4, internal, Cell } from "@ton/ton"; -import * as schemaValidator from '../../../configuration/schemaValidator'; +import { mnemonicToPrivateKey, keyPairFromSecretKey } from "ton-crypto"; import * as common from '../../../configuration/common'; -import { initialiseWeb3 } from "../../../configuration/intialiseWeb3"; import config from '../../../configuration/config'; +import { initialiseWeb3 } from "../../../configuration/intialiseWeb3"; +import * as schemaValidator from '../../../configuration/schemaValidator'; interface WalletTONOptions { privateKey: string; diff --git a/src/adapters/WalletXRPL/index.js b/src/adapters/WalletXRPL/index.js index ecc2fc3..806d5fb 100644 --- a/src/adapters/WalletXRPL/index.js +++ b/src/adapters/WalletXRPL/index.js @@ -1,13 +1,13 @@ const { default: axios } = require("axios"); const xrpl = require('xrpl'); -const schemaValidator = require('../../../configuration/schemaValidator'); const common = require('../../../configuration/common'); const config = require('../../../configuration/config.json'); +const schemaValidator = require('../../../configuration/schemaValidator'); class WalletXRPL { constructor(options) { this.privateKey = options.privateKey, - this.xApiKey = options.xApiKey + this.xApiKey = options.xApiKey; } signTransaction = async (options) => { @@ -27,7 +27,7 @@ class WalletXRPL { if (chainName !== "XRPL") { return { "msg": "XRPL wallet can be used only with XRP Ledger" - } + }; }; const account = (this.privateKey.split(" ").length > 1) ? xrpl.Wallet.fromMnemonic(this.privateKey) diff --git a/src/adapters/WalletXRPL/index.ts b/src/adapters/WalletXRPL/index.ts index 10f0c31..cfb8558 100644 --- a/src/adapters/WalletXRPL/index.ts +++ b/src/adapters/WalletXRPL/index.ts @@ -1,8 +1,8 @@ import axios from "axios"; import xrpl from 'xrpl'; -import * as schemaValidator from '../../../configuration/schemaValidator'; import * as common from '../../../configuration/common'; import config from '../../../configuration/config'; +import * as schemaValidator from '../../../configuration/schemaValidator'; interface WalletXRPLConstructorOptions { privateKey: string; diff --git a/src/dydx/cancelOrder.js b/src/dydx/cancelOrder.js index 4676c43..f498f68 100644 --- a/src/dydx/cancelOrder.js +++ b/src/dydx/cancelOrder.js @@ -1,6 +1,6 @@ +const { OrderFlags } = require('@dydxprotocol/v4-client-js'); const { default: axios } = require('axios'); const { getSubAccountCompositeClient } = require('../../configuration/dYdXCommon'); -const { OrderFlags } = require('@dydxprotocol/v4-client-js'); const errorMessage = require('../../configuration/errorMessage.json'); module.exports = { @@ -28,7 +28,7 @@ module.exports = { return { message: errorMessage.error.message.invalidOrderId, code: errorMessage.error.code.invalidInput - } + }; } try { diff --git a/src/dydx/cancelOrder.ts b/src/dydx/cancelOrder.ts index 2e2aeb3..9127bfe 100644 --- a/src/dydx/cancelOrder.ts +++ b/src/dydx/cancelOrder.ts @@ -1,6 +1,6 @@ +import { OrderFlags } from '@dydxprotocol/v4-client-js'; import axios from 'axios'; import { getSubAccountCompositeClient } from '../../configuration/dYdXCommon'; -import { OrderFlags } from '@dydxprotocol/v4-client-js'; import errorMessage from '../../configuration/errorMessage'; interface CancelOrderOptions { diff --git a/src/dydx/deposit.js b/src/dydx/deposit.js index 8c2a7e7..57a0653 100644 --- a/src/dydx/deposit.js +++ b/src/dydx/deposit.js @@ -1,9 +1,9 @@ const { default: axios } = require('axios'); +const dotenv = require('dotenv').config(); const config = require("../../configuration/config.json"); +const errorMessage = require('../../configuration/errorMessage.json'); const tokenConfig = require("../../configuration/squidRouterTokenConfig.json"); const { Wallet } = require('../adapters/Wallet'); -const dotenv = require('dotenv').config(); -const errorMessage = require('../../configuration/errorMessage.json'); module.exports = { deposit: async (options) => { @@ -53,7 +53,7 @@ module.exports = { }); if (!createTransaction?.name?.valid) { - return new Error("Invalid", {cause: createTransaction?.message}) + return new Error("Invalid", {cause: createTransaction?.message}); } const transactionReceipt = await wallet.sendTransaction(createTransaction); return transactionReceipt; diff --git a/src/dydx/deposit.ts b/src/dydx/deposit.ts index 3e10a11..bbfaddb 100644 --- a/src/dydx/deposit.ts +++ b/src/dydx/deposit.ts @@ -1,9 +1,9 @@ import axios from 'axios'; +import dotenv from 'dotenv'; import config from '../../configuration/config'; +import errorMessage from '../../configuration/errorMessage'; import tokenConfig from '../../configuration/squidRouterTokenConfig'; import { Wallet } from '../adapters/Wallet'; -import dotenv from 'dotenv'; -import errorMessage from '../../configuration/errorMessage'; dotenv.config(); diff --git a/src/dydx/index.js b/src/dydx/index.js index 53185ff..fe27cb7 100644 --- a/src/dydx/index.js +++ b/src/dydx/index.js @@ -1,9 +1,9 @@ -const schemaValidator = require('../../configuration/schemaValidator'); -const PlaceOrder = require('./placeOrder'); -const UserOnboarding = require('./userOnboarding'); const CancelOrder = require('./cancelOrder'); -const Transfer = require('./transfer'); const Deposit = require('./deposit'); +const PlaceOrder = require('./placeOrder'); +const Transfer = require('./transfer'); +const UserOnboarding = require('./userOnboarding'); +const schemaValidator = require('../../configuration/schemaValidator'); exports.userOnboarding = async (options) => { const filterOptions = options; @@ -18,7 +18,7 @@ exports.placeOrder = async (options) => { let filterOptions = options; const {side, type, timeInForce, market} = filterOptions; - filterOptions = {...filterOptions, side: side && side.toUpperCase(), type: type && type.toUpperCase(), timeInForce: timeInForce && timeInForce.toUpperCase(), market: market && market.toUpperCase()} + filterOptions = {...filterOptions, side: side && side.toUpperCase(), type: type && type.toUpperCase(), timeInForce: timeInForce && timeInForce.toUpperCase(), market: market && market.toUpperCase()}; filterOptions.function = "placeOrderDYDX()"; const validJson = await schemaValidator.validateInput(filterOptions); diff --git a/src/dydx/index.ts b/src/dydx/index.ts index d47d533..369fcd1 100644 --- a/src/dydx/index.ts +++ b/src/dydx/index.ts @@ -1,9 +1,9 @@ -import * as schemaValidator from '../../configuration/schemaValidator'; -import * as PlaceOrder from './placeOrder'; -import * as UserOnboarding from './userOnboarding'; import * as CancelOrder from './cancelOrder'; -import * as Transfer from './transfer'; import * as Deposit from './deposit'; +import * as PlaceOrder from './placeOrder'; +import * as Transfer from './transfer'; +import * as UserOnboarding from './userOnboarding'; +import * as schemaValidator from '../../configuration/schemaValidator'; interface Options { side?: string; diff --git a/src/dydx/placeOrder.js b/src/dydx/placeOrder.js index 4635c9f..c2783b3 100644 --- a/src/dydx/placeOrder.js +++ b/src/dydx/placeOrder.js @@ -1,6 +1,6 @@ const { OrderExecution, OrderType, OrderSide, OrderTimeInForce } = require('@dydxprotocol/v4-client-js'); -const {getSubAccountCompositeClient} = require('../../configuration/dYdXCommon'); const config = require("../../configuration/config.json"); +const {getSubAccountCompositeClient} = require('../../configuration/dYdXCommon'); module.exports = { placeOrder: async (options) => { @@ -44,7 +44,7 @@ module.exports = { ); if (typeof tx.hash === 'object') { - tx = {...tx, 'hex': `0x${Buffer.from(tx.hash).toString('hex')}`} + tx = {...tx, 'hex': `0x${Buffer.from(tx.hash).toString('hex')}`}; } return (tx); } catch (error) { diff --git a/src/dydx/placeOrder.ts b/src/dydx/placeOrder.ts index 5ad9d0f..4efadad 100644 --- a/src/dydx/placeOrder.ts +++ b/src/dydx/placeOrder.ts @@ -1,6 +1,6 @@ import { OrderExecution, OrderType, OrderSide, OrderTimeInForce } from '@dydxprotocol/v4-client-js'; -import { getSubAccountCompositeClient } from '../../configuration/dYdXCommon'; import config from "../../configuration/config"; +import { getSubAccountCompositeClient } from '../../configuration/dYdXCommon'; interface PlaceOrderOptions { subAccountNumber: number; diff --git a/src/dydx/transfer.js b/src/dydx/transfer.js index 6d390f1..90cfdd7 100644 --- a/src/dydx/transfer.js +++ b/src/dydx/transfer.js @@ -1,5 +1,5 @@ -const Long = require('long'); const { Method } = require('@cosmjs/tendermint-rpc'); +const Long = require('long'); const { getSubAccountValidatorClient } = require('../../configuration/dYdXCommon'); diff --git a/src/dydx/transfer.ts b/src/dydx/transfer.ts index cc9cd94..b9c8b9b 100644 --- a/src/dydx/transfer.ts +++ b/src/dydx/transfer.ts @@ -1,7 +1,7 @@ -import Long from 'long'; +import { EncodeObject } from '@cosmjs/proto-signing'; import { Method } from '@cosmjs/tendermint-rpc'; +import Long from 'long'; import { getSubAccountValidatorClient } from '../../configuration/dYdXCommon'; -import { EncodeObject } from '@cosmjs/proto-signing'; interface TransferOptions { subAccountNumber: number; @@ -13,7 +13,7 @@ interface TransferOptions { export const transfer = async (options: TransferOptions): Promise => { const { subAccountNumber, mnemonic, recipient, assetId } = options; - let amount: Long = Long.fromValue(options.amount); + const amount: Long = Long.fromValue(options.amount); const { client, subaccount } = await getSubAccountValidatorClient(mnemonic, subAccountNumber); // amount = Long.fromValue(amount); diff --git a/src/dydx/userOnboarding.js b/src/dydx/userOnboarding.js index b4af2cc..7c0aa06 100644 --- a/src/dydx/userOnboarding.js +++ b/src/dydx/userOnboarding.js @@ -1,7 +1,7 @@ const { BECH32_PREFIX, LocalWallet } = require('@dydxprotocol/v4-client-js'); +const { deriveHDKeyFromEthereumSignature } = require('@dydxprotocol/v4-client-js/build/src/lib/onboarding'); const { ethers } = require('ethers-5'); const config = require("../../configuration/config.json"); -const { deriveHDKeyFromEthereumSignature } = require('@dydxprotocol/v4-client-js/build/src/lib/onboarding'); module.exports = { userOnboarding: async (options) => { @@ -13,6 +13,6 @@ module.exports = { const keys = deriveHDKeyFromEthereumSignature(signature); const {mnemonic, publicKey, privateKey} = keys; const wallet = await LocalWallet.fromMnemonic(mnemonic, BECH32_PREFIX); - return {mnemonic, publicKey, privateKey, address: wallet.address} + return {mnemonic, publicKey, privateKey, address: wallet.address}; } }; diff --git a/src/dydx/userOnboarding.ts b/src/dydx/userOnboarding.ts index d893d24..0663c53 100644 --- a/src/dydx/userOnboarding.ts +++ b/src/dydx/userOnboarding.ts @@ -1,7 +1,7 @@ import { BECH32_PREFIX, LocalWallet } from '@dydxprotocol/v4-client-js'; +import { deriveHDKeyFromEthereumSignature } from '@dydxprotocol/v4-client-js/build/src/lib/onboarding'; import { ethers } from 'ethers-5'; import config from '../../configuration/config'; -import { deriveHDKeyFromEthereumSignature } from '@dydxprotocol/v4-client-js/build/src/lib/onboarding'; export const userOnboarding= async (options:any) => { @@ -13,6 +13,6 @@ export const userOnboarding= async (options:any) => { const keys = deriveHDKeyFromEthereumSignature(signature); const {mnemonic, publicKey, privateKey} = keys; const wallet = await LocalWallet.fromMnemonic(mnemonic, BECH32_PREFIX); - return {mnemonic, publicKey, privateKey, address: wallet.address} - } + return {mnemonic, publicKey, privateKey, address: wallet.address}; + }; diff --git a/src/helper/Starknet.js b/src/helper/Starknet.js index 2d583f4..3ee86cf 100644 --- a/src/helper/Starknet.js +++ b/src/helper/Starknet.js @@ -1,6 +1,6 @@ /* eslint-disable camelcase */ -const web3 = require('web3'); const BN = require("bn.js"); +const web3 = require('web3'); const config = require('../../configuration/config.json'); module.exports = { diff --git a/src/helper/Starknet.ts b/src/helper/Starknet.ts index 232e542..24e960a 100644 --- a/src/helper/Starknet.ts +++ b/src/helper/Starknet.ts @@ -1,6 +1,6 @@ /* eslint-disable camelcase */ -import Web3 from 'web3'; import BN from "bn.js"; +import Web3 from 'web3'; import config from '../../configuration/config'; interface Call { diff --git a/src/helper/batchRequest.js b/src/helper/batchRequest.js index ea58e23..50d1ca0 100644 --- a/src/helper/batchRequest.js +++ b/src/helper/batchRequest.js @@ -2,7 +2,7 @@ async function getNonce(web3, account) { const [pendingNonce, latestNonce] = await Promise.all([ web3.eth.getTransactionCount(account, 'pending'), web3.eth.getTransactionCount(account) - ]) + ]); return Math.max(pendingNonce, latestNonce); } diff --git a/src/helper/batchRequest.ts b/src/helper/batchRequest.ts index 6574695..7989123 100644 --- a/src/helper/batchRequest.ts +++ b/src/helper/batchRequest.ts @@ -1,5 +1,5 @@ import Web3 from 'web3'; -import { TransactionConfig, SignedTransaction } from 'web3-core'; +import { TransactionConfig } from 'web3-core'; async function getNonce(web3: Web3, account: string): Promise { const [pendingNonce, latestNonce] = await Promise.all([ diff --git a/src/index.js b/src/index.js index e2418f7..f986484 100644 --- a/src/index.js +++ b/src/index.js @@ -1,9 +1,9 @@ const axios = require('axios').default; -const config = require('../configuration/config.json'); -const schemaValidator = require('../configuration/schemaValidator'); const { Wallet, WalletFordefi, WalletDFNS, WalletTON, WalletFireblocks, WalletPhantom, WalletCoinbase, WalletCircle, WalletCosmos, WalletStellar, WalletXRPL, WalletBitcoin, WalletStacks } = require('./interfaces/index'); +const config = require('../configuration/config.json'); +const schemaValidator = require('../configuration/schemaValidator'); exports.prepareTransaction = async (apiURL, options) => { diff --git a/src/index.ts b/src/index.ts index dabbe55..474095d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,4 @@ import axios from "axios"; -import config from "../configuration/config"; -import * as schemaValidator from "../configuration/schemaValidator"; import { Wallet, WalletFordefi, @@ -16,6 +14,8 @@ import { WalletStacks, WalletBitcoin } from "./interfaces/index"; +import config from "../configuration/config"; +import * as schemaValidator from "../configuration/schemaValidator"; export const prepareTransaction = async (apiURL:any, options:any) => { const filterOptions = options; diff --git a/src/interfaces/index.js b/src/interfaces/index.js index f1ab00d..158f458 100644 --- a/src/interfaces/index.js +++ b/src/interfaces/index.js @@ -1,16 +1,16 @@ const { Wallet } = require('../adapters/Wallet'); -const { WalletFordefi } = require('../adapters/WalletFordefi'); -const { WalletDFNS } = require('../adapters/WalletDFNS'); -const { WalletPhantom } = require('../adapters/WalletPhantom'); -const { WalletCoinbase } = require('../adapters/WalletCoinbase'); -const { WalletTON } = require('../adapters/WalletTON'); -const { WalletFireblocks } = require('../adapters/WalletFireblocks'); +const { WalletBitcoin } = require('../adapters/WalletBitcoin'); const { WalletCircle } = require('../adapters/WalletCircle'); +const { WalletCoinbase } = require('../adapters/WalletCoinbase'); const { WalletCosmos } = require("../adapters/WalletCosmos"); +const { WalletDFNS } = require('../adapters/WalletDFNS'); +const { WalletFireblocks } = require('../adapters/WalletFireblocks'); +const { WalletFordefi } = require('../adapters/WalletFordefi'); +const { WalletPhantom } = require('../adapters/WalletPhantom'); +const { WalletStacks } = require('../adapters/WalletStacks'); const { WalletStellar } = require('../adapters/WalletStellar'); +const { WalletTON } = require('../adapters/WalletTON'); const { WalletXRPL } = require('../adapters/WalletXRPL'); -const { WalletStacks } = require('../adapters/WalletStacks'); -const { WalletBitcoin } = require('../adapters/WalletBitcoin'); module.exports = { Wallet, diff --git a/src/interfaces/index.ts b/src/interfaces/index.ts index a7d5ae1..0640c45 100644 --- a/src/interfaces/index.ts +++ b/src/interfaces/index.ts @@ -1,16 +1,16 @@ import { Wallet } from '../adapters/Wallet'; -import { WalletFordefi } from '../adapters/WalletFordefi'; -import { WalletDFNS } from '../adapters/WalletDFNS'; -import { WalletPhantom } from '../adapters/WalletPhantom'; -import { WalletCoinbase } from '../adapters/WalletCoinbase'; -import { WalletTON } from '../adapters/WalletTON'; -import { WalletFireblocks } from '../adapters/WalletFireblocks'; +import { WalletBitcoin } from '../adapters/WalletBitcoin'; import { WalletCircle } from '../adapters/WalletCircle'; +import { WalletCoinbase } from '../adapters/WalletCoinbase'; import { WalletCosmos } from "../adapters/WalletCosmos"; +import { WalletDFNS } from '../adapters/WalletDFNS'; +import { WalletFireblocks } from '../adapters/WalletFireblocks'; +import { WalletFordefi } from '../adapters/WalletFordefi'; +import { WalletPhantom } from '../adapters/WalletPhantom'; +import { WalletStacks } from '../adapters/WalletStacks'; import { WalletStellar } from '../adapters/WalletStellar'; +import { WalletTON } from '../adapters/WalletTON'; import { WalletXRPL } from '../adapters/WalletXRPL'; -import { WalletStacks } from '../adapters/WalletStacks'; -import { WalletBitcoin } from '../adapters/WalletBitcoin'; export { Wallet, diff --git a/src/stellar/getAllAssets.js b/src/stellar/getAllAssets.js index d6da39d..c3e2d00 100644 --- a/src/stellar/getAllAssets.js +++ b/src/stellar/getAllAssets.js @@ -3,8 +3,8 @@ const { StrKey } = require("@stellar/stellar-sdk"); -const schemaValidator = require('../../configuration/schemaValidator'); const { bufferToString, getTransactionByHash } = require('./helpers'); +const schemaValidator = require('../../configuration/schemaValidator'); module.exports = { getAllAssets: async (options) => { @@ -52,4 +52,4 @@ module.exports = { return null; } } -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/stellar/getAllAssets.ts b/src/stellar/getAllAssets.ts index bdf3c47..163f2b3 100644 --- a/src/stellar/getAllAssets.ts +++ b/src/stellar/getAllAssets.ts @@ -1,6 +1,6 @@ import { xdr, StrKey } from "@stellar/stellar-sdk"; -import * as schemaValidator from "../../configuration/schemaValidator"; import { bufferToString, getTransactionByHash } from './helpers'; +import * as schemaValidator from "../../configuration/schemaValidator"; // Type definitions interface FilterOptions { diff --git a/src/stellar/getAsset.js b/src/stellar/getAsset.js index 638a8c9..25587b5 100644 --- a/src/stellar/getAsset.js +++ b/src/stellar/getAsset.js @@ -3,8 +3,8 @@ const { StrKey } = require("@stellar/stellar-sdk"); -const schemaValidator = require('../../configuration/schemaValidator'); const { bufferToString, getTransactionByHash } = require('./helpers'); +const schemaValidator = require('../../configuration/schemaValidator'); // const errorMessage = require('../../configuration/errorMessage.json'); module.exports = { @@ -49,4 +49,4 @@ module.exports = { return null; } } -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/stellar/getAsset.ts b/src/stellar/getAsset.ts index 2d6f4d4..20ab5ea 100644 --- a/src/stellar/getAsset.ts +++ b/src/stellar/getAsset.ts @@ -1,6 +1,6 @@ import { xdr, StrKey } from "@stellar/stellar-sdk"; -import * as schemaValidator from '../../configuration/schemaValidator'; import { bufferToString, getTransactionByHash } from './helpers'; +import * as schemaValidator from '../../configuration/schemaValidator'; // Type definitions interface FilterOptions { diff --git a/src/stellar/getOwnerAssets.js b/src/stellar/getOwnerAssets.js index f15a6af..73fc21f 100644 --- a/src/stellar/getOwnerAssets.js +++ b/src/stellar/getOwnerAssets.js @@ -3,8 +3,8 @@ const { StrKey } = require("@stellar/stellar-sdk"); -const schemaValidator = require('../../configuration/schemaValidator'); const { bufferToString, getTransactionByHash } = require('./helpers'); +const schemaValidator = require('../../configuration/schemaValidator'); module.exports = { getOwnerAssets: async (options) => { @@ -53,4 +53,4 @@ module.exports = { return null; } } -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/stellar/getOwnerAssets.ts b/src/stellar/getOwnerAssets.ts index 4e08b31..23f1468 100644 --- a/src/stellar/getOwnerAssets.ts +++ b/src/stellar/getOwnerAssets.ts @@ -1,6 +1,6 @@ import { xdr, StrKey } from "@stellar/stellar-sdk"; -import * as schemaValidator from '../../configuration/schemaValidator'; import { bufferToString, getTransactionByHash } from './helpers'; +import * as schemaValidator from '../../configuration/schemaValidator'; // Type definitions interface FilterOptions { diff --git a/test/SwapWithApprovalTest.js b/test/SwapWithApprovalTest.js index 4a6c253..857eeab 100644 --- a/test/SwapWithApprovalTest.js +++ b/test/SwapWithApprovalTest.js @@ -1,8 +1,8 @@ require("dotenv").config(); const axios = require("axios"); const web3 = require("web3"); -const { batchRequest } = require('../src/batchRequest'); const config = require('../configuration/config.json'); +const { batchRequest } = require('../src/batchRequest'); const expand_url = config.url.apiurl; diff --git a/test/batchTransactionTest.js b/test/batchTransactionTest.js index aa18084..55c38fb 100644 --- a/test/batchTransactionTest.js +++ b/test/batchTransactionTest.js @@ -7,7 +7,7 @@ const { Wallet, WalletCoinbase, WalletPhantom } = require("../src"); const expand_url = config.url.apiurl; const chainId = "1"; const headers = { 'x-api-key': process.env.xApiKey }; -const wallet = new WalletPhantom({privateKey: process.env.WALLET_PRIVATE_KEY, xApiKey: process.env.xApiKey}) +const wallet = new WalletPhantom({privateKey: process.env.WALLET_PRIVATE_KEY, xApiKey: process.env.xApiKey}); async function getApproveTx(options) { const rawApprovedTx = await axios.post(expand_url + 'fungibletoken/approve', options, { headers }); diff --git a/test/bitcoinTest.js b/test/bitcoinTest.js index 1eea383..486d346 100644 --- a/test/bitcoinTest.js +++ b/test/bitcoinTest.js @@ -1,6 +1,6 @@ +const dotenv = require('dotenv'); const { getKeysFromMnemonic } = require('../src/adapters/WalletBitcoin'); const { WalletBitcoin } = require('../src/index'); -const dotenv = require('dotenv'); const main = async () => { dotenv.config(); @@ -16,7 +16,7 @@ const main = async () => { vout: 0, value, } - } + }; // Securely sign the transaction on user's end const signedTx = await wallet.signTransaction(preparedTx); @@ -24,7 +24,7 @@ const main = async () => { const tx = await wallet.sendTransaction(signedTx); console.log("Tx: ", tx); -} +}; const getKeys = async() => { const keys = await getKeysFromMnemonic({ chainId: "1801", mnemonic: process.env.mnemonic}); console.log(keys); diff --git a/test/circleTest.js b/test/circleTest.js index 7385ebb..a0c08d6 100644 --- a/test/circleTest.js +++ b/test/circleTest.js @@ -1,5 +1,5 @@ -const { WalletCircle, prepareTransaction } = require('../src/index'); const dotenv = require('dotenv'); +const { WalletCircle, prepareTransaction } = require('../src/index'); async function initcircleWallet(options){ const userToken = await WalletCircle.getUserToken(options); diff --git a/test/cosmosTest.js b/test/cosmosTest.js index ba87f29..e4fd855 100644 --- a/test/cosmosTest.js +++ b/test/cosmosTest.js @@ -8,7 +8,7 @@ async function main() { "from": "cosmos1h7sp085zemehp5gunplymxhflrp8ls4qm3mxrq", "to": "cosmos1h6r7sgwxfxps4payfyc8rl56svzmx6t5kpumg3", "value": "1000", - } + }; const wallet = new WalletCosmos({ privateKey:'your Mnemonic in English', xApiKey:xApiKey}); const signedTx = await wallet.signTransaction(preparedTx); diff --git a/test/dfnsTest.js b/test/dfnsTest.js index a303a36..fe5aaeb 100644 --- a/test/dfnsTest.js +++ b/test/dfnsTest.js @@ -1,5 +1,5 @@ -const { WalletDFNS , prepareTransaction } = require('../src/index'); const dotenv = require('dotenv'); +const { WalletDFNS , prepareTransaction } = require('../src/index'); async function main() { @@ -17,7 +17,7 @@ async function main() { options.credId = process.env.DFNS_CRED_ID; options.xApiKey = process.env.xApiKey; options.appId = process.env.DFNS_APP_ID; - options.authToken = process.env.DFNS_ACCESS_TOKEN + options.authToken = process.env.DFNS_ACCESS_TOKEN; options.baseUrl = process.env.DFNS_API_URL; options.walletId = process.env.WALLET_ID; options.appOrigin = 'http://localhost:3000'; diff --git a/test/dydxTest.js b/test/dydxTest.js index 7492cfe..b2bf064 100644 --- a/test/dydxTest.js +++ b/test/dydxTest.js @@ -1,5 +1,5 @@ -const dydx = require('../src/dydx'); const dotenv = require('dotenv').config(); +const dydx = require('../src/dydx'); const mnemonic = process.env.dydxMnemonic; diff --git a/test/signLimitOrder.js b/test/signLimitOrder.js index 704024d..aa5321f 100644 --- a/test/signLimitOrder.js +++ b/test/signLimitOrder.js @@ -1,6 +1,6 @@ const { default: axios } = require("axios"); -const { Wallet } = require("../src"); const dotenv = require('dotenv'); +const { Wallet } = require("../src"); dotenv.config(); @@ -39,7 +39,7 @@ const signCreateLimitOrder = async () => { const orderType = "create"; const sig = await wallet.signLimitOrder({ domain, types, message, orderType }); console.log(sig); -} +}; const signCancelLimitOrder = async () => { const apiConfig = JSON.stringify({ @@ -65,7 +65,7 @@ const signCancelLimitOrder = async () => { const orderType = "cancel"; const sig = await wallet.signLimitOrder({ domain, types, message, orderType }); console.log(sig); -} +}; // signCreateLimitOrder(); // signCancelLimitOrder(); diff --git a/test/stacksTest.js b/test/stacksTest.js index f7a7dae..b0d9557 100644 --- a/test/stacksTest.js +++ b/test/stacksTest.js @@ -1,6 +1,6 @@ +const dotenv = require('dotenv'); const { getStacksPrivateKey } = require('../src/adapters/WalletStacks'); const { WalletStacks } = require('../src/index'); -const dotenv = require('dotenv'); const main = async () => { dotenv.config(); @@ -16,20 +16,20 @@ const main = async () => { to: recipient, value: "3000", message: "Expand STACKS Test" - } + }; // Securely sign the transaction on user's end const signedTx = await wallet.signTransaction(preparedTx); - console.log(signedTx) + console.log(signedTx); const tx = await wallet.sendTransaction(signedTx); console.log("Tx: ", tx); -} +}; const getWallets = async() => { const keys = await getStacksPrivateKey("", ""); console.log(keys); -} +}; // getWallets() diff --git a/test/stellarTest.js b/test/stellarTest.js index 7385dbf..6e4c763 100644 --- a/test/stellarTest.js +++ b/test/stellarTest.js @@ -1,5 +1,5 @@ -const { WalletStellar, prepareTransaction } = require('../src/index'); const dotenv = require('dotenv'); +const { WalletStellar, prepareTransaction } = require('../src/index'); const main = async () => { // configure the env @@ -23,7 +23,7 @@ const main = async () => { const tx = await wallet.sendTransaction(signedTx); console.log("Tx: ", tx); -} +}; main(); diff --git a/test/swapTest.js b/test/swapTest.js index c7f12cb..666fc7d 100644 --- a/test/swapTest.js +++ b/test/swapTest.js @@ -1,11 +1,11 @@ -const { Wallet, prepareTransaction } = require("../src"); const dotenv = require('dotenv'); +const { Wallet, prepareTransaction } = require("../src"); async function swap() { dotenv.config(); - const xApiKey = process.env.xApiKey - const privateKey = process.env.privateKey + const xApiKey = process.env.xApiKey; + const privateKey = process.env.privateKey; const wallet = new Wallet({ privateKey, xApiKey }); diff --git a/test/uniswapXTest.js b/test/uniswapXTest.js index 8a79cbc..8074d04 100644 --- a/test/uniswapXTest.js +++ b/test/uniswapXTest.js @@ -1,6 +1,6 @@ const { default: axios } = require("axios"); -const { Wallet } = require("../src"); const dotenv = require('dotenv'); +const { Wallet } = require("../src"); const amountIn = "10000000000000000"; const amountOutMin = "10000000000000000"; @@ -8,7 +8,7 @@ const fromToken = "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6"; //weth const toToken = "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984"; //uni const dexId = "1901"; -const user = "" // weth: 0.069, UNI: 0 +const user = ""; // weth: 0.069, UNI: 0 const now = Math.floor(Date.now() / 1000); const deadline = Math.floor(Date.now() / 1000) + 3600000; @@ -51,5 +51,5 @@ const main = async () => { const sig = await wallet.signOrderRFQ({ domain, types, values }); console.log(sig); -} +}; main(); diff --git a/test/xrplTest.js b/test/xrplTest.js index 32304dc..d43310c 100644 --- a/test/xrplTest.js +++ b/test/xrplTest.js @@ -1,5 +1,5 @@ -const { WalletXRPL, prepareTransaction } = require('../src/index'); const dotenv = require('dotenv'); +const { WalletXRPL, prepareTransaction } = require('../src/index'); const main = async () => { dotenv.config(); @@ -27,7 +27,7 @@ const main = async () => { const tx = await wallet.sendTransaction(signedTx); console.log("Tx: ", tx); -} +}; main(); From 398d007daec7833807e7ce0ea586191f5d0a6404 Mon Sep 17 00:00:00 2001 From: anupam18 Date: Wed, 30 Jul 2025 12:56:45 +0530 Subject: [PATCH 31/32] code refactor --- .eslintrc.json | 15 ++-- configuration/intialiseWeb3.ts | 7 +- package.json | 4 +- src/adapters/WalletCosmos/index.ts | 2 +- src/adapters/WalletDFNS/index.ts | 2 +- .../WalletDFNS/signTransaction/Ethereum.ts | 2 +- .../WalletFordefi/signTransaction/Solana.ts | 4 +- src/adapters/WalletPhantom/index.ts | 8 ++ src/adapters/WalletStacks/index.ts | 5 +- src/adapters/WalletTON/index.ts | 18 +++- src/dydx/cancelOrder.ts | 2 +- src/dydx/index.ts | 82 +++++++++++++------ src/helper/batchRequest.ts | 2 +- src/index.ts | 2 +- src/stellar/getAllAssets.ts | 6 +- src/stellar/getAsset.ts | 8 +- src/stellar/getOwnerAssets.ts | 8 +- src/stellar/helpers.ts | 2 - tsconfig.json | 37 ++++----- 19 files changed, 133 insertions(+), 83 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 6179549..b42dc87 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,12 +1,10 @@ { "env": { "es2021": true, - "node": true, - "browser": true + "node": true }, "extends": [ "eslint:recommended", - "plugin:@typescript-eslint/recommended", "plugin:import/recommended", "plugin:import/typescript", "prettier" @@ -19,21 +17,26 @@ }, "overrides": [ { - "files": ["*.ts", "*.tsx"], + "files": ["*.ts"], "parserOptions": { "project": "./tsconfig.json", "tsconfigRootDir": "." }, + "extends": ["plugin:@typescript-eslint/recommended"], "rules": { "@typescript-eslint/no-unused-vars": [ "warn", { "args": "after-used", "ignoreRestSiblings": true } - ] + ], + "@typescript-eslint/no-require-imports": "warn" // or "off" if you want to allow it in TS too } }, { "files": ["*.js"], "rules": { + "import/no-commonjs": "off", + "import/no-unresolved": "off", + "@typescript-eslint/no-require-imports": "off", // <-- important fix "no-unused-vars": [ "warn", { "args": "after-used", "ignoreRestSiblings": true } @@ -63,4 +66,4 @@ } ] } -} +} \ No newline at end of file diff --git a/configuration/intialiseWeb3.ts b/configuration/intialiseWeb3.ts index 0312022..7210ea6 100644 --- a/configuration/intialiseWeb3.ts +++ b/configuration/intialiseWeb3.ts @@ -13,7 +13,6 @@ import * as common from './common'; import config from './config'; import errorMessage from './errorMessage.json'; -// Define interfaces for your data structures interface InitializeWeb3Data { chainId?: string | number; chainSymbol?: string; @@ -48,11 +47,11 @@ interface Config { rpc_url: RpcUrls; } -// Type for the web3 instance which can be any of the supported clients + type Web3Instance = | EvmWeb | Connection - | TronWeb + | typeof TronWeb | nearApi.Near | algosdk.Algodv2 | algosdk.Indexer @@ -101,7 +100,7 @@ export const initialiseWeb3 = async (data: InitializeWeb3Data): Promise => try { const res = await axios.request(orderConfig); - order = res.data; // Assuming the response directly contains `clientId` and `ticker` + order = res.data; } catch (err) { return { message: errorMessage.error.message.invalidOrderId, diff --git a/src/dydx/index.ts b/src/dydx/index.ts index 369fcd1..ab2c464 100644 --- a/src/dydx/index.ts +++ b/src/dydx/index.ts @@ -5,33 +5,68 @@ import * as Transfer from './transfer'; import * as UserOnboarding from './userOnboarding'; import * as schemaValidator from '../../configuration/schemaValidator'; -interface Options { - side?: string; - type?: string; - timeInForce?: string; - market?: string; + +interface BaseOptions { [key: string]: any; } -interface ValidationResult { - valid: boolean; - errors?: string[]; - [key: string]: any; + +interface UserOnboardingOptions extends BaseOptions { + privateKey: string; } -interface CancelOrderOptions { - subAccountNumber: string; + +interface PlaceOrderOptions extends BaseOptions { + subAccountNumber: number; + mnemonic: string; + market: string; + type: string; + side: string; + timeInForce: string; + time: number; + price: number; + postOnly: boolean; + reduceOnly: boolean; + triggerPrice?: number; + size: number; +} + + +interface CancelOrderOptions extends BaseOptions { + subAccountNumber: number; mnemonic: string; orderId: string; - goodTillTimeInSeconds: number; - function: string; - side?: string; - type?: string; - timeInForce?: string; - market?: string; + goodTillTimeInSeconds: string; +} + + +interface TransferOptions extends BaseOptions { + subAccountNumber: number; + mnemonic: string; + recipient: string; + assetId: number; + amount: string | number; +} + + +interface DepositOptions extends BaseOptions { + srcChainId: number; + from: string; + to: string; + amountIn: string; + tokenIn: string; + slippage: number; + gas: number; + privateKey: string; +} + +interface ValidationResult { + valid: boolean; + errors?: string[]; + [key: string]: any; } -export const userOnboarding = async (options: Options): Promise => { +export const userOnboarding = async (options: UserOnboardingOptions): Promise => { const filterOptions = { ...options, function: "userOnboardingDYDX()" }; const validJson: ValidationResult = await schemaValidator.validateInput(filterOptions); @@ -39,7 +74,7 @@ export const userOnboarding = async (options: Options): Promise => { return UserOnboarding.userOnboarding(options); }; -export const placeOrder = async (options: Options): Promise => { +export const placeOrder = async (options: PlaceOrderOptions): Promise => { let filterOptions = options; const { side, type, timeInForce, market } = filterOptions; @@ -55,10 +90,11 @@ export const placeOrder = async (options: Options): Promise => { const validJson: ValidationResult = await schemaValidator.validateInput(filterOptions); if (!validJson.valid) return validJson; - return PlaceOrder.placeOrder(filterOptions); + + return PlaceOrder.placeOrder(filterOptions as any); }; -export const cancelOrder = async (options: Options): Promise => { +export const cancelOrder = async (options: CancelOrderOptions): Promise => { const filterOptions = { ...options, function: "cancelOrderDYDX()" }; const validJson: ValidationResult = await schemaValidator.validateInput(filterOptions); @@ -66,7 +102,7 @@ export const cancelOrder = async (options: Options): Promise => { return CancelOrder.cancelOrder(filterOptions); }; -export const transfer = async (options: Options): Promise => { +export const transfer = async (options: TransferOptions): Promise => { const filterOptions = { ...options, function: "transferDYDX()" }; const validJson: ValidationResult = await schemaValidator.validateInput(filterOptions); @@ -74,7 +110,7 @@ export const transfer = async (options: Options): Promise => { return Transfer.transfer(filterOptions); }; -export const deposit = async (options: Options): Promise => { +export const deposit = async (options: DepositOptions): Promise => { const filterOptions = { ...options, function: "depositDYDX()" }; const validJson: ValidationResult = await schemaValidator.validateInput(filterOptions); diff --git a/src/helper/batchRequest.ts b/src/helper/batchRequest.ts index 7989123..7076767 100644 --- a/src/helper/batchRequest.ts +++ b/src/helper/batchRequest.ts @@ -73,5 +73,5 @@ const batchRequestEvm = async ( } }; -// Export the function + export { batchRequestEvm }; \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 474095d..f147933 100644 --- a/src/index.ts +++ b/src/index.ts @@ -73,7 +73,7 @@ export const decodeTransaction = async (options:any) => { } }; -// Replace `exports.Wallet = Wallet;` with: + export { Wallet, WalletFordefi, diff --git a/src/stellar/getAllAssets.ts b/src/stellar/getAllAssets.ts index 163f2b3..1bb8113 100644 --- a/src/stellar/getAllAssets.ts +++ b/src/stellar/getAllAssets.ts @@ -2,7 +2,7 @@ import { xdr, StrKey } from "@stellar/stellar-sdk"; import { bufferToString, getTransactionByHash } from './helpers'; import * as schemaValidator from "../../configuration/schemaValidator"; -// Type definitions + interface FilterOptions { function?: string; chainId: string; @@ -83,7 +83,7 @@ export default { const returnValue: xdr.ScVal = sorobanMeta.returnValue(); const response = returnValue.value(); - // Type guard to check if response is an array-like structure + if (response && typeof response === 'object' && '_value' in response && Array.isArray(response._value)) { return response._value.map((assetResponse: any) => { const assetValues = assetResponse._value; @@ -96,7 +96,7 @@ export default { throw new Error("Invalid asset value structure"); } - // Convert to BigInt safely + const hi = BigInt(attributes.hi._value.toString()); const lo = BigInt(attributes.lo._value.toString()); const fullValue = (hi << BigInt(64)) + lo; diff --git a/src/stellar/getAsset.ts b/src/stellar/getAsset.ts index 20ab5ea..892e1ba 100644 --- a/src/stellar/getAsset.ts +++ b/src/stellar/getAsset.ts @@ -2,7 +2,7 @@ import { xdr, StrKey } from "@stellar/stellar-sdk"; import { bufferToString, getTransactionByHash } from './helpers'; import * as schemaValidator from '../../configuration/schemaValidator'; -// Type definitions + interface FilterOptions { function?: string; chainId: string; @@ -44,7 +44,7 @@ interface ScValObject { type ScVal = xdr.ScVal | ScValObject; -// Type guard for ScVal with attributes + function isScValObject(value: any): value is ScValObject { return value && typeof value === 'object' && @@ -54,7 +54,7 @@ function isScValObject(value: any): value is ScValObject { 'val' in value._attributes; } -// Type guard for array of ScVal objects + function isScValArray(value: any): value is ScValObject[] { return Array.isArray(value) && value.every(isScValObject); } @@ -108,7 +108,7 @@ export default { const response = returnValue.value(); if (isScValArray(response) && response.length >= 4) { - // Access attributes safely after type checking + const attr0 = response[0]._attributes; const attr1 = response[1]._attributes; const attr2 = response[2]._attributes; diff --git a/src/stellar/getOwnerAssets.ts b/src/stellar/getOwnerAssets.ts index 23f1468..cd57e43 100644 --- a/src/stellar/getOwnerAssets.ts +++ b/src/stellar/getOwnerAssets.ts @@ -2,7 +2,7 @@ import { xdr, StrKey } from "@stellar/stellar-sdk"; import { bufferToString, getTransactionByHash } from './helpers'; import * as schemaValidator from '../../configuration/schemaValidator'; -// Type definitions + interface FilterOptions { function?: string; chainId: string; @@ -48,7 +48,7 @@ interface ScMapEntry { type ScVal = xdr.ScVal | ScValObject; -// Type guard for ScVal with attributes + function isScValObject(value: any): value is ScValObject { return value && typeof value === 'object' && @@ -58,7 +58,7 @@ function isScValObject(value: any): value is ScValObject { 'val' in value._attributes; } -// Type guard for array of ScVal objects + function isScValArray(value: any): value is ScValObject[] { return Array.isArray(value) && value.every(isScValObject); } @@ -137,7 +137,7 @@ export default { throw new Error("Missing hi/lo values in response"); } - // Safe BigInt conversion + const hi = BigInt(attributes.hi._value.toString()); const lo = BigInt(attributes.lo._value.toString()); const fullValue = (hi << BigInt(64)) + lo; diff --git a/src/stellar/helpers.ts b/src/stellar/helpers.ts index ccff07e..916cd35 100644 --- a/src/stellar/helpers.ts +++ b/src/stellar/helpers.ts @@ -11,8 +11,6 @@ interface RequestBody { } interface TransactionResponse { - // Define the structure of your transaction response here - // Adjust based on the actual response structure [key: string]: any; } diff --git a/tsconfig.json b/tsconfig.json index 00ef3cc..5b1f331 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,22 +1,17 @@ + { - "compilerOptions": { - "target": "ES6", - "module": "CommonJS", - "strict": true, - "esModuleInterop": true, - "resolveJsonModule": true, - "moduleResolution": "node", - "sourceMap": true, - "forceConsistentCasingInFileNames": true , - "allowSyntheticDefaultImports": true, - "jsx": "react", - "outDir": "./dist", - "baseUrl": "./", - "paths": { - "@/*": ["src/*"] - } - }, - "include": ["src/**/*", "errorMessage.json"], - "exclude": ["node_modules", "dist"] - } - \ No newline at end of file + "compilerOptions": { + "target": "ES2021", + "module": "CommonJS", + "lib": ["ES2021"], + "strict": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "moduleResolution": "node", + "forceConsistentCasingInFileNames": true, + "allowSyntheticDefaultImports": true, + "sourceMap": true + }, + "include": ["src/**/*", "test/**/*", "errorMessage.json"], + "exclude": ["node_modules"] +} \ No newline at end of file From 481336ba3417a5fff6b425e201a7fa110d06fa0c Mon Sep 17 00:00:00 2001 From: anupam18 Date: Mon, 4 Aug 2025 10:38:27 +0530 Subject: [PATCH 32/32] Lint issue fix --- src/adapters/Wallet/index.ts | 12 +- src/adapters/Wallet/signTransaction/Solana.ts | 16 +- .../Wallet/signTransaction/Starknet.ts | 138 ++++++++++++++++++ src/adapters/Wallet/signTransaction/Sui.ts | 14 +- src/adapters/WalletCoinbase/index.ts | 2 +- .../signTransaction/Ethereum.ts | 2 +- 6 files changed, 164 insertions(+), 20 deletions(-) create mode 100644 src/adapters/Wallet/signTransaction/Starknet.ts diff --git a/src/adapters/Wallet/index.ts b/src/adapters/Wallet/index.ts index a7b2110..2e54ea1 100644 --- a/src/adapters/Wallet/index.ts +++ b/src/adapters/Wallet/index.ts @@ -63,10 +63,10 @@ class Wallet { configuration.params = { chainId }; - let rpc = await axios.get(apiURL, configuration); - rpc = rpc.data.data.rpc; + const rpcResponse = await axios.get(apiURL, configuration); + const rpc = rpcResponse.data.data.rpc; - const web3 = await initialiseWeb3({ rpc, chainId, key: this.xApiKey }); + const web3 = await initialiseWeb3({ rpc: rpc || undefined, chainId: chainId || undefined, key: this.xApiKey }); transactionOptions.value = new BN(transactionOptions.value); const chainName = config.chains[chainId as keyof typeof config.chains].chainName; @@ -108,10 +108,10 @@ class Wallet { configuration.params = { chainId }; - let rpc = await axios.get(apiURL, configuration); - rpc = rpc.data.data.rpc; + const rpcResponse = await axios.get(apiURL, configuration); + const rpc = rpcResponse.data.data.rpc; - const web3 = await initialiseWeb3({ rpc, chainId, key: this.xApiKey }); + const web3 = await initialiseWeb3({ rpc: rpc || undefined, chainId: chainId || undefined, key: this.xApiKey }); const options = { privateKey: this.privateKey }; const rawData = await rawTransaction[`signVersionedTransaction${chainName}`](web3, transactionObject, options); rawData.chainId = chainId; diff --git a/src/adapters/Wallet/signTransaction/Solana.ts b/src/adapters/Wallet/signTransaction/Solana.ts index b7d3e16..a287766 100644 --- a/src/adapters/Wallet/signTransaction/Solana.ts +++ b/src/adapters/Wallet/signTransaction/Solana.ts @@ -46,6 +46,9 @@ export const SolanaUtils:any = { lastValidBlockHeight: blockHeight.lastValidBlockHeight + 1500, feePayer: from.publicKey, }); + if (!transactionObject.to) { + throw new Error('Recipient address is required'); + } preparedTx.add( SystemProgram.transfer({ fromPubkey: from.publicKey, @@ -63,13 +66,13 @@ export const SolanaUtils:any = { } transactionBuffer = preparedTx.serializeMessage(); - const signature = sign.detached(transactionBuffer, from.secretKey); - preparedTx.addSignature(from.publicKey, signature); + const signature = sign.sign.detached(transactionBuffer, from.secretKey); + preparedTx.addSignature(from.publicKey, Buffer.from(signature)); if (transactionObject.additionalSigners) { const additionalKey = Keypair.fromSecretKey(bs58.decode(transactionObject.additionalSigners)); - const additionalSignature = sign.detached(transactionBuffer, additionalKey.secretKey); - preparedTx.addSignature(additionalKey.publicKey, additionalSignature); + const additionalSignature = sign.sign.detached(transactionBuffer, additionalKey.secretKey); + preparedTx.addSignature(additionalKey.publicKey, Buffer.from(additionalSignature)); } const serializedTx = preparedTx.serialize(); @@ -93,11 +96,14 @@ export const SolanaUtils:any = { let preparedTx: VersionedTransaction; if (!transactionObject.data) { + if (!transactionObject.to) { + throw new Error('Recipient address is required'); + } const instructions = [ SystemProgram.transfer({ fromPubkey: from.publicKey, toPubkey: new PublicKey(transactionObject.to), - lamports: transactionObject.value instanceof BN ? transactionObject.value.toNumber() : transactionObject.value || 0, + lamports: transactionObject.value instanceof BN ? transactionObject.value.toNumber() : Number(transactionObject.value) || 0, }), ]; const versionedMessage = new TransactionMessage({ diff --git a/src/adapters/Wallet/signTransaction/Starknet.ts b/src/adapters/Wallet/signTransaction/Starknet.ts new file mode 100644 index 0000000..630f02d --- /dev/null +++ b/src/adapters/Wallet/signTransaction/Starknet.ts @@ -0,0 +1,138 @@ +// const starknet = require('starknet'); +// const BN = require("bn.js"); +// const config = require('../../../../configuration/config.json'); +// const { callsToArrayData } = require('../../../helper/Starknet'); +// const starkNetNativeEthAbi = require('../../../../assets/abis/starknetNativeEth.json'); +const errorMessage = require('../../../../configuration/errorMessage.json'); + +const throwErrorMessage = (msg: string) => ({ + 'message': errorMessage.error.message[msg], + 'code': errorMessage.error.code.invalidInput +}); + +module.exports = { + + signTransactionStarkNet: async (web3: any, transactionObject: any, options: any) => { + /* + * Function will sign the transaction payload for Near chain + */ + + // const hexCallData = {}; + // let estimateFee = ''; + + // try { + // // const starkKeyPair = starknet.ec.getKeyPair(options.privateKey); + // const userAddress = transactionObject.from; + // // const signer = new starknet.Signer(starkKeyPair); + + // const rpcProvider = new starknet.RpcProvider({ + // nodeUrl: config.chains[options.chainId].rpc, + // }); + + // // console.log(await rpcProvider.getChainId()); + // const chainId = await rpcProvider.getChainId(); + // const account = new starknet.Account(rpcProvider, transactionObject.from, options.privateKey); + + // const currentNonce = BigInt(await account.getNonce()); + // const { nativeEthAddress } = config.chains[options.chainId]; + // const contract = new starknet.Contract(starkNetNativeEthAbi, nativeEthAddress, rpcProvider); + + // contract.connect(account); + // const value = parseInt(transactionObject.value); + // if (options.gas !== undefined && Number(options.gas) !== 0) { + // estimateFee = options.gas; + // } + // else { + // estimateFee = await account.estimateInvokeFee({ + // contractAddress: nativeEthAddress, // ETH contract address + // entrypoint: 'transfer', + // calldata: starknet.CallData.compile( + // { + // recipient: transactionObject.to, + // amount: { + // low: value, // 1 wei + // high: '0', + // } + // } + // ), + // }).then(res => res.suggestedMaxFee.toString()); + + // } + + // const signedTransaction = await account.signer.signTransaction([{ + // contractAddress: nativeEthAddress, // ETH contract address + // entrypoint: 'transfer', + // calldata: starknet.CallData.compile( + // { + // recipient: transactionObject.to, + // amount: { + // low: value, // 1 wei + // high: '0', + // } + // } + // ), + // }], + // { + // walletAddress: userAddress, + // nonce: new BN(currentNonce), + // maxFee: estimateFee, + // version: new BN(1), + // chainId + // }, + // undefined); + + // const finalSignedData = [signedTransaction.r, signedTransaction.s]; + + // const callDataInitial = ({ + // contractAddress: userAddress, + // calldata: await callsToArrayData([{ + // contractAddress: nativeEthAddress, + // entrypoint: 'transfer', + // calldata: starknet.CallData.compile( + // { + // recipient: transactionObject.to, + // amount: { + // low: value, + // high: '0', + // } + // }) + // }]), + // signature: finalSignedData + // }); + + // for (const key in callDataInitial) { + // if (key === 'contractAddress') { + // hexCallData[key] = (callDataInitial[key]).toLowerCase(); + // } + // else if (Array.isArray(callDataInitial[key])) { + // hexCallData[key] = callDataInitial[key].map(val => `0x${BigInt(val).toString(16)}`); + // } else { + // hexCallData[key] = `0x${BigInt(callDataInitial[key]).toString(16)}`; + // } + // } + + // const finalCallData = { + // invoke_transaction: { + // sender_address: hexCallData.contractAddress, + // calldata: hexCallData.calldata, + // type: "INVOKE", + // max_fee: `0x${BigInt(estimateFee).toString(16)}`, + // version: `0x${BigInt(1).toString(16)}`, + // signature: hexCallData.signature, + // nonce: `0x${BigInt(currentNonce).toString(16)}` + // } + // }; + + // const rawTransaction = Buffer.from(JSON.stringify(finalCallData)).toString("base64"); + + // return { "rawTransaction": rawTransaction }; + + // } + // catch (error) { + // return error; + // } + + return throwErrorMessage("notApplicable"); + + } +}; diff --git a/src/adapters/Wallet/signTransaction/Sui.ts b/src/adapters/Wallet/signTransaction/Sui.ts index aa4d297..9343725 100644 --- a/src/adapters/Wallet/signTransaction/Sui.ts +++ b/src/adapters/Wallet/signTransaction/Sui.ts @@ -1,5 +1,6 @@ import { fromB64 } from "@mysten/bcs"; -import { TransactionBlock, Ed25519Keypair, RawSigner } from '@mysten/sui.js'; +import { Transaction } from '@mysten/sui/transactions'; +import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519'; @@ -11,10 +12,8 @@ import { TransactionBlock, Ed25519Keypair, RawSigner } from '@mysten/sui.js'; const privateKeyBase64 = Buffer.from(secretKey, "hex").toString("base64"); // Convert hex to base64 string // Create the keypair from converted private key const keypair = Ed25519Keypair.fromSecretKey(fromB64(privateKeyBase64)); - // Create a signer with the provided keypair and network - const signer = new RawSigner(keypair, web3); // Create the transaction with given input - const tx = new TransactionBlock(); + const tx = new Transaction(); // Currently we support sui coin transfer const [coin] = tx.splitCoins(tx.gas, [tx.pure(transactionObject.value)]); // Add the instruction @@ -24,9 +23,10 @@ import { TransactionBlock, Ed25519Keypair, RawSigner } from '@mysten/sui.js'; transactionObject.to ) ); - // Sign the transaction Block - const signedTransaction = await signer.signTransactionBlock({ - transactionBlock: tx, + // Sign the transaction + const signedTransaction = await web3.signTransaction({ + transaction: tx, + signer: keypair, }); // Return the raw Transaction return { "rawTransaction": signedTransaction }; diff --git a/src/adapters/WalletCoinbase/index.ts b/src/adapters/WalletCoinbase/index.ts index fbddfc7..909ba53 100644 --- a/src/adapters/WalletCoinbase/index.ts +++ b/src/adapters/WalletCoinbase/index.ts @@ -56,7 +56,7 @@ class WalletCoinbase { const rpcResponse = await axios.get(apiURL, configuration); const rpc = rpcResponse.data.data.rpc; - const web3 = await initialiseWeb3({ rpc, chainId, key: this.xApiKey }); + const web3 = await initialiseWeb3({ rpc: rpc || undefined, chainId: chainId || undefined, key: this.xApiKey }); transactionOptions.value = new BN(transactionOptions.value); diff --git a/src/adapters/WalletCoinbase/signTransaction/Ethereum.ts b/src/adapters/WalletCoinbase/signTransaction/Ethereum.ts index 6af63ce..30527f6 100644 --- a/src/adapters/WalletCoinbase/signTransaction/Ethereum.ts +++ b/src/adapters/WalletCoinbase/signTransaction/Ethereum.ts @@ -6,7 +6,7 @@ interface TransactionObject { gas?: string; gasPrice?: string; data?: string; - nonce?: number; // Update nonce to be a number instead of string + nonce?: number; } interface SignTransactionOptions {