Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

rootstock-wallet.json
rootstock-wallet-dev.json
#lock files
#lock files
pnpm-lock.yaml
bun.lockb
# Logs
Expand Down Expand Up @@ -164,6 +164,7 @@ dist
# Stores VSCode versions used for testing VSCode extensions

.vscode-test
.vscode

# yarn v2

Expand Down
128 changes: 117 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,25 @@

`rsk-cli` is a command-line tool for interacting with Rootstock blockchain

## Table of Contents

- [Installation](#installation)
- [Configuration](#configuration)
- [Features](#features)
1. [Manage Wallet](#1-manage-wallet)
2. [Check Balance](#2-check-balance)
3. [Transfer](#3-transfer-rbtc-and-erc20)
4. [Check Transaction Status](#4-check-transaction-status)
5. [Deploy Smart Contract](#5-deploy-smart-contract)
6. [Verify Smart Contract](#6-verify-smart-contract)
7. [Interact with Verified Contracts](#7-interact-with-verified-smart-contracts)
8. [Interact with RSK Bridge](#8-interact-with-rsk-bridge-contract)
9. [Fetch Wallet History](#9-fetch-wallet-history)
10. [Batch Transfer](#10-batch-transfer)
11. [Transaction Simulation](#11-transaction-simulation)
12. [RNS Operations](#12-rns-operations)
- [Contributing](#contributing)

## Installation

To install the CLI tool globally, use the following command:
Expand Down Expand Up @@ -232,7 +251,7 @@ Use the `-t` or `--testnet` flag to check the balance on the Rootstock testnet.
# Check balance on testnet
rsk-cli balance -t

# Check balance using RNS domain on testnet
# Check balance using RNS domain on testnet
rsk-cli balance -t --rns testing.rsk
```

Expand Down Expand Up @@ -851,27 +870,113 @@ The simulation provides comprehensive information:

> **Note**: Simulation uses real blockchain state but does not execute transactions. It provides accurate estimates based on current network conditions. Gas prices may vary, so actual costs might differ slightly from simulation results.

### 12. RNS Resolve
### 12. RNS Operations
The `rns` command provides a unified interface to interact with the RIF Name Service (RNS). You can Register, Transfer, Update, and Resolve domains using specific flags.

#### 1. Register a Domain

Secure a `.rsk` domain name through a two-step commitment process. Requires a wallet with RBTC for gas and RIF for the registration fee.

##### Mainnet

```bash
rsk-cli rns --register <domain_name>.rsk --wallet <wallet_name>
```

##### Testnet

```bash
rsk-cli rns --register <domain_name>.rsk --wallet <wallet_name> --testnet
```

##### Output example:

The `resolve` command allows you to interact with the RIF Name Service (RNS) on the Rootstock blockchain. You can perform both forward resolution (domain to address) and reverse resolution (address to domain name).
```
🔍 Checking availability for 'mycoolname.rsk'...
Price: 2.0 tRIF
Step 1/2: Sending commitment...
✅ Commitment sent.
⏳ Waiting for commitment maturity (approx 1 min)...
.........
Step 2/2: Registering domain...
Tx: https://rootstock-testnet.blockscout.com/tx/0x_transaction_hash

✅ Success! 'mycoolname.rsk' is now registered to 0x123...FFf

```

#### 2. Transfer Ownership

Transfer the ownership of an existing domain to another address. Note: Recipient must be a raw address `(0x...)`, RNS names are not supported as recipient; use the `resolve` command first if needed. Requires: `--recipient` flag.

##### Mainnet

#### Forward Resolution (Domain to Address)
```bash
rsk-cli rns --transfer <domain_name>.rsk --recipient <recipient_address> --wallet <wallet_name>
```

##### Testnet

```bash
rsk-cli rns --transfer <domain_name>.rsk --recipient <recipient_address> --wallet <wallet_name> --testnet
```

##### Output example:

```
Preparing to transfer 'mycoolname.rsk' to 0x123...FFf
🔄 Transferring ownership...
Tx: https://rootstock-testnet.blockscout.com/tx/0x_transaction_hash
✅ Success! 'mycoolname.rsk' has been transferred to 0x123...FFf

```

#### 3. Update Resolver

Change the resolution address of a domain (where the domain "points" to). Requires: `--address` flag.

##### Mainnet

```bash
rsk-cli rns --update blessings.rsk --address <new_address> --wallet <wallet_name>
```

##### Testnet

```bash
rsk-cli rns --update blessings.rsk --address <new_address> --wallet <wallet_name> --testnet
```

##### Output example:

```
Preparing to update records for 'mycoolname.rsk'...
🔄 Setting resolution address to 0x123...FFf
Tx: https://rootstock-testnet.blockscout.com/tx/0x_transaction_hash
✅ Success! 'mycoolname.rsk' now resolves to 0x123...FFf
```

#### 4. Resolve Domain

Perform both forward resolution (domain to address) and reverse resolution (address to domain name).

**Forward Resolution (Domain to Address):**

Convert an RNS domain name to its associated address:

##### Mainnet

```bash
rsk-cli resolve testing.rsk
rsk-cli rns --resolve testing.rsk
```

##### Testnet

```bash
rsk-cli resolve testing.rsk --testnet
rsk-cli rns --resolve testing.rsk --testnet
```

Output example:
##### Output example:

```
🔍 Resolving testing.rsk...
Expand All @@ -881,20 +986,20 @@ Output example:
🌐 Network: Rootstock Mainnet
```

#### Reverse Resolution (Address to Domain)
**Reverse Resolution (Address to Domain):**

Convert an address back to its RNS domain name:

##### Mainnet

```bash
rsk-cli resolve 0x123456789abcdef0123456789abcdef012345678 --reverse
rsk-cli rns --resolve 0x123456789abcdef0123456789abcdef012345678 --reverse
```

##### Testnet

```bash
rsk-cli resolve 0x123456789abcdef0123456789abcdef012345678 --reverse --testnet
rsk-cli rns --resolve 0x123456789abcdef0123456789abcdef012345678 --reverse --testnet
```

Output example:
Expand All @@ -907,11 +1012,12 @@ Output example:
🌐 Network: Rootstock Testnet
```

> **Note**:
> **Note**:
> - The `.rsk` extension is automatically appended if not provided
> - Both checksummed and non-checksummed addresses are supported
> - The command will show appropriate error messages if the name or address cannot be resolved


## Contributing

We welcome contributions from the community. Please fork the repository and submit pull requests with your changes. Ensure your code adheres to the project's main objective.
Expand Down
102 changes: 88 additions & 14 deletions bin/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ import { simulateCommand, TransactionSimulationOptions } from "../src/commands/s
import { parseEther } from "viem";
import { resolveRNSToAddress } from "../src/utils/rnsHelper.js";
import { validateAndFormatAddressRSK } from "../src/utils/index.js";
import { rnsUpdateCommand } from "../src/commands/rnsUpdate.js";
import { rnsTransferCommand } from "../src/commands/rnsTransfer.js";
import { rnsRegisterCommand } from "../src/commands/rnsRegister.js";

interface CommandOptions {
testnet?: boolean;
Expand Down Expand Up @@ -103,7 +106,7 @@ program
}
holderAddress = resolvedAddress;
}

await balanceCommand({
testnet: options.testnet,
walletName: options.wallet!,
Expand Down Expand Up @@ -333,19 +336,6 @@ program
}
});

program
.command("resolve <name>")
.description("Resolve RNS names to addresses or reverse lookup addresses to names")
.option("-t, --testnet", "Use testnet (currently mainnet only)")
.option("-r, --reverse", "Reverse lookup: address to name")
.action(async (name: string, options: CommandOptions) => {
await resolveCommand({
name,
testnet: !!options.testnet,
reverse: !!options.reverse
});
});

program
.command("config")
.description("Manage CLI configuration settings")
Expand Down Expand Up @@ -485,4 +475,88 @@ program
}
});

program
.command("rns")
.description("RNS Manager: Register, Transfer, Update, or Resolve domains")
.option("--register <domain>", "Register a new RNS domain")
.option("--transfer <domain>", "Transfer ownership of a domain")
.option("--update <domain>", "Update resolver records for a domain")
.option("--resolve <name>", "Resolve a name to address (or address to name)")

.option("-t, --testnet", "Use testnet network")
.option("-w, --wallet <wallet>", "Wallet name or private key to use")
.option("--recipient <address>", "Recipient address (required for --transfer)")
.option("--address <address>", "New address to set (required for --update)")
.option("-r, --reverse", "Perform reverse lookup (required for --resolve)")

.action(async (options: any) => {
const actions = [
options.register ? "register" : null,
options.transfer ? "transfer" : null,
options.update ? "update" : null,
options.resolve ? "resolve" : null,
].filter(Boolean);

if (actions.length === 0) {
console.error(chalk.red("❌ Error: You must specify an action."));
console.log("Try: --register, --transfer, --update, or --resolve");
process.exit(1);
}
if (actions.length > 1) {
console.error(chalk.red("❌ Error: Please specify only one action at a time."));
process.exit(1);
}

const action = actions[0];

try {
switch (action) {
case "register":
await rnsRegisterCommand({
domain: options.register,
wallet: options.wallet,
testnet: !!options.testnet,
});
break;

case "transfer":
if (!options.recipient) {
console.error(chalk.red("❌ Error: --recipient <address> is required for transfer."));
process.exit(1);
}
await rnsTransferCommand({
domain: options.transfer,
recipient: options.recipient,
wallet: options.wallet,
testnet: !!options.testnet,
});
break;

case "update":
if (!options.address) {
console.error(chalk.red("❌ Error: --address <address> is required for update."));
process.exit(1);
}
await rnsUpdateCommand({
domain: options.update,
address: options.address,
wallet: options.wallet,
testnet: !!options.testnet,
});
break;

case "resolve":
await resolveCommand({
name: options.resolve,
testnet: !!options.testnet,
reverse: !!options.reverse,
});
break;
}
} catch (error: any) {
console.error(chalk.red(`❌ Operation failed: ${error.message || error}`));
process.exit(1);
}
});

program.parse(process.argv);
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,15 @@
"dependencies": {
"@openzeppelin/contracts": "^5.0.2",
"@rsksmart/rns-resolver.js": "^1.1.0",
"@rsksmart/rns-sdk": "^1.0.0-beta.9",
"@rsksmart/rsk-precompiled-abis": "^6.0.0-ARROWHEAD",
"@types/fs-extra": "^11.0.4",
"@types/zxcvbn": "^4.4.5",
"chalk": "^5.3.0",
"cli-table3": "^0.6.5",
"commander": "^13.1.0",
"figlet": "^1.7.0",
"ethers": "^5.8.0",
"fs-extra": "^11.2.0",
"inquirer": "^12.1.0",
"ora": "^8.0.1",
Expand Down
Loading
Loading