Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
3c594c8
Add support for delegated address in forest-wallet
sudo-shashank Mar 9, 2026
4a662d3
Add wallet test
sudo-shashank Mar 9, 2026
ca1d974
fix test
sudo-shashank Mar 10, 2026
414f300
fix getting eth addr
sudo-shashank Mar 10, 2026
1d717cd
fix balance check
sudo-shashank Mar 10, 2026
cace07c
fund delegate wallet for test
sudo-shashank Mar 10, 2026
04d7d15
update changelog
sudo-shashank Mar 10, 2026
6b652f2
increase delegate test wallet fund
sudo-shashank Mar 10, 2026
57cb5d4
Merge branch 'main' into shashank/add-f4-support
sudo-shashank Mar 10, 2026
65ea290
Merge branch 'main' into shashank/add-f4-support
sudo-shashank Mar 10, 2026
9d2ea9d
Merge branch 'main' into shashank/add-f4-support
sudo-shashank Mar 10, 2026
4591458
Merge branch 'main' into shashank/add-f4-support
sudo-shashank Mar 11, 2026
ed652e8
refactor and add test
sudo-shashank Mar 11, 2026
3c928c8
refactor resolve_method_num
sudo-shashank Mar 11, 2026
675da0a
lint fix
sudo-shashank Mar 11, 2026
4b7ac40
more lint fix
sudo-shashank Mar 11, 2026
cce81a9
Merge branch 'main' into shashank/add-f4-support
sudo-shashank Mar 11, 2026
73db886
Merge branch 'main' into shashank/add-f4-support
sudo-shashank Mar 11, 2026
a8a54a5
update changelog
sudo-shashank Mar 11, 2026
d299b36
Merge branch 'main' into shashank/add-f4-support
sudo-shashank Mar 11, 2026
4fa870a
refactor test
sudo-shashank Mar 11, 2026
51275e3
run wallet tests in parallel
sudo-shashank Mar 11, 2026
2508b46
Merge branch 'main' into shashank/add-f4-support
sudo-shashank Mar 11, 2026
90aa7b1
Increase delegated wallet test fund
sudo-shashank Mar 11, 2026
6ee251f
Merge branch 'main' into shashank/add-f4-support
sudo-shashank Mar 11, 2026
0d59a3d
Merge branch 'main' into shashank/add-f4-support
sudo-shashank Mar 12, 2026
5a38954
Merge branch 'main' into shashank/add-f4-support
sudo-shashank Mar 12, 2026
65dd517
send only required fund
sudo-shashank Mar 12, 2026
501461b
Merge branch 'main' into shashank/add-f4-support
sudo-shashank Mar 12, 2026
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
27 changes: 27 additions & 0 deletions .github/workflows/forest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,33 @@ jobs:
./scripts/tests/calibnet_wallet_check.sh "$CALIBNET_WALLET"
fi
timeout-minutes: ${{ fromJSON(env.SCRIPT_TIMEOUT_MINUTES) }}
calibnet-delegated-wallet-check:
needs:
- build-ubuntu
name: Delegated wallet tests
runs-on: ubuntu-24.04
steps:
- run: lscpu
- uses: actions/cache@v5
with:
path: "${{ env.FIL_PROOFS_PARAMETER_CACHE }}"
key: proof-params-keys
- uses: actions/checkout@v6
- uses: actions/download-artifact@v8
with:
name: "forest-${{ runner.os }}"
path: ~/.cargo/bin
- name: Set permissions
run: |
chmod +x ~/.cargo/bin/forest*
- name: Delegated wallet commands check
env:
CALIBNET_WALLET: "${{ secrets.CALIBNET_WALLET }}"
run: |
if [[ "$CALIBNET_WALLET" != "" ]]; then
./scripts/tests/calibnet_delegated_wallet_check.sh "$CALIBNET_WALLET"
fi
timeout-minutes: ${{ fromJSON(env.SCRIPT_TIMEOUT_MINUTES) }}
calibnet-export-check-v1:
if: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'Release')) }}
needs:
Expand Down
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@

### Added

- [#6710](https://github.com/ChainSafe/forest/pull/6710): Added support for f4 addresses in forest-wallet.

### Changed

### Removed
Expand Down
87 changes: 87 additions & 0 deletions scripts/tests/calibnet_delegated_wallet_check.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
#!/usr/bin/env bash
# This script checks delegated wallet features of the forest node and the forest-cli.
# It requires both `forest` and `forest-cli` to be in the PATH.

set -euxo pipefail

source "$(dirname "$0")/harness.sh"

forest_wallet_init "$@"

# Amount to send (note: `send` command defaults to FIL if no units are specified)
FIL_AMT="500 atto FIL"

# Amount for an empty wallet
FIL_ZERO="0 FIL"

# The preloaded address
ADDR_ONE=$($FOREST_WALLET_PATH list | tail -1 | cut -d ' ' -f1)

sleep 5s

: Begin delegated wallet tests

# The following steps do basic delegated wallet handling tests.

echo "Creating delegated wallet DELEGATE_ADDR_ONE"
DELEGATE_ADDR_ONE=$($FOREST_WALLET_PATH new delegated)
echo "$DELEGATE_ADDR_ONE"
$FOREST_WALLET_PATH export "$DELEGATE_ADDR_ONE" > delegated_wallet.key
$FOREST_WALLET_PATH --remote-wallet import delegated_wallet.key

# Fund delegated wallet from preloaded wallet
DELEGATE_FUND_AMT="2 micro FIL"
$FOREST_WALLET_PATH set-default "$ADDR_ONE"
MSG_DELEGATE_FUND=$($FOREST_WALLET_PATH send "$DELEGATE_ADDR_ONE" "$DELEGATE_FUND_AMT")
: "$MSG_DELEGATE_FUND"

DELEGATE_ADDR_ONE_BALANCE=$FIL_ZERO
i=0
while [[ $i != 20 && $DELEGATE_ADDR_ONE_BALANCE == "$FIL_ZERO" ]]; do
i=$((i+1))
: "Checking DELEGATE_ADDR_ONE balance $i/20"
sleep 30s
DELEGATE_ADDR_ONE_BALANCE=$($FOREST_WALLET_PATH balance "$DELEGATE_ADDR_ONE" --exact-balance)
done

echo "Creating delegated wallet DELEGATE_ADDR_TWO"
DELEGATE_ADDR_TWO=$($FOREST_WALLET_PATH new delegated)
echo "$DELEGATE_ADDR_TWO"
$FOREST_WALLET_PATH set-default "$DELEGATE_ADDR_ONE"

echo "Creating delegated (remote) wallet DELEGATE_ADDR_THREE"
DELEGATE_ADDR_THREE=$($FOREST_WALLET_PATH --remote-wallet new delegated)
echo "$DELEGATE_ADDR_THREE"
$FOREST_WALLET_PATH --remote-wallet set-default "$DELEGATE_ADDR_ONE"

$FOREST_WALLET_PATH list
$FOREST_WALLET_PATH --remote-wallet list

MSG_DELEGATE_TWO=$($FOREST_WALLET_PATH send "$DELEGATE_ADDR_TWO" "$FIL_AMT")
: "$MSG_DELEGATE_TWO"

MSG_DELEGATE_THREE=$($FOREST_WALLET_PATH send "$DELEGATE_ADDR_THREE" "$FIL_AMT")
: "$MSG_DELEGATE_THREE"

DELEGATE_ADDR_TWO_BALANCE=$FIL_ZERO
i=0
while [[ $i != 20 && $DELEGATE_ADDR_TWO_BALANCE == "$FIL_ZERO" ]]; do
i=$((i+1))
: "Checking DELEGATE_ADDR_TWO balance $i/20"
sleep 30s
DELEGATE_ADDR_TWO_BALANCE=$($FOREST_WALLET_PATH balance "$DELEGATE_ADDR_TWO" --exact-balance)
done

DELEGATE_ADDR_THREE_BALANCE=$FIL_ZERO
i=0
while [[ $i != 20 && $DELEGATE_ADDR_THREE_BALANCE == "$FIL_ZERO" ]]; do
i=$((i+1))
: "Checking DELEGATE_ADDR_THREE balance $i/20"
sleep 30s
DELEGATE_ADDR_THREE_BALANCE=$($FOREST_WALLET_PATH --remote-wallet balance "$DELEGATE_ADDR_THREE" --exact-balance)
done

$FOREST_WALLET_PATH list
$FOREST_WALLET_PATH --remote-wallet list

: End delegated wallet tests
60 changes: 43 additions & 17 deletions scripts/tests/calibnet_wallet_check.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,7 @@ set -euxo pipefail

source "$(dirname "$0")/harness.sh"


usage() {
echo "Usage: $0 <PRELOADED_WALLET_STRING>"
exit 1
}

if [ -z "$1" ]
then
usage
fi

echo "$1" > preloaded_wallet.key

forest_init "$@"

$FOREST_WALLET_PATH import preloaded_wallet.key
$FOREST_WALLET_PATH --remote-wallet import preloaded_wallet.key
forest_wallet_init "$@"

# Test commented out due to it being flaky. See the tracking issue: https://github.com/ChainSafe/forest/issues/4849
# : Begin Filecoin.MarketAddBalance test
Expand Down Expand Up @@ -115,6 +99,8 @@ sleep 5s
# Show balances
$FOREST_WALLET_PATH list

FOREST_URL="http://127.0.0.1:2345/rpc/v1"

echo "Creating a new address to send FIL to"
ADDR_TWO=$($FOREST_WALLET_PATH new)
echo "$ADDR_TWO"
Expand Down Expand Up @@ -154,6 +140,46 @@ while [[ $i != 20 && $ADDR_THREE_BALANCE == "$FIL_ZERO" ]]; do
ADDR_THREE_BALANCE=$($FOREST_WALLET_PATH --remote-wallet balance "$ADDR_THREE" --exact-balance)
done

ETH_ADDR_TWO=$(curl -s -X POST "$FOREST_URL" \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $ADMIN_TOKEN" \
--data "$(jq -n --arg addr "$ADDR_TWO" '{jsonrpc: "2.0", id: 1, method: "Filecoin.FilecoinAddressToEthAddress", params: [$addr, "pending"]}')" \
| jq -r '.result')
echo "ETH address: $ETH_ADDR_TWO"

ETH_ADDR_THREE=$(curl -s -X POST "$FOREST_URL" \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $ADMIN_TOKEN" \
--data "$(jq -n --arg addr "$ADDR_THREE" '{jsonrpc: "2.0", id: 1, method: "Filecoin.FilecoinAddressToEthAddress", params: [$addr, "pending"]}')" \
| jq -r '.result')
echo "ETH address: $ETH_ADDR_THREE"

MSG_ETH=$($FOREST_WALLET_PATH send "$ETH_ADDR_TWO" "$FIL_AMT")
: "$MSG_ETH"

MSG_ETH_REMOTE=$($FOREST_WALLET_PATH --remote-wallet send "$ETH_ADDR_THREE" "$FIL_AMT")
: "$MSG_ETH_REMOTE"

ETH_ADDR_TWO_BALANCE=$ADDR_TWO_BALANCE
i=0
while [[ $i != 20 && $ETH_ADDR_TWO_BALANCE == "$ADDR_TWO_BALANCE" ]]; do
i=$((i+1))

: "Checking balance $i/20"
sleep 30s
ETH_ADDR_TWO_BALANCE=$($FOREST_WALLET_PATH balance "$ADDR_TWO" --exact-balance)
done

ETH_ADDR_THREE_BALANCE=$ADDR_THREE_BALANCE
i=0
while [[ $i != 20 && $ETH_ADDR_THREE_BALANCE == "$ADDR_THREE_BALANCE" ]]; do
i=$((i+1))

: "Checking balance $i/20"
sleep 30s
ETH_ADDR_THREE_BALANCE=$($FOREST_WALLET_PATH --remote-wallet balance "$ADDR_THREE" --exact-balance)
done

# wallet list should contain address two with transferred FIL amount
$FOREST_WALLET_PATH list
$FOREST_WALLET_PATH --remote-wallet list
Expand Down
19 changes: 19 additions & 0 deletions scripts/tests/harness.sh
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,25 @@ function forest_init_stateless {
export FULLNODE_API_INFO
}

function forest_wallet_init {
usage() {
echo "Usage: $0 <PRELOADED_WALLET_STRING>"
exit 1
}

if [ -z "$1" ]
then
usage
fi

echo "$1" > preloaded_wallet.key

forest_init "$@"

$FOREST_WALLET_PATH import preloaded_wallet.key
$FOREST_WALLET_PATH --remote-wallet import preloaded_wallet.key
}

function forest_print_logs_and_metrics {
echo "Get and print metrics"
wget -O metrics.log http://localhost:6116/metrics
Expand Down
9 changes: 8 additions & 1 deletion src/message_pool/msgpool/msg_pool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@ use crate::eth::is_valid_eth_tx_for_sending;
use crate::libp2p::{NetworkMessage, PUBSUB_MSG_STR, Topic};
use crate::message::{ChainMessage, Message, SignedMessage, valid_for_block_inclusion};
use crate::networks::{ChainConfig, NEWEST_NETWORK_VERSION};
use crate::rpc::eth::types::EthAddress;
use crate::shim::{
address::Address,
address::{Address, Protocol},
crypto::{Signature, SignatureType},
econ::TokenAmount,
gas::{Gas, price_list_by_network_version},
Expand Down Expand Up @@ -265,6 +266,12 @@ where
if to_vec(msg)?.len() > MAX_MESSAGE_SIZE {
return Err(Error::MessageTooBig);
}
let to = msg.message().to();
if to.protocol() == Protocol::Delegated {
EthAddress::from_filecoin_address(&to).context(format!(
"message recipient {to} is a delegated address but not a valid Eth Address"
Comment thread
sudo-shashank marked this conversation as resolved.
))?;
}
valid_for_block_inclusion(msg.message(), Gas::new(0), NEWEST_NETWORK_VERSION)?;
if msg.value() > *crate::shim::econ::TOTAL_FILECOIN {
return Err(Error::MessageValueTooHigh);
Expand Down
2 changes: 1 addition & 1 deletion src/rpc/methods/eth.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1012,7 +1012,7 @@ async fn execute_tipset<DB: Blockstore + Send + Sync + 'static>(
))
}

fn is_eth_address(addr: &VmAddress) -> bool {
pub fn is_eth_address(addr: &VmAddress) -> bool {
if addr.protocol() != Protocol::Delegated {
return false;
}
Expand Down
Loading
Loading