npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@wealthwallet/core

v1.0.1

Published

Wealthwallet is a smart contract built on Ethereum that allows you to build unlimited portfolios easily

Downloads

4

Readme

Wealthwallet

Wealthwallet is a smart contract built on Ethereum powered by Uniswap that allows you to make unlimited portfolios easily

Follow us on Twitter

Wealthwallet smart contract is deployed on Mainnet, Ropsten and Kovan. |Network | Address |------------|------------ |Mainnet | 0x6d439dBA58e8642746c155fe902B1833892F2504 |Ropsten | 0x93732c84E51C89b23a4869cD94856DaE2141771E |Kovan | 0x3E9d6C24726CFCA4864bCc6c193dD411485235AD

Table of Contents

  1. Features
  2. Getting Started
  3. WealthWalletFactory
  4. WealthWallet
  5. Portfolio
  6. Fund
  7. Rebalance
  8. Withdraw

Features

  • Wealthwallet allows you to make custom portfolios with any Uniswap asset.
  • You can choose the ratio in which the assets make up your portfolio.
  • Whenever you fund your portfolio, Wealthwallet will automatically distribute your funds to your chosen assets.
  • You can rebalance your portfolio(redistribute your assets to their respective ratios) at anytime.
  • It is completely free to use, there are no fees associated with Wealthwallet.

Getting Started

This tutorial uses Truffle for simplicity and assumes you have your ethereum wallet connected to interact with the smart contract.

To install Truffle:

$ npm install -g truffle

To get started, install the wealthwallet node package to have access to the contracts

$ npm i @wealthwallet/core

First, we import the smart contracts from the wealthwallet node package.

const WealthWalletFactory = artifacts.require("@wealthwallet/core/contracts/WealthWalletFactory.sol");
const WealthWallet = artifacts.require("@wealthwallet/core/contracts/WealthWallet.sol");
const Portfolio = artifacts.require("@wealthwallet/core/contracts/Portfolio.sol");

WealthWalletFactory

The WealthWalletFactory is used to create wealthwallets. It also keeps track of which ethereum wallets created a wealthwallet.

//define factory address
const factoryAddress = "0x6d439dBA58e8642746c155fe902B1833892F2504"; // mainnet address

//create wealthwalletfactory instance
const wealthWalletFactory = await WealthWalletFactory.at(factoryAddress);

//create wealthwallet
await wealthWalletFactory.createWealthWallet();

//get wealthwallet
const wealthWalletAddress = await wealthWalletFactory.getWealthWallet();

First, we create an instance of WealthWalletFactory at the address it's deployed on.

Next, we create a wealthwallet using the factory's createWealthWallet() method. Whenever you create a wealthwallet, only the ethereum wallet you used to create it will have access to it.

Finally, we retrieve the address of the wealthwallet we just created using getWealthWallet() method.

Congratulations, you have just create a wealthwallet using WealthWalletFactory and retrieved the address of that wealthwallet. Next, we will interaction with the wealthwallet we have just created.

WealthWallet

Wealthwallets are used to create and keep track of your portfolios.

//create wealthwallet instance
const wealthWallet = await WealthWallet.at(wealthWalletAddress);

//get current portfolio index aka total portfolios
const portfolioIndex = await wealthWallet.getTotalPortfolios(); //equals 0

// define portfolio name
const portfolioName = "Portfolio 1";

//create Portfolio
await wealthWallet.createPortfolio(portfolioName);

//get portfolio address
const portfolioAddress = await wealthWallet.getPortfolio(portfolioIndex);

First, we create an instance of the wealthwallet we just created.

Next, we create a portfolio using createPortfolio method and giving it a name.

Finally, we retrieve the address of that portfolio using getPortfolio method and giving it the portfolio index. 0 = First portfolio 1 = Second portfolio ...

You have just created a portfolio and retrieved at address of that portfolio using your wealthwallet! Next we will customize the portfolio.

Portfolio

Portfolios are where you choose the assets you want to invest in and their respective ratios. You can deposit, rebalance and withdraw from your portfolio at anytime.

//create portfolio instance
const portfolio = await Portfolio.at(portfolioAddress);

//define configuration settings
const slippage = 50; //basis points out of 10,000 (0.5% slippage)
const swapTimeLimit = 600; //time limit in seconds (10 minutes)
const uniswapRouterAddress = "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D";
const wethAddress = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2";


//configure portfolio
await portfolio.configure(slippage, swapTimeLimit, uniswapRouterAddress, wethAddress);

assets = [
    {
        name: "Wrapped BTC",
        symbol: "WBTC",
        address: "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599",
        ratio: 5000
    },
    {
        name: "Wrapped Ether",
        symbol: "WETH",
        address: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
        ratio: 5000
    }
];

//loop through all assets
for (let i=0; i<assets.length; i++){
    // add asset
    await portfolio.addAsset(assets[i].name, assets[i].symbol, assets[i].address, assets[i].ratio);
}

First, we create an instance of the portfolio using the address we were given.

Then, we configure the settings that we want the portfolio to be made of using the configure() method.

configure(slippage, swapTimeLimit, uniswapRouterAddress, wethAddress)

slippage: This is amount a price can move between when a swap is submitted and when it is executed, this is measured in basis points out of 10,000, see Uniswap's glossary.
swapTimeLimit: This is a swap's deadline, the maximum amount of time a swap has to execute a trade from when it's submitted. uniswapRouterAddress: Input Uniswap's Router address to be able to swap tokens on Uniswap. See Uniswap's Router02. wethAddress: This is wrapped ether's address. We input this address to buy wrapped ether directly, without having to use a market maker.

Next, we add the assets we want to make up the portfolio using addAsset() method.

addAsset(name, symbol, address, ratio)

name: This is the name of the asset symbol: This is the symbol of the asset address: This is the asset's token address ratio: This is the percentage you want the asset to make up of your portfolio. This is measured in basis points out of 10,000. Remember to make sure your assets always add up to 100% of your portfolio. You have just configure your portfolio and added 2 assets. In this example, your portfolio is 50% WBTC and 50% WETH.

Fund

Whenever you fund your portfolio, wealthwallet will automatically distribute your funds to your chosen assets with their respective ratios.

console.log("BEFORE FUNDING\n");

//get total assets
const totalAssets = (await portfolio.getTotalAssets()).toNumber();

//loop through all assets 
for (let i=0; i<totalAssets; i++) {
    //get asset details
    let asset = await portfolio.getAssetDetails(i);
    console.log("--------------- Asset Details ----------------");

    console.log("Name: ", asset[0]);
    console.log("Symbol: ", asset[1]);
    console.log("Address: ", asset[2]);
    console.log("Ratio: ", asset[3].toString());
    console.log("Amount: ", asset[4].toString());

}

// set funding amount
const fundingAmount = web3.utils.toWei('1', 'ether');

// fund portfolio
await portfolio.deposit({value: fundingAmount});

console.log("\n\nAFTER FUNDING\n");

//loop through all assets 
for (let i=0; i<totalAssets; i++) {
    //get asset details
    let asset = await portfolio.getAssetDetails(i);
    console.log("--------------- Asset Details ----------------");

    console.log("Name: ", asset[0]);
    console.log("Symbol: ", asset[1]);
    console.log("Address: ", asset[2]);
    console.log("Ratio: ", asset[3].toString());
    console.log("Amount: ", asset[4].toString());
}

Console

BEFORE FUNDING

--------------- Asset Details ----------------
Name:  Wrapped BTC
Symbol:  WBTC
Address:  0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599
Ratio:  5000
Amount:  0
--------------- Asset Details ----------------
Name:  Wrapped Ether
Symbol:  WETH
Address:  0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Ratio:  5000
Amount:  0


AFTER FUNDING

--------------- Asset Details ----------------
Name:  Wrapped BTC
Symbol:  WBTC
Address:  0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599
Ratio:  5000
Amount:  3056095
--------------- Asset Details ----------------
Name:  Wrapped Ether
Symbol:  WETH
Address:  0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Ratio:  5000
Amount:  500000000000000000

First, we get the total number of assets using the getTotalAssets() method, then loop through those assets and get their information using the getAssetDetails() method.

Next, we fund the portfolio by calling the deposit() method and sending the amount of wei we want to deposit. You can also fund your portfolio by simply sending funds to the portfolio address.

Finally, we loop through the assets again to see how they've change. As you can see, 50% of the funds sent was swapped for WBTC and the other 50% was swapped for WETH.

Rebalance

Let's say you want to modify your portfolio's structure or are simply overdue for rebalancing, wealthwallet makes rebalancing simple.

console.log("\n\nBEFORE REBALANCE\n");

//loop through all assets 
for (let i=0; i<totalAssets; i++) {
    //get asset details
    let asset = await portfolio.getAssetDetails(i);
    console.log("--------------- Asset Details ----------------");

    console.log("Name: ", asset[0]);
    console.log("Symbol: ", asset[1]);
    console.log("Address: ", asset[2]);
    console.log("Ratio: ", asset[3].toString());
    console.log("Amount: ", asset[4].toString());
}

//change asset ratio

//set first asset to 25% of portfolio
await portfolio.changeAssetRatio(0, 2500);

//set second asset to 75% of portfolio
await portfolio.changeAssetRatio(1, 7500);

//rebalance
await portfolio.rebalance();

console.log("\n\nAFTER REBALANCE\n");

//loop through all assets 
for (let i=0; i<totalAssets; i++) {
    //get asset details
    let asset = await portfolio.getAssetDetails(i);
    console.log("--------------- Asset Details ----------------");

    console.log("Name: ", asset[0]);
    console.log("Symbol: ", asset[1]);
    console.log("Address: ", asset[2]);
    console.log("Ratio: ", asset[3].toString());
    console.log("Amount: ", asset[4].toString());
}

Console

BEFORE REBALANCE

--------------- Asset Details ----------------
Name:  Wrapped BTC
Symbol:  WBTC
Address:  0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599
Ratio:  5000
Amount:  3056095
--------------- Asset Details ----------------
Name:  Wrapped Ether
Symbol:  WETH
Address:  0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Ratio:  5000
Amount:  500000000000000000


AFTER REBALANCE

--------------- Asset Details ----------------
Name:  Wrapped BTC
Symbol:  WBTC
Address:  0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599
Ratio:  2500
Amount:  1523482
--------------- Asset Details ----------------
Name:  Wrapped Ether
Symbol:  WETH
Address:  0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Ratio:  7500
Amount:  747753291186141747

We loop through the assets and get their information using getAssetDetails().

Then, we change the asset's ratio using the changeAssetRatio() method. In this example, we're changing WBTC(0) to 25% and WETH(1) to 75% of the portfolio.

Next, we rebalancing the portfolio using the rebalance() method. This method liquifies all the assets to ETH and then reswaps them at their respective ratios.

Finally, we loop through the assets to get their info and see how they've changed. As you can see, the asset's ratios were updated and using rebalance(), their amount was changed to match that ratio. It works like magic!

Withdraw

console.log("\n\nBEFORE WITHDRAWAL\n");

//loop through all assets 
for (let i=0; i<totalAssets; i++) {
    //get asset details
    let asset = await portfolio.getAssetDetails(i);
    console.log("--------------- Asset Details ----------------");

    console.log("Name: ", asset[0]);
    console.log("Symbol: ", asset[1]);
    console.log("Address: ", asset[2]);
    console.log("Ratio: ", asset[3].toString());
    console.log("Amount: ", asset[4].toString());
}

//withdraw all from portfolio
await portfolio.withdrawAll();

// or withdraw specific amount

//const withdrawAmount = web3.utils.toWei('0.5', 'ether');
//await portfolio.withdraw(withdrawAmount);

console.log("\n\nAFTER WITHDRAWAL\n");

//loop through all assets 
for (let i=0; i<totalAssets; i++) {
    //get asset details
    let asset = await portfolio.getAssetDetails(i);
    console.log("--------------- Asset Details ----------------");

    console.log("Name: ", asset[0]);
    console.log("Symbol: ", asset[1]);
    console.log("Address: ", asset[2]);
    console.log("Ratio: ", asset[3].toString());
    console.log("Amount: ", asset[4].toString());
}

Console

BEFORE WITHDRAWAL

--------------- Asset Details ----------------
Name:  Wrapped BTC
Symbol:  WBTC
Address:  0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599
Ratio:  2500
Amount:  1523482
--------------- Asset Details ----------------
Name:  Wrapped Ether
Symbol:  WETH
Address:  0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Ratio:  7500
Amount:  747753291186141747


AFTER WITHDRAWAL

--------------- Asset Details ----------------
Name:  Wrapped BTC
Symbol:  WBTC
Address:  0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599
Ratio:  2500
Amount:  0
--------------- Asset Details ----------------
Name:  Wrapped Ether
Symbol:  WETH
Address:  0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Ratio:  7500
Amount:  0

We get the asset's details using getAssetDetails().

Then, we withdraw all of our fund back to our ethereum wallet using the withdrawAll() method. You also have the option of using withdraw(withdrawAmount) to withdraw a specific amount. These methods liquify your assets into ETH, then withdraws the amount requested to your wallet, then reswaps the remaining funds, if any, back to the portfolio's chosen assets.

We get the asset's details and notice that all of the tokens were successfully withdrawn from the portfolio back to your ethereum wallet.