# Creating & Funding Wallets

## Wallet Funding

To trade on Delphi using the Agentic Trading Toolkit, you need two assets on the Gensyn chain:

* **ETH:** This is used for gas fees.
* **USDC:** This is the ERC-20 collateral token used for trading.

If you're starting from scratch, this page walks you through creating a wallet, funding it with ETH and USDC on Ethereum, and moving those assets to Gensyn.&#x20;

If you already have some of these pieces in place, you can skip ahead using the shortcuts below:

* **No wallet yet, or no crypto holdings:** Start at [Getting Started with a Crypto Wallet.](#getting-started-with-a-crypto-wallet)
* **Wallet with ETH and native USDC on Ethereum Mainnet:** Skip to [Manual Bridging](#manual-bridging), or let the Delphi agent handle bridging automatically.
* **Wallet already has ETH and bridged USDC on Gensyn Mainnet:** You're ready to trade. See the [agent documentation](/tech/agentic-trading/usage-guide.md) to get started.
* **Working on testnet:** Skip to [Testnet Funding.](#testnet)

The funding process differs between testnet and mainnet. Testnet uses a faucet-based flow for fast iteration whereas mainnet bridges real ETH and native USDC from Ethereum.&#x20;

For canonical network parameters (RPC URLs, chain IDs, block explorers) and OP Stack contract addresses, refer to the [OP Stack Contracts](https://docs.gensyn.network/providers/network-information#op-stack-contracts) section in the [Gensyn Network](https://docs.gensyn.network/) docs.

### Getting Started with a Crypto Wallet

To use Delphi you need a self-custody crypto wallet that holds ETH and USDC on Ethereum Mainnet. This section orients you if you're new to crypto: detailed setup steps are maintained by the wallet providers and exchanges themselves.

#### Create a Wallet

Any EVM-compatible self-custody wallet works. Two common options:

* [MetaMask](https://metamask.io/download): A browser extension and mobile app, widely supported by dApps.
* [Coinbase Wallet](https://www.coinbase.com/wallet/downloads): A browser extension and mobile app that directly integrates with Coinbase exchange accounts.

Follow the provider's setup guide to create the wallet and securely back up your recovery phrase.

#### Fund with ETH and USDC

The simplest path for most users is to buy ETH and USDC on a centralized exchange like [Coinbase](https://www.coinbase.com), then withdraw to your self-custody wallet on Ethereum Mainnet. Coinbase's [withdrawal guide](https://help.coinbase.com/en/coinbase/getting-started/crypto-education/how-to-send-crypto) walks through the process.

{% hint style="warning" %}
USDC must be native Circle-issued USDC on Ethereum Mainnet (`0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48`).&#x20;

USDC.e, axlUSDC, and other bridged variants will not work. Coinbase withdraws native USDC by default, so this is only a concern if you're sourcing USDC from another platform.
{% endhint %}

Once your wallet holds ETH and native USDC on Ethereum Mainnet, you have two options:

1. **Let the Delphi agent handle bridging automatically:** This is the default path.&#x20;
2. **Bridge manually:** Continue to [Manual Bridging](#manual-bridging) below.

### Manual Bridging

If you prefer to bridge funds yourself rather than let the agent handle it, or if you're building custom tooling against the Delphi SDK, use the flows below.

ETH bridges via the OP Stack canonical bridge. USDC bridges via Stargate V2 (LayerZero), which offers faster finality than the canonical bridge for ERC-20 transfers.

Both scripts below require `DELPHI_NETWORK=mainnet` in your `.env`.

### Testnet

On testnet, you'll bridge Sepolia ETH to Gensyn Testnet for gas, then mint mock USDC directly from a faucet contract on Gensyn Testnet.

* **Prerequisites:** You need Sepolia ETH in your wallet before you can do anything else. Testnet USDC is minted directly on Gensyn Testnet. No prior balance is needed.

#### Step 1: Get Sepolia ETH

Use a Sepolia faucet to get ETH on Ethereum Sepolia. We recommend the [Google Cloud Web3 Faucet](https://cloud.google.com/application/web3/faucet/ethereum/sepolia).

#### Step 2: Bridge ETH to Gensyn Testnet

Use the bundled script to bridge ETH from Sepolia to Gensyn Testnet via the OP Stack canonical bridge:

```bash
npx tsx scripts/bridge-eth-to-gensyn-testnet.ts <amount-eth>
# or
npm run bridge-eth-to-gensyn-testnet 0.0001
```

ETH arrives on Gensyn Testnet within a few minutes of Sepolia confirmation. The deposit appears under the **Internal txns** tab on the [Gensyn Testnet explorer](https://gensyn-testnet.explorer.alchemy.com/), not under regular Transactions.&#x20;

{% hint style="info" %}
OP Stack deposits are a special transaction type (`0x7e`) triggered by the L1 bridge rather than a user-signed L2 transaction.
{% endhint %}

#### Alternative: Call the L1 Bridge Directly

You can bypass the script and call `depositETH` directly on the Sepolia L1StandardBridge. For the contract address, see [OP Stack Contracts.](https://docs.gensyn.network/providers/network-information#op-stack-contracts)

Using Foundry's `cast`:

```bash
# Deposit 0.1 ETH to your own address on Gensyn Testnet
cast send <L1StandardBridge-Sepolia> \
  "depositETH(uint32,bytes)" 200000 "0x" \
  --value 0.1ether \
  --rpc-url https://ethereum-sepolia-rpc.publicnode.com \
  --private-key $PRIVATE_KEY

# Deposit to a different address
cast send <L1StandardBridge-Sepolia> \
  "depositETHTo(address,uint32,bytes)" $RECIPIENT 200000 "0x" \
  --value 0.1ether \
  --rpc-url https://ethereum-sepolia-rpc.publicnode.com \
  --private-key $PRIVATE_KEY
```

You can also do this using `viem`:

```typescript
import { createWalletClient, http, parseEther, encodeFunctionData } from "viem";
import { sepolia } from "viem/chains";
import { privateKeyToAccount } from "viem/accounts";

const account = privateKeyToAccount(process.env.WALLET_PRIVATE_KEY as `0x${string}`);
const walletClient = createWalletClient({
  account,
  chain: sepolia,
  transport: http("https://ethereum-sepolia-rpc.publicnode.com"),
});

const hash = await walletClient.sendTransaction({
  to: "<L1StandardBridge-Sepolia>",
  value: parseEther("0.1"),
  data: encodeFunctionData({
    abi: [{
      name: "depositETH",
      type: "function",
      inputs: [
        { name: "_minGasLimit", type: "uint32" },
        { name: "_extraData", type: "bytes" },
      ],
      stateMutability: "payable",
    }],
    functionName: "depositETH",
    args: [200000, "0x"],
  }),
});
```

#### Step 3: Claim Testnet USDC from the Faucet

On testnet, USDC is a mock token (`MockToken`) minted directly from a faucet contract on Gensyn Testnet. Each call dispenses 1,000 USDC.

You can find the Delphi testnet contracts here:

| Contract                    | Address                                      |
| --------------------------- | -------------------------------------------- |
| USDC Faucet (`MockToken`)   | `0xB5876320DdA1AEE3eFC03aD02dC2e2CB4b61B7D9` |
| Delphi SDK Collateral Token | `0x0724D6079b986F8e44bDafB8a09B60C0bd6A45a1` |

Use the bundled script to claim:

```bash
npx tsx scripts/testnet-faucet.ts
# or
npm run testnet-faucet
```

This calls `requestToken()` on the faucet, logs your balance before and after, and waits for the transaction to confirm.

To call the faucet directly with `cast`:

```bash
cast send 0xB5876320DdA1AEE3eFC03aD02dC2e2CB4b61B7D9 \
  "requestToken()" \
  --rpc-url https://gensyn-testnet.g.alchemy.com/public \
  --private-key $PRIVATE_KEY
```

### Mainnet

On mainnet, you'll bridge real ETH and native USDC from Ethereum to Gensyn Mainnet. ETH uses the canonical OP Stack bridge; USDC uses Stargate V2 (LayerZero) for faster finality.

* **Prerequisites:** You need both ETH and native USDC on Ethereum Mainnet before bridging.
  * **ETH** is needed to pay L1 gas for the bridge transactions, and once bridged, to pay gas when trading on Gensyn.
  * **USDC** must be native Circle-issued USDC on Ethereum Mainnet (`0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48`). USDC.e, axlUSDC, and other bridged variants will not work.

Both scripts below require `DELPHI_NETWORK=mainnet` in your `.env`.

#### Bridging ETH (Ethereum Mainnet to Gensyn Mainnet)

ETH bridges via the OP Stack canonical bridge:

```bash
npx tsx scripts/bridge-eth-to-gensyn-mainnet.ts <amount-eth>
# or
npm run bridge-eth-to-gensyn-mainnet 0.0001
```

ETH arrives within a few minutes and appears under the **Internal txns** tab on the [Gensyn Mainnet explorer](https://gensyn-mainnet.explorer.alchemy.com/): this is the same pattern as when bridging to testnet (see above).&#x20;

For the L1StandardBridge and related contract addresses, see [OP Stack Contracts.](https://docs.gensyn.network/providers/network-information#op-stack-contracts)

#### Bridging USDC (Ethereum Mainnet to Gensyn Mainnet via Stargate V2)

USDC bridges via Stargate V2 (LayerZero) rather than the canonical bridge. The script handles approval, quotes the LayerZero fee, and sends in one flow:

```bash
npx tsx scripts/bridge-usdc-to-gensyn-mainnet.ts <amount-usdc> [slippage-pct]
# or
npm run bridge-usdc-to-gensyn-mainnet 10
npm run bridge-usdc-to-gensyn-mainnet 10 1
```

Default slippage is 0.5%. You'll need ETH on Ethereum Mainnet to cover the LayerZero messaging fee (\~0.001–0.005 ETH) in addition to normal Ethereum gas. Track delivery at [LayerZero Scan](https://layerzeroscan.com/).

For the Stargate pool addresses, OFT addresses, and Gensyn's LayerZero Endpoint ID, see the [LayerZero / Stargate](https://docs.gensyn.network/providers/bridges#layerzero-stargate) section under [Bridges.](https://docs.gensyn.network/providers/bridges)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.gensyn.ai/tech/agentic-trading/creating-and-funding-wallets.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
