Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: overrides undefined and router address conversion #22

Merged
merged 13 commits into from
Nov 9, 2024
Merged
18 changes: 18 additions & 0 deletions packages/react/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,23 @@
# @tangled3/react

## 1.12.0-routerchain-beta-0.2

### Patch Changes

- fix routerchain balance fetch

## 1.12.0-routerchain-beta-0.1

### Minor Changes

- update cosmos integrations

## 1.10.0-routerchain-beta-0.1

### Minor Changes

- feat router chain integration

## 1.9.11-cosmos-beta

### Patch Changes
Expand Down
4 changes: 2 additions & 2 deletions packages/react/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@tangled3/react",
"private": false,
"version": "1.9.11-cosmos-beta",
"version": "1.12.0-routerchain-beta-0.2",
"type": "module",
"license": "MIT",
"main": "./src/index.ts",
Expand Down Expand Up @@ -49,7 +49,7 @@
"@near-wallet-selector/my-near-wallet": "^8.9.13",
"@near-wallet-selector/near-mobile-wallet": "^8.9.13",
"@near-wallet-selector/wallet-connect": "^8.9.13",
"@routerprotocol/chain-api": "^1.2.3",
"@routerprotocol/router-chain-sdk-ts": "0.8.70-beta-0.2",
"@safe-global/safe-apps-sdk": "^9.0.0",
"@solana/spl-token": "^0.4.8",
"@solana/wallet-adapter-base": "^0.9.23",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ export const getCosmosChainRegistryClient = async (chains: string[]) => {
});

await client.fetchUrls();
console.log('[REGISTRY]', client);

return client;
};
Expand Down
95 changes: 66 additions & 29 deletions packages/react/src/actions/cosmos/getCosmosToken.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,8 @@ export const getCosmosTokenMetadata = async ({
}) => {
const registryClient = await getCosmosClient().getChainRegistry();

console.log('registryClient', registryClient);

const assetList = registryClient.getChainAssetList(chain.chainName).assets;

console.log('assetlist', assetList);

const asset = assetList.find((asset) => areTokensEqual(asset.base, token));

if (!asset) {
Expand Down Expand Up @@ -48,40 +44,81 @@ export const getCosmosTokenBalanceAndAllowance = async ({
balance: bigint;
allowance: bigint;
}> => {
try {
const cosmwasmClient = await SigningCosmWasmClient.connect(chain.rpcUrls.default.http[0]);
const formattedToken = formatTokenAddress(token);
if (chain.id === 'router_9600-1') {
const { getNetworkInfo, ChainGrpcWasmApi, ChainGrpcBankApi, getRouterSignerAddress, toUtf8 } = await import(
'@routerprotocol/router-chain-sdk-ts'
);

const network = getNetworkInfo(chain.extra?.environment);
if (token === 'route') {
const bankClient = new ChainGrpcBankApi(network.grpcEndpoint);

const accountAddress = getRouterSignerAddress(account);
if (!accountAddress) {
throw new Error(`Invalid address to convert to Router: ${account}`);
}

// Getting initial token balance
const tokenBalance = await cosmwasmClient.getBalance(account, formattedToken);
const routeBalance = await bankClient.fetchBalance({
accountAddress,
denom: 'route',
});

// For native/factory tokens
if (isNativeOrFactoryToken(token)) {
return {
balance: BigInt(tokenBalance.amount),
balance: BigInt(routeBalance.amount),
allowance: maxInt256,
};
} else {
const wasmClient = new ChainGrpcWasmApi(network.grpcEndpoint);

const address = getRouterSignerAddress(account);
if (!address) {
throw new Error(`Invalid address to convert to Router: ${account}`);
}

const balance = await wasmClient.fetchSmartContractState(
token,
toUtf8(
JSON.stringify({
balance: { address },
}),
),
);

return {
balance: BigInt(balance.data.balance),
allowance: maxInt256,
};
}
}
const cosmwasmClient = await SigningCosmWasmClient.connect(chain.rpcUrls.default.http[0]);
const formattedToken = formatTokenAddress(token);

// Querying both balance and allowance
const [balanceResult, allowanceResult] = await Promise.all([
cosmwasmClient.queryContractSmart(token, {
balance: { address: account },
}),
cosmwasmClient.queryContractSmart(token, {
allowance: {
owner: account,
spender: spender,
},
}),
]);
// Getting initial token balance
const tokenBalance = await cosmwasmClient.getBalance(account, formattedToken);

// For native/factory tokens
if (isNativeOrFactoryToken(token)) {
return {
balance: BigInt(balanceResult.amount),
allowance: BigInt(allowanceResult.allowance.amount),
balance: BigInt(tokenBalance.amount),
allowance: maxInt256,
};
} catch (error) {
console.error('Failed to fetch allowance:', error);
throw error;
}

// Querying both balance and allowance
const [balanceResult, allowanceResult] = await Promise.all([
cosmwasmClient.queryContractSmart(token, {
balance: { address: account },
}),
cosmwasmClient.queryContractSmart(token, {
allowance: {
owner: account,
spender: spender,
},
}),
]);

return {
balance: BigInt(balanceResult.amount),
allowance: BigInt(allowanceResult.allowance.amount),
};
};
91 changes: 86 additions & 5 deletions packages/react/src/actions/sendTransaction.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Transaction } from '@mysten/sui/transactions';
import type { Network as RouterChainNetwork } from '@routerprotocol/router-chain-sdk-ts';
import { VersionedTransaction as SolanaVersionedTransaction } from '@solana/web3.js';
import { Cell } from '@ton/ton';
import { CHAIN } from '@tonconnect/ui-react';
Expand All @@ -15,7 +16,7 @@
from: string;
value: bigint;
args: TransactionArgs<CData['type']>;
overrides: any;
overrides?: any;

Check warning on line 19 in packages/react/src/actions/sendTransaction.ts

View workflow job for this annotation

GitHub Actions / build (20)

Unexpected any. Specify a different type
config: ConnectionOrConfig & {
connector: WalletInstance<CData['type']>;
};
Expand All @@ -24,6 +25,10 @@
export type TransactionArgs<CType extends ChainType> = CType extends 'evm' | 'tron'
? {
calldata: string;
routerChainArgs?: {
executeMsg: object;
funds: Array<{ denom: string; amount: string }>;
};
}
: CType extends 'solana'
? {
Expand All @@ -46,10 +51,13 @@
? {
messages: Array<{
readonly typeUrl: string;
readonly value: any;

Check warning on line 54 in packages/react/src/actions/sendTransaction.ts

View workflow job for this annotation

GitHub Actions / build (20)

Unexpected any. Specify a different type
}>;
memo?: string;
routerChainArgs: any;
routerChainArgs?: {
executeMsg: object;
funds: Array<{ denom: string; amount: string }>;
};
}
: CType extends 'near'
? {
Expand All @@ -75,7 +83,7 @@
: never;

// eslint-disable-next-line @typescript-eslint/no-unused-vars
type SendTransactionReturnType<C extends ChainType> = { txHash: string };
export type SendTransactionReturnType<C extends ChainType> = { txHash: string };

export type SendTransactionToChainFunction = <CData extends ChainData>(
params: SendTransactionParams<CData>,
Expand All @@ -90,9 +98,44 @@
* @param args - Additional arguments
* @param config - {@link ConnectionOrConfig}
*/
export const sendTransactionToChain = (async ({ chain, to, from, value, args, config, overrides }) => {
export const sendTransactionToChain = (async ({ chain, to, from, value, args, config, overrides = {} }) => {
if (chain.type === 'evm') {
if (overrides?.walletType === 'evm') {
const { sendEthTxnToRouterChainPf, getNetworkInfo, MsgExecuteCwContract, getRouterSignerAddress } = await import(
'@routerprotocol/router-chain-sdk-ts'
);

if (!chain.extra) {
throw new Error('Environment data not found for Router Chain');
}

const network = getNetworkInfo(chain.extra.environment as RouterChainNetwork);

const { routerChainArgs } = args as TransactionArgs<'evm'>;

const { executeMsg, funds } = routerChainArgs!;

const executeContractMsg = MsgExecuteCwContract.fromJSON({
sender: getRouterSignerAddress(from),
contractAddress: to,
msg: executeMsg,
funds,
});

const txResponse = await sendEthTxnToRouterChainPf({
networkEnv: chain.extra.environment,
txMsg: executeContractMsg,
nodeUrl: network.lcdEndpoint,
ethereumAddress: from,
injectedSigner: window.ethereum,
pfUrl: `${chain.extra.pathfinder}/v2/router-pubkey`,
});

return { txHash: txResponse.tx_response.txhash };
}

const { calldata } = args as TransactionArgs<'evm'>;

// send transaction to EVM chain
const txHash = await sendEVMTransaction(config.wagmiConfig, {
account: from as EVMAddress,
Expand Down Expand Up @@ -193,11 +236,49 @@
throw new Error('Chain wallet not found for cosmos chain');
}

if (chain.id === 'router_9600-1') {
if (overrides?.walletType === 'keplr') {
if (!chain.extra) {
throw new Error('Environment data not found for Router Chain');
}

const { MsgExecuteCwContract, sendEthTxnToRouterChainKeplrPf, getNetworkInfo } = await import(
'@routerprotocol/router-chain-sdk-ts'
);

const { routerChainArgs } = args as TransactionArgs<'cosmos'>;

const { executeMsg, funds } = routerChainArgs!;

const executeContractMsg = MsgExecuteCwContract.fromJSON({
sender: from,
contractAddress: to,
msg: executeMsg,
funds: funds,
});
const network = getNetworkInfo(chain.extra.environment as RouterChainNetwork);

const txResponse = await sendEthTxnToRouterChainKeplrPf({
networkEnv: chain.extra.environment,
txMsg: executeContractMsg,
nodeUrl: network.lcdEndpoint,
ethereumAddress: from,
// @ts-expect-error: keplr is not defined in the global scope
injectedSigner: window.keplr,
pfUrl: `${chain.extra.pathfinder}/v2/router-pubkey`,
});

return { txHash: txResponse.tx_response.txhash };
} else {
throw new Error('Unsupported Wallet, please connect with Keplr wallet');
}
}

const { messages, memo } = args as TransactionArgs<'cosmos'>;

const cosmWasmClient = await chainWallet.getSigningCosmWasmClient();

const fee = overrides.gasFee || 'auto';
const fee = overrides?.gasFee || 'auto';

const result = await cosmWasmClient.signAndBroadcast(from, messages, fee, memo);

Expand Down
1 change: 1 addition & 0 deletions packages/react/src/chains/router-cosmos.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,6 @@ export const router: CosmsosChainType = {
},
extra: {
environment: 'mainnet',
pathfinder: 'https://api-beta.pathfinder.routerprotocol.com/api',
},
} as const;
4 changes: 4 additions & 0 deletions packages/react/src/chains/router-evm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,8 @@ export const routerEvm: EVMChain = {
url: 'https://routerscan.io',
},
},
extra: {
environment: 'mainnet',
pathfinder: 'https://api-beta.pathfinder.routerprotocol.com/api',
},
} as const;
2 changes: 1 addition & 1 deletion packages/react/src/hooks/useTronStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ import { TronState } from '../store/Tron.js';

export function useTronStore<T>(selector: (state: TronState) => T): T {
const { store } = useContext(TronContext);
if (!store) throw new Error('Missing Tron Store Provider in the tree');
if (!store) throw new Error('Missing TronContext.Provider in the tree');
return useStore(store, selector);
}
21 changes: 11 additions & 10 deletions packages/react/src/types/index.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import { IndexedTx as CosmosIndexedTx } from '@cosmjs/stargate';
import { SuiClient, SuiTransactionBlockResponse } from '@mysten/sui/client';
import { WalletSelector as NearWalletSelector } from '@near-wallet-selector/core';
import { Connection as SolanaConnection } from '@solana/web3.js';
import { TonClient } from '@ton/ton';
import { GetTransactionReceiptReturnType as EVMTxReceipt } from '@wagmi/core';
import { providers } from 'near-api-js';
import { Types as TronWebTypes, type TronWeb } from 'tronweb';
import { Chain as ViemChain } from 'viem';
import { Config as WagmiConfig } from 'wagmi';
import type { IndexedTx as CosmosIndexedTx } from '@cosmjs/stargate';
import type { SuiClient, SuiTransactionBlockResponse } from '@mysten/sui/client';
import type { WalletSelector as NearWalletSelector } from '@near-wallet-selector/core';
import type { Connection as SolanaConnection } from '@solana/web3.js';
import type { TonClient } from '@ton/ton';
import type { GetTransactionReceiptReturnType as EVMTxReceipt } from '@wagmi/core';
import type { providers } from 'near-api-js';
import type { TronWeb, Types as TronWebTypes } from 'tronweb';
import type { Chain as ViemChain } from 'viem';
import type { Config as WagmiConfig } from 'wagmi';
import { CHAIN_ID } from '../constants/index.js';
import { GetCosmosClient } from '../store/Cosmos.js';
import { XfiBitcoinConnector } from './bitcoin.js';
Expand Down Expand Up @@ -48,6 +48,7 @@ export interface ChainDataGeneric {

export interface EVMChain extends ViemChain {
type: Extract<'evm', ChainType>;
extra?: Record<string, any>;
}

export interface TronChain extends ChainDataGeneric {
Expand Down
2 changes: 2 additions & 0 deletions packages/react/src/types/wallet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ export type ChainConnectors = {
bitcoin: any[];
// eslint-disable-next-line @typescript-eslint/no-explicit-any
ton: any[];
// eslint-disable-next-line @typescript-eslint/no-explicit-any
router: any[];
};

export type WalletBase<C extends ChainType = ChainType> = {
Expand Down
Loading
Loading