
Research
/Security News
DuckDB npm Account Compromised in Continuing Supply Chain Attack
Ongoing npm supply chain attack spreads to DuckDB: multiple packages compromised with the same wallet-drainer malware.
rubic-sdk
Advanced tools
<script src="https://unpkg.com/rubic-sdk@latest/dist/rubic-sdk.min.js"></script>
npm install rubic-sdk
ℹ️️ Skip the rest of the steps if your have already installed web3 in your project.
npm install --save-dev http-browserify https-browserify stream-browserify crypto-browserify
npm run eject
to extract config
plugins
new webpack.ProvidePlugin({
Buffer: ['buffer', 'Buffer'],
process: 'process/browser'
})
resolve.fallback
"fallback": {
"fs": false,
"constants": false,
"querystring": false,
"url": false,
"path": false,
"os": false,
"http": require.resolve("http-browserify"),
"https": require.resolve("https-browserify"),
"zlib": false,
"stream": require.resolve("stream-browserify"),
"crypto": require.resolve("crypto-browserify"),
"zlib": require.resolve('browserify-zlib')
}
npm install rubic-sdk
ℹ️️ Skip the rest of the steps if your have already installed web3 in your project.
npm install --save-dev stream-browserify assert https-browserify os-browserify stream-http crypto-browserify process buffer
{
"compilerOptions": {
...
"paths" : {
...
"stream": ["./node_modules/stream-browserify"],
"assert": ["./node_modules/assert"],
"https": ["./node_modules/https-browserify"],
"os": ["./node_modules/os-browserify"],
"http": ["./node_modules/stream-http"],
"crypto": ["./node_modules/crypto-browserify"]
}
}
import Process = NodeJS.Process;
export interface AppWindow extends Window {
process: Process;
Buffer: Buffer;
global?: unknown;
}
(window as AppWindow).global = window;
(window as AppWindow).process = window.process || require('process');
(window as AppWindow).Buffer = (window as any).Buffer || require('buffer').Buffer;
<script>
// you have to declare rpc links only for networks you will use
const configuration = {
rpcProviders: {
ETH: {
rpcList: ['<your ethereum rpc>']
},
BSC: {
rpcList: ['<your bsc rpc>']
},
...
TRON: {
rpcList: [
{
fullHost: '<tron-api>',
headers: { "TRON-PRO-API-KEY": 'your api key' }
}
]
}
},
// if you are whitelisted integrator, provide your wallet address here
providerAddress: {
[CHAIN_TYPE.EVM]: {
crossChain: '0x0000000000000000000000000000000000000000', // Address for cross chain fee
onChain: '0x0000000000000000000000000000000000000000' // Address for on chain fee
}
}
}
async function main() {
// create SDK instance
const sdk = await RubicSDK.SDK.createSDK(configuration);
// define example trade parameters
const blockchain = 'ETH';
const fromTokenAddress = '0x0000000000000000000000000000000000000000';
const fromAmount = 1;
const toTokenAddress = '0xdac17f958d2ee523a2206206994597c13d831ec7';
// calculate trades
const trades = await sdk.onChainManager
.calculateTrade({blockchain, address: fromTokenAddress}, fromAmount, toTokenAddress);
console.log(trades);
}
main();
</script>
Create configuration
import { Configuration, BLOCKCHAIN_NAME } from 'rubic-sdk';
// you have to declare rpc links only for networks you will use
export const configuration: Configuration = {
rpcProviders: {
[BLOCKCHAIN_NAME.ETHEREUM]: {
rpcList: ['<your ethereum rpc #1>', '<your ethereum rpc #2>', ...]
},
[BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN]: {
rpcList: ['<your bsc rpc>']
},
...
[BLOCKCHAIN_NAME.TRON]: {
rpcList: [
{
fullHost: '<tron api>',
headers: { "TRON-PRO-API-KEY": 'your api key' }
}
]
}
},
// if you are whitelisted integrator, provide your wallet address here
providerAddress: {
[CHAIN_TYPE.EVM]: {
crossChain: '0x0000000000000000000000000000000000000000', // Address for cross chain fee
onChain: '0x0000000000000000000000000000000000000000' // Address for on chain fee
}
}
}
Create sdk instance
import { SDK } from 'rubic-sdk';
const sdk = await SDK.createSDK(configuration);
Use sdk instance for trade calculation
import { BLOCKCHAIN_NAME, TradeType, OnChainTrade, EvmOnChainTrade } from 'rubic-sdk';
const blockchain = BLOCKCHAIN_NAME.ETHEREUM;
const fromTokenAddress = '0x0000000000000000000000000000000000000000'; // ETH
const fromAmount = 1;
const toTokenAddress = '0xdac17f958d2ee523a2206206994597c13d831ec7'; // USDT
const trades = await sdk.onChainManager.calculateTrade(
{ blockchain, address: fromTokenAddress },
fromAmount,
toTokenAddress
);
const bestTrade = trades[0];
trades.forEach(trade => {
const tradeType: TradeType = trade.type;
console.log(`trade type: ${tradeType}`);
if (trade instanceof OnChainTrade) {
console.log(`to amount: ${trade.to.tokenAmount.toFormat(3)}`);
} else {
console.log(`error: ${trade.error}`);
}
// explore trades info
if (trade instanceof EvmOnChainTrade) {
console.log(`Gas fee: ${bestTrade.gasFeeInfo}`);
}
...
});
When user connects wallet (e.g. MetaMask) you should change configuration to use trade swap
method.
⚠️ Recalculate trades after this.
import { WalletProvider, CHAIN_TYPE, Configuration } from 'rubic-sdk';
const walletProvider: WalletProvider = {
[CHAIN_TYPE.EVM]: {
address: '0x123...', // user wallet address
core: window.ethereum
},
[CHAIN_TYPE.TRON]: {
address: 'T123...', // user wallet address
core: window.tronLink.tronWeb // or window.tronWeb
}
};
// initial configuration example
const configuration: Configuration = {
...
walletProvider
}
const sdk = await SDK.createSDK(configuration);
// after user's wallet address changed
// Example #1:
sdk.updateWalletProvider(walletProvider);
// Example #2:
sdk.updateWalletAddress(CHAIN_TYPE.EVM, address);
Now you can use swap
method of trade instance. Approve transaction will be sent automatically if needed.
const onConfirm = (hash: string) => console.log(hash);
// check that trade is defined
сonst bestTrade = trades[0];
const receipt = await bestTrade.swap({ onConfirm });
Steps 1. and 2. are the same. You can use single sdk instance for on-chain trades and cross-chain swaps calculations.
Use sdk instance for trade calculation
import { BLOCKCHAIN_NAME } from 'rubic-sdk';
import { EvmCrossChainTrade } from "./evm-cross-chain-trade";
const fromBlockchain = BLOCKCHAIN_NAME.ETHEREUM;
const fromTokenAddress = '0x0000000000000000000000000000000000000000'; // ETH
const fromAmount = 1;
const toBlockchain = BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN;
const toTokenAddress = '0xe9e7cea3dedca5984780bafc599bd69add087d56'; // BUSD
const wrappedTrades = await sdk.crossChainManager.calculateTrade(
{ blockchain: fromBlockchain, address: fromTokenAddress },
fromAmount,
{ blockchain: toBlockchain, address: toTokenAddress }
);
wrappedTrades.forEach(wrappedTrade => {
const tradeType: TradeType = wrappedTrade.type;
console.log(`trade type: ${tradeType}`);
if (wrappedTrade.error) {
console.log(`error: ${wrappedTrade.error}`);
} else {
const trade = wrappedTrade.trade!;
console.log(`to amount: ${trade.to.tokenAmount.toFormat(3)}`);
// explore trades info
if (trade instanceof EvmCrossChainTrade) {
console.log(trade.gasData)
}
...
}
})
Same as in on-chain.
Now you can use swap
method of trade instance. Approve transaction will be sent automatically if needed.
const onConfirm = (hash: string) => console.log(hash);
// check, that trade is defined
const bestTrade = wrappedTrades[0].trade;
const receipt = await bestTrade.swap({ onConfirm });
You can use specific sdk Token
classes to work with tokens.
import { BLOCKCHAIN_NAME } from 'rubic-sdk';
const token: Token = await Token.createToken({
blockchain: BLOCKCHAIN_NAME.ETHEREUM,
address: '0xdac17f958d2ee523a2206206994597c13d831ec7'
});
console.log(token.symbol); // USDT
console.log(token.name); // Tether USD
console.log(token.decimals); // 6
You can also use constructor directly.
import { BLOCKCHAIN_NAME } from 'rubic-sdk';
const token = new Token({
blockchain: BLOCKCHAIN_NAME.ETHEREUM,
address: '0xdac17f958d2ee523a2206206994597c13d831ec7',
name: 'USD Coin',
symbol: 'USDC',
decimals: 6
})
import { BLOCKCHAIN_NAME } from 'rubic-sdk';
const token: PriceToken = await PriceToken.createToken({
blockchain: BLOCKCHAIN_NAME.ETHEREUM,
address: '0xdac17f958d2ee523a2206206994597c13d831ec7'
});
console.log(token.price);
import { BLOCKCHAIN_NAME } from 'rubic-sdk';
const token: PriceTokenAmount = await PriceTokenAmount.createToken({
blockchain: BLOCKCHAIN_NAME.ETHEREUM,
address: '0xdac17f958d2ee523a2206206994597c13d831ec7',
tokenAmount: new BigNumber(1)
});
console.log(token.weiAmount);
FAQs
Simplify dApp creation
We found that rubic-sdk demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 3 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
/Security News
Ongoing npm supply chain attack spreads to DuckDB: multiple packages compromised with the same wallet-drainer malware.
Security News
The MCP Steering Committee has launched the official MCP Registry in preview, a central hub for discovering and publishing MCP servers.
Product
Socket’s new Pull Request Stories give security teams clear visibility into dependency risks and outcomes across scanned pull requests.