# Overview

The onchain home for real world assets.

## About Plume

**Plume** is a public, EVM-compatible blockchain built for the next evolution of Real World Assets (RWAs). We’re not just tokenizing assets — we’re creating a seamless way to use them like crypto: stake, swap, lend, borrow, loop, and more.

By integrating institutional-grade assets with decentralized finance (DeFi) tools, Plume makes traditionally inaccessible assets — like private credit, ETFs, commodities — **permissionless, composable, and a click away.**

Our mission is simple: bridge traditional finance and crypto through **demand-driven adoption**, without sacrificing transparency, openness, or user experience.

## Why Plume Stands Out

#### **A thriving ecosystem:**

* Over **200 protocols onboarded** and growing.
* Testnet success with **18 million wallets, 280 million transactions.**
* Partnerships with major institutions, distribution partners, and asset managers.

#### **Designed for utility:**

* Use RWAs like crypto-native assets across DeFi — stake, swap, lend, borrow, loop.
* Composable assets ready for lending markets, collateral, and complex strategies.
* Built to bring **new capital onchain every day** from the world’s best funds.

## The Future of RWAfi

Plume is more than a blockchain — it’s an ecosystem designed for **RWA finance (RWAfi)** to thrive:

* Access assets previously out of reach: stake stables to earn yield from **Superstate, Apollo, Blackrock, Blackstone, Invesco, and more.**
* Loop, collateralize, and trade RWAs as easily as crypto tokens.
* Explore esoteric assets like **GPUs, uranium, mineral rights, durian farms,** and more.

Through phased onboarding, Plume ensures a **secure, scalable, and liquid** environment for users and partners — with each phase unlocking more use cases, assets, and DeFi integrations.

## Built for Composability

At Plume, RWAs aren’t just tokenized — they’re made **composable and usable across the DeFi stack.** This unlocks:

* Yield stacking and leverage
* Integration with lending protocols
* Creation of new structured products

By bringing **the real world into crypto** (instead of the other way around), Plume opens new doors for builders, investors, and institutions alike.

## Dive into RWAfi

Plume is building a **permissionless, transparent, and demand-driven financial system,** where anyone can access high-quality assets, trade freely, and innovate with new financial tools.

The future of RWAfi is here — and it’s built on Plume.


# Roadmap

## Coming soon!&#x20;


# About the Portal

A quick overview of the Plume Portal

<figure><img src="/files/f90rv74LKOcZzDvzuFcT" alt=""><figcaption><p>Plume's Portal</p></figcaption></figure>

The main hub for accessing everything in the Plume ecosystem.

* **Manage your assets:** bridge tokens into Plume, swap tokens, and stake to earn rewards.
* **Grow and track your earnings:** explore featured opportunities, monitor your portfolio, and see your earnings in real time.
* **Engage and compete:** refer friends, earn points to climb the leaderboard, and spin daily to win RWA prizes.
* **Learn and level up:** complete quests to learn DeFi workflows and unlock rewards.


# Bridge and Swap

Bridge options available on Plume

<div data-full-width="false"><figure><img src="/files/ikhthOBy11yl8ieANIjb" alt="" width="563"><figcaption></figcaption></figure></div>

Plume enables cross-chain bridging and swapping in one transaction using our own internal bridge, **powered by Relay**.&#x20;

For swapping with the lowest fees and deep liquidity use [Rooster Protocol](https://app.rooster.trade/), the official RWA liquidity hub and Plume's official DEX.&#x20;

We recognize that many users also have bridges that they rely on, so Plume also partners with the following industry-leading bridge solutions (with more to come):&#x20;

* [Stargate](https://stargate.finance/)
* [Arbitrum](https://bridge.arbitrum.io/?amount=0)
* [Relay](https://www.relay.link/bridge/plume?includeChainIds=e696b420-e986-4902-a5fd-2a5f98d86f50\&fromChainId=1)
* For Bitcoin holders, we support bridging staked Bitcoin (stBTC) using [Lorenzo](https://app.lorenzo-protocol.xyz/bridgestBTC)


# Stake

Stake PLUME to support the growth and security of the Plume network while earning rewards and special benefits from our ecosystem

## What is Plume Staking?

[**Plume Staking**](https://staking.plume.org/) is the official application that allows users to stake their **PLUME tokens** on the Plume blockchain to earn additional PLUME as rewards.

<figure><img src="/files/4GhBMbpfh0IZhWnmJnHc" alt=""><figcaption></figcaption></figure>

## How does Plume Staking work?

**Staking PLUME** entails delegating your **PLUME tokens** to validators who help secure the **Plume blockchain.** In return, you earn more PLUME as rewards.

#### More in detail:

* **Definition**:\
  Staking PLUME involves delegating your tokens to a **validator**, who helps run and secure the Plume blockchain. You don’t give up ownership—you just lock the tokens temporarily.
* **Purpose**:\
  Validators need stake (PLUME) to participate in validating blocks. The more you stake with them, the more weight they have in securing the network.
* **In Return**:\
  You earn **PLUME staking rewards** proportional to your staked amount. Refer to the "Effective APY" for each validator on the app to know the projected yearly return on your staked PLUME tokens.

## Possible benefits beyond earning yield

Apart from earning more PLUME as rewards, the following possible benefits for stakers are being explored:

1. Airdrop allocation from ecosystem projects.
2. Earn a share of ecosystem revenue.
3. Governance rights.
4. App-specific perks like lower fees or priority access.

## Features

### Stake

Stake PLUME delegating to a validator of your choice and start earning rewards.

<figure><img src="/files/baPgv1gAKmnFqZ0XOR8u" alt=""><figcaption></figcaption></figure>

#### **How to stake?**

1. Make sure you have connected your wallet. To connect, click on the "Connect Wallet" button and proceed as on any other DeFi app.
2. Within the "Stake" card on the right, input the amount of PLUME you want to stake.&#x20;
   1. You can also select wPLUME and automatically unwrap then stake in one step.
   2. Here you will also find the equivalent of what you are staking in US dollars and your PLUME balance in your wallet.
3. Choose the validator you want to delegate to in the dropdown. See there the commission each one gets, and the effective APY once you have made the selection. In Phase 1, all validator commissions are fixed at 0.5%.
4. Before staking, we recommend you checking the information under the "Stake" button:
   1. Staking APY: The reward Plume gives to stakers.
   2. Validator Fee: A small portion that the validator gets to cover their costs.
   3. Effective APY: Which is the actual return you are going to receive and it's calculated like this: `Staking APY - Validator Free`.
   4. Expected Annual Reward: Calculation of your expected return after one year.
   5. Unstake period: Number of days you need to wait before you can withdraw your PLUME after requesting to unstake. Check the [Unstake Period section](#unstake-period-of-21-days).
5. Click on "Stake", confirm the operation on your wallet, and see how "Your Position" gets updated.

### Unstake

Unstake the amount you choose from the validator you desire any time.

<figure><img src="/files/Ugq6E4Sl9be7aT7lqo0I" alt=""><figcaption></figcaption></figure>

#### **How to unstake?**

1. Once you have an amount staked, the "Unstake" tab on the card on the right will be enabled.&#x20;
2. Click on the "Unstake" tab.
3. Select the validator you want to unstake from.
4. Input the amount you want to unstake.
   1. Under the input field you will find the equivalent amount in US dollars,
   2. and the amount you have staked with that validator.
5. You should know that after you initiate this unstaking request, you will need to wait 21 days ([unstake period](#unstake-period-of-21-days)) until you can withdraw the amount to your wallet.
6. Click on the "Unstake" button, and confirm the operation from your wallet.
7. Once the request has been successful, you will find your unstake request on the "Unstaking" section on the left side.
8. Once the unstake period has passed, a "Withdraw" button will appear for you to retrieve the PLUME to your wallet.

### Claim your rewards (Feature available by late June, 2025)

Your stake will immediately start generating rewards that you can claim and withdraw to your wallet.

<figure><img src="/files/YeBsnLX2EgOAu59P9uAK" alt=""><figcaption></figcaption></figure>

#### How to claim your rewards?

1. Once you have staked some PLUME, you can go to the "Rewards" section on the left side of the app and click on "Claim Rewards".
2. Confirm the transaction from your wallet.
3. And the PLUME will be sent to your wallet.

### Restake your rewards (Feature available by late June, 2025)

Instead of claiming rewards first then manually restaking, we made it easy for you to restake them directly so you can compound and earn more.

<figure><img src="/files/17Iu4PuO3kdiPKHFdOxS" alt=""><figcaption></figcaption></figure>

#### How to restake your rewards?

1. Once you have staked some PLUME, go to the "Rewards" section on the left side of the app, and click on "Stake Rewards".
2. Select the validator you want to delegate all your rewards to.
3. And confirm the transaction from your wallet.
4. Once the operation is successful, your staking position should get updated.

### "Your position" section

In this section we show:

1. The number of PLUME you have staked.
2. Its value in US dollars.
3. And the split of your stake across the different validators.

<figure><img src="/files/QVHYKvJ4j9uFa7KY7fib" alt=""><figcaption></figcaption></figure>

### "Rewards" section

In this section we show:

1. The amount of PLUME rewards you have earned so far and that you can claim or restake.
2. Its value in US dollars.

<figure><img src="/files/wXmkkrNJ7PKiCL11P2P9" alt=""><figcaption></figcaption></figure>

### "Unstaking" section

In this section you will find any in-progress unstaking requests and any PLUME that is ready to be withdrawn.

<figure><img src="/files/Y7Msb5moIc0EcA8ZwkNn" alt=""><figcaption></figcaption></figure>

### "Your transaction history" section

Here you will find all the operations you have done: staking, unstaking, claiming rewards, restaking rewards, and withdrawing. Also, you find the exact time of the operation, the transaction hash, the link to the block explorer, and the amount involved.

<figure><img src="/files/Zk1rDoGKMmcbYRMCfzfk" alt=""><figcaption></figcaption></figure>

### "Global staking overview" section

This is a list of all Plume validators, the amount staked and delegated to each of them, and their Effective APY.

<figure><img src="/files/YuJSW9YCdNNra5sCvW0w" alt=""><figcaption></figcaption></figure>

## Important notes to consider

### Unstake period of 21 days

Unstake period of 21 days means you will be able to withdraw your PLUME 21 days after requesting to unstake. If you unstake again from the same validator before an in-progress request is completed, the timer resets.

This delay protects the network by preventing sudden exits and helps maintain security and stability.


# Optimizer

DeFi yield based on Real World Assets

<figure><img src="/files/S3TZs33xU9cMuMMuOpwF" alt=""><figcaption><p>Plume's Optimizer</p></figcaption></figure>

### About the Optimizer

Optimizer combines Real World Assets with crypto capabilities to produce DeFi level yields with the smallest number of clicks. &#x20;

### How it works

<figure><img src="/files/AyS7ybJClJkKJqi9Yq8V" alt=""><figcaption><p>Example Optimizer flow</p></figcaption></figure>

While the underlying movement of the capital seems complex, the Optimizer abstracts that away by giving the user a one-click easy to use tool.&#x20;

* The user deposits the stablecoin (USD.e, USDT, [pUSD](/plume/tokens/plume-usd), or a Nest token).&#x20;
* The Optimizer takes the deposit and moves it to a vault where it's automatically deployed across our partner looping markets (Solera, Mystic, etc.).&#x20;
* Plume incentivizes the user by working with the leading incentive market Royco to give you the highest DeFi yield backed by Real World Assets.&#x20;


# Plume Points (PP)

The Plume Portal's activity based rewards mechanism

<figure><img src="/files/PlQyJSbQsHNwyMFd6VGH" alt=""><figcaption><p>Plume Points</p></figcaption></figure>

**Plume Points (PP)** are earned by participating in the Plume ecosystem and can unlock future rewards, including eligibility for airdrops.

### How to Earn Plume Points

Earn Plume Points by actively using apps in the Plume ecosystem:

* **Use apps:** increase TVL, make swaps and transactions, and interact with unique dApps.
* **Keep streaks:** earn more Plume Points by maintaining activity over consecutive weeks.
* **Refer friends:** earn Plume Points by referring your friends to the portal.&#x20;

### Why Earn PP

Plume Points give you access to special rewards:

* **Airdrop eligibility:** Plume Points will determine the share of Plume’s airdrops.
* **Ongoing perks:** future ecosystem benefits and rewards tied to your PP balance.

*Note: Standard anti-sybil protections will apply to ensure fairness.*


# PLUME ($PLUME)

The native utility token of the Plume Network

### Plume Token ($PLUME)

**$PLUME** is the native utility token of the Plume Network, powering a modular blockchain optimized for Real World Assets (RWAs). It facilitates transactions, governance, and incentivizes ecosystem growth.

You can review the token on:

* [Etherscan](https://etherscan.io/address/0x4C1746A800D224393fE2470C70A35717eD4eA5F1)
* [coingecko](https://www.coingecko.com/en/coins/plume)
* [CoinMarketCap](https://coinmarketcap.com/currencies/plume/)

### Token Utility

**$PLUME** serves multiple functions within the Plume ecosystem:

* **Gas Fees:** Used for transaction fees on the Plume Network.
* **Governance:** Enables holders to participate in network decision-making processes.
* **Staking:** Allows users to stake tokens, contributing to network security and earning rewards.
* **Ecosystem Incentives:** Rewards for participating in community activities, quests, and referrals.

### Ecosystem Integration

**$PLUME** is integral to various aspects of the Plume ecosystem:

* **DeFi Applications:** Facilitates yield farming, looping, and speculation on tokenized RWAs.
* **Real World Asset Tokenization:** Enables on-chain representation and interaction with assets like real estate, commodities, and collectibles.
* **Community Engagement:** Drives user participation through incentives and governance.

### Token Supply & Allocation

**Total Supply:** 10 billion $PLUME tokens\
**Initial Circulating Supply at TGE:** 20% of total supply

**Allocation Breakdown:**

* **Community, Ecosystem & Foundation (59%):** Supports grants, community incentives, validator rewards, and liquidity provisioning.
* **Early Backers (21%):** Allocated to strategic partners and investors contributing to Plume's development.
* **Core Contributors (20%):** Designated for the team driving Plume's engineering, product, and operational efforts.

####


# Plume USD (pUSD)

The RWAfi stablecoin to use to get real-world yield across the Plume ecosystem.

## Overview

Plume USD (pUSD) is the premier stablecoin of the Plume ecosystem, designed to support seamless financial operations within Real World Asset Finance (RWAfi). Fully backed and deeply liquid, pUSD plays a critical role in enabling secure payments, efficient trading, and robust collateralization across onchain apps on Plume.

If your organization is used to holding, minting, and deploying USDC or USDT, you will be clear to hold, mint, and deploy pUSD. While pUSD is the canonical stablecoin of the Plume ecosystem, used as the unit of account and collateral across DeFi protocols and applications, it is for all intents and purposes a simple way to reduce onboarding friction during capital deployment.&#x20;

{% hint style="info" %}
**Chains Supported:** Minting and redemption are currently live on Ethereum and Plume for Native USDC.&#x20;
{% endhint %}

## Composition

Plume USD (pUSD) maintains a 1:1 peg with the US dollar, backed by a reserve of the world’s most trusted stablecoins. This ensures deep liquidity, robust price stability, and unparalleled user confidence.

* Plume USD (pUSD) is backed on a 1:1 basis by USDC within a BoringVault on the Plume Chain.
* The pUSD BoringVault is managed by Plume.
* Minting and redemption incur **NO protocol fees**.

## Stability

* There is **no algorithmic mechanism** controlling supply; stability is achieved through full collateral backing.
* pUSD is **NOT yield-bearing** in its base form. Future staking wrappers are under design but explicitly opt-in and will not impact pUSD.

## Risk Management

* **Collateral Risk:** Full reliance on the solvency and liquidity of Circle's USDC. No overcollateralization, immediate 1:1 convertibility.
* **Oracle & Pricing Risk**: Oracles are used for asset monitoring on-chain; integrity mechanisms protect against manipulation.
* **Liquidity & Redeem Risk**: The protocol is designed so that at any time a holder can redeem pUSD for USDC on any supported chaint at a 1:1 peg.  &#x20;

## Mint and Redeem pUSD

Minting and redeeming Plume USD (pUSD) is seamless:

1. **Bridge and Mint**: Bridge and mint USDC in a single transaction without protocol fees at 1:1 peg from Ethereum to Plume Chain.
2. **Swap Back to USDC**: Redeem pUSD on Plume and receive USDC at a 1:1 ratio on Ethereum or Plume Chain at any time.

<details>

<summary><strong>Mint Plume USD</strong></summary>

1. Go to [pUSD Bridge](https://pusd.plume.org/) and connect your wallet
2. Enter your amount and click Mint
3. Approve the amount and confirm transaction
4. pUSD is minted in your wallet

<figure><img src="/files/RyA5v2Ie1MPFfi9Roeba" alt=""><figcaption></figcaption></figure>

</details>

<details>

<summary><strong>Redeem Plume USD</strong></summary>

1. Go to [pUSD Bridge](https://pusd.plume.org/) and connect your wallet
2. Switch to Redeem tab
3. Enter your amount and click Redeem
4. Create Bridge tx on Plume
5. Approve amount and submit redemption request on Ethereum
6. USDC is redeemed in your wallet on Ethereum

**Note:** Redemptions can take upto 12 hours and may show up as pending

<figure><img src="/files/QdBpnqpINWrZOrLmPKJn" alt=""><figcaption></figcaption></figure>

</details>

You are now ready to explore the many DeFi use cases powered by Real World Assets on Plume.&#x20;

## Smart Contracts

Plume USD (pUSD) uses BoringVault smart contracts through [Nucleus](https://www.nucleusearn.io/). These are hardened with multiple rounds of audits by leading crypto security firms.

The primary minter contract is **TellerWithMultiAssetSupportPredicateProxy** (0x6104fe10ca937a086ba7AdbD0910A4733d380cB6). The predicate proxy enforces compliance checks: the front-end initiates an off-chain API call to fetch a compliance message (e.g., wallet OFAC clearance) and passes it to the contract as part of the minting transaction.

<details>

<summary><strong>Audits</strong></summary>

* 2024/03/20: [BoringVault smart contracts audit](https://github.com/Ion-Protocol/nucleus-boring-vault/blob/master/audit/0xmacro-boring-vault-arctic-0.pdf) (0xMacro)
* 2024/04/19: [BoringVault smart contracts audit](https://github.com/Ion-Protocol/nucleus-boring-vault/blob/master/audit/spearbit-boring-vault-arctic-0.pdf) (Spearbit)
* 2024/04/22: [BoringVault smart contracts audit follow-up](https://github.com/Ion-Protocol/nucleus-boring-vault/blob/master/audit/0xmacro-boring-vault-arctic-1.pdf) (0xMacro)
* 2024/07/13: [Nucleus cross-chain smart contracts audit](https://github.com/Ion-Protocol/nucleus-boring-vault/blob/master/audit/pashov-boring-vault.pdf) (Pashov)
* 2024/12/16: [Nucleus integration with Hyperlane audit](https://github.com/Ion-Protocol/nucleus-boring-vault/blob/master/audit/pashov-hyperlane.pdf) (Pashov)

</details>

## Compliance

**Legal Structure:** pUSD is minted via vault contracts managed by Plume. pUSD simply wraps USDC (previously USDC.e) with transparent, on-chain backing.

**Regulatory:** pUSD is a non-interest-bearing tokenized wrapper on USDC. No fiat conversion or custody occurs within Plume.

## **Brand assets**

Browse our [Media Kit](/plume/community-and-support/brand-assets) to download the token symbol.


# Plume ETH (pETH)

Plume's native yield-bearing Ethereum liquid staking token

## Overview

Plume's native Ethereum token, pETH, is both composible and natively yield bearing by default. When a user mints pETH in their wallet we , we do the following for the user with a single transaction:

* automatically stake the underlying ETH on Ethereum Mainnet
* automatically bridge the newly minted liquid staking token, pETH to&#x20;
* stream the rewards to your wallet. No effort required.

Since pETH is a liquid staking token, a user is immediately able to earn more yield with DeFi flows like looping, lending, and more.&#x20;

## How to get pETH

<figure><img src="/files/yIfH6W6XB8C7x8pPbxxl" alt=""><figcaption></figcaption></figure>

* Go to <https://peth.plume.org/>
* Connect your wallet
* Stake your bridged ETH&#x20;
* Add pETH to your wallet

Once you have pETH in your wallet you're ready to explore the many DeFI uses cases powered by Real World Assets on Plume.&#x20;

## RWAfi use cases with pETH

pETH, like it's USD companion pUSD, is supported by the ecosystem’s top apps, enabling diverse use cases across multiple categories, including:

* **Nest**: Earn yield from real-world assets (e.g., loans, invoices).
* **Cultured**: Bet on culture markets like crypto, sports, and more.
* **Solera**: Lend and borrow against RWAs.
* **Osprey**: Secure borrowing, lending, and yield.
* **Ambient:** Zero-to-one decentralized trading protocol.
* **MetaStreet**: Sophisticated borrowing and lending solutions.
* **Avalon Labs:** The Liquidity Hub for BTCFi.
* **Rooster Protocol:** Go-to RWA liquidity solutions on Plume, powered by Maverick Protocol.
* **Mystic Finance**: Lend, borrow, and access lending strategies powered by RWAs.
* **Satori Finance:** The leading multichain Perp DEX with cheap fees and fast execution.

## Integrate Plume ETH

Technical documentation and APIs to integrate Plume ETH into your RWAfi apps on Plume will be made accessible at launch.

### **Brand assets**

Browse our [Media Kit](/plume/community-and-support/brand-assets) to download the token symbol.


# USD Coin (USDC)

**USDC** is a **fully reserved digital dollar** issued by **Circle** and redeemable **1:1 for USD**. On **Plume**, native USDC brings trusted liquidity to the **Real-World Asset (RWA)** ecosystem, enabling instant settlement, lending, and payments in decentralized finance (DeFi) and RWAfi protocols.

***

### **Overview**

* **Fiat-backed & transparent:** Every USDC is backed 100% by cash and short-term U.S. Treasuries, with monthly reserve attestations published by Circle.
* **Global & instant:** Operates 24/7 on blockchain networks, removing friction in international transfers.
* **Regulated & interoperable:** Issued by Circle under U.S. supervision and seamlessly transferable across supported chains via Circle’s CCTP (Cross-Chain Transfer Protocol).
* **On Plume:** USDC is available **natively** — not a bridged or wrapped asset — making it ideal for institutions and RWA finance applications.

### **Accessing USDC on Plume**

You can obtain or use native USDC on Plume in the following ways:

* 🏦 **Via Circle Mint:**\
  Businesses can mint and redeem USDC directly 1:1 for USD through Circle Mint, providing a secure institutional on/off-ramp.
* 🔄 **Migrate Bridged USDC (USDC.e):**\
  Older bridged USDC tokens (USDC.e) can now be migrated to **native USDC** for better liquidity and compliance.\
  [Follow the official Plume Migration Guide](https://www.circle.com/blog/plume-migration-guide)
* 💼 **Wallets & dApps:**\
  Native USDC appears simply as “USDC.” Bridged tokens are labeled “USDC.e” — make sure to use the native version for swaps, lending, or collateral.

***

### **RWA Use Cases on Plume**

USDC powers the **RWA finance ecosystem** on Plume by serving as a stable, programmable currency for tokenized assets.

* Acts as **settlement currency** for tokenized treasury bills, corporate bonds, or real-estate tokens.
* Used as **collateral** in RWA lending protocols like Morpho and Nest.
* Enables **on-chain yield generation** tied to real-world financial instruments.
* Provides **instant and global settlement** for RWA trades and distributions.

### **Developer Quickstart**

Developers can seamlessly integrate and transfer **USDC** on Plume using **Circle’s SDKs and APIs**.\
The official guide includes setup instructions, balance queries, and sample transfer code to get started quickly.

{% embed url="<https://developers.circle.com/stablecoins/quickstart-setup-transfer-usdc-plume>" %}


# Architecture

A cross-chain and secure infrastructure for seamless interactions with Real World Assets.

Plume’s architecture is purpose-built to support the tokenization and management of Real World Assets (RWAs) on the blockchain. The core components—Arc, Passport (coming soon), and Nexus—work together to deliver a streamlined and secure environment for managing diverse asset classes, ensuring compliance, and facilitating data integration.

### **Tokenization Engine – Arc**

* **Purpose**: Arc is our engine for efficient asset tokenization, designed to simplify the creation, onboarding, and management of tokenized RWAs.
* **How It Works**: Arc supports the tokenization of both physical and digital assets, integrating with compliance and data systems to maintain the accuracy, security, and regulatory alignment of each asset on the network.
* **Key Benefits**: Arc’s structure enables issuers to tokenize assets quickly and affordably while leveraging automated compliance checks.

### **Passport - Smart Wallets**

* **Purpose**: Most RWA holdings today are stagnant; they can’t be staked, collateralized, or integrated into DeFi, making true composability a challenge. Plume’s Smart Wallet changes that by embedding custody and compliance directly within the wallet, abstracting these functions to streamline user experience.
* **Features**: These wallets offer customizable controls for managing digital assets, yield-bearing instruments, and contract-based interactions, all within a secure, user-friendly wallet environment.
* **Key Benefits**: Plume Smart Wallets enable users to access advanced DeFi functionalities, such as yield generation and liquidity management, while maintaining security and control over their assets.

### **Data Highway – Nexus**

* **Purpose**: Nexus is a foundational component that brings real-world data onchain, enabling new use cases for prediction markets, DeFi applications, and speculative indices.
* **How It Works**: This data pipeline integrates reliable offchain data, connecting with external sources to feed real-time, actionable insights directly into the blockchain.
* **Key Benefits**: With Nexus, users can access accurate, up-to-date information for use in prediction markets, lending protocols, and other RWA-related DeFi applications, enhancing the value and functionality of tokenized assets.

## **Why Choose Plume’s Architecture?**

Plume’s modular infrastructure combines security, compliance, and real-world data integration, making it the ideal foundation for developers and users interested in leveraging blockchain technology for real world assets. Each component of the architecture is optimized to streamline the user experience, ensuring compliance and scalability while fostering growth in RWA-driven financial products.


# Core Features

Built-in compliance, liquidity, and data solutions for a seamless RWA experience.

Plume’s core features and functionalities provide a comprehensive framework for RWA tokenization, trading, and compliance. These components ensure that users have a secure, compliant, and efficient experience interacting with real world assets onchain, covering liquidity management, built-in AML compliance, and data access.

### **Built-in AML Compliance**

* **Purpose**: Plume integrates compliance directly into the platform to streamline regulatory compliance and user onboarding.
* **How It Works**: Using a network of compliance partners, Plume enables compliance verification for tokenized assets, ensuring transactions align with relevant regulations.
* **User Benefits**: With integrated compliance, users can confidently participate in RWAfi (Real World Asset Finance) transactions and access a wider range of opportunities on the Plume network while adhering to necessary legal standards.

### **Liquidity and Trading Support**

* **Purpose**: Liquidity is crucial to the success of tokenized assets, and Plume facilitates liquidity by partnering with trusted providers and deploying yield-boosting mechanisms.
* **How It Works**: Plume’s trading features enhance liquidity options for RWA tokens, including staking, yield farming, and integration with DeFi protocols to support market activity.
* **User Benefits**: Users can participate in asset trading with reduced slippage and improved asset stability, leveraging opportunities for liquidity and yield in the RWA market.

### **Data Integration and Analytics**

* **Purpose**: Plume offers real-time data feeds through Nexus, connecting onchain assets with offchain data sources.
* **How It Works**: The platform integrates reliable data sources directly into the network, allowing users to use accurate and up-to-date data in DeFi applications, lending protocols, and asset valuations.
* **User Benefits**: With access to trustworthy data, users can make informed decisions on tokenized assets, enhancing the functionality and accuracy of onchain financial products.

## **A Complete RWAfi Toolkit**

Each of Plume’s core features is designed to maximize user access, security, and market opportunity within the RWA ecosystem. By providing a streamlined and integrated experience, Plume makes it easier for users to engage with tokenized assets while offering peace of mind through compliance and liquidity support.


# AML Screening

## Blockchain Level AML Screening

Because Plume is a public blockchain, we operate our own infrastructure that lets us integrate the highest industry standards for AML. We are the only public and permissionless blockchain that runs AML at the sequencer level.

## TLDR:

We run AML screen *at the moment of transfer* - right after the bridge. This means that if someone uses a wallet that sends USDC from another chain, and that wallet has illicitly obtained stablecoins, the transfer will be blocked. USDC will not be minted or appear on Plume.

### Screening Process in Detail

<figure><img src="/files/PcaSr2RmS6T49o4pX2Mr" alt=""><figcaption></figcaption></figure>

1. All transactions on the Plume mainnet network are submitted through the Plume RPC before being sent to the Plume sequencer for ordering and execution.
2. Once the RPC receives the transaction, the transaction details (to address, from address, value, inputs) are forwarded to the [Forta Firewall](https://firewall.forta.network/) API.&#x20;
3. Once Forta Firewall receives transaction details, it performs compliance screening, followed by security screening.&#x20;
4. Firewall simulates the transaction with the details provided and generates traces which reveal the “internal” transactions as well as generated event logs. This process is equivalent to “unpacking the transaction” to see all the individual component parts, and all of this happens inside the firewall in milliseconds.  &#x20;
5. The unpacked transaction data is then parsed to extract the wallet addresses involved. Wallet addresses are the closest analogy we have to a person or entity’s identity onchain.&#x20;
6. The extracted wallet addresses are then screened against the Specially Designated Nationals (SDN) list of the US Department of the Treasury’s Office of Foreign Assets Control (OFAC) (commonly referred to as the “OFAC Sanctions List”) .
7. If a transaction is found to involve an OFAC-sanctioned address, the Firewall API returns an error response (indicating that it will be blocked) to the Plume RPC, and the transaction is dropped before the execution process.

### False Positives

In the context of compliance screening, a false positive (FP) refers to a blocked transaction that does not actually involve a sanctioned or high-risk wallet address (addresses included in sanctions lists (OFAC, EU, UK) are considered high-risk). While FPs are technically possible, we don’t foresee this occurring given how the compliance screening is performed. Forta Firewall screens each address in the transaction against a blacklist. The determination is binary - the address is either on the list or not. Additionally, onchain actions like contract deployments would never be blocked by the Firewall unless the transaction involves a sanctioned address.&#x20;

FPs are more likely, although very infrequent, in the context of Firewall’s security screening where the determination is risk-based. In either case if an FP is identified, we will investigate and address the cause as soon as reasonably possible. Once resolved, if the transaction is resubmitted by the user, the transaction should be processed and executed normally.<br>

Information requests

If you believe your transaction is a FP transaction, please contact <compliance@plume.org>. &#x20;


# Compliance at Plume

How we monitor for compliance purposes

### Compliance at Plume

Plume Network prioritizes compliance with **sanctions enforcement (OFAC)** to ensure a secure and lawful ecosystem and also works to combat money laundering through **anti-money laundering (AML)** measures.&#x20;

### What We Monitor

* **Sanctions compliance:** preventing transactions with individuals, entities, or countries sanctioned by OFAC.
* **AML and transaction monitoring:** scanning transactions for anomalies or red flags tied to fraud, laundering, or sanctions violations.
* **Network analysis:** analyzing blockchain activity at a network level to identify high-risk participants and complex schemes.

### Our Monitoring Partners

Plume uses leading blockchain analytics providers to meet AML and sanctions requirements:

* **Forta:** real-time [AML](/plume/plume-security/aml-screening) and threat monitoring at sequencer level.
* **Predicate:** real-time risk monitoring for protocols and apps, at smart contract and frontend level
* **TRM**: wallet screening and threat detection for enterprise customers using Plume.
* **Chainalysis:** wallet, transaction, and risk monitoring for EOA wallets on other chains.
* **Elliptic:** comprehensive wallet analytics for risk management, sanction, threat actors, and crimes.


# Audits and Security

Ensuring trust and transparency with rigorous, third-party audits.

Security is at the core of Plume’s commitment to providing a safe and reliable platform for real world asset tokenization. We work with trusted third-party auditors to regularly review our code, smart contracts, and integrations to identify and mitigate potential risks. By conducting thorough audits across key components of our infrastructure, we ensure that Plume’s platform maintains the highest standards of security and resilience.

***

### **Completed Audits**

Below is a list of completed audits for core components of the Plume ecosystem. Each audit includes comprehensive reviews of smart contracts, bridge integrations, and staking mechanisms to protect user assets and ensure a secure experience on the Plume platform.

1. **Plume Chain Audits**
   * *Description:* The Plume chain is built on top of Arbitrum Nitro and Arbitrum Stylus, which power Plume's EVM-compatible interface, precompiles, interactive challenge protocol, native token bridge, and more. These open-source technologies are developed and maintained by the Arbitrum team.
   * *Audit Reports*: [View all Arbitrum audits](https://docs.arbitrum.io/audit-reports)
2. **Data Availability Layer Audits**
   * *Description*: Plume uses the AnyTrust data availability protocol developed by Arbitrum, which relies on a permissioned Data Availability Committee (DAC) to store transaction data off-chain. The committee issues cryptographic proofs of data availability that are posted on the parent chain, significantly reducing costs while preserving strong availability guarantees as long as at least one committee member is honest.
   * *Audit Reports*: [View all Arbitrum audits](https://docs.arbitrum.io/audit-reports)
3. **Multi-Chain Interoperability Audits**
   * *Description*: Plume's multi-chain interoperability is powered by LayerZero, and core tokens like PLUME and WETH use LayerZero's Omnichain Fungible Token standard on Plume.
   * *Audit Report*: [View all LayerZero audits](https://github.com/LayerZero-Labs/Audits/tree/main/audits)
4. **Cross-Chain Yield Audits**
   * *Description:* Plume supports natively cross-chain assets that can generate yield on any chain with our partner [Nucleus](https://nucleusearn.io). Their cross-chain vaults power [pUSD](/plume/tokens/plume-usd), [Optimizer](/plume/plume-portal/optimizer) and multi-chain vaults on Plume's flagship RWA staking protocol [Nest](https://nest.credit).
   * *Audit Report:* [View all Nucleus audits](https://github.com/Ion-Protocol/nucleus-boring-vault/tree/master/audit)
5. **Plume Staking Audits**
   * Description: Plume Staking allows users to delegate their PLUME tokens to validators who help secure the chain. In exchange, users earn PLUME rewards. The staking contract currently supports staking, delegation, and unstaking — with claiming and restaking rewards coming soon.&#x20;
   * *OtterSec's Audit Report:* [*Link*](https://github.com/plumenetwork/contracts/blob/main/plume/audit/ottersec.pdf)
   * *Immunefi's Audit Report:* [*Link*](https://github.com/plumenetwork/contracts/blob/main/plume/audit/immunefi.pdf)

***

### **Ongoing Security Practices**

In addition to external audits, Plume follows continuous security practices to maintain a safe environment for users:

* **Continuous Monitoring**: Our team actively monitors the platform for any unusual activity, enabling rapid response to potential issues.
* **Regular Code Reviews**: We conduct regular internal code reviews, ensuring ongoing adherence to best security practices across our codebase.
* **Partnerships with Leading Auditors**: Plume partners with reputable auditing firms to perform thorough reviews of new contracts, features, and integrations before mainnet deployment.

### **Commitment to Transparency**

Plume is dedicated to transparency in all security efforts. We publicly share audit reports and keep our community informed of any security updates. Our commitment to open reporting allows users to trust Plume with confidence, knowing our systems undergo continuous review and improvement.

***

### **Questions?**

If you have questions about Plume’s security practices or would like to learn more about our audits, feel free to contact us at <support@plume.org>.


# Overview

## What is Arc?

Currently under development, Arc is a self-contained, comprehensive, full-stack tokenization engine that will be completely open-source, MIT-licensed, and free—both *gratis* and *libre*. Arc will be made available in Q1 2025 by Plume and developers will be able to run their own self-hosted versions.  While currently in active development, issuers can already [sign up for the waitlist here](https://forms.plumenetwork.xyz/arc-waitlist).

## App Store

To deal with the large diversity of different tokenized assets, the Plume Arc employs an app store model, which allows issuers to install modular applications to fit their specific tokenization needs. &#x20;

* [Asset Tokenization](/plume/arc/asset-tokenization): needed to ensure compliance with US securities laws
* [Onramps and Offramps](/plume/arc/onramps-and-offramps): needed to move USD yield onchain to distribute to token holders, and to cash out proceeds of onchain sales
* [Identity Verification](/plume/arc/identity-verification): needed to ensure compliance with Know Your Counterparty (KYC) standards
* [Compliance at Plume](/plume/plume-security/compliance-at-plume): needed to ensure compliance with Anti-Money Laundering (AML) laws
* [Primary Offering & Secondary Trading](/plume/arc/primary-offering-and-secondary-trading): needed to allow asset buyers to trade their assets on secondary markets
* [ATS (Alternative Trading Systems) Integrations](/plume/arc/ats-alternative-trading-systems-integrations): needed to allow asset buyers to trade their assets on alternative trading systems, as a subset of secondary markets

We are constantly adding in additional apps and functionality into the Arc. Please don't hesitate to reach out to <engineering@plumenetwork.xyz> if you're interested in providing your own services into our product.


# Asset Tokenization

## What is Asset Tokenization?

Asset tokenization is the process of converting legal and economic claims against the underlying asset into composable smart contracts. In every jurisdiction in the world, asset tokenization is already being done at some scale. In the U.S., tokenization falls under the Uniform Commercial Code articles 9 through 12 - these speak to any asset issuer's ability to record stakeholders using any medium, from paper, to databases, and even blockchains.&#x20;

## What Regulatory Restrictions Exist?

In the U.S., the SEC makes a clear distinction between *tokenization* and *fundraising*. While tokenization converts economic and legal rights into useful tokens, fundraising lets issuers of tokenized securities raise money.&#x20;

Offerings of securities that are made available to sophisticated (e.g. accredited, qualified, professional) investors are typically exempt from SEC registration and require that the issuer files Form D with the SEC after fundraising is done.

Every other offering falls under more regulatory requirements, and any issuer that raises from retail (e.g. public, non-accredited) must comply with disclosing significantly more information using various forms provided by the SEC.

On Plume, asset issuers that need help from FINRA-registered brokers, exchanges, and law firms will be able to utilize their services form one app. We provide this table strictly for reference and education.

<table data-full-width="false"><thead><tr><th></th><th>Reg D</th><th>Reg A+</th><th>Reg CF</th></tr></thead><tbody><tr><td><strong>Who can invest?</strong></td><td>506(b): Maximum of 35 non-accredited investors<br>506(c): Only accredited investors</td><td>Public (retail investors)</td><td>Public (retail investors)</td></tr><tr><td><strong>How much can be raised in a 12-month period?</strong></td><td>Unlimited</td><td>Tier I: $20m<br>Tier II: $75m</td><td>$5m</td></tr><tr><td><strong>What SEC Form must be filed?</strong></td><td>Form D</td><td>Tier 1: Form 1-A, Form 1-Z<br>Tier 2: Form 1-A, Form 1-SA (annual), Form 1-K (semi-annual), Form 1-U (ongoing)</td><td> Form C, Form C-AR (annual), Form C-U (halfway through raise)</td></tr><tr><td><strong>Is public solicitation allowed?</strong></td><td>506(b): No<br>506(c): Yes</td><td>Yes</td><td>Yes</td></tr><tr><td><strong>Are there resale restrictions?</strong></td><td>506(b) mandatory 6 months lockup (for reporting companies) or 1 year to sell to the public under Rule 144<br>506(c): mandatory 3 months lockup, can sell to accredited </td><td>No restrictions under Tier 2</td><td>Must be held for 1 year</td></tr><tr><td><strong>Is a broker-dealer required?</strong></td><td>No</td><td>No, but often useful for compliance</td><td>Yes, must use licensed broker-dealer or funding portal as intermediary</td></tr><tr><td><strong>Is a transfer agent required?</strong></td><td>No</td><td>Tier I: no but recommended<br>Tier II: yes, must be an SEC-licensed TA</td><td>No but recommended to manage the cap table</td></tr><tr><td><strong>Is escrow required?</strong></td><td>No</td><td>No</td><td>Yes</td></tr></tbody></table>


# Onramps and Offramps

Plume will be integrating with a variety of different onramp and offramp providers for our mainnet launch, allowing users to onboard directly to Plume from fiat rails and allowing asset issuers to safely withdraw their proceeds back into fiat. We are actively in discussions with the dozen top onramp and offramp providers in the industry, so stay tuned for our official partnership announcements leading up to ETH Denver!

## What Are Onramps and Offramps?

**Onramps**: These are services that convert fiat currencies like USD or EUR into cryptocurrencies like BTC or ETH. Onramping is one of the first steps in a user's journey after setting up their crypto wallet, as they cannot make any transactions without having some tokens to pay for their transaction to be included in the next block. On Bitcoin, users must pay transaction fees to miners to secure the chain and compensate for the electricity used, while on Ethereum and related chains like Plume, users must pay gas fees to validators to compensate for the computational and storage resources used. Without onramping some ETH onto Plume, users cannot interact with the chain at all.

**Offramps**: These are services that perform the reverse process, converting cryptocurrencies like BTC or ETH into fiat currencies like USD or EUR. Correspondingly, offramping is the last step in a user's crypto journey. Having a stable, trusted, and safe offramp provider is critical for asset issuers on Plume, especially for RWA projects that seek to raise capital onchain, so they can deploy their proceeds in a productive real-world enterprise offchain.

## Onramp and Offramp Providers

Plume is in active discussions with the top onramp and offramp providers in the industry. Some of these providers include:

* [**Kado**](https://www.kado.money/): A crypto-native onramp platform that integrates quickly across many newly launched chains. Used by dYdX, Base, and Injective.
* [**Alchemy Pay**](https://alchemypay.org/): A global onramp solution that supports 170+ countries and 300+ fiat payment channels. Used by Polygon, Arbitrum, and NEAR.
* [**Onramper**](https://onramper.com/): An onramp aggregator that routes currency conversions between 17 different onramps at no additional charge to the user. Used by Coinbase Wallet, BitMEX, and Wirex.

## Onramps and Offramps on Plume

For our mainnet launch, Plume will partner with a variety of top onramp and offramp providers. These companies will provide flexible options for users across the world to onboard directly to Plume from an assortment of diverse fiat rails, including:

* Direct bank transfer
  * ACH in the United States
  * SEPA in the European Union
  * Faster Payments in the United Kingdom
  * Interac in Canada
  * PIX in Brazil
* Wire transfer in the United States
* Credit card and debit card payments via Visa and Mastercard
* Apple Pay
* Google Pay
* Cash App

Users will be able to onramp directly to Plume, without performing multiple hops when onramping first to Ethereum and then bridging to Plume. Users that have previously completed [identity verification](/plume/arc/identity-verification) can opt-in to allow Plume servers to send their information directly to some of these providers, and would not have to go through the KYC process again when onramping. Finally, asset issuers will have access to all of our onramp and offramp providers directly in their admin dashboard.

However, most of these onramp and offramp providers cannot be integrated into the Plume testnet environment, as the tokens on our testnet have no value, so there would be no point in connecting the testnet to the existing traditional financial infrastructure, where fiat currencies do have value.

## Best Practices

* Regularly review the security protocols of your chosen onramp and offramp provider.
* Stay informed about changing fees and transaction limits for your chosen fiat rails.
* Ensure that all documents are in order for passing KYC checks when onramping or offramping.
* Keep track of regulatory changes that might affect onramping and offramping in your country.

By using onramps to directly onboard to Plume and offramps to safely offboard, users will enjoy a seamless and secure conversion between fiat and cryptocurrencies.


# Identity Verification

Identity verification is a cornerstone of the Plume ecosystem, as the first line of defence against bots, criminals, and other malicious entities. Many asset issuers have specific compliance requirements for their real-world assets, including Know Your Customer (KYC), Know Your Business (KYB), and accredited investor checks.

Plume will be integrating with a variety of different identity verification providers for our mainnet launch, allowing users to pass KYC and Sybil resistance checks, and allowing asset issuers to require these checks on users before trading certain assets. We're particularly excited about novel advances in zero-knowledge proofs (ZK), decentralized identifiers (DID), and fully homomorphic encryption (FHE), and are actively seeking out partnerships with companies building cutting-edge identity technology.

## What Are Identity Verification Requirements?

**Know Your Customer (KYC):** This is a set of practices, guidelines, and regulations that require financial services companies to verify the identity of individual users. KYC processes are critical in preventing identity theft, financial fraud, money laundering, and terrorist financing, all issues which have even higher stakes on a permissionless blockchain. Modern KYC platforms not only collect and verify personal information like name, date of birth, address, and government-issued ID, but also perform video verification, matching biometric markers on a user's government-issued ID to a live video feed. Users do not have to pass KYC checks to interact with the Plume network, but individual asset issuers, onramps, and alternative trading systems on Plume may require KYC checks for their own users.

**Know Your Business (KYB):** Similar to KYC, this is a set of practices, guidelines, and regulations that require financial services companies to verify the identity and legitimacy of businesses. Plume conducts KYB checks on businesses that wish to onboard real-world assets through the Plume admin dashboard. Users do not have to pass KYB checks to interact with the Plume network.

**Sybil Resistance:** Malicious actors can conduct Sybil attacks, where a single person or small team generates a large number of fake identities, bot accounts, or wallet addresses, then pretends to be many more people than they actually are. Plume works with identity verification providers to implement Sybil resistance mechanisms such as liveness checks and face matching. Asset issuers can use Sybil resistance checks to make sure each of their users is a real unique human, without requiring personally identifiable information (PII) like in a full KYC process.

**Accredited Investor Checks**: The United States Securities and Exchange Commission (SEC) allows asset issuers to make securities offerings that are exempt from registration in a limited set of scenarios. There are two types of offerings—public and private. Read our breakdown of primary offerings for more detail.

{% content-ref url="/pages/73Fzk8by9TfxmyVfCgLi" %}
[Primary Offering & Secondary Trading](/plume/arc/primary-offering-and-secondary-trading)
{% endcontent-ref %}

In the majority of cases that deal with **both types of offerings**, the asset issuer must check that all transactions on Plume are conducted by accredited investors. There are various ways to become an accredited investor, including having a net worth of over $1,000,000 (not including your primary residence), or having an individual income above $200,000 for both of the last two years. See [17 CFR § 230.501(a)](https://www.ecfr.gov/current/title-17/chapter-II/part-230#230.501) for the official definition under Title 17 of the *Code of Federal Regulations*.

## Identity Verification Providers

Plume is in active discussions with a diverse array of leading identity verification providers, including new startups that are experimenting at the cutting edge of cryptographic technology:

* [**Persona**](https://withpersona.com/): A popular KYC provider for fintech and consumer tech startups, with advanced fraud prevention algorithms. Used by Square, LinkedIn, and Twilio.
* [**Sumsub**](https://sumsub.com/): A fully-featured KYC provider with liveness checks, address checks, and KYC/KYB/AML features. Used by many cryptocurrency exchanges, such as Binance, ByBit, and Bitget.
* [**Parallel Markets**](https://parallelmarkets.com/): An identity verification provider for banks and funds serving high-value clients, providing KYC, KYB, and accredited investor checks. Used by Goldfinch, Allocations, and Ava Labs.
* [**Quadrata**](https://quadrata.com/): A digital passport service that mints an onchain soul-bound token for passing KYC, KYB, AML, and accredited investor checks. Used by TrueFi and the Spruce subnet on Avalanche.
* [**Gateway**](https://mygateway.xyz/): A platform that gives users sovereignty over their own data, allowing KYC providers to issue private data assets that users can carry around to verify their identity with different dapps.
* [**Ankr Verify**](https://www.ankr.com/verifying/vendor/): An identity verification solution from [Ankr](https://www.ankr.com/), a leading blockchain node provider, which integrates various KYC providers and brings their attestations onchain using zero-knowledge proofs.
* [**zkMe**](https://www.zk.me/) - Builds web3 protocols and infrastructure for compliant, self-sovereign, and private verification of user credentials.&#x20;

## Identity Verification on Plume

For our mainnet launch, Plume will partner with a large selection of identity verification providers. Most of these providers will require the same standard set of PII:

* First name
* Last name
* Date of birth
* Country of birth
* Current residential address
* Front and back image of government-issued ID
* Biometric face scans using live mobile video

Identity verification providers that offer additional services like KYB and accredited investor checks will require additional information and documents attesting to the legitimacy of the business entity and proving the user's accredited investor status.

Plume will provide an open-source service that anyone can host permissionlessly. Operators of this service can individually integrate with Plume's KYC partners, and this service will provide the following features:

* Decentralized frontend interface with a list of all supported KYC partners
* Opt-in pass-through authentication that re-uses KYC info for other providers and ancillary services
* Backend webhook endpoint that receives KYC data from our partners
* Automatic publishing to onchain attestation registries

Here is an example user story as a user goes through the full KYC flow:

* Users will be able to click on their desired KYC partner in the decentralized frontend interface,
  * Users will go through the KYC flow in the corresponding embedded widget
* Users can opt into storing their KYC data in the backend database of this service
  * These users can then send this KYC data automatically to other providers and ancillary services that support uploading of PII via API, and do not have any live mobile video face scans
  * For example, users will be able to onboard with some of our onramp providers without going through a separate, second KYC flow
* The current status of the user's KYC check will be sent by our KYC partners to a backend webhook endpoint, which can trigger automatic actions in response
* Proof of the user's KYC status can be automatically uploaded onchain in a variety of formats, including potentially confidential formats:
  * We are deploying the Ethereum Attestation Service as a custom precompile, with modifications to the underlying execution engine to reduce gas costs on contract calls to retrieve identity attestation info
  * We are developing a custom time-bound, soul-bound token format that composable DeFi apps can use to verify identity onchain
  * We are currently working with companies working on the cutting edge of ZK and FHE technology, which would allow us to attest to KYC status without revealing additional PII
  * We have implemented the [ERC-3643](https://eips.ethereum.org/EIPS/eip-3643) standard of tokens for regulated exchanges in our asset issuance process

Asset issuers that choose to tokenize their asset as an ERC-3643 token on the upcoming Plume Dashboard must pass KYB checks operated by Plume before deploying restricted real-world assets. Of course, anyone is free to deploy non-restricted tokens, like NFTs representing collectibles, in a permissionless way directly onchain.

## Best Practices

* Regularly review the security protocols of your chosen identity verification provider.
* Keep your identity safe and secure, and conduct periodic reviews for any potential PII leaks.
* Never submit your personal information to any website without verifying its authenticity.
* Use zero-knowledge proofs and other privacy-preserving technology whenever possible to encrypt your onchain data.

Undergoing KYC checks is not a prerequisite of participating in the Plume network. However, due to the compliance requirements that each asset issuer faces in their own jurisdiction, users with verified identities will have access to a much larger range and variety of onchain activities.


# Primary Offering & Secondary Trading

In this section, we explore the concept of secondary trading, differentiating it from primary offering. Understanding these concepts is crucial for participating in the full spectrum of trading opportunities available on Plume. As a global blockchain, Plume supports both permissionless tokens that fall outside of regulatory definitions of securities, as well as those that do.

## Primary vs. Secondary Offering

**Primary Offering:** Assets are created and sold to investors for the first time. The issuer of the asset is directly involved in the sale. The issuer raises funds for the first time, aiming to return that investment later. The vast majority of assets that undergo this process fall under the securities laws in the US, and globally. Security Token Offerings are a type of primary offering that remain popular in some jurisdictions.

**Secondary Offering:** Secondary offering refers to trading of assets that already exist, typically when the original holder of the asset re-sells it to someone else. The original issuer is not always directly involved in these transactions, although that depends on their jurisdiction and regulatory compliance requirements. The outcome is the same - existing asset holders trade among themselves. This type of trading is crucial for providing liquidity and price discovery for assets post-issuance.

For every type of security (tokenized or traditional), there are rules around how it’s sold to the investor. The vast majority of investments start out as “private placement”. In the US, privately placed securities that are sold to investors for the first time are called ***primary offerings***. That means the issuers themselves raise initial funds, and aim to provide returns to their investors at a later time. Secondary offerings mean assets are re-sold by their original holders to someone else.

For both primary and ***secondary offerings***, the SEC (Securities and Exchange Commission) lets asset issuers use a number of exemptions that make registration straightforward. Private offerings are described in Regulation D, rules 506(b) and (c). Public offerings are more nuanced, where asset issuers are required to adhere to ever stricter reporting requirements and disclosures. Let's examine their key characteristics.

| Regulation                                                                                | Description                                                                                                                   | Key Features                                                                                                                                                  |
| ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [**Reg D 506(b)**](https://www.sec.gov/education/smallbusiness/exemptofferings/rule506b)  | Private offerings for unlimited funds from accredited investors, plus up to 35 non-accredited investors with disclosures.     | <p>- Unlimited funds from accredited investors<br>- Up to 35 non-accredited investors with disclosures<br>- No public advertising</p>                         |
| [**Reg D 506(c)**](https://www.sec.gov/education/smallbusiness/exemptofferings/rule506b)  | Private offerings for unlimited funds exclusively from accredited investors, with public advertising allowed.                 | <p>- Unlimited funds from accredited investors<br>- Public advertising permitted<br>- Exclusively for accredited investors</p>                                |
| [**Reg A**](https://www.sec.gov/education/smallbusiness/exemptofferings/rega)             | Public offerings exempt from traditional registration, with two tiers for simplified SEC compliance.                          | <p>- Tier 1: Raise up to $20M in 12 months<br>- Tier 2: Raise up to $75M in 12 months<br>- Requires filing with the SEC, but offers a streamlined process</p> |
| [**Reg CF**](https://www.sec.gov/education/smallbusiness/exemptofferings/regcrowdfunding) | Crowdfunding for small projects, enabling public fundraising up to a specified limit under a simplified regulatory framework. | <p>- Open to a wide investor audience<br>- Suitable for small-scale projects<br>- Cap of $5M in a 12-month period</p>                                         |
| [**Reg S**](https://www.ecfr.gov/current/title-17/chapter-II/part-210)                    | Offers and sales outside the U.S., for non-U.S. residents, exempt from SEC registration for domestic offerings.               | <p>- No fundraising limit<br>- For non-U.S. residents only<br>- Not subject to SEC registration for domestic offerings</p>                                    |

Without handing primary offerings directly, Plume Network has agreements in place with FINRA registered brokers in the United States. Globally, we're working with market leading fund administrators and issuing banks.<br>


# ATS (Alternative Trading Systems) Integrations

This section explores the role Alternative Trading Systems play on Plume Network, and how they enable compliant trading of tokenized securities.&#x20;

## Alternative Trading Systems (ATS)

ATSs are regulatory-compliant and FINRA registered trading venues for tokenized securities. They match buyers in both primary offerings and secondary market trading. In the US, they are a required partner for institutional asset issuers. Unlike traditional exchanges, ATSs do not have the same regulatory burdens, making them more flexible and accessible for various types of securities trading.

## Two Types of Settlement Process

FINRA registered broker-dealers can apply for an ATS license. Those who elect to use the non-custodial approach (meaning they don't take possession customer assets) are allowed to let qualified customers use their APIs for trading. They typically use one of these settlement types.

**Four-Step Process:**

1. **Order Submission:** The buyer and seller send their orders to the ATS.
2. **Order Matching:** The ATS matches these orders.
3. **Trade Notification:** The ATS notifies both parties of the match.
4. **Settlement:** Parties settle the transaction directly or through their custodians.

**Three-Step Process:**

1. **Order and Settlement Preparation:** Buyers and sellers submit orders to the ATS and simultaneously instruct their custodians to be ready to settle matched trades.
2. **Order Matching:** The ATS matches the orders.
3. **Notification and Settlement Execution:** The ATS informs all parties and their custodians of the match, triggering custodians to execute the trade based on prior instructions.

Both of these settlement schemes benefit from using the blockchain.

## ATS Providers on Plume

Several registered Alternative Trading Systems have signed agreements and are aiming to support institutional asset issuers and investors on Plume Network.

* **Texture Capital**: A non-custodial broker dealer with an API-first Alternative Trading System. Supports primary offerings and secondary market trading in the US.
* **tZERO:** A leader in blockchain innovation for capital markets, tZERO offers an ATS  for private companies and other issuers to trade their digital securities.
* **Openfinance:** Provides trading and settlement services for tokenized securities. Offers a compliant platform for secondary market trading, increasing liquidity and accessibility for alternative assets.
* **Archax:** EU regulated trading venue designed for institutional investors. Provides a regulated, secure, and efficient environment for digital securities.

## Integrating with ATS Providers

1. **Selecting an ATS Provider:** Choose a provider based on your specific needs, considering factors like asset types, trading volume, and regulatory compliance.
2. **Integration Process:** Work with the ATS provider to integrate their trading system into your Plume Network operations. This often involves API integration for seamless trading experience.
3. **Compliance and Legal Considerations:** Ensure that the ATS provider adheres to all relevant securities regulations and legal requirements.
4. **Educate Your Users:** Provide resources and information to help users understand the workings of secondary trading and the role of ATS in the ecosystem.

By understanding and utilizing ATS for secondary trading, participants on the Plume Network can engage in a broader range of trading activities, benefiting from increased liquidity and market accessibility.


# Overview

## Integrate Any Real-World Data Seamlessly

Bringing real-world data onto the blockchain has long been a challenge, with persistent issues around latency, update frequency, and data availability. Plume Nexus addresses this by delivering an onchain data highway designed for efficient, real-time data integration.

### Plume Nexus: The Real-World Data Highway

Launched in collaboration with leading Oracle partners — [SEDA](https://www.seda.xyz/), [Stork](https://www.stork.network/), [Supra](https://supra.com/), [Chronicle](https://chroniclelabs.org/), [TRUF.Network](https://truf.network/), [RedStone](https://www.redstone.finance/), [Oraichain](https://orai.io/), [OpenLayer](https://www.openlayer.xyz/), and [eOracle](https://docs.eo.app/docs/eprice/feed-addresses/plume) — Plume Nexus represents a cornerstone of Plume's vision to bridge the gap between real-world data and decentralized ecosystems. Unlike traditional RWA projects focused solely on asset tokenization, Plume’s data highway, Nexus, enables the seamless ingestion of diverse data types, from weather patterns to economic indicators and social trends, directly into the blockchain.

### A Comprehensive Data Integration Framework

At its core, Plume Nexus offers a fully integrated framework, including developer toolkits, client libraries, containerized daemons, and specialized smart contracts. This infrastructure streamlines the process of uploading and consuming real-time data feeds, making Plume the optimal environment for projects that require up-to-date and reliable real-world data onchain.

### Data-Priority Transaction Mechanism

A defining feature of the Nexus data highway is its custom transaction type, engineered specifically for high-priority data updates. Plume reserves a portion of block space for these transactions, guaranteeing their timely processing by the sequencer even during peak network congestion. When data update activity is low, the sequencer reallocates this reserved block space, optimizing throughput for other network transactions. This structure ensures data is always prioritized without compromising network efficiency.

### Oracle Partners Powering the Nexus

Our Oracle partners—SEDA, Stork, Supra, Chronicle, TRUF.Network, RedStone, Oraichain, OpenLayer, and eOracle — play a critical role in the reliable delivery and verification of real-world data onchain. These partnerships enhance Plume’s ability to provide dependable, diversified data sources, ensuring that any onchain applications leveraging Nexus have access to accurate and resilient data streams.

​​For teams interested in integrating Plume Nexus to enhance real-world data access for their projects, we encourage you to reach out through the existing [contact form](https://forms.plumenetwork.xyz/lets-chat).

<br>


# Background

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdYUio87yJE2SKSaYD4SoUip3xGZgFvXf_9Jm31h6ynJG12LJi5oozf3JYk16NYLTWgxgx5etFXlGJECbbLitZ7IQ3BVWD8CU4Kew2nYP9rO8imKtB4QaBhn6ohMdqBKmHKOSI5i8uvMCm1o1d9TxG3IMe-?key=E_F2sf1KvY0OCuBE1ZcEzg" alt=""><figcaption></figcaption></figure>

The Plume Data Highway is a cornerstone of Plume's expansive vision for RWAs. Unlike traditional RWA projects that focus solely on tokenizing physical assets, Plume's Data Highway facilitates the integration of real-world data, including weather, economic indicators, and social trends, into the onchain ecosystem.

At its core, the Plume Data Highway is a fully integrated system comprising developer toolkits, client libraries, containerized daemons, and smart contracts. This comprehensive infrastructure allows for efficient uploading and consumption of real-time data feeds, making Plume the optimal chain for handling real-world data.

A key property of the Data Highway is its custom transaction type, specifically designed for pure data updates. Plume reserves a percentage of block space for these transactions, ensuring they are prioritized even during high network congestion. This design guarantees timely processing of data updates by the sequencer, regardless of mempool traffic. Conversely, during periods of low data update activity, the sequencer efficiently utilizes the full block space.

### **Integration with TLSNotary**

<figure><img src="/files/Oje0yGIh5z8eVkzpNqCq" alt=""><figcaption></figcaption></figure>

A crucial component of Plume's Data Highway is the integration of TLSNotary, a protocol that enables secure and verifiable data export from any website. TLSNotary leverages ZK to allow users to selectively share data with others in a cryptographically verifiable manner, making data truly portable and enhancing its utility within the Plume ecosystem.

The TLSNotary protocol operates in three key steps:

1. **Request**: The 'Prover' (data requester) obtains data from a 'Server' over TLS while engaging in secure and privacy-preserving multi-party computation (MPC) with the 'Verifier' (data recipient).
2. **Selective Disclosure**: The Prover selectively shares the acquired data with the Verifier, maintaining control over what information is revealed.
3. **Verification**: The Verifier authenticates the shared data, ensuring its integrity and origin.

By incorporating TLSNotary, Plume's Data Highway can ensure the authenticity and integrity of real-world data brought onchain. This enables the creation of trusted data feeds and indices based on information from reputable sources, which can then be used in various applications within the Plume network. For instance, economic indicators, market data, or other real-world information can be securely imported and utilized in decentralized finance applications, prediction markets, or other innovative use cases that bridge the gap between offchain data and onchain functionality.

**3.3.2 Integrated Smart Contract Deployment Platform**

Plume's Data Highway includes an integrated data contract deployment platform for bringing real-world data onchain. This system uses the OracleFactory contract, which allows users to create "data contracts" that serve as bridges between offchain data sources and onchain applications. Users can verify that these contracts correspond to the data uploads of specific data providers using TLSNotary verification as described above.

Data providers construct indexes and upload them to the Plume chain via upload daemons. These daemons are designed to automatically upload both the value of their index and the verified hash from TLSNotary. This dual upload approach aims to ensure both the data's accuracy and its verifiable authenticity.

Once the data is deployed onchain, applications can interact with it by staking with the verified data contracts. This staking mechanism serves as a security measure against potential manipulation. The integrated data contract deployment platform offers several features:

1. **Data Processing**: By processing data updates as a native transaction type, the system can handle data updates efficiently
2. **Cost Structure**: The system eliminates the need for cross-chain operations or external oracle fees, which may affect costs for both data providers and consumers.
3. **Customizability**: The permissionless nature of the OracleFactory allows for integration of various data types and sources
4. **Data Reliability**: The staking mechanisms are designed to support the accuracy and timeliness of data

The Plume Data Highway expands the scope of onchain trading beyond traditional assets. While current exchanges primarily focus on cryptocurrencies and assets with globally defined prices (such as equities, commodities, and forex), the Data Highway enables the creation of a novel applications such as perpetual DEXs based on a wide range of real-world data. This includes metrics like crime rates in specific cities, election outcome probabilities, or cultural indices of countries. The system supports both time series and binary data, facilitating the development of diverse applications such as DEXs, prediction markets, and sports betting platforms.

Furthermore, the Plume Data Highway aims to create a more dynamic and responsive ecosystem for RWA management and utilization. By enabling data providers to upload price information for various assets, the system allows for real-time, onchain valuation of RWAs. This capability can be integrated with Plume's staking and lending protocols, potentially allowing these assets to be used as collateral and managed based on their current market value. This integration of real-world asset values with onchain representations.

<br>


# Overview

## Plume Passport: Smart Wallets with Abstracted Custody and Compliance, Built for Composability

## What is Plume Passport?&#x20;

Most RWA holdings today are stagnant; they can’t be staked, collateralized, or integrated into DeFi, making true composability a challenge. Plume Passport's Smart Wallet changes that by embedding custody and compliance directly within the wallet, abstracting these functions to streamline user experience.

Plume Passport's Smart Wallets are fully audited by [Trail of Bits](https://github.com/trailofbits/publications/blob/master/reviews/2024-11-plume-securityreview.pdf).

## Why It’s Needed: Unlocking RWA Utility

RWAs are inherently different from traditional crypto assets. They produce exogenous yield—income originating outside blockchain demand, like interest from real estate or solar assets—requiring an entirely different infrastructure for custody, yield distribution, and compliance. Passport's Smart Wallet abstracts these complexities, allowing users to integrate RWAs across DeFi applications effortlessly. This means RWAs can be combined, staked, and used in DeFi just like native crypto assets, all while maintaining essential security and compliance standards under the hood.

## How It Works: Embedded Compliance and Composability

Unlike traditional account abstraction models that rely on third-party providers, Passport's Smart Wallet incorporates custom code directly into each user’s wallet (EOA) using a modified go-ethereum (geth) client. This innovation enables features like gasless transactions, automated operations, and batch processing. Instead of depending on external smart contracts, users gain full control over wallet extensions—enabling seamless interaction with dApps and DeFi protocols without compromising on security or flexibility.

This built-in flexibility and self-custody unlock limitless possibilities for RWAfi, from customized custodial functions to advanced, automated workflows within DeFi. Currently undergoing audit by Trail of Bits, the Smart Wallet represents a secure and revolutionary shift for RWA composability, bringing RWAs into the decentralized finance ecosystem with the same utility as any on-chain asset.

## Partner With Us

Passport’s Smart Wallet makes RWA custody and compliance effortless, composable, and fully on-chain. [Reach out to learn more](https://forms.plumenetwork.xyz/lets-chat) about integrating this game-changing technology and unlocking the full potential of real-world asset finance.


# Background

In order to support these new RWAfi use cases, we explored various concepts that were specifically tied to the notion of yield as a first-class citizen, using custom precompiles on top of our existing stack to add explicit functionality that would support various ways that users could interact with yield. These initial explorations were useful for creating a proof-of-concept that allowed yield to be freely combined, divided, etc. between users and smart contracts but we soon realized that the same concepts we were building that specifically allowed users to interact with yield could be extended to allow users to interact with any real-world concept, however they want.

Therefore, we came up with the revolutionary technical innovation of making custom modifications to go-ethereum ("geth") that support native account abstraction using the concept of "smart wallets". Unlike existing account abstraction solutions, which give users a separate "smart account" with code controlled by third-party AA wallet providers, Plume is the only chain with smart wallets that store custom code directly in the existing storage of each EOA. Users have full control over what code they want to store and any custom extensions they want to install to support new features. This includes all functionality covered by existing account abstraction frameworks, such as gasless transactions, batched transactions, and automated transactions, but baked directly into the chain rather than added on as an afterthought like the ERC-4337 implementation.

If you look at a diagram of the current state of account abstraction, there are a small number of centralized providers like Biconomy and Etherspot that dominate the market. This is because ERC-4337 was designed to be implemented on top of Ethereum without needing any changes that would require a hard fork, so there has to be a new area to aggregate pending UserOperations (the "alt mempool") where all the infrastructure with proposer-builder separation and MEV must be redeployed but to a smaller subset of transactions given the limited adoption of account abstraction enabled wallets.

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfx4AqwtH2WMMOGMgfsIb9_wBe5T4V7I9Aj4mea0boMtMCYiBZTq3PSF9h8PFwQFmDsfoYyym9I4HDnlc0AuYt80Jtaq8S544hxV9IMbZgBMlY-N8otHjFtPVehtFBUB3uNZrniMI91ZmJmKzOHxSoaMlp1?key=E_F2sf1KvY0OCuBE1ZcEzg" alt=""><figcaption></figcaption></figure>

This is a clunky and over-complicated system that is not necessary in a new chain where account abstraction can be implemented directly in the execution client from genesis. Rather than using the storage of smart contracts that have no relationship to the EOA that relies on them for their account abstraction functionality, we use the storage of the EOA directly so that you can upgrade your smart wallet with any extensions you like, then wrap your EOA address in the appropriate interface to call the corresponding code. This avoids the need for an alt mempool entirely as we can completely rely on the existing execution client to execute the smart wallet instructions deterministically, and the resulting transactions are sent sequentially to the Plume sequencer. We chose to make these custom modifications on go-ethereum ("geth"), the most popular Ethereum client, with over 45% market share on Ethereum mainnet. All of the code is currently being audited by [Trail of Bits](https://docs.arbitrum.io/audit-reports), the main auditor for the core Arbitrum codebase.

Imagine that you are the user that owns the smart wallet in the diagram below—your EOA's wallet address is 0x01, and your smart wallet's address is also 0x01. The technical details for the flow of control is:

1. Any EOA ("initiator") can initiate a transaction to the smart wallet (0x01)
   1. Either directly;
   2. Or by calling a contract, which then calls the smart wallet; the actual contents of the transaction could come from another smart wallet too
2. Plume's custom implementation of geth detects that this is a call to a smart wallet, so it loads and executes the code in the hardcoded address (0xFE) of the immutable WalletProxy contract
   1. We decided not to build in functionality to access the storage of the WalletProxy contract as it introduces additional surface area for attack vectors, which means we can only read the code from WalletProxy and not its storage
3. The WalletProxy contract is a proxy that stores a single public immutable constant, which is the hardcoded address (0xFF) of the WalletFactory contract
   1. The address of the WalletFactory must be immutable so that we can read it directly from the deployed bytecode as we cannot read from the WalletProxy storage
   2. The WalletProxy code is executed with a delegatecall to WalletFactory
4. The WalletFactory contract is a proxy that stores the implementation of the PlumeWallet framework in its storage (0xFF)
   1. The WalletFactory code is executed with a delegatecall to PlumeWallet
5. The PlumeWallet contract is a proxy that stores the custom implementation of the smart wallet in the user's storage (0x01)
   1. The PlumeWallet code is executed with a delegatecall to the user's implementation of their own smart wallet
6. The user (0x01) can upgrade their smart wallet implementation with custom extensions whenever they want
7. The Plume Foundation multisig (0xE1..97) can upgrade the PlumeWallet implementation following a formal governance vote

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfkltRUMMcttA3TaF3CBTM9PjGiXUqdAkRR_Y9U5nuFxHKmMKLCNb-fSMVEJhW2B9mPmvDTg_VUCBIbmSfiWxYlJNQxXvkzWYRJcgIG1crV3gtkXus7Jz8K1gHPkvDJqYsgUXOIwhKQcZ1l16KqgYioJfeV?key=E_F2sf1KvY0OCuBE1ZcEzg" alt=""><figcaption></figcaption></figure>

As an example of how this genericized framework applies to more than just the concept of yield, we demonstrate a vastly simpler flow for the archetypal use case for account abstraction—sponsored or "gasless" transactions. One of the first custom extensions that we have built and will be available day one on mainnet is the ability for EOAs to sign EIP-712 compatible typed data which can then be sent to a paymaster for execution:

1. The user (0x01) constructs a bundle of typed data, formatted and signed according to EIP-712 compatible specs, and packaged into a list of SignedOperations
   1. This custom extension gives users the ability to bundle multiple transactions together, each represented by a single SignedOperation
   2. Each SignedOperation in Plume corresponds to a UserOperation in ERC-4337
2. The user sends these signed operations to a paymaster (0x0B), e.g. through an offchain API call
3. The paymaster calls executeSignedOperations on the smart wallet (0x01) and pays for the gas
   1. The user has their SignedOperations execute without doing any onchain transactions and without paying for any gas

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfXtPN2rd5DP9Osvgmf_dLZSiObh_BumJUevQ6587NtOi1_vjirZv6PKF7WrkwFxxQTHeg5wnNn4nSlu2pjDtBZ0e0CzyZ3ofUU5Zq75oabljxDKkeuzcU41vfMYbX_-5T8dCK--s4wtNah8aPMuUWGJCRR?key=E_F2sf1KvY0OCuBE1ZcEzg" alt=""><figcaption></figcaption></figure>

Because the user (0x01) has full control over the code in their own smart wallet, they can define any set of custom hooks to execute before or after each SignedOperation, unlike traditional account abstraction approaches where the logic is handled by the AA wallet and not by the user themselves. The flexibility of allowing anyone to add any code into their smart wallets gives developers limitless potential to develop entirely new categories of applications like self-sovereign smart custody solutions, individualized automated trading strategies using onchain algorithms and oracles, chained smart wallet function calls, and more—all only possible due to Plume's custom modifications of geth.

<br>


# Network Information

## Plume Mainnet

{% tabs %}
{% tab title="Network Details" %}

<table data-header-hidden data-full-width="true"><thead><tr><th width="259.07421875">Name</th><th>Details</th></tr></thead><tbody><tr><td>Network Name</td><td>Plume </td></tr><tr><td>Chain ID</td><td>98866</td></tr><tr><td>Token Symbol</td><td>PLUME</td></tr><tr><td>Settlement Layer</td><td>Ethereum (Chain ID: 1)</td></tr><tr><td>Latest Supported EVM Version</td><td>Fusaka</td></tr><tr><td>HTTP RPC URL</td><td>https://rpc.plume.org</td></tr><tr><td>WebSocket RPC URL</td><td>wss://rpc.plume.org</td></tr><tr><td>Block Explorer URL</td><td><a href="https://explorer.plume.org/">https://explorer.plume.org</a></td></tr><tr><td>Contract Verifier URL</td><td>https://explorer.plume.org/api/</td></tr></tbody></table>
{% endtab %}

{% tab title="Chain Details" %}

<table data-header-hidden data-full-width="true"><thead><tr><th width="154.5234375">Name</th><th>Details</th></tr></thead><tbody><tr><td>Chain Info</td><td><a href="https://assets.plume.org/mainnet/chainInfo.json">https://assets.plume.org/mainnet/chainInfo.json</a></td></tr><tr><td>Core Info</td><td><a href="https://assets.plume.org/mainnet/core.json">https://assets.plume.org/mainnet/core.json</a></td></tr></tbody></table>
{% endtab %}
{% endtabs %}

## Plume Testnet

{% tabs %}
{% tab title="Network Details" %}

<table data-header-hidden data-full-width="true"><thead><tr><th width="258.7890625">Name</th><th>Details</th></tr></thead><tbody><tr><td>Network Name</td><td>Plume Testnet</td></tr><tr><td>Chain ID</td><td>98867</td></tr><tr><td>Token Symbol</td><td>PLUME</td></tr><tr><td>Settlement Layer</td><td>Ethereum Sepolia (Chain ID: 11155111)</td></tr><tr><td>Latest Supported EVM Version</td><td>Fusaka</td></tr><tr><td>HTTP RPC URL</td><td>https://testnet-rpc.plume.org</td></tr><tr><td>WebSocket RPC URL</td><td>wss://testnet-rpc.plume.org</td></tr><tr><td>Block Explorer URL</td><td><a href="https://testnet-explorer.plume.org">https://testnet-explorer.plume.org</a></td></tr><tr><td>Contract Verifier URL</td><td>https://testnet-explorer.plume.org/api/</td></tr></tbody></table>
{% endtab %}

{% tab title="Chain Details" %}

<table data-header-hidden data-full-width="true"><thead><tr><th width="147.06640625">Name</th><th>Details</th></tr></thead><tbody><tr><td>Chain Info</td><td><a href="https://assets.plume.org/testnet/chainInfo.json">https://assets.plume.org/testnet/chainInfo.json</a></td></tr><tr><td>Core Info</td><td><a href="https://assets.plume.org/testnet/core.json">https://assets.plume.org/testnet/core.json</a></td></tr></tbody></table>
{% endtab %}
{% endtabs %}

## Useful Tools

### Plume Testnet Faucet

Drip tokens to engage with the Plume ecosystem on testnet using this faucet

{% embed url="<https://faucet.plume.org>" %}


# Contract Addresses

## Plume Mainnet

{% tabs %}
{% tab title="Official Tokens" %}

<table data-full-width="true"><thead><tr><th width="242.796875">Token Name</th><th>Deployed Contract Address</th></tr></thead><tbody><tr><td>PLUME</td><td><a href="https://explorer.plume.org/address/0x0000000000000000000000000000000000000000">0x0000000000000000000000000000000000000000</a></td></tr><tr><td>Wrapped PLUME (WPLUME)</td><td><a href="https://explorer.plume.org/token/0xEa237441c92CAe6FC17Caaf9a7acB3f953be4bd1">0xEa237441c92CAe6FC17Caaf9a7acB3f953be4bd1</a></td></tr><tr><td>Plume USD (pUSD)</td><td><a href="https://explorer.plume.org/token/0xdddD73F5Df1F0DC31373357beAC77545dC5A6f3F">0xdddD73F5Df1F0DC31373357beAC77545dC5A6f3F</a></td></tr><tr><td>Plume ETH (pETH)</td><td><a href="https://explorer.plume.org/token/0x39d1F90eF89C52dDA276194E9a832b484ee45574">0x39d1F90eF89C52dDA276194E9a832b484ee45574</a></td></tr><tr><td>USD Coin (USDC)</td><td><a href="https://explorer.plume.org/token/0x222365EF19F7947e5484218551B56bb3965Aa7aF">0x222365EF19F7947e5484218551B56bb3965Aa7aF</a></td></tr><tr><td>Bridged USDC (USDC.e)</td><td><a href="https://explorer.plume.org/address/0x78adD880A697070c1e765Ac44D65323a0DcCE913">0x78adD880A697070c1e765Ac44D65323a0DcCE913</a></td></tr></tbody></table>

{% hint style="info" %}
Access other tokens on [Plume Token List](https://assets.plume.org/plume.tokenlist.json)
{% endhint %}
{% endtab %}

{% tab title="Common Utils" %}

<table data-full-width="true"><thead><tr><th width="211.5999755859375">Contract Name</th><th>Deployed Contract Address</th></tr></thead><tbody><tr><td><a href="https://createx.rocks/">CreateX</a></td><td><a href="https://explorer.plume.org/address/0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed">0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed</a></td></tr><tr><td><a href="https://github.com/Arachnid/deterministic-deployment-proxy">Nick’s Deployment Proxy (Foundry CREATE2)</a></td><td><a href="https://explorer.plume.org/address/0x4e59b44847b379578588920cA78FbF26c0B4956C">0x4e59b44847b379578588920cA78FbF26c0B4956C</a></td></tr><tr><td><a href="https://github.com/mds1/multicall/blob/main/src/Multicall3.sol">Multicall3</a></td><td><a href="https://explorer.plume.org/address/0xcA11bde05977b3631167028862bE2a173976CA11">0xcA11bde05977b3631167028862bE2a173976CA11</a></td></tr><tr><td><a href="https://github.com/delegatexyz/delegate-registry">Delegate Registry</a></td><td><a href="https://explorer.plume.org/address/0x00000000000000447e69651d841bD8D104Bed493">0x00000000000000447e69651d841bD8D104Bed493</a></td></tr></tbody></table>
{% endtab %}

{% tab title="L1 Contracts" %}

<table data-full-width="true"><thead><tr><th width="211.5999755859375">Contract Name</th><th>Deployed Contract Address</th></tr></thead><tbody><tr><td>Rollup Proxy</td><td><a href="https://etherscan.io/address/0x4eD3F488a5a4417839BbC39712EB76D8Aaee6eE8">0x4eD3F488a5a4417839BbC39712EB76D8Aaee6eE8</a></td></tr><tr><td>Inbox</td><td><a href="https://etherscan.io/address/0x943fc691242291B74B105e8D19bd9E5DC2fcBa1D">0x943fc691242291B74B105e8D19bd9E5DC2fcBa1D</a></td></tr><tr><td>Outbox</td><td><a href="https://etherscan.io/address/0x7e4627bC114Fcd12ba912103279FD2858E644E71">0x7e4627bC114Fcd12ba912103279FD2858E644E71</a></td></tr><tr><td>Proxy Admin</td><td><a href="https://etherscan.io/address/0xb90fe445014e74eA5aA7681291212bfEa37031CC">0xb90fe445014e74eA5aA7681291212bfEa37031CC</a></td></tr><tr><td>Sequencer Inbox</td><td><a href="https://etherscan.io/address/0x85eC1b9138a8b9659A51e2b51bb0861901040b59">0x85eC1b9138a8b9659A51e2b51bb0861901040b59</a></td></tr><tr><td>Bridge</td><td><a href="https://etherscan.io/address/0x35381f63091926750F43b2A7401B083263aDEF83">0x35381f63091926750F43b2A7401B083263aDEF83</a></td></tr><tr><td>ValidatorWalletCreator</td><td><a href="https://etherscan.io/address/0x0A5eC2286bB15893d5b8f320aAbc823B2186BA09">0x0A5eC2286bB15893d5b8f320aAbc823B2186BA09</a></td></tr></tbody></table>

{% hint style="info" %}
Refer <https://assets.plume.org/mainnet/core.json> for more info
{% endhint %}
{% endtab %}
{% endtabs %}

## Plume Testnet

{% tabs %}
{% tab title="Official Tokens" %}

<table data-full-width="true"><thead><tr><th width="231.0843505859375">Token Name</th><th>Deployed Contract Address</th></tr></thead><tbody><tr><td>PLUME</td><td><a href="https://testnet-explorer.plume.org/address/0x0000000000000000000000000000000000000000">0x0000000000000000000000000000000000000000</a></td></tr><tr><td>Wrapped Plume (WPLUME)</td><td><a href="https://testnet-explorer.plume.org/token/0xC1FD14775c8665B31c7154074f537338774351EB">0xC1FD14775c8665B31c7154074f537338774351EB</a></td></tr><tr><td>Plume USD (pUSD)</td><td><a href="https://testnet-explorer.plume.org/token/0x1E0E030AbCb4f07de629DCCEa458a271e0E82624">0x1E0E030AbCb4f07de629DCCEa458a271e0E82624</a></td></tr><tr><td>USD Coin (USDC)</td><td><a href="https://testnet-explorer.plume.org/token/0xcB5f30e335672893c7eb944B374c196392C19D18">0xcB5f30e335672893c7eb944B374c196392C19D18</a></td></tr></tbody></table>
{% endtab %}

{% tab title="Common Utils" %}

<table data-full-width="true"><thead><tr><th width="213.6859130859375">Contract Name</th><th>Deployed Contract Address</th></tr></thead><tbody><tr><td><a href="https://createx.rocks/">CreateX</a></td><td><a href="https://testnet-explorer.plume.org/address/0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed">0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed</a></td></tr><tr><td><a href="https://github.com/Arachnid/deterministic-deployment-proxy">Nick’s Deployment Proxy (Foundry CREATE2)</a></td><td><a href="https://testnet-explorer.plume.org/address/0x4e59b44847b379578588920cA78FbF26c0B4956C">0x4e59b44847b379578588920cA78FbF26c0B4956C</a></td></tr><tr><td><a href="https://github.com/mds1/multicall/blob/main/src/Multicall3.sol">Multicall3</a></td><td><a href="https://testnet-explorer.plume.org/address/0x59218e2df2A2E7Ba0de00c023e80906Ba47cB4C8">0x59218e2df2A2E7Ba0de00c023e80906Ba47cB4C8</a></td></tr><tr><td><a href="https://github.com/delegatexyz/delegate-registry">Delegate Registry</a></td><td><a href="https://testnet-explorer.plume.org/address/0x00000000000000447e69651d841bD8D104Bed493">0x00000000000000447e69651d841bD8D104Bed493</a></td></tr></tbody></table>
{% endtab %}

{% tab title="L1 Contracts" %}

<table data-full-width="true"><thead><tr><th width="211.5999755859375">Contract Name</th><th>Deployed Contract Address</th></tr></thead><tbody><tr><td>Rollup Proxy</td><td><a href="https://sepolia.etherscan.io/address/0x3B37BeD1c38c6283A56E60340FE813C0BBA031C3">0x3B37BeD1c38c6283A56E60340FE813C0BBA031C3</a></td></tr><tr><td>Inbox</td><td><a href="https://sepolia.etherscan.io/address/0xb48cdff890199f5De31514024B95F8664F8Af222">0xb48cdff890199f5De31514024B95F8664F8Af222</a></td></tr><tr><td>Outbox</td><td><a href="https://sepolia.etherscan.io/address/0x3F6e2Ee3406b18b7F5ce3D0447d3aD8fbc807744">0x3F6e2Ee3406b18b7F5ce3D0447d3aD8fbc807744</a></td></tr><tr><td>Proxy Admin</td><td><a href="https://sepolia.etherscan.io/address/0xcc97f8f566D1ACA1d5BeDcfCBAAE545dB5F022cA">0xcc97f8f566D1ACA1d5BeDcfCBAAE545dB5F022cA</a></td></tr><tr><td>Sequencer Inbox</td><td><a href="https://sepolia.etherscan.io/address/0xbCa991f1831bE1F1E7e5576d5F84A645e70F3E4d">0xbCa991f1831bE1F1E7e5576d5F84A645e70F3E4d</a></td></tr><tr><td>Bridge</td><td><a href="https://sepolia.etherscan.io/address/0xC55b89c17d7a35877FA4ea818fea2a70d5765f1c">0xC55b89c17d7a35877FA4ea818fea2a70d5765f1c</a></td></tr><tr><td>ValidatorWalletCreator</td><td><a href="https://sepolia.etherscan.io/address/0x684A827456373a0C0379B1C82BA31Ee5E4F88F62">0x684A827456373a0C0379B1C82BA31Ee5E4F88F62</a></td></tr></tbody></table>

{% hint style="info" %}
Refer <https://assets.plume.org/testnet/core.json> for more info
{% endhint %}
{% endtab %}
{% endtabs %}


# How-to Guides

{% content-ref url="/pages/mtwChire1i4wa89BQijO" %}
[How to Connect to Network](/plume/developers/how-to-guides/how-to-connect-to-network)
{% endcontent-ref %}

{% content-ref url="/pages/uNhNFfwfQDuuw8Bvah3s" %}
[How to Deploy Smart Contracts](/plume/developers/how-to-guides/how-to-deploy-smart-contracts)
{% endcontent-ref %}

{% content-ref url="/pages/tnsEl9QOTzlwOZStIbAR" %}
[How to Verify Smart Contracts](/plume/developers/how-to-guides/how-to-verify-smart-contracts)
{% endcontent-ref %}

{% content-ref url="/pages/6BPAmQkLGQcFABHJKjWF" %}
[How to Run a Node](/plume/developers/how-to-guides/how-to-run-a-node)
{% endcontent-ref %}


# How to Connect to Network

{% hint style="warning" %}
To interact with Plume Testnet, you'll need a wallet and test tokens.
{% endhint %}

{% content-ref url="/pages/6YTYhg7qXzjfLIdlNYnN" %}
[Install and Configure Wallet](/plume/developers/how-to-guides/how-to-connect-to-network/install-and-configure-wallet)
{% endcontent-ref %}

{% content-ref url="/pages/53gUOEiTF8d1HOCH09Ti" %}
[Claim test tokens](/plume/developers/how-to-guides/how-to-connect-to-network/claim-test-tokens)
{% endcontent-ref %}


# Install and Configure Wallet

## Install a Wallet

You need to install a wallet in order to interact with the Plume Mainnet and Plume Testnet. **Plume supports all EVM-compatible wallets, including:**

* [MetaMask](https://metamask.io/)
* [Trust Wallet](https://trustwallet.com/)
* [Bitget Wallet](https://web3.bitget.com/)
* [OKX Wallet](https://www.okx.com/web3)
* [Coinbase Wallet](https://www.coinbase.com/wallet)
* [FoxWallet](https://foxwallet.com/)
* [Binance Web3 Wallet](https://www.binance.com/en/web3wallet)
* [Reown](https://reown.com/)
* [Rainbow](https://rainbow.me/)
* [Phantom](https://phantom.app/)

## Configure Wallet

Each wallet has its own process for adding Plume as a supported network. For example, below are the steps for **MetaMask**:

{% stepper %}
{% step %}
Open the MetaMask extension in **"Expand View"** mode

<figure><img src="/files/g4lUbvwzvAgg5GUexsgo" alt="" width="335"><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Click the network selection button in the top left of the expanded view/extension

<figure><img src="/files/7fzbnM02hPFjerQ7Pcka" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Select **"Add a Custom Network"**

<figure><img src="/files/FlV89Z3vSVyABMBJsGyZ" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Fill in the details from below for Plume Mainnet and Testnet, and press **"Save"**

{% tabs %}
{% tab title="Plume Mainnet" %}

<table data-header-hidden><thead><tr><th width="311"></th><th></th></tr></thead><tbody><tr><td>Network Name</td><td>Plume Mainnet</td></tr><tr><td>RPC URL</td><td><a href="http://rpc.plume.org/">http://rpc.plume.org</a></td></tr><tr><td>Chain ID</td><td>98866</td></tr><tr><td>Currency Symbol</td><td>PLUME</td></tr><tr><td>Block Explorer URL</td><td><a href="https://explorer.plume.org/">https://explorer.plume.org</a></td></tr></tbody></table>
{% endtab %}

{% tab title="Plume Testnet" %}

<table data-header-hidden><thead><tr><th width="311"></th><th></th></tr></thead><tbody><tr><td>Network Name</td><td>Plume Testnet</td></tr><tr><td>RPC URL</td><td><a href="https://testnet-rpc.plume.org">https://testnet-rpc.plume.org</a></td></tr><tr><td>Chain ID</td><td>98867</td></tr><tr><td>Currency Symbol</td><td>PLUME</td></tr><tr><td>Block Explorer URL</td><td><a href="https://testnet-explorer.plume.org">https://testnet-explorer.plume.org</a></td></tr></tbody></table>
{% endtab %}
{% endtabs %}

Here's a screenshot for testnet details:

<figure><img src="/files/AsZbA4gfDLOQ8yEDPFje" alt="" width="307"><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Switch to desired network now
{% endstep %}
{% endstepper %}


# Claim test tokens

To interact and make transactions on Plume Testnet you'll require `$PLUME` for making transactions and `$pUSD` for performing any financial operations but not limited.

## Before you Begin

* Check if you are using the right [network configuration](/plume/developers/network-information#network-details)

## Claiming tokens

{% stepper %}
{% step %}

### Go to [Plume Faucet](https://faucet.plumenetwork.xyz)

{% endstep %}

{% step %}

### Connect Wallet

Use the "Connect wallet" button on the faucet page to connect to your desired wallet in which you want the test tokens

<figure><img src="/files/34xmzvb7NTxKTLnxTxiO" alt="" width="527"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Select the token

**PLUME** - The native gas token to make transactions on Plume Testnet

**pUSD** - Plume USD or pUSD is the premier stablecoin of the Plume ecosystem. [Know more](/plume/tokens/plume-usd)

**WPLUME** - Wrapped Plume or WPLUME is the ERC-20 compatible and tradable version of PLUME and can be used to interact with other ERC-20 assets.

<figure><img src="/files/qhUy4xig80O5uTnEW8Dp" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Pass the verification challenge

You'll need to pass the cloudflare challenge in order to claim test tokens from the faucet.

<figure><img src="/files/OSb6Ljz5Gy75qaTwYObB" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Claim tokens

After you have passed the verification challenge you'll be able to claim the testnet tokens in your wallet.

<figure><img src="/files/BSEEhZNFouCDS3kejFZ1" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Tokens are on the way

<figure><img src="/files/JpYAcCoCN4bY7EsFVROB" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}


# How to Deploy Smart Contracts

{% content-ref url="/pages/Z6JcXaIlPs2mPgfUvnvu" %}
[Deploy using Remix IDE](/plume/developers/how-to-guides/how-to-deploy-smart-contracts/deploy-using-remix-ide)
{% endcontent-ref %}

{% content-ref url="/pages/tOUJHUgcq8IMErtZKkk4" %}
[Deploy using Foundry](/plume/developers/how-to-guides/how-to-deploy-smart-contracts/deploy-using-foundry)
{% endcontent-ref %}

{% content-ref url="/pages/bmK1Fnzlka5F0x8nYs82" %}
[Deploy using Hardhat](/plume/developers/how-to-guides/how-to-deploy-smart-contracts/deploy-using-hardhat)
{% endcontent-ref %}


# Deploy using Remix IDE

[Remix IDE](https://remix.ethereum.org/) is an online no-setup platform maintained by the Ethereum Foundation with a GUI for developing smart contracts. You can check the [Remix IDE docs](https://remix-ide.readthedocs.io/en/latest/run.html) to learn more about deployment.

## Before you Begin

* Check if you are using the right [network configuration](/plume/developers/network-information)
* Have enough test tokens in your wallet

{% hint style="info" %}
Learn more about claiming test tokens from [here](/plume/developers/how-to-guides/how-to-connect-to-network/claim-test-tokens).
{% endhint %}

## Deploying your Contract

Let's write a simple one-of-one NFT contract based on [OpenZeppelin's open-source ERC-721](https://docs.openzeppelin.com/contracts/4.x/erc721) implementation to tokenize our CBO's prized Rolex watch on Plume Testnet for instance.

{% stepper %}
{% step %}

### Create a file on Remix IDE

Go to [Remix IDE](https://remix.ethereum.org) and create a new file. We are using a sample file named `RolexYachtMaster40.sol`.

<figure><img src="/files/kNVFWqcaULLfgqBsR6lX" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Add your code to the file

To demonstrate we are using this sample smart contract code, you can add your own code.

{% code title="RolexYachtMaster40.sol" overflow="wrap" fullWidth="false" %}

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";

contract RolexYachtMaster40 is Ownable, ERC721 {
    error NFTAlreadyMinted();
    bool private _minted;

    constructor() Ownable(msg.sender) ERC721("Rolex Yacht-Master 40", "") {}

    function mint() public onlyOwner returns (uint256) {
        if (_minted) {
            revert NFTAlreadyMinted();
        }
        _safeMint(owner(), 0);
        _minted = true;
        return 0;
    }
}
```

{% endcode %}
{% endstep %}

{% step %}

### Compile the Contract

Go to the **Solidity Compiler** tab on the IDE, choose the compiler version if you wish to and click on the blue `Compile <file_name>` button.

<figure><img src="/files/4z9AWlVjKq34qUXMS1DG" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
A green tick :white\_check\_mark: will appear on the Compiler tab if the compilation is successful.
{% endhint %}
{% endstep %}

{% step %}

### Deploying the contract using MetaMask

Make sure you are on Plume Testnet network in MetaMask.

<img src="/files/HiJ9m3dO4XkDA4looLuX" alt="" data-size="original">

Select **Injected Provider - MetaMask** in the Environment dropdown and select the account which has sufficient ETH to pay to gas fees. As for our sample contract, no need to change other fields and click on **Deploy** button

<figure><img src="/files/tqslDEBzSjFAjnoeWdI1" alt=""><figcaption></figcaption></figure>

There will be a pop-up on MetaMask to confirm the transaction (asking for gas fees), on confirming the contract will be deployed.
{% endstep %}

{% step %}

### Contract Deployed

Check the console for the transaction info and deployed contract on the left-side panel.

<figure><img src="/files/dD1ZGCU6SB4DTshE11Ah" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}


# Deploy using Foundry

[Foundry](https://getfoundry.sh/) is a Solidity framework for deploying smart contracts, built by [Paradigm](https://paradigm.xyz/) and written in Rust to be blazingly fast.

## Before you Begin

* Check if you are using the right [network configuration](/plume/developers/network-information)
* Have enough test tokens in your wallet

{% hint style="info" %}
Learn more about claiming test tokens from [here](/plume/developers/how-to-guides/how-to-connect-to-network/claim-test-tokens).
{% endhint %}

## Foundry Setup

Simply follow their ["Getting Started" documentation](https://book.getfoundry.sh/getting-started/installation) to install and run Foundry, then follow their ["Projects" documentation](https://book.getfoundry.sh/projects/creating-a-new-project) to create a new project.&#x20;

Run the following commands in your terminal:

```sh
curl -L https://foundry.paradigm.xyz | bash
foundryup
```

## Setup your project

To start a new project with Foundry, use [`forge init`](https://book.getfoundry.sh/reference/forge/forge-init.html):

```sh
forge init plume
```

Let's install the OpenZeppelin dependency required for our sample smart contract.

```sh
forge install openzeppelin/openzeppelin-contracts
```

<details>

<summary>Sample Smart Contract Code</summary>

This is a sample NFT contract based on [OpenZeppelin's open-source ERC-721](https://docs.openzeppelin.com/contracts/4.x/erc721) implementation to tokenize our CBO's prized Rolex watch on Plume.

{% code title="src/RolexYachtMaster40.sol" %}

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";

contract RolexYachtMaster40 is Ownable, ERC721 {
    error NFTAlreadyMinted();
    bool private _minted;

    constructor() Ownable(msg.sender) ERC721("Rolex Yacht-Master 40", "") {}

    function mint() public onlyOwner returns (uint256) {
        if (_minted) {
            revert NFTAlreadyMinted();
        }
        _safeMint(owner(), 0);
        _minted = true;
        return 0;
    }
}
```

{% endcode %}

</details>

Then, compile the project using [`forge build`](https://book.getfoundry.sh/reference/forge/forge-build.html):

<pre class="language-sh"><code class="lang-sh"><strong>forge build
</strong>
[⠰] Compiling...
[⠔] Compiling 38 files with Solc 0.8.27
[⠒] Solc 0.8.27 finished in 1.01s
Compiler run successful!
</code></pre>

## Deploy your Contract

Follow the instructions on in the ["Deploying" documentation](https://book.getfoundry.sh/forge/deploying) and set your `PLUME_RPC_URL` environment variable similar to the ETH RPC URL. The below command will deploy the sample smart contract provided above on **Plume Testnet** for instance (switch the RPC and verifier URL to Mainnet to deploy on Plume Mainnet).

{% code overflow="wrap" %}

```sh
export PLUME_RPC_URL=https://testnet-rpc.plume.org
export CONTRACT_PATH=<contract_file>:<contract_name>

forge create $CONTRACT_PATH \
    --rpc-url $PLUME_RPC_URL \
    --broadcast \
    --legacy --interactive
```

{% endcode %}

{% hint style="info" %}
To verify the contract while deploying, use `--verify`  flag, more details [here](https://book.getfoundry.sh/forge/deploying).
{% endhint %}

The below command will verify the contract and deploy it simultaneously.

```sh
export PLUME_RPC_URL=https://testnet-rpc.plume.org
export VERIFIER_URL=https://testnet-explorer.plume.org/api/
export CONTRACT_PATH=<contract_file>:<contract_name>

forge create $CONTRACT_PATH \
    --rpc-url $PLUME_RPC_URL \
    --verify \
    --verifier blockscout \
    --verifier-url $VERIFIER_URL \
    --broadcast \
    --legacy --interactive
```

{% hint style="warning" %}
Make sure to replace the details in the `<contract_file>:<contract_name>` with your contract details.
{% endhint %}

### Sample Output

```sh
No files changed, compilation skipped
Enter private key:
Deployer: 0x32820DE739394C1ee69264ef3C0193E4B5C0122c
Deployed to: 0xa43a88ccfec87295aa0c5017a7ddcc5cdfcacdd0
Transaction hash: 0x1441297a9288fc37820a09e2e9b1d14d62b5d6341fd1e14159eabcedb7dfe115
```

You can view the deployed contract on the [Plume Testnet Explorer](https://testnet-explorer.plumenetwork.xyz/).


# Deploy using Hardhat

[Hardhat](https://hardhat.org) is a development environment for Ethereum software. It consists of different components for editing, compiling, debugging and deploying your smart contracts and dApps, all of which work together to create a complete development environment.

## Before you Begin

* Check if you are using the right [network configuration](/plume/developers/network-information#network-details)
* Have enough test tokens in your wallet

{% hint style="info" %}
Learn more about claiming test tokens from [here](/plume/developers/how-to-guides/how-to-connect-to-network/claim-test-tokens).
{% endhint %}

## Hardhat Setup

Start by creating a folder `plume-hardhat`. Open a terminal pointing to this folder and run the below command to initialize a node.js project.

```sh
npm init -y
```

Followed by installing hardhat and other necessary libraries using the below command.

```sh
npm install --save-dev hardhat @openzeppelin/contracts @nomicfoundation/hardhat-ignition-ethers dotenv
```

Let's create a hardhat project using `npx hardhat init`  now. We are using a JavaScript template from the list of options to facilitate the deployment and choosing the configuration for the project as shown below.

```
√ What do you want to do? · Create a JavaScript project
√ Hardhat project root: · \Users\...\plume-hardhat
√ Do you want to add a .gitignore? (Y/n) · y
√ Do you want to install this sample project's dependencies with npm (@nomicfoundation/hardhat-toolbox)? (Y/n) · y
```

{% hint style="info" %}
Learn more about setting up hardhat project [here](https://hardhat.org/hardhat-runner/docs/guides/project-setup).
{% endhint %}

## Configure and prepping to deploy

Let's create a `.env`  file to store the private key inside it safely.

```sh
touch .env
echo "PRIVATE_KEY=<your-wallet-private-key>" >> .env
```

Make the following adjustments to the auto-generated `hardhat.config.js` file to prepare to deploy to the **Plume Testnet** for instance (switch the RPC and verifier URL to Mainnet to deploy on Plume Mainnet):

* Import the `hardhat-toolbox` and `hardhat-ignition-ethers` plugin into the Hardhat Runtime Environment.
* Add the Plume Testnet [network details](/plume/developers/network-information#testnet-details).

{% code title="hardhat.config.js" overflow="wrap" %}

```javascript
require("@nomicfoundation/hardhat-toolbox");
require("@nomicfoundation/hardhat-ignition-ethers");
require('dotenv').config();

/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
  solidity: "0.8.28",
  settings: {
    evmVersion: "cancun"
  },
  networks: {
    hardhat: {},
    "plume-testnet": {
      url: "https://testnet-rpc.plume.org",
      chainId: 98867,
      accounts: [process.env.PRIVATE_KEY]
    }
  },
  etherscan: {
    apiKey: {
      "plume-testnet": "testnet"
    },
    customChains: [
      {
        network: "plume-testnet",
        chainId: 98867,
        urls: {
          apiURL: "https://testnet-explorer.plume.org/api",
          browserURL: "https://testnet-explorer.plume.org"
        }
      }
    ]
  }
};
```

{% endcode %}

## Compile and Deploy

We'll be using a sample contract, you can replace this with your own codebase. Make sure you place the contract in **"Contracts"** directory within your Hardhat project.

<details>

<summary>Sample Smart Contract Code</summary>

This is a sample NFT contract based on [OpenZeppelin's open-source ERC-721](https://docs.openzeppelin.com/contracts/4.x/erc721) implementation to tokenize our CBO's prized Rolex watch on Plume.

{% code title="Contracts/RolexYachtMaster40.sol" %}

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";

contract RolexYachtMaster40 is Ownable, ERC721 {
    error NFTAlreadyMinted();
    bool private _minted;

    constructor() Ownable(msg.sender) ERC721("Rolex Yacht-Master 40", "") {}

    function mint() public onlyOwner returns (uint256) {
        if (_minted) {
            revert NFTAlreadyMinted();
        }
        _safeMint(owner(), 0);
        _minted = true;
        return 0;
    }
}
```

{% endcode %}

</details>

Compile the contract(s) using the below command:

```sh
npx hardhat compile
```

Let's create a ignition module to deploy the contract(s). Create a file as `<Your-Contract>.js` at `ignition/modules/<Your-Contract>.js` . Here's a sample module we used with the above sample contract.

{% code title="RolexYachtMaster40.js" overflow="wrap" %}

```javascript
const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules");

module.exports = buildModule("DeployRolexYachtMaster40", (m) => {
    const RolexYachtMaster40 = m.contract("RolexYachtMaster40", [
        /** constructor args */
    ]);

    return { RolexYachtMaster40 };
});
```

{% endcode %}

Deploy your contract(s) to the Plume Testnet using the following command:

```
npx hardhat ignition deploy ./ignition/modules/<Your-Contract>.js --network plume-testnet
```

{% hint style="info" %}
To verify your contract while deploying, add a `--verify` flag in the command or go to [Verify using Hardhat](/plume/developers/how-to-guides/how-to-verify-smart-contracts/verify-using-hardhat) to learn more about post-verification steps.
{% endhint %}

### Sample Output

```
√ Confirm deploy to network plume-testnet (98867)? ... yes
Hardhat Ignition 🚀

Deploying [ DeployRolexYachtMaster40 ]

Batch #1
  Executed DeployRolexYachtMaster40#RolexYachtMaster40

[ DeployRolexYachtMaster40 ] successfully deployed 🚀

Deployed Addresses

DeployRolexYachtMaster40#RolexYachtMaster40 - 0x0c14F7df7f2B0c6F55851610849BA09f97732C9B
```

You can view the deployed contract on the [Plume Testnet Explorer](http://testnet-explorer.plume.org).


# How to Verify Smart Contracts

{% content-ref url="/pages/kEOFkzeDP9DSVcPugURu" %}
[Verify using Foundry](/plume/developers/how-to-guides/how-to-verify-smart-contracts/verify-using-foundry)
{% endcontent-ref %}

{% content-ref url="/pages/8vX9P2jIhDWRSCO6j2PJ" %}
[Verify using Hardhat](/plume/developers/how-to-guides/how-to-verify-smart-contracts/verify-using-hardhat)
{% endcontent-ref %}


# Verify using Foundry

## Verify your Contract

To verify your smart contract that is already deployed, refer the instructions in [Blockscout's Foundry Contract Verification](https://docs.blockscout.com/devs/verification/foundry-verification) page.&#x20;

Run the following command to verify on **Plume Testnet** for instance (switch the RPC and verifier URL to Mainnet to deploy on Plume Mainnet):

```sh
export PLUME_RPC_URL=https://testnet-rpc.plume.org
export VERIFIER_URL=https://testnet-explorer.plume.org/api/
export CONTRACT_ADDRESS=<your_contract_address>
export CONTRACT_PATH=<contract_file>:<contract_name>

forge verify-contract $CONTRACT_ADDRESS $CONTRACT_PATH \
    --rpc-url $PLUME_RPC_URL \
    --verifier blockscout \
    --verifier-url $VERIFIER_URL
```

{% hint style="warning" %}
Make sure to replace the details in the `<contract address>` and `<contract_file>:<contract_name>` with your contract details.
{% endhint %}

### Sample Output

```sh
Start verifying contract `0x4b98e3767DB95C5D30834E1261Ea4Caa96081160` deployed on 98867

Submitting verification for [src/RolexYachtMaster40.sol:RolexYachtMaster40] 0x4b98e3767DB95C5D30834E1261Ea4Caa96081160.
Submitted contract for verification:
        Response: `OK`
        GUID: `4b98e3767db95c5d30834e1261ea4caa9608116067b396ba`
        URL: https://testnet-explorer.plume.org/address/0x4b98e3767db95c5d30834e1261ea4caa96081160
```


# Verify using Hardhat

## Verify your Contract

To verify your smart contract(s) that are already deployed, refer the instructions in [Blockscout's Hardhat Contract Verification](https://docs.blockscout.com/devs/verification/hardhat-verification-plugin#verify) page.&#x20;

Run the following command on **Plume Testnet** for instance (switch the RPC and verifier URL to Mainnet to deploy on Plume Mainnet):

```sh
npx hardhat verify --network plume-testnet <your-contract-address>
```

{% hint style="warning" %}
Make sure to replace the details in the `<your-contract-address>` with your contract address.
{% endhint %}

### Sample Output

```
Successfully submitted source code for contract
contracts/RolexYachtMaster40.sol:Lock at 0x0c14F7df7f2B0c6F55851610849BA09f97732C9B
for verification on the block explorer. Waiting for verification result...

Successfully verified contract Lock on the block explorer.
https://testnet-explorer.plume.org/address/0x0c14F7df7f2B0c6F55851610849BA09f97732C9B#code
```


# How to Run a Node

This guide provides a step-by-step walkthrough for running a Plume Mainnet or Testnet node with Celestia data availability using Docker Compose.

## Hardware Requirements

Please visit the [Minimum hardware configuration](https://docs.arbitrum.io/run-arbitrum-node/run-full-node#minimum-hardware-configuration) for checking the hardware requirements for running a orbit chain node.

## Prerequisites

* [Docker Engine](https://docs.docker.com/engine/install)
* [Docker Compose](https://docs.docker.com/compose/install)

## Configuration

### Set up your environment

Create a directory for your node and enter it:

```sh
mkdir plume-node
cd plume-node
```

### Initialize the configuration

{% tabs %}
{% tab title="Plume Mainnet" %}
Create your `plume-mainnet.yaml` file with the below configuration.

#### **Docker Compose Snippet**

<pre class="language-yaml" data-title="plume-mainnet.yaml" data-line-numbers><code class="lang-yaml">services:
  plume-mainnet:
    image: offchainlabs/nitro-node:v3.9.5-66e42c4-validator
    container_name: plume-mainnet
    restart: unless-stopped
    ports:
      - "8547:8547"
      - "6070:6070"
    command:
      - --chain.id=98866
      - --chain.name=conduit-orbit-deployer
      - --http.addr=0.0.0.0
      - --http.corsdomain=*
      - --http.vhosts=*
      - --ws.expose-all
      - --ws.rpcprefix=/
      - --ws.port=8547
      - --ws.addr=0.0.0.0
      - --ws.origins=*
      - --http.api=net,web3,eth,txpool,debug,admin,arb,arbdebug,arbtrace
      - --ws.api=net,web3,eth,txpool,debug
      - --chain.info-json=[{"chain-id":98866,"parent-chain-id":1,"chain-name":"conduit-orbit-deployer","chain-config":{"chainId":98866,"homesteadBlock":0,"daoForkBlock":null,"daoForkSupport":true,"eip150Block":0,"eip150Hash":"0x0000000000000000000000000000000000000000000000000000000000000000","eip155Block":0,"eip158Block":0,"byzantiumBlock":0,"constantinopleBlock":0,"petersburgBlock":0,"istanbulBlock":0,"muirGlacierBlock":0,"berlinBlock":0,"londonBlock":0,"clique":{"period":0,"epoch":0},"arbitrum":{"EnableArbOS":true,"AllowDebugPrecompiles":false,"DataAvailabilityCommittee":true,"InitialArbOSVersion":32,"InitialChainOwner":"0x5Ec32984332eaB190cA431545664320259D755d8","GenesisBlockNum":0}},"rollup":{"bridge":"0x35381f63091926750F43b2A7401B083263aDEF83","inbox":"0x943fc691242291B74B105e8D19bd9E5DC2fcBa1D","sequencer-inbox":"0x85eC1b9138a8b9659A51e2b51bb0861901040b59","rollup":"0x4eD3F488a5a4417839BbC39712EB76D8Aaee6eE8","validator-wallet-creator":"0x0A5eC2286bB15893d5b8f320aAbc823B2186BA09","deployed-at":21887008,"stake-token":"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"}}]
      - --node.data-availability.enable=true
      - --node.data-availability.rest-aggregator.enable=true
      - --node.data-availability.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
<strong>      - --node.data-availability.parent-chain-node-url=&#x3C;ETH_RPC_URL>
</strong>      - --execution.forwarding-target=https://rpc.plume.org
      - --execution.caching.archive
<strong>      - --parent-chain.connection.url=&#x3C;ETH_RPC_URL>
</strong><strong>      - --parent-chain.blob-client.beacon-url=&#x3C;ETH_BEACON_RPC_URL>
</strong>      - --node.staker.enable=false
      - --node.feed.input.url=wss://relay-plume-mainnet-1.t.conduit.xyz
      - --node.sequencer=false
      - --execution.rpc.tx-fee-cap=100
      - --execution.rpc.gas-cap=500000000
      - --metrics
      - --metrics-server.addr=0.0.0.0
      - --metrics-server.port=6070
      - --metrics-server.update-interval=5s
</code></pre>

{% hint style="warning" %}
Replace `ETH_RPC_URL` and `ETH_BEACON_RPC_URL` with your RPC URLs.

* ETH\_RPC\_URL = execution layer client like Geth, Erigon, Nethermind, or Reth
* ETH\_BEACON\_RPC\_URL = consensus layer client like Lighthouse, Prysm, Nimbus, or Teku
  {% endhint %}
  {% endtab %}

{% tab title="Plume Testnet" %}
Create your `plume-testnet.yaml` file with the below configuration.

#### **Docker Compose Snippet**

<pre class="language-yaml" data-title="plume-testnet.yaml" data-line-numbers><code class="lang-yaml">services:
  plume-testnet:
    image: offchainlabs/nitro-node:v3.9.5-66e42c4-validator
    container_name: plume-testnet
    restart: unless-stopped
    ports:
      - "8547:8547"
      - "6070:6070"
    command:
      - --chain.id=98867
      - --chain.name=conduit-orbit-deployer
      - --http.addr=0.0.0.0
      - --http.corsdomain=*
      - --http.vhosts=*
      - --ws.expose-all
      - --ws.rpcprefix=/
      - --ws.port=8547
      - --ws.addr=0.0.0.0
      - --ws.origins=*
      - --http.api=net,web3,eth,txpool,debug,admin,arb,arbdebug,arbtrace
      - --ws.api=net,web3,eth,txpool,debug
      - --chain.info-json=[{"chain-id":98867,"parent-chain-id":11155111,"chain-name":"conduit-orbit-deployer","chain-config":{"chainId":98867,"homesteadBlock":0,"daoForkBlock":null,"daoForkSupport":true,"eip150Block":0,"eip150Hash":"0x0000000000000000000000000000000000000000000000000000000000000000","eip155Block":0,"eip158Block":0,"byzantiumBlock":0,"constantinopleBlock":0,"petersburgBlock":0,"istanbulBlock":0,"muirGlacierBlock":0,"berlinBlock":0,"londonBlock":0,"clique":{"period":0,"epoch":0},"arbitrum":{"EnableArbOS":true,"AllowDebugPrecompiles":false,"DataAvailabilityCommittee":true,"InitialArbOSVersion":32,"InitialChainOwner":"0x09a24DD120676EA4034cD47BfA4432a6a87A8a42","GenesisBlockNum":0}},"rollup":{"bridge":"0xC55b89c17d7a35877FA4ea818fea2a70d5765f1c","inbox":"0xb48cdff890199f5De31514024B95F8664F8Af222","sequencer-inbox":"0xbCa991f1831bE1F1E7e5576d5F84A645e70F3E4d","rollup":"0x3B37BeD1c38c6283A56E60340FE813C0BBA031C3","validator-wallet-creator":"0x684A827456373a0C0379B1C82BA31Ee5E4F88F62","deployed-at":7889627,"stake-token":"0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9"}}]
      - --node.data-availability.enable=true
      - --node.data-availability.rest-aggregator.enable=true
      - --node.data-availability.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
<strong>      - --node.data-availability.parent-chain-node-url=&#x3C;ETH_SEPOLIA_RPC_URL>
</strong>      - --execution.forwarding-target=https://testnet-rpc.plume.org
      - --execution.caching.archive
<strong>      - --parent-chain.connection.url=&#x3C;ETH_SEPOLIA_RPC_URL>
</strong><strong>      - --parent-chain.blob-client.beacon-url=&#x3C;ETH_SEPOLIA_BEACON_RPC_URL>
</strong>      - --node.staker.enable=false
      - --node.feed.input.url=wss://relay-plume-testnet-1.t.conduit.xyz
      - --node.sequencer=false
      - --execution.rpc.tx-fee-cap=100
      - --execution.rpc.gas-cap=500000000
      - --metrics
      - --metrics-server.addr=0.0.0.0
      - --metrics-server.port=6070
      - --metrics-server.update-interval=5s
</code></pre>

{% hint style="warning" %}
Replace `ETH_SEPOLIA_RPC_URL` and `ETH_SEPOLIA_BEACON_RPC_URL` with your RPC URLs.

* ETH\_SEPOLIA\_RPC\_URL = execution layer client like Geth, Erigon, Nethermind, or Reth
* ETH\_SEPOLIA\_BEACON\_RPC\_URL = consensus layer client like Lighthouse, Prysm, Nimbus, or Teku
  {% endhint %}
  {% endtab %}
  {% endtabs %}

### Start the Node

Run the following command to start your Plume node:

{% tabs %}
{% tab title="Plume Mainnet" %}

```sh
docker-compose -f plume-mainnet.yaml up -d
```

{% endtab %}

{% tab title="Plume Testnet" %}

```sh
docker-compose -f plume-testnet.yaml up -d
```

{% endtab %}
{% endtabs %}

### Verify Operations

Check the logs to ensure the node is syncing successfully:

{% tabs %}
{% tab title="Plume Mainnet" %}

```bash
docker logs plume-mainnet
```

{% endtab %}

{% tab title="Plume Testnet" %}

```bash
docker logs plume-testnet
```

{% endtab %}
{% endtabs %}

## Node Snapshot

To speed up syncing your node, you can use the latest Plume mainnet snapshot instead of syncing from genesis. Download and extract the snapshot from the link below before starting your node:

> [Latest Snapshot](https://storage.googleapis.com/conduit-networks-snapshots/plume-mainnet-1/latest.tar)

This provides a fast, reliable starting point and ensures your node is aligned with the current Plume mainnet state.

***

## Troubleshooting

#### Running on MacOS (Apple Silicon)/Linux

If you are running this setup on an Apple Silicon (M1/M2/M3)/Linux machine, Docker usually handles emulation automatically. However, if you encounter platform errors, you can force the platform by adding the following line to the `plume-mainnet` service in your YAML file:

```yaml
platform: linux/amd64
```


# How to Use NightFall

Nightfall is an L3 privacy blockchain originally incubated by EY and the Ethereum community, designed to bring enterprise-grade privacy to tokenized assets.

<figure><img src="/files/JtyfdclJsiLTMzYmYdFv" alt=""><figcaption></figcaption></figure>

**Nightfall\_4 (NF\_4)** uses a Zero-Knowledge Proof (ZKP)-based protocol for private transfers of ERC-standard tokens:

* **ERC-20**: fungible tokens
* **ERC-721**: NFTs
* **ERC-1155**: multi-token standard
* **ERC-3525**: semi-fungible tokens

NF\_4 incorporates a **Layer-2 ZK-ZK rollup**, allowing transactions to be grouped into succinct proofs. Key properties:

* **Scalable:** private transfers typically cost \~6,000 gas
* **Fast finality:** finality is aligned with the underlying blockchain (EVM or SVM)
* **Rust-based:** implementation written in Rust, while preserving NF\_3’s API for compatibility

In order to run Nightfall you must run two applications: a `client` and a `proposer`.

\
The purpose of the `proposer` is to make Layer 2 blocks. It makes an endpoint available to `clients`. Clients are the application that normal users will employ to make transactions that are hidden by ZKP. Full instructions for How to Run a Proposer on Plume Testnet can be found [here](https://github.com/EYBlockchain/nightfall_4_CE/blob/master/doc/Plume_Testnet_Docs/plume_testnet_proposer_playbook.md).\
\
`clients` are the application that normal users will employ to make transactions that are hidden by ZKP. the user can intitiate three types of transaction via the `client`: Deposit, Transfer, and Withdraw. Full instructions for How to Run a Client Application on Plume Testnet can be found [here](https://github.com/EYBlockchain/nightfall_4_CE/blob/master/doc/Plume_Testnet_Docs/plume_testnet_client_playbook.md).


# Tools & Services

{% content-ref url="/pages/CW0gCEjl9FO2bWzp4rfK" %}
[Account Abstraction](/plume/developers/tools-and-services/account-abstraction)
{% endcontent-ref %}

{% content-ref url="/pages/SerAHhprCXdygLgr9fhc" %}
[Bridges](/plume/developers/tools-and-services/bridges)
{% endcontent-ref %}

{% content-ref url="/pages/QyP6MP9BXEYJxemcykBC" %}
[Oracles](/plume/developers/tools-and-services/oracles)
{% endcontent-ref %}

{% content-ref url="/pages/qFIjAthl1TiPpaGolF1W" %}
[Data Indexers](/plume/developers/tools-and-services/data-indexers)
{% endcontent-ref %}

{% content-ref url="/pages/iZ8oL73L962fqZ4rV2wW" %}
[Node/RPC Providers](/plume/developers/tools-and-services/node-rpc-providers)
{% endcontent-ref %}

{% content-ref url="/pages/nIrb8IPeUdV4E2yuOsr3" %}
[OnRamps](/plume/developers/tools-and-services/onramps)
{% endcontent-ref %}

{% content-ref url="/pages/KVtcmWKV8d6Q0pFFn1KF" %}
[Analytics](/plume/developers/tools-and-services/analytics)
{% endcontent-ref %}

{% content-ref url="/pages/Zhoax8NDOkA96VLn0LmH" %}
[Custodians & Multisigs](/plume/developers/tools-and-services/custodians-and-multisigs)
{% endcontent-ref %}

{% content-ref url="/pages/CUkluCMg1jbOzMJKJXZM" %}
[Misc Tools](/plume/developers/tools-and-services/misc-tools)
{% endcontent-ref %}


# Account Abstraction

Account Abstraction available on Plume Mainnet and Testnet

## [Conduit](https://conduit.xyz/)

The Conduit Bundler is a component of Conduit's Account Abstraction solution that streamlines complex blockchain operations via ERC-4337 UserOperations, enabling one-click transactions by bundling multi-step actions into a single, user-friendly interaction

<details>

<summary>Quick Links</summary>

**Docs:** <https://docs.conduit.xyz/account-abstraction/conduit-bundler>

Plume Bundler URL: <https://bundler.plume.org>

</details>

### Smart Contracts

Here are smart contracts for Plume Mainnet

<table><thead><tr><th width="221.0234375">Contract Name</th><th>Contract Address</th></tr></thead><tbody><tr><td>Entry Point</td><td>0x0000000071727De22E5E9d8BAf0edAc6f37da032</td></tr><tr><td>Safe 4337 Module</td><td>0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226</td></tr><tr><td>Safe Module Setup</td><td>0x2dd68b007B46fBe91B9A7c3EDa5A7a1063cB5b47</td></tr><tr><td>Simple Account Factory</td><td>0x0ACDDd4868E24aad6A16573b416133F58795A916</td></tr><tr><td>Test Counter</td><td>0x475d5a5B128c1846b86493b357e75E27201447B7</td></tr></tbody></table>

## [Pimlico](http://pimlico.io/)

Pimlico is the world's most advanced ERC-4337 account abstraction infrastructure platform. Pimlico provides a suite of tools and services to help you build, deploy, and manage smart accounts on Ethereum and other EVM-compatible chains.

<details>

<summary>Quick Links</summary>

**Docs:** <https://docs.pimlico.io/>

**Dashboard:** <https://dashboard.pimlico.io/>

</details>


# Bridges

Bridges that support Plume Mainnet and Testnet

## Plume Mainnet

Visit the Plume Bridge Page to see all supported bridges.

{% embed url="<https://portal.plume.org/bridge>" fullWidth="false" %}

### [Arbitrum Bridge](https://portal.arbitrum.io/bridge?sourceChain=ethereum\&destinationChain=plume-mainnet\&tab=bridge\&sanitized=true)

The Arbitrum native bridge supports bridging of PLUME and WETH between Plume Mainnet and Ethereum Mainnet.

{% embed url="<https://bridge.arbitrum.io/?destinationChain=plume-mainnet&sourceChain=ethereum&tab=bridge>" %}

### [pUSD Bridge](https://pusd.plume.org/)

The pUSD Bridge supports bridging of USDC.e and pUSD betweeen Ethereum and Plume Mainnet.

{% embed url="<https://pusd.plume.org>" %}

### [Stargate](https://stargate.finance/bridge)

Stargate (powered by LayerZero) supports bridging of USDC.e and USDT between Plume Mainnet and 100+ Stargate-enabled chains.

{% embed url="<https://stargate.finance/bridge?dstChain=plumephoenix&dstToken=0x78adD880A697070c1e765Ac44D65323a0DcCE913&srcChain=ethereum&srcToken=0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48>" %}

### [LayerZero](https://layerzero.network/)

LayerZero is the omnichain infrastructure that powers bridges like Stargate.

<table><thead><tr><th width="189.13671875">DVN Name</th><th>Contract Deployment Address</th></tr></thead><tbody><tr><td>LayerZero Labs</td><td><a href="https://explorer.plume.org/address/0x4208d6e27538189bb48e603d6123a94b8abe0a0b">0x4208d6e27538189bb48e603d6123a94b8abe0a0b</a></td></tr></tbody></table>

The Plume Mainnet has **EID 30370** for its [LayerZero V2 Endpoint](https://docs.layerzero.network/v2/deployments/deployed-contracts?chains=plumephoenix). The V2 contract addresses are:

<table data-full-width="false"><thead><tr><th width="189.58984375">Contract Name</th><th>Contract Deployment Address</th></tr></thead><tbody><tr><td>EndpointV2</td><td><a href="https://explorer.plume.org/address/0xC1b15d3B262bEeC0e3565C11C9e0F6134BdaCB36">0xC1b15d3B262bEeC0e3565C11C9e0F6134BdaCB36</a></td></tr><tr><td>SendUln302</td><td><a href="https://explorer.plume.org/address/0xFe7C30860D01e28371D40434806F4A8fcDD3A098">0xFe7C30860D01e28371D40434806F4A8fcDD3A098</a></td></tr><tr><td>ReceiveUln302</td><td><a href="https://explorer.plume.org/address/0x5B19bd330A84c049b62D5B0FC2bA120217a18C1C">0x5B19bd330A84c049b62D5B0FC2bA120217a18C1C</a></td></tr><tr><td>BlockedMessageLib</td><td><a href="https://explorer.plume.org/address/0x9e611db91ade3312534064ae6ae700f5b531844c">0x9e611dB91aDe3312534064ae6Ae700F5B531844c</a></td></tr><tr><td>LZ Executor</td><td><a href="https://explorer.plume.org/address/0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d">0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3</a></td></tr><tr><td>LZ Dead DVN</td><td><a href="https://phoenix-explorer.plumenetwork.xyz/address/0x4514FC667a944752ee8A29F544c1B20b1A315f25">0x4514FC667a944752ee8A29F544c1B20b1A315f25</a></td></tr></tbody></table>

The Plume Mainnet has **EID 370** for its [LayerZero V1 Endpoint](https://docs.layerzero.network/v1/deployments/deployed-contracts?chains=plumephoenix). The V1 contract addresses are:

<table><thead><tr><th width="196.15234375">Contract Name</th><th>Contract Deployment Address</th></tr></thead><tbody><tr><td>EndpointV1</td><td><a href="https://phoenix-explorer.plumenetwork.xyz/address/0x377530cdA84DFb2673bF4d145DCF0C4D7fdcB5b6">0x377530cdA84DFb2673bF4d145DCF0C4D7fdcB5b6</a></td></tr><tr><td>SendUln301</td><td><a href="https://phoenix-explorer.plumenetwork.xyz/address/0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887">0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887</a></td></tr><tr><td>ReceiveUln301</td><td><a href="https://phoenix-explorer.plumenetwork.xyz/address/0xc1B621b18187F74c8F6D52a6F709Dd2780C09821">0xc1B621b18187F74c8F6D52a6F709Dd2780C09821</a></td></tr><tr><td>Relayer201</td><td><a href="https://phoenix-explorer.plumenetwork.xyz/address/0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD">0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD</a></td></tr><tr><td>UltraLightNode201</td><td><a href="https://phoenix-explorer.plumenetwork.xyz/address/0xfd76d9CB0Bac839725aB79127E7411fe71b1e3CA">0xfd76d9CB0Bac839725aB79127E7411fe71b1e3CA</a></td></tr><tr><td>NonceContract</td><td><a href="https://phoenix-explorer.plumenetwork.xyz/address/0x15e51701F245F6D5bd0FEE87bCAf55B0841451B3">0x15e51701F245F6D5bd0FEE87bCAf55B0841451B3</a></td></tr></tbody></table>

### [Hyperlane](https://hyperlane.xyz/)

Hyperlane is a modular, permissionless interoperability protocol that enables generalized cross-chain messaging.

#### 📦 Plume Deployment Addresses

* **Mailbox**
  * Domain: `98866`
  * Address: `0x3a464f746D23Ab22155710f44dB16dcA53e0775E`
* **Interchain Account Router**
  * Address: `0xf303B04d9ad21dAe2658Cf302478A424e0B45368`

**Contract Addresses:** <https://docs.hyperlane.xyz/docs/reference/addresses/mailbox-addresses>

### [Gas.Zip](https://www.gas.zip/)

Gas.zip is the fastest one-stop gas refuel bridge for over 300+ chains and counting. Users can instantly bridge to multiple destination blockchains with a single deposit transaction.

## Plume Testnet

### [Arbitrum Bridge](https://bridge.arbitrum.io/)

Bridge ETH and USDC between Ethereum Sepolia and Plume Testnet using this bridge.

{% embed url="<https://bridge.arbitrum.io/?destinationChain=plume-testnet&sourceChain=sepolia&tab=bridge>" %}


# Oracles

Oracles that support Plume Mainnet and Testnet

## [Stork](https://stork.network/)

Stork is an oracle protocol that enables ultra low latency connections between data providers and both on and off-chain applications. The most common use-case for Stork is pulling and consuming market data in the form of real time price feeds for DeFi.

**Supported Feeds -** pUSD, pETH, nRWA, nYIELD, nTBILL, STONE, SBTC, WETH are specific to Plume, in addition to [350+ other assets](https://docs.stork.network/resources/asset-id-registry).

<details>

<summary>Quick Links</summary>

**Docs:** <https://docs.stork.network/getting-started/accessing-data-on-chain>

**Asset List:** <https://docs.stork.network/resources/asset-id-registry>

**Stork Plume Contracts:** <https://docs.stork.network/resources/contract-addresses/evm#plume>

</details>

## [eOracle](https://eo.app/)

eOracle is an open infrastructure platform that empowers developers to build secure [oracles](https://ethereum.org/en/developers/docs/oracles/) backed by Ethereum's battle-tested security model. eOracle creates a foundation for specialized data services that combine deep domain expertise with unmatched cryptoeconomic security.

<details>

<summary>Quick Links</summary>

**Docs:** <https://docs.eo.app/docs>

**Plume Mainnet Contracts:** <https://docs.eo.app/docs/eprice/feed-addresses/plume>

**Plume Testnet Contracts:** <https://docs.eo.app/docs/eprice/feeds-addresses/price-feed-addresses/plume-testnet>

</details>

## [Supra](https://supra.com/)

Supra Oracles is a powerful cross-chain oracle network designed to power dApps across blockchain ecosystems with fast, secure, decentralized, and scalable data solutions.

**Supra’s dVRF** can provide the exact properties required for a random number generator (RNG) to be fair with tamper-proof, unbiased, and cryptographically verifiable random numbers to be employed by smart contracts.

<details>

<summary>Quick Links</summary>

**Available Networks:** <https://docs.supra.com/oracles/data-feeds/push-oracle/networks>

**dVRF Contracts:** <https://docs.supra.com/oracles/dvrf/networks>

**Plume Mainnet Contracts:** <https://supra.com/data/networks/plume?nid=142&networkType=mainnet&network=2>

</details>

## [Chronicle](https://chroniclelabs.org/)

Chronicle Protocol offers scalable, cost-efficient, verifiable Oracles, powering MakerDAO, Spark & more.

<details>

<summary>Quick Links</summary>

**Docs:** <https://docs.chroniclelabs.org/Developers/tutorials/Remix>

**Plume Mainnet Dashboard:** <https://chroniclelabs.org/dashboard/oracles#blockchain=PLUME-MAINNET>

</details>

## [Orochi Network](https://orochi.network/)

**Orochi Network** is a **Verifiable Data Infrastructure** designed to ensure data integrity and privacy through advanced cryptographic techniques. Orochi Network provides a secure infrastructure for processing and proving data without compromising confidentiality.

<details>

<summary>Quick Links</summary>

**Docs:** <https://docs.orochi.network/orochi-network>

**Mainnet Contracts:** <https://docs.orochi.network/Orocle/mainnet>

**Testnet Contracts:** <https://docs.orochi.network/Orocle/testnet>

</details>

## [Block Scholes](https://www.blockscholes.com/data#oracle-solutions)

Block Scholes is the uniquely complete financial data oracle, encompassing the highest quality specialised data catalog available: institutional-grade crypto & equity price feeds (options, futures, spot), volatility surfaces, forward/rate curves, and more, with unparalleled breadth & depth across the industry. Excels on bespoke use cases, with flexible support for any token, asset or data type: delivered on-chain, off-chain or on-demand.

<details>

<summary>Quick Links</summary>

**Docs:** <https://block-scholes.gitbook.io/block-scholes>

**On-chain Example Integration:** <https://block-scholes.gitbook.io/block-scholes/push-based-oracle#example-integration>

**Contracts:** <https://block-scholes.gitbook.io/block-scholes/push-based-oracle#deployments>

**TG Community:** <https://t.me/blockscholes>

</details>


# Data Indexers

Index the data all over the Plume Mainnet and Testnet

## [Goldsky](https://goldsky.com/)

Goldsky is Web3’s realtime data platform, giving developers access to world-class data infrastructure to power their onchain applications.

<details>

<summary>Quick Links</summary>

**Docs:** <https://docs.goldsky.com/chains/plume/?utm_medium=docs&utm_source=plume>

**Supported Networks:** <https://docs.goldsky.com/chains/supported-networks>

**Slug:** `plume-mainnet`

</details>

### [SQD](https://www.sqd.dev/)

SQD Network ingests and stores petabytes of raw blockchain data unlocking indexing and data access at a speed, scale, and price never before possible.

<details>

<summary>Quick Links</summary>

**Docs:** <https://docs.sqd.dev/>

**Gateway URL:** <https://v2.archive.subsquid.io/network/plume>

**Tutorial:** <https://docs.sqd.dev/sdk/quickstart/>

**Example:** <https://github.com/plumenetwork/nest-sqd>

**Slug:** `plume`

</details>

## [Indexing Co.](https://www.indexing.co)

Building on Plume? The Indexing Company makes onchain data easy. Get access to Plume’s real-time and historical data with custom transformations, programmable logic and flexible outputs (DBs, webhooks, Kafka).

<details>

<summary>Quick Links</summary>

**Docs:** <https://docs.indexing.co/guide/overview>

**Network Key:** `plume`&#x20;

**Contact**: <https://warpcast.com/runninyeti.eth>

</details>


# Node/RPC Providers

Facing RPC limit issues? Our node providers got your back!

## [Conduit](https://www.conduit.xyz/)

<details>

<summary>Steps to use Conduit</summary>

* Log in to the [Conduit App](https://app.conduit.xyz/).
* Navigate to `Nodes` section and select `Create an API Key` (if not created before)
* Give your API key a suitable name and your RPC URLs are ready.
* Sample URL: [https://rpc-plume-mainnet-1.t.conduit.xyz/{YOUR\_API\_KEY\_HERE}](https://rpc-plume-mainnet-1.t.conduit.xyz/%7BYOUR_API_KEY_HERE%7D)

</details>

More details about Conduit RPC are available [here](https://docs.conduit.xyz/nodes/nodes-overview)

## [Uniblock](https://www.uniblock.dev/)

<details>

<summary>Steps to use Uniblock</summary>

* Log in to the [Uniblock Dashboard](https://dashboard.uniblock.dev/dashboard/home)
* Create/Select your project
* Navigate to Endpoints > RPC and scroll down to Plume
* Copy the URL
* Sample URL: <https://api.uniblock.dev/uni/v1/json-rpc?chainId=98866&apiKey={YOUR_API_KEY}>

</details>

More details about Uniblock are available [here](https://docs.uniblock.dev/reference/unified-api-reference-overview)

## [dRPC](https://drpc.org/)

<details>

<summary>Steps to use dRPC</summary>

* Login to [dRPC Dashboard](https://drpc.org/login)
* Navigate to "API Keys" section and create an API key
* Select the API and go to the "Endpoints" section
* Find Plume and copy the URL
* Sample URL: [https://lb.drpc.live/plume/{YOUR\_API\_KEY}](https://lb.drpc.live/plume/%7BYOUR_API_KEY%7D)

</details>

More details about dRPC are available [here](https://drpc.org/docs/gettingstarted/createaccount)

## [Tatum](https://tatum.io/)

<details>

<summary>Steps to use Tatum</summary>

* Log in to the [Tatum Dashboard](https://dashboard.tatum.io/)
* Navigate to the `API Keys` section and copy your existing API Key.
* Use the RPC URL and [authenticate requests](https://docs.tatum.io/docs/authentication) via HTTP header.\
  Authentication header: x-api-key: YOUR\_API\_KEY
* You can customize your RPC endpoints and monitor them too from `RPC Gateway`.
* Sample URL: [https://plume-mainnet.gateway.tatum.io](https://plume-mainnet.gateway.tatum.io/)

</details>

More details about Tatum are available [here](https://docs.tatum.io/reference/rpc-plume)


# OnRamps

## [Thirdweb Universal Bridge](https://portal.thirdweb.com/connect/pay/overview)

Thirdweb Universal Bridge allows your users to purchase cryptocurrencies and execute transactions with their credit card or debit card, or with any token via cross-chain routing.

<details>

<summary>Quick Links</summary>

**Docs:** <https://portal.thirdweb.com/pay>

**Slug:** `plume`

</details>


# Analytics

Analyze the data in all the ways you want

## [Dune](https://dune.com/)

Dune is a web-based platform that allows you to query public blockchain data and aggregate it into beautiful dashboards.

<details>

<summary>Quick Links</summary>

**Docs:** <https://docs.dune.com/home>

**Plume Dashboard:** <https://dune.com/plume/plume-dashboard>

</details>


# Custodians & Multisigs

## [Safe](https://safe.global/)

Safe is an open-source, modular smart account framework that allows developers to create multi-signature wallets, among other applications.

<details>

<summary>Quick Links</summary>

**Plume Safe:** <https://safe.onchainden.com/welcome>

**Docs:** [https://docs.safe.global](https://docs.safe.global/)

</details>

The deployed Safe contracts are available at:

{% tabs %}
{% tab title="Plume Mainnet" %}

<table><thead><tr><th width="273.09375">Contract Name</th><th>Contract Deployment Address</th></tr></thead><tbody><tr><td>CompatibilityFallbackHandler</td><td><a href="https://explorer.plume.org/address/0xfd0732dc9e303f09fcef3a7388ad10a83459ec99">0xfd0732dc9e303f09fcef3a7388ad10a83459ec99</a></td></tr><tr><td>CreateCall</td><td><a href="https://explorer.plume.org/address/0x9b35af71d77eaf8d7e40252370304687390a1a52">0x9b35af71d77eaf8d7e40252370304687390a1a52</a></td></tr><tr><td>MultiSend</td><td><a href="https://explorer.plume.org/address/0x38869bf66a61cf6bdb996a6ae40d5853fd43b526">0x38869bf66a61cf6bdb996a6ae40d5853fd43b526</a></td></tr><tr><td>MultiSendCallOnly</td><td><a href="https://explorer.plume.org/address/0x9641d764fc13c8b624c04430c7356c1c7c8102e2">0x9641d764fc13c8b624c04430c7356c1c7c8102e2</a></td></tr><tr><td>Safe</td><td><a href="https://explorer.plume.org/address/0x41675c099f32341bf84bfc5382af534df5c7461a">0x41675c099f32341bf84bfc5382af534df5c7461a</a></td></tr><tr><td>SafeL2</td><td><a href="https://explorer.plume.org/address/0x29fcb43b46531bca003ddc8fcb67ffe91900c762">0x29fcb43b46531bca003ddc8fcb67ffe91900c762</a></td></tr><tr><td>SafeMigration</td><td><a href="https://explorer.plume.org/address/0x526643f69b81b008f46d95cd5ced5ec0edffdac6">0x526643f69b81b008f46d95cd5ced5ec0edffdac6</a></td></tr><tr><td>SafeProxyFactory</td><td><a href="https://explorer.plume.org/address/0x4e1dcf7ad4e460cfd30791ccc4f9c8a4f820ec67">0x4e1dcf7ad4e460cfd30791ccc4f9c8a4f820ec67</a></td></tr><tr><td>SafeToL2Migration</td><td><a href="https://explorer.plume.org/address/0xff83f6335d8930cbad1c0d439a841f01888d9f69">0xff83f6335d8930cbad1c0d439a841f01888d9f69</a></td></tr><tr><td>SafeToL2Setup</td><td><a href="https://explorer.plume.org/address/0xbd89a1ce4dde368ffab0ec35506eece0b1ffdc54">0xbd89a1ce4dde368ffab0ec35506eece0b1ffdc54</a></td></tr><tr><td>SignMessageLib</td><td><a href="https://explorer.plume.org/address/0xd53cd0ab83d845ac265be939c57f53ad838012c9">0xd53cd0ab83d845ac265be939c57f53ad838012c9</a></td></tr><tr><td>SimulateTxAccessor</td><td><a href="https://explorer.plume.org/address/0x3d4ba2e0884aa488718476ca2fb8efc291a46199">0x3d4ba2e0884aa488718476ca2fb8efc291a46199</a></td></tr></tbody></table>
{% endtab %}

{% tab title="Plume Testnet" %}

<table><thead><tr><th width="273.09375">Contract Name</th><th>Contract Deployment Address</th></tr></thead><tbody><tr><td>CompatibilityFallbackHandler</td><td><a href="https://testnet-explorer.plume.org/address/0xfd0732dc9e303f09fcef3a7388ad10a83459ec99">0xfd0732dc9e303f09fcef3a7388ad10a83459ec99</a></td></tr><tr><td>CreateCall</td><td><a href="https://testnet-explorer.plume.org/address/0x9b35af71d77eaf8d7e40252370304687390a1a52">0x9b35af71d77eaf8d7e40252370304687390a1a52</a></td></tr><tr><td>MultiSend</td><td><a href="https://testnet-explorer.plume.org/address/0x38869bf66a61cf6bdb996a6ae40d5853fd43b526">0x38869bf66a61cf6bdb996a6ae40d5853fd43b526</a></td></tr><tr><td>MultiSendCallOnly</td><td><a href="https://testnet-explorer.plume.org/address/0x9641d764fc13c8b624c04430c7356c1c7c8102e2">0x9641d764fc13c8b624c04430c7356c1c7c8102e2</a></td></tr><tr><td>Safe</td><td><a href="https://testnet-explorer.plume.org/address/0x41675c099f32341bf84bfc5382af534df5c7461a">0x41675c099f32341bf84bfc5382af534df5c7461a</a></td></tr><tr><td>SafeL2</td><td><a href="https://testnet-explorer.plume.org/address/0x29fcb43b46531bca003ddc8fcb67ffe91900c762">0x29fcb43b46531bca003ddc8fcb67ffe91900c762</a></td></tr><tr><td>SafeMigration</td><td><a href="https://testnet-explorer.plume.org/address/0x526643f69b81b008f46d95cd5ced5ec0edffdac6">0x526643f69b81b008f46d95cd5ced5ec0edffdac6</a></td></tr><tr><td>SafeProxyFactory</td><td><a href="https://testnet-explorer.plume.org/address/0x4e1dcf7ad4e460cfd30791ccc4f9c8a4f820ec67">0x4e1dcf7ad4e460cfd30791ccc4f9c8a4f820ec67</a></td></tr><tr><td>SafeToL2Migration</td><td><a href="https://testnet-explorer.plume.org/address/0xff83f6335d8930cbad1c0d439a841f01888d9f69">0xff83f6335d8930cbad1c0d439a841f01888d9f69</a></td></tr><tr><td>SafeToL2Setup</td><td><a href="https://testnet-explorer.plume.org/address/0xbd89a1ce4dde368ffab0ec35506eece0b1ffdc54">0xbd89a1ce4dde368ffab0ec35506eece0b1ffdc54</a></td></tr><tr><td>SignMessageLib</td><td><a href="https://testnet-explorer.plume.org/address/0xd53cd0ab83d845ac265be939c57f53ad838012c9">0xd53cd0ab83d845ac265be939c57f53ad838012c9</a></td></tr><tr><td>SimulateTxAccessor</td><td><a href="https://testnet-explorer.plume.org/address/0x3d4ba2e0884aa488718476ca2fb8efc291a46199">0x3d4ba2e0884aa488718476ca2fb8efc291a46199</a></td></tr></tbody></table>
{% endtab %}
{% endtabs %}

## [Den’s Onchain Custody (Exclusive)](https://docsend.com/view/dzbpj424fpykb945)

Onchain Custody is a more secure alternative to MPC and custody.

Den is providing Plume projects exclusive early access to Onchain Custody to secure their assets sooner. Plume projects will receive:

* Preferential pricing
* Priority support and SLAs
* Direct engineering support
* Optional self-hosted environments

<details>

<summary>Quick Links</summary>

**Docs:** <https://docsend.com/view/dzbpj424fpykb945>

**Learn more:** <https://calendly.com/onchainden/30min>

</details>


# Web3 Toolkits

## [Tenderly](https://dashboard.tenderly.co/)

**Tenderly** is an **all-in-one Web3 development platform** that accelerates smart contract development and provides a fully integrated developer experience. It combines in-depth debugging tools with observability and blockchain infrastructure.

<details>

<summary>Quick Links</summary>

**Get Started:** [https://dashboard.tenderly.co](https://dashboard.tenderly.co/)

**Docs:** [https://docs.tenderly.co](https://docs.tenderly.co/)

</details>


# Misc Tools

## [Viem](https://viem.sh/)

Viem is a TypeScript interface for Ethereum that provides low-level stateless primitives for interacting with Ethereum.

<details>

<summary>Quick Links</summary>

Plume Mainnet: <https://github.com/wevm/viem/blob/main/src/chains/definitions/plumeMainnet.ts>

Plume Testnet: <https://github.com/wevm/viem/blob/main/src/chains/definitions/plumeSepolia.ts>

</details>

## [Delegate Registry v2](https://delegate.xyz/)

**Delegate Registry v2** is a permissionless on-chain protocol that lets users securely assign rights between wallets—without ever transferring assets. It powers safe and flexible participation in everything from airdrops and minting to governance and gameplay, all without compromising cold wallet security.

<details>

<summary>Quick Links</summary>

**Docs:** <https://docs.delegate.xyz/>

</details>


# Plume vs. Ethereum

Plume is an EVM-compatible blockchain, and most smart contract developers will not notice any differences with Ethereum. This page outlines some of the differences between Plume and Ethereum, which are similar to the [differences between Arbitrum and Ethereum](https://docs.arbitrum.io/build-decentralized-apps/arbitrum-vs-ethereum/comparison-overview).

### Gas and Fees

There is a fee for executing a transaction on Plume, just like on Ethereum. The difference is that Plume transactions must pay an extra fee to cover the cost of batch posting to Ethereum. More details are available in [Gas and Fees](/plume/developers/gas-and-fees).

### Block gas limit, numbers, and time

#### Block gas limit

When submitting a transaction to Plume, users pay for both execution on Plume and the cost of posting calldata to Ethereum. This dual cost structure results in a higher gas limit than pure execution alone. The total gas limit of an Plume block includes all transaction gas limits, accounting for Ethereum data costs. To manage potential cost variations, Ethereum assigns a much larger artificial gas limit, but the actual execution gas limit is capped at 32 million. This discrepancy explains why a block’s reported gas limit may appear inflated despite the effective execution costs.

#### Block numbers

Plume assigns its own block numbers, distinct from Ethereum’s, with multiple Plume blocks potentially fitting within a single Ethereum block. However, each Plume block is always associated with exactly one Ethereum block. In Plume smart contracts, querying `block.number` returns a value close to the L1 Ethereum block number when the sequencer received the transaction, though it may not be exact. Timing assumptions based on block numbers are reliable over several hours but not within minutes, similar to Ethereum.

Plume blocks start at 0 from genesis and increase sequentially, with the sequencer determining block transitions based on transaction activity. Blocks are produced as needed, meaning block production may be sporadic during hours of low activity. When querying a Plume node’s RPC, transaction receipts return the Plume block number, with the corresponding Ethereum block number available in the `l1BlockNumber` field.

#### Block timestamps

Block timestamps on Plume are determined by the sequencer’s clock and are independent of the timestamp of the Ethereum block. Each Plume block timestamp must be equal to or greater than the previous one and must fall within set boundaries—no more than 24 hours in the past or one hour in the future. Since the sequencer may experience delays in posting batches to Ethereum, it has limited flexibility to adjust timestamps within the defined boundaries to maintain chain stability and prevent reorganization.

### RPC methods[​](https://docs.arbitrum.io/build-decentralized-apps/arbitrum-vs-ethereum/comparison-overview#rpc-methods) <a href="#rpc-methods" id="rpc-methods"></a>

Most of the RPC methods available on Plume behave exactly the same as the methods do on Ethereum. However, some methods may result in a different output or add more information on Plume.  These methods behave the same as they do on Arbitrum, so information about the exact differences is available on [Arbitrum's documentation of RPC methods](https://docs.arbitrum.io/build-decentralized-apps/arbitrum-vs-ethereum/rpc-methods).

### Solidity Support

Smart contracts on Plume mostly behave the same as they do on Ethereum. However, some properties and functions on Solidity smart contracts return a different result on Plume. The operations that return a different result are the same as Arbitrum's, so more information is available on [Arbitrum's documentation of Solidity support](https://docs.arbitrum.io/build-decentralized-apps/arbitrum-vs-ethereum/solidity-support).

### Cross-chain messaging[​](https://docs.arbitrum.io/build-decentralized-apps/arbitrum-vs-ethereum/comparison-overview#cross-chain-messaging) <a href="#cross-chain-messaging" id="cross-chain-messaging"></a>

Arbitrary messages can be passed from Ethereum to Plume. These are commonly known as "parent chain to child chain messages". Developers using this functionality should familiarize themselves with how they work. Find more information about it in [Parent chain to child chain messaging](https://docs.arbitrum.io/how-arbitrum-works/l1-to-l2-messaging).

Similarly, Plume can also send messages to Ethereum. Find more information about them in [Child chain to parent chain messaging and the outbox](https://docs.arbitrum.io/how-arbitrum-works/l2-to-l1-messaging).

### Precompiles[​](https://docs.arbitrum.io/build-decentralized-apps/arbitrum-vs-ethereum/comparison-overview#precompiles) <a href="#precompiles" id="precompiles"></a>

Plume supports all precompiles available in both Ethereum and Arbitrum, with methods smart contracts can call the same way they can Solidity functions. You can find a full reference of them in [Precompiles](https://docs.arbitrum.io/build-decentralized-apps/precompiles/overview).

### NodeInterface[​](https://docs.arbitrum.io/build-decentralized-apps/arbitrum-vs-ethereum/comparison-overview#nodeinterface) <a href="#nodeinterface" id="nodeinterface"></a>

Plume includes a special `NodeInterface` contract available at address `0xc8` that is only accessible via RPCs (it's not actually deployed on-chain, and thus can't be called by smart contracts). Find more information about this interface in [NodeInterface](https://docs.arbitrum.io/build-decentralized-apps/nodeinterface/overview).


# Gas and Fees

Gas is used by Plume to track the cost of executing a transaction. It works the same as Ethereum gas, in the sense that every EVM instruction costs the same amount of gas that it would on Ethereum. Plume's gas calculations are very similar to [Arbitrum's gas calculations](https://docs.arbitrum.io/how-arbitrum-works/gas-fees), but gas is paid in $PLUME rather than in $ETH.

There are two parties a user pays when submitting a tx:

* the poster, if reimbursable, for Ethereum resources such as the Ethereum calldata needed to post the tx
* the network fee account for Plume resources, which include the computation, storage, and other burdens Plume nodes must bear to service the tx

The Ethereum component is the product of the Transaction's estimated contribution to its Batch's size — computed using Brotli on the transaction by itself — and Plume's view of Ethereum's data price, a value which dynamically adjusts over time to ensure the batch-poster is ultimately fairly compensated.

The Plume component consists of the traditional fees Geth would pay to stakers in Ethereum, such as the computation and storage charges applying the State Transition Function entails. Plume charges additional fees for executing Plume-specific precompiles, whose fees are dynamically priced according to the specific resources used while executing the call.

### Ethereum gas pricing[​](https://docs.arbitrum.io/how-arbitrum-works/gas-fees#parent-chain-gas-pricing) <a href="#parent-chain-gas-pricing" id="parent-chain-gas-pricing"></a>

Plume dynamically prices Ethereum gas, with the price adjusting to ensure that the amount collected in Ethereum gas fees is as close as possible to the costs that must be covered, over time. Ethereum costs include batch posting costs and rewards.

* Batch posting costs reflect the actual cost incurred by a batch poster when submitting batch data to Ethereum. Each time a batch is posted, the Ethereum contract sends a "batch posting report" to the Plume, detailing who paid for the batch and the basefee at the time. This report enters Plume's Delayed Inbox and is processed after a delay. Upon arrival, Plume calculates the batch cost by multiplying the reported basefee by the batch's data cost. The pricer then records the amount due to the batch submitter.
* Optional per-unit rewards can be set for handling transaction calldata, which may be paid to the Sequencer or any other party incurring per-byte costs. The Ethereum pricer tracks and updates the funds due to the designated reward recipient as batch posting reports arrive.

Ethereum calldata fees arise because the Sequencer or batch poster incurs gas costs when posting transactions on Ethereum as calldata. These fees are credited to the batch poster to offset expenses. Every transaction routed through the Sequencer pays a calldata fee, whereas transactions from the delayed inbox do not, as they already pay Ethereum gas fees when inserted into the delayed inbox. The Ethereum pricing algorithm determines this fee by estimating a transaction’s size, considering its compressibility, and multiplying it by the current price per byte. The cost is then converted into Plume gas units, resulting in a "poster fee" for the transaction. A dynamic pricing algorithm adjusts the per-byte price based on the balance between collected fees and actual costs incurred by batch posters, increasing or decreasing prices to maintain equilibrium.

### Plume gas pricing[​](https://docs.arbitrum.io/how-arbitrum-works/gas-fees#child-chain-gas-pricing) <a href="#child-chain-gas-pricing" id="child-chain-gas-pricing"></a>

The gas price on Plume has a set floor, which can be queried via [ArbGasInfo](https://phoenix-explorer.plumenetwork.xyz/address/0x000000000000000000000000000000000000006C)'s `getMinimumGasPrice` method. Estimating Plume gas can be done via a Plume Node’s `eth_estimateGas` RPC, which returns a value sufficient to cover the full transaction fee at Plume's current gas price. Multiplying this value by the Plume gas price gives the total Ether required for a transaction. Since Ethereum calldata prices fluctuate, the estimate may change over time. Alternatively, calling `NodeInterface.gasEstimateComponents()` provides the gas limit for a transaction, with the total cost calculated by multiplying the gas estimate by the Plume basefee.

Plume gas fees function similarly to Ethereum’s gas system, where the gas used by a transaction is multiplied by the current basefee to determine the total fee. The basefee is managed by an "exponential mechanism" similar to Ethereum’s EIP-1559, adjusting based on network usage. It compares gas consumption to a speed limit, currently set at 7,000,000 gas per second on Plume Mainnet, and maintains a backlog that increases when gas is used and decreases every second by the speed limit amount. If the backlog grows, the basefee rises to slow gas usage; if it shrinks, the basefee decreases to allow more transactions. The basefee follows an exponential function of the backlog, where parameters control how quickly the price escalates.

Transaction prioritization on Plume follows a first-come, first-served basis, meaning tips are ignored, and users always pay the basefee regardless of any tip amount.

### Total fee and gas estimation[​](https://docs.arbitrum.io/how-arbitrum-works/gas-fees#total-fee-and-gas-estimation) <a href="#total-fee-and-gas-estimation" id="total-fee-and-gas-estimation"></a>

The total fee charged to a transaction is the Plume basefee, multiplied by the sum of the Plume gas used plus the Ethereum calldata charge. As on Ethereum, a transaction will fail if it fails to supply enough gas, or if it specifies a basefee limit that is below the current basefee. Ethereum also allows a "tip" but Plume ignores this field and never collects any tips.


# Finality

Finality in blockchain systems refers to the point at which a transaction becomes irreversible and permanently included in the blockchain's ledger. Plume offers two levels of finality.

#### Soft Finality[​](https://docs.arbitrum.io/how-arbitrum-works/sequencer#soft-finality) - 1 block (\~250 ms) <a href="#soft-finality" id="soft-finality"></a>

Soft finality refers to the preliminary confirmation of transactions based on the Sequencer's real-time feed. It occurs as soon as the sequencer orders the transaction in its off-chain inbox, locally executes it using the Plume VM, and gives a transaction receipt back to the client. Key characteristics include:

* **Immediate Confirmation**: Transactions are confirmed almost instantly as they are accepted and ordered by the Sequencer. This typically takes \~250 ms and doesn't require any other on-chain confirmations.
* **Provisional Assurance**: The confirmations are provisional and rely on the Sequencer's integrity and availability. That is, a malicious or faulty Sequencer could deviate between what it promised in the transaction receipt and what is ultimately published in a batch.
* **High Performance**: Enables applications to offer rapid responses and real-time interactions, enhancing user experience.

#### Hard Finality[​](https://docs.arbitrum.io/how-arbitrum-works/sequencer#hard-finality) - 64 blocks after posting to Ethereum (\~30 minutes) <a href="#hard-finality" id="hard-finality"></a>

Hard finality occurs when batched transactions get posted to Ethereum. These batches are typically posted every few minutes during normal traffic on Plume, after which the transaction inherits the full security of Ethereum. It's recommended to wait for two Ethereum epochs, or 64 blocks, to minimize the chances of any potential re-orgs happening on Ethereum. Key characteristics include:

* **Strong Security Guarantees**: When included in blocks on Ethereum, transactions inherit Ethereum's security assurances.
* **Decentralized Assurance**: Anyone, including yourself, can run a Plume validator node to confirm that the L1 batch is legitimate. Only a single well-behaved validator is needed to ensure that the transaction is finalized.
* **Data Availability**: All transaction data is recorded on-chain, ensuring transparency and verifiability.

If any malicious validator tries to deviate from this finalized state, any honest validator can submit a fraud proof challenge within 7 days and win. Once the honest validator has succeeded in the challenge, the correct finalized state will be propagated to Ethereum. Even though the state is finalized within 30 minutes, in order to ensure that there is enough time for honest validators to challenge malicious actors, no messages will be propagated from the Ethereum outbox until after the 7 days is up. This means that withdrawals from Plume are subject to a 7-day delay.


# DeFi Strategy Shortcuts

Plume has partnered with Enso to create Shortcuts to turn crosschain DeFi strategies into atomic, gas-efficient transactions for liquidity migration and provide seamless user experience to dApps.

### Getting Started <a href="#nfpw5it9ujqw" id="nfpw5it9ujqw"></a>

Enso's battle-tested [routing engine](https://docs.enso.build/pages/build/get-started/overview) provides a standardized interface to interact with  different protocols, despite their differences.&#x20;

**Routing APIs**. Both routing APIs return a transaction object—the executable form of the route, which executes atomically, regardless of the number of steps:

* [**/route API**](https://docs.enso.build/pages/build/get-started/route): Specify input/output tokens and run optimized execution paths
* [**/bundle API**](https://docs.enso.build/pages/build/get-started/bundling-actions): Chain custom shortcut blueprints that interact with various protocols by chaining different actions

**Utility APIs.** Additional APIs bring information about:

* supported [tokens](https://docs.enso.build/pages/build/get-started/protocol-data#filter-supported-tokens) with TVL and APY values,
* [available actions](https://docs.enso.build/pages/build/reference/actions) - the unified interaction interfaces used to build routes declaratively,
* supported [projects](https://docs.enso.build/api-reference/integration/projects) and [protocols](https://docs.enso.build/pages/build/get-started/protocol-data#get-supported-protocols),
* wallet [balanaces and DeFi positions](https://docs.enso.build/pages/build/get-started/balances) for any address.

{% hint style="success" %}
You can explore supported tokens and protocols using [Enso Navigator](https://navigator.enso.build/projects?\&chainId=98866).
{% endhint %}

To explore what's possible with Enso, check out [Routing Examples](#id-2x6l0spkqgtx), and for further ideas check out the [Shortcuts Library](https://docs.enso.build/pages/build/examples/shortcuts).

#### Integration <a href="#ya8r7adbju3f" id="ya8r7adbju3f"></a>

You can integrate Enso in your UI or backends in following ways:

* [Crosschain Route Widget](https://happypath.enso.build/)—a React component and a standalone application for frictionless token transfers. Whereas You can  [integrate into your own application](https://docs.enso.build/pages/templates/cross-chain-route-widget).
* REST [API](https://docs.enso.build/pages/api-reference/overview) & [SDK](https://github.com/EnsoBuild/sdk-ts) for a more controlled setup.

### Routing Examples <a href="#id-2x6l0spkqgtx" id="id-2x6l0spkqgtx"></a>

The following examples demonstrate how to use Enso's [GET /route API](https://docs.enso.build/pages/build/get-started/route) with protocols such as Mystic, Solera, Nucleus, Tempest, Dinero, and Origin.&#x20;

#### Basic Token Swap <a href="#y5b6lxw2d9e9" id="y5b6lxw2d9e9"></a>

The simplest route you can construct with Enso is a token swap. In this example, we're creating a path from bridged USDC.e to PUSD. The result will contain:

* `route.route`: The route object with the exact path and parameters
* `route.tx`: The transaction object that can be executed on-chain

{% tabs %}
{% tab title="SDK" %}

```typescript
const client = new EnsoClient({
  apiKey: 'your-api-key'
});

const route = await client.getRouteData({
  fromAddress: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
  receiver: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
  chainId: 98866,
  amountIn: ['1000000000000000000'],
  slippage: '300',
  tokenIn: ['0x54FD4da2Fa19Cf0f63d8f93A6EA5BEd3F9C042C6'],
  tokenOut: ['0xdddD73F5Df1F0DC31373357beAC77545dC5A6f3F'],
  routingStrategy: 'router'
});

console.log("Route", route.route);
console.log("Transaction", route.tx);
```

{% endtab %}

{% tab title="cURL" %}

```bash
curl -X POST 'https://api.enso.finance/api/v1/shortcuts/route' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -d '{
    "fromAddress": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
    "receiver": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
    "chainId": 98866,
    "amountIn": ["1000000000000000000"],
    "slippage": "300",
    "tokenIn": ["0x54FD4da2Fa19Cf0f63d8f93A6EA5BEd3F9C042C6"],
    "tokenOut": ["0xdddD73F5Df1F0DC31373357beAC77545dC5A6f3F"],
    "routingStrategy": "router"
  }' | jq
```

{% endtab %}
{% endtabs %}

#### Mystic Vaults: Depositing PLUME for myUSDC <a href="#tvugfc7g55rw" id="tvugfc7g55rw"></a>

The following call will construct a route for depositing **PLUME** (`tokenIn=0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE`) as a collateral to get **myUSDC** (`tokenOut=0x6c92efa3F77760619bb13d395836415ac18C86dc`), with receiver address getting all output tokens.

Under the hood, the route designs two operations:

* swap PLUME (input token) for USDC.e
* deposit USDC.e into the myUSDC pool, interacting with primary `0xCE192A6E105cD8dd97b8Dedc5B5b263B52bb6AE0`

{% hint style="success" %}
The exact route is determined at runtime, and optimized against current market conditions.
{% endhint %}

Explore [Mystic Positions](https://navigator.enso.build/tokens?chainId=98866\&project=mystic).

{% tabs %}
{% tab title="SDK" %}

```typescript
const routeData = await client.getRouteData({
  fromAddress: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
  receiver: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
  chainId: 98866,
  amountIn: ['1000000000000000000'],
  slippage: '300',
  tokenIn: ['0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'],
  tokenOut: ['0x6c92efa3F77760619bb13d395836415ac18C86dc'],
  routingStrategy: 'router'
});

console.log("Route", route.route);
console.log("Transaction", route.tx);
```

{% endtab %}

{% tab title="cURL" %}

```bash
curl -X POST 'https://api.enso.finance/api/v1/shortcuts/route' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -d '{
    "fromAddress": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
    "receiver": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
    "chainId": 98866,
    "amountIn": ["1000000000000000000"],
    "slippage": "300",
    "tokenIn": ["0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"],
    "tokenOut": ["0x6c92efa3F77760619bb13d395836415ac18C86dc"],
    "routingStrategy": "router"
  }' | jq
```

{% endtab %}
{% endtabs %}

#### Solera: Depositing PLUME for aPlunALPHA <a href="#id-7m7tfee9rjmk" id="id-7m7tfee9rjmk"></a>

The following call will generate a route for depositing **PLUME** `tokenIn=0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` as a collateral to get **aPlunALPHA** `tokenOut=0x5d0EC9B10e6759719CeFE14b8c881634678b32f2`, with receiver address getting all output tokens.

In this multi-step process, Enso saves you 2 transactions by constructing a route with:

* swap **PLUME** for **PUSD** using enso.swap action
* deposit **PUSD** into **NALPHA** Nucleus pool, interacting with primary `0xc9f6a492fb1d623690dc065bbced6dfb4a324a35`
* deposit **NALPHA** into the **Solera** pool, interacting with primary `0x5d0ec9b10e6759719cefe14b8c881634678b32f2`

Check out supported [Solera Vaults](https://navigator.enso.build/tokens?chainId=98866\&project=solera).

{% tabs %}
{% tab title="SDK" %}

```typescript
const routeData = await client.getRouteData({
  fromAddress: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
  receiver: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
  chainId: 98866,
  amountIn: ['1000000000000000'],
  slippage: '300',
  tokenIn: ['0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'],
  tokenOut: ['0x5d0EC9B10e6759719CeFE14b8c881634678b32f2'],
  routingStrategy: 'router'
});
```

{% endtab %}

{% tab title="cURL" %}

```bash
curl -X POST 'https://api.enso.finance/api/v1/shortcuts/route' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -d '{
    "fromAddress": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
    "receiver": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
    "chainId": 98866,
    "amountIn": ["1000000000000000"],
    "slippage": "300",
    "tokenIn": ["0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"],
    "tokenOut": ["0x5d0EC9B10e6759719CeFE14b8c881634678b32f2"],
    "routingStrategy": "router"
  }' | jq
```

{% endtab %}
{% endtabs %}

#### Nucleus: Depositing USDC.e into an nYIELD Vault <a href="#id-6uxukvvwf9aj" id="id-6uxukvvwf9aj"></a>

The following call will design a route for depositing USDC `tokenIn=0x78adD880A697070c1e765Ac44D65323a0DcCE913` as a collateral to get **nYIELD** `tokenOut=0x892dFF5257B39F7AFb7803Dd7C81E8ecDB6af3E8`, with receiver address getting all output tokens.

The internal mechanics of this route include:

* swap **USDC** for **PUSD** using enso.swap action
* deposit **PUSD** into **nYIELD** Nucleus pool, interacting with primary `0x92a735f600175fe9ba350a915572a86f68ebbe66` to get **nUSDY**

Browse through [Nucleus positions](https://navigator.enso.build/tokens?chainId=98866\&project=nucleus).

{% tabs %}
{% tab title="SDK" %}

```typescript
const routeData = await client.getRouteData({
  fromAddress: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
  receiver: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
  chainId: 98866,
  amountIn: ['1000000000'],
  slippage: '300',
  tokenIn: ['0x78adD880A697070c1e765Ac44D65323a0DcCE913'],
  tokenOut: ['0x892DFf5257B39f7afB7803dd7C81E8ECDB6af3E8'],
  routingStrategy: 'delegate'
});
console.log("Route", route.route);
console.log("Transaction", route.tx);
```

{% endtab %}

{% tab title="cURL" %}

```bash
curl -X POST 'https://api.enso.finance/api/v1/shortcuts/route' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -d '{
    "fromAddress": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
    "receiver": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
    "chainId": 98866,
    "amountIn": ["1000000000"],
    "slippage": "300",
    "tokenIn": ["0x78adD880A697070c1e765Ac44D65323a0DcCE913"],
    "tokenOut": ["0x892DFf5257B39f7afB7803dd7C81E8ECDB6af3E8"],
    "routingStrategy": "delegate"
  }' | jq
```

{% endtab %}
{% endtabs %}

#### Tempest: Depositing USDC.e into a Tempest Vault <a href="#id-7l2n4ch4sdsi" id="id-7l2n4ch4sdsi"></a>

At the protocol level, the route maps:

* swap **USDC.e** for **PUSD** using enso.swap action
* deposit **PUSD** into Tempest pool, interacting with primary `0x3c4f9804ce0810821f61289eb4f92c8e5007c119`

Explore [Tempest Positions](https://navigator.enso.build/tokens?chainId=98866\&project=tempest).

{% tabs %}
{% tab title="SDK" %}

```typescript
const routeData = await client.getRouteData({
  fromAddress: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
  receiver: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
  chainId: 98866,
  amountIn: ['1000000000'],
  slippage: '300',
  tokenIn: ['0x78adD880A697070c1e765Ac44D65323a0DcCE913'],
  tokenOut: ['0x3C4F9804ce0810821F61289Eb4F92c8E5007c119'],
  routingStrategy: 'delegate'
});
console.log("Route", route.route);
console.log("Transaction", route.tx);
```

{% endtab %}

{% tab title="cURL" %}

```bash
curl -X POST 'https://api.enso.finance/api/v1/shortcuts/route' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -d '{
    "fromAddress": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
    "receiver": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
    "chainId": 98866,
    "amountIn": ["1000000000"],
    "slippage": "300",
    "tokenIn": ["0x78adD880A697070c1e765Ac44D65323a0DcCE913"],
    "tokenOut": ["0x3C4F9804ce0810821F61289Eb4F92c8E5007c119"],
    "routingStrategy": "delegate"
  }' | jq
```

{% endtab %}
{% endtabs %}

#### Dinero: Staking PLUME for pETH <a href="#s32bxl541tdb" id="s32bxl541tdb"></a>

This call will generate a route for staking Plume as a collateral to get **pETH**.

The route will swap **PLUME** for **PUSD** using `enso.swap` action, and deposit **PUSD** into the Dinero pool, interacting with primary `0x3c4f9804ce0810821f61289eb4f92c8e5007c119`.

Explore [Dinero Positions](https://navigator.enso.build/tokens?chainId=98866\&project=dinero).

{% tabs %}
{% tab title="SDK" %}

```typescript
const routeData = await client.getRouteData({
  fromAddress: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
  receiver: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
  chainId: 98866,
  amountIn: ['1000000000'],
  slippage: '300',
  tokenIn: ['0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'],
  tokenOut: ['0x39d1F90eF89C52dDA276194E9a832b484ee45574'],
  routingStrategy: 'delegate'
});
console.log("Route", route.route);
console.log("Transaction", route.tx);
```

{% endtab %}

{% tab title="cURL" %}

```bash
curl -X POST 'https://api.enso.finance/api/v1/shortcuts/route' \
  -H 'Content-Type: application/json' \
  -d '{
    "fromAddress": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
    "receiver": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
    "chainId": 98866,
    "amountIn": ["100000000000"],
    "slippage": 300,
    "tokenIn": ["0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"],
    "tokenOut": ["0x39d1F90eF89C52dDA276194E9a832b484ee45574"],
    "routingStrategy": "delegate"
  }'
```

{% endtab %}
{% endtabs %}

#### Origin: Depositing USDC.e into an Origin Vault <a href="#id-7xl515rf4jhe" id="id-7xl515rf4jhe"></a>

This call will generate a route for depositing USDC.e as a collateral to get SUPEROETH, encapsulating the following steps:

* swap USDC.e for WETH using enso.swap action
* deposit PUSD into the Origin pool, interacting with primary

{% tabs %}
{% tab title="SDK" %}

```typescript
const routeData = await client.getRouteData({
  fromAddress: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
  receiver: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
  chainId: 98866,
  amountIn: ['1000000000'],
  slippage: '300',
  tokenIn: ['0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'],
  tokenOut: ['0x39d1F90eF89C52dDA276194E9a832b484ee45574'],
  routingStrategy: 'delegate'
});
console.log("Route", route.route);
console.log("Transaction", route.tx);
```

{% endtab %}

{% tab title="cURL" %}

```bash
curl -X POST 'https://api.enso.finance/api/v1/shortcuts/route' \
  -H 'Content-Type: application/json' \
  -d '{
    "fromAddress": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
    "receiver": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
    "chainId": 98866,
    "amountIn": ["100000000000"],
    "slippage": 300,
    "tokenIn": ["0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"],
    "tokenOut": ["0x39d1F90eF89C52dDA276194E9a832b484ee45574"],
    "routingStrategy": "delegate"
  }'
```

{% endtab %}
{% endtabs %}

Explore [Origin Positions](https://navigator.enso.build/tokens?chainId=98866\&project=origin-protocol).

#### Rooster: Depositing PUSD into a Rooster pool <a href="#jkemfzxik2pv" id="jkemfzxik2pv"></a>

This example requests a route for depositing PUSD into a Rooster pool, with the following steps:

* split PUSD to NALPHA and PUSD using the enso.split action
* deposit NALPHA and PUSD into the Rooster pool, interacting with primary 0xfc3bd0e01b4e755aedd2a4087ccdb90c4d28f038

Explore [Rooster Pools](https://navigator.enso.build/tokens?chainId=98866\&project=rooster).

{% tabs %}
{% tab title="SDK" %}

```javascript
const routeData = await client.getRouteData({
  fromAddress: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
  receiver: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
  chainId: 98866,
  amountIn: ['1000000000'],
  slippage: '300',
  tokenIn: ['0xdddd73f5df1f0dc31373357beac77545dc5a6f3f'],
  tokenOut: ['0xfc3bd0e01b4e755aedd2a4087ccdb90c4d28f038'],
  routingStrategy: 'delegate'
});
console.log("Route", route.route);
console.log("Transaction", route.tx);
```

{% endtab %}

{% tab title="cURL" %}

```bash
curl -X POST 'https://api.enso.finance/api/v1/shortcuts/route' \
  -H 'Content-Type: application/json' \
  -d '{
    "amountIn": "100000000000",
    "tokenIn": "0xdddd73f5df1f0dc31373357beac77545dc5a6f3f",
    "tokenOut": "0xfc3bd0e01b4e755aedd2a4087ccdb90c4d28f038",
    "slippage": 25,
    "fromAddress": "0x93621DCA56fE26Cdee86e4F6B18E116e9758Ff11",
    "receiver": "0x93621DCA56fE26Cdee86e4F6B18E116e9758Ff11",
    "spender": "0x93621DCA56fE26Cdee86e4F6B18E116e9758Ff11",
    "routingStrategy": "router",
    "chainId": 98866
  }' | jq
```

{% endtab %}
{% endtabs %}

#### Nest: Depositing PUSD into a Nest Alpha Vault for NALPHA <a href="#th4ix27c4c4r" id="th4ix27c4c4r"></a>

This example requests a route for depositing PUSD into a Rooster pool, with the following steps:

* swap **PUSD** for **WETH** using the `enso.swap` action
* deposit **WETH** into the Nest pool, interacting with primary `0xc9f6a492fb1d623690dc065bbced6dfb4a324a35`

{% tabs %}
{% tab title="SDK" %}

```javascript
const routeData = await client.getRouteData({
  fromAddress: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
  receiver: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
  chainId: 98866,
  amountIn: ['1000000000'],
  slippage: '300',
  tokenIn: ['0xca59ca09e5602fae8b629dee83ffa819741f14be'],
  tokenOut: ['0x593ccca4c4bf58b7526a4c164ceef4003c6388db'],
  routingStrategy: 'delegate'
});
console.log("Route", route.route);
console.log("Transaction", route.tx);
```

{% endtab %}

{% tab title="cURL" %}

```bash
curl -X POST 'https://api.enso.finance/api/v1/shortcuts/route' \
  -H 'Content-Type: application/json' \
  -d '{
    "amountIn": "100000000000",
    "tokenIn": "0xca59ca09e5602fae8b629dee83ffa819741f14be",
    "tokenOut": "0x593ccca4c4bf58b7526a4c164ceef4003c6388db",
    "slippage": 25,
    "fromAddress": "0x93621DCA56fE26Cdee86e4F6B18E116e9758Ff11",
    "receiver": "0x93621DCA56fE26Cdee86e4F6B18E116e9758Ff11",
    "spender": "0x93621DCA56fE26Cdee86e4F6B18E116e9758Ff11",
    "routingStrategy": "router",
    "chainId": 98866
  }' | jq
```

{% endtab %}
{% endtabs %}

### Resources <a href="#ekshrbdtzrk5" id="ekshrbdtzrk5"></a>

* [Enso Website](https://enso.build/)
* [Crosschain Route Widget](https://happypath.enso.build/)
* [Developer Docs](https://docs.enso.build/)
* [Shortcuts Library](https://docs.enso.build/pages/build/examples/shortcuts)


# Community Channels

Join the Plume community and help shape the future of real world asset finance.

At Plume, we believe that building the future of finance is a collaborative journey. Our community channels provide a space for developers, users, and enthusiasts to connect, share ideas, and contribute to Plume’s evolution. Whether you’re a seasoned developer or new to blockchain, our community is open to anyone interested in real world asset finance.

## **Connect with Us**

### Discord

Join our Discord server for technical discussions, development updates, and community events. This is where developers can connect with the Plume team, get support, and engage with other community members on everything from technical help to brainstorming new ideas.

<https://discord.com/invite/plume-network>

### Twitter and Farcaster

Follow us on Twitter and Farcaster for real-time updates, announcements, and insights. We post news, industry trends, and details on upcoming Plume events and feature releases, keeping our followers in the loop on Plume’s progress.

* <https://twitter.com/plumenetwork>
* <https://warpcast.com/plumenetwork>

### Telegram

Follow us on Telegram for real-time updates, announcements, and insights.&#x20;

* Subscribe to notifications: <https://t.me/plumenetwork>
* Join to chat with the community: <https://t.me/plumenetwork_community>

### More official channels

* Binance Square: <https://www.binance.com/en/square/profile/plume>
* Link3: <https://link3.to/plumenetwork>
* Goon Twitter: <https://twitter.com/plumegoon>&#x20;
* LinkedIn: <https://www.linkedin.com/company/plume-network>
* CoinMarketCap: <https://coinmarketcap.com/community/profile/plumenetwork/>
* YouTube: <https://www.youtube.com/@plume-network>


# Brand Assets

Access and download Plume's official brand assets

Plume's official brand assets are [available on our website](https://www.plume.org/media-kit). This includes:

* Logo variations and usage guidelines
* Color scales, including core and secondary colors
* Typeface specifications

For logos, you may also download PNG and SVG packs directly from here.

\--

{% file src="/files/ty9TGSeUqiOMA29WmefG" %}

{% file src="/files/nldkWVgEieIVCP8wRwW8" %}


# Changelog

Welcome to the Plume documentation changelog - this page tracks all notable updates to the docs, features, developer tools, and community resources in the Plume ecosystem.

{% updates format="full" %}
{% update date="2026-02-05" %}

## ArbOS 51 Upgrade Completion

Plume Mainnet and Testnet have successfully completed the migration to ArbOS 51.

#### **Key Updates**

* Updated `chainInfo.json` is now available for both networks. Node operators should refresh their configurations to match the latest documentation.
* Ensure your nodes are running `v3.9.5` to support ArbOS 51.

{% hint style="info" %}
Full node setup and updated config snippets are available at [How to Run a Node](/plume/developers/how-to-guides/how-to-run-a-node).
{% endhint %}
{% endupdate %}

{% update date="2026-01-28" %}

## Node Upgrade v3.9.5: ArbOS 51/40 Support

We have released a critical node upgrade to support ArbOS 51 (Dia) and ArbOS 40 (Callisto). This update brings significant improvements from the Ethereum Fusaka and Pectra upgrades to Plume Network, including native account abstraction and cheaper cryptographic operations.

#### Migration Checklist

* **Update Docker Image:** \
  All external node operators must update their Nitro node image to the latest recommended version: `offchainlabs/nitro-node:v3.9.5-66e42c4-validator`&#x20;
  * This image includes `split-val-entry.sh` to automatically run both v3.9.5 and v3.7.6 workers, standard validators should use this by default. Custom split-validator setups must manually run both worker versions. More details can be found at [Offchain Labs Nitro v3.9.5 Release Notes](https://github.com/OffchainLabs/nitro/releases/tag/v3.9.5)
* **Update Configuration:** \
  Following the activation, Plume will provide an updated `chainInfo.json`. It is recommended to swap to this new config file for your external node to ensure long-term compatibility.

#### What’s Included

* **ArbOS 40 (Callisto):**
  * EIP-7702: Native Account Abstraction (Set EOA account code).
  * EIP-2537: BLS12-381 precompile support for cheaper zkSNARKs.
  * EIP-2935: Historical block hash access.
* **ArbOS 51 (Dia):**
  * Native Token Mint/Burn: Unlocks path for native asset management.
  * EIP-7825: Transaction gas limit cap for efficient gas usage.
  * Optimization: Opcode changes making EVM cryptographic operations cheaper.

#### Readiness Schedule

Nodes must be upgraded before the following activation dates:

* Plume Testnet: Monday, February 2, 2026
* Plume Mainnet: Thursday, February 5, 2026

#### **Troubleshooting**

If your node stops syncing after the upgrade, please use the [latest snapshot](https://docs.plume.org/plume/developers/how-to-guides/how-to-run-a-node#node-snapshot) to sync from the most recent block state.

{% hint style="info" %}
Full node setup and updated config snippets are available at [How to Run a Node](/plume/developers/how-to-guides/how-to-run-a-node).
{% endhint %}
{% endupdate %}

{% update date="2025-12-03" %}

## Node Upgrade v3.9.3 & AnyTrust Migration

Upgraded the Plume node to Offchain Labs `v3.9.3`. This critical update migrates our Data Availability layer from Celestia to AnyTrust DA and introduces support for ArbOS 51 and the Ethereum Fusaka upgrade.&#x20;

#### Migration Checklist

* **Update Docker Image** \
  Switch to: `offchainlabs/nitro-node:v3.9.3-8bc5554`
* **Remove Old Flags:** \
  Delete the following flags from your node configuration:

```yaml
--node.da-provider.enable
--node.da-provider.rpc.url
--node.da-provider.with-writer
--node.data-availability.enable
```

* **Add New Flags:**\
  Add the following flags (replace URLs for testnet if necessary):

```yaml
--node.data-availability.enable=true
--node.data-availability.parent-chain-node-url=<YOUR L1 RPC>
--node.data-availability.rest-aggregator.urls=http://das-plume-mainnet-1.t.conduit.xyz
```

* **Delete Legacy Resources:**\
  Remove `celestia-das-server`, `daprovider`, and any other Celestia-related containers.
* **Restore Snapshot:**\
  If your node is out of sync, download the [latest snapshot](/plume/developers/how-to-guides/how-to-run-a-node#node-snapshot)

{% hint style="info" %}
Full node setup and config available at [How to Run a Node](/plume/developers/how-to-guides/how-to-run-a-node)
{% endhint %}

**Note:** To avoid breaking changes while migrating to the Fusaka upgrade, properly syncing all historical blob data is essential. Ensure your node is using an updated Beacon RPC that retains all historical blob data. This guarantees that your Nitro node can sync from periods beyond the standard blob retention limit. For more details on Beacon node historical data, please refer to the documentation: <https://docs.arbitrum.io/run-arbitrum-node/beacon-nodes-historical-blobs>
{% endupdate %}
{% endupdates %}


# Glossary

Understand key terms in the Plume ecosystem.

**RWA (Real World Asset)**: Assets that exist in the physical or traditional financial world, such as real estate, commodities, or intellectual property, which are tokenized on the blockchain to increase liquidity, accessibility, and flexibility.

**RWAfi**: Short for Real World Asset Finance, a DeFi ecosystem focused on trading, earning, and speculating with tokenized RWAs.

**Tokenization**: The process of converting an asset into a digital token on the blockchain, enabling ownership, trading, and management onchain.

**Smart Wallet**: A blockchain wallet with programmable functionalities, allowing users to interact with smart contracts, earn yield, and manage digital assets directly from their wallets.

**KYC (Know Your Customer)**: A compliance process used to verify the identity of users in alignment with regulatory requirements.

**AML (Anti-Money Laundering)**: Regulatory processes and practices used to prevent money laundering and fraudulent activities in financial transactions.

**Liquidity**: The ability to buy, sell, or trade an asset without significantly affecting its price; high liquidity means assets can be traded quickly and easily.

**DeFi (Decentralized Finance)**: Financial applications built on blockchain that allow users to borrow, lend, trade, and earn interest without traditional intermediaries.

**Plume Devnet**: A sandbox testing environment for developers to experiment with and build RWA solutions on the Plume platform before moving to mainnet.

**Mainnet**: The fully deployed version of a blockchain network, where actual transactions and applications are live and operational.


# FAQ

Get answers to common questions.

**What is Plume?**

Plume is an innovative modular blockchain network designed to support Real World Assets (RWAs) in a crypto-native, DeFi-compatible ecosystem.

**How does Plume handle compliance for RWA transactions?**

Plume integrates AML compliance at the chain level to verify users and asset transactions, ensuring regulatory alignment across all RWA interactions.

**What can I do on the Plume Testnet?**

The Plume Testnet is a testing environment where developers can experiment with tokenizing assets, smart contract deployment, compliance modules, and more, all without risk before going live on the mainnet.

**What types of assets can be tokenized on Plume?**

Plume will support tokenization of various RWAs, including real estate, commodities, luxury collectibles, data indices, and more, allowing users to engage with a wide range of onchain asset classes.

**Is Plume only for crypto-native users?**

Plume is primarily focused on serving crypto-native users initially, but the roadmap includes future integrations to bridge with traditional finance, broadening accessibility to a wider audience.

**How can I earn yield on Plume?**

Plume will offer yield-generating opportunities such as staking green assets, AI GPU staking, or agricultural asset tokenization, among others, giving users diverse avenues to earn income on tokenized RWAs.

**What kind of support is available for developers?**

Developers can join our Discord for direct support and stay tuned for future updates across our community. Check out our official [community channels](/plume/community-and-support/community-channels).

**Where can I learn more about Plume’s roadmap and future plans?**

Our roadmap will be further elaborated in the [Roadmap](/plume/introduction/roadmap) page, covering short-term goals, upcoming releases, and long-term integration with traditional finance.


