Skip to content

Commit

Permalink
Merge pull request #60 from davisshaver/custom-rpc-classnames
Browse files Browse the repository at this point in the history
✨ Add custom RPC options and Base/Zora support
  • Loading branch information
davisshaver authored May 5, 2024
2 parents c13ab4f + 70b0652 commit 0863665
Show file tree
Hide file tree
Showing 19 changed files with 3,345 additions and 2,664 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/generate-zip.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
- name: Setup Node
uses: actions/setup-node@v2
with:
node-version: '16'
node-version: '18'
cache: 'yarn'

- name: Install packages w/ Yarn
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
- name: Setup Node
uses: actions/setup-node@v2
with:
node-version: '16'
node-version: '18'
cache: 'yarn'

- name: Install packages w/ Yarn
Expand Down
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
18
8 changes: 7 additions & 1 deletion blocks/login-block/frontend.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,15 @@ if ( loginBlocks ) {
}
onLogout={ () => {
const logoutURL = new URL( LOGOUT_URL );
const currentURL = new URL( window.location.href );
// Add a 'wp-rainbow-logout' query parameter to the current URL.
currentURL.searchParams.append(
'wp-rainbow-logout',
'true'
);
logoutURL.searchParams.append(
'redirect_to',
encodeURI( window.location.href )
encodeURI( currentURL )
);
window.location = logoutURL.toString();
} }
Expand Down
22 changes: 17 additions & 5 deletions inc/class-wp-rainbow-login-functionality.php
Original file line number Diff line number Diff line change
Expand Up @@ -128,10 +128,11 @@ public function get_should_disable_user_role_updates_on_login(): string {
* @param string $filtered_infura_id Filtered Infura ID.
* @param string $filtered_infura_network Filtered Infura network.
* @param WP_User|false $user User object, if available.
* @param string $filtered_rpc_url Filtered RPC URL.
*
* @return string Filtered role for a given address.
*/
public function get_role_for_address_filtered( string $address, string $filtered_infura_id, string $filtered_infura_network, $user ): string {
public function get_role_for_address_filtered( string $address, string $filtered_infura_id, string $filtered_infura_network, $user, string $filtered_rpc_url ): string {
$default_role = get_option( 'default_role' );

$options = get_option( 'wp_rainbow_options', [ 'wp_rainbow_field_default_user_role' => '' ] );
Expand All @@ -140,15 +141,25 @@ public function get_role_for_address_filtered( string $address, string $filtered
}

/**
* Filter the default role for WP Rainbow users.
* Legacy filter for the default role for WP Rainbow users.
*
* @param string $default Default role for new users.
* @param string $address Address of user being added.
* @param string $filtered_infura_id Filtered Infura ID.
* @param string $filtered_infura_network Filtered Infura network.
* @param WP_User|false $user User object, if available.
*/
return apply_filters( 'wp_rainbow_role_for_address', $default_role, $address, $filtered_infura_id, $filtered_infura_network, $user );
$legacy_filtered_role = apply_filters( 'wp_rainbow_role_for_address', $default_role, $address, $filtered_infura_id, $filtered_infura_network, $user );

/**
* Filter the default role for WP Rainbow users.
*
* @param string $default Default role for new users.
* @param string $address Address of user being added.
* @param string $filtered_rpc_url Filtered RPC URL.
* @param WP_User|false $user User object, if available.
*/
return apply_filters( 'wp_rainbow_role', $legacy_filtered_role, $address, $filtered_rpc_url, $user );
}

// API ROUTES.
Expand Down Expand Up @@ -291,12 +302,13 @@ public function login_callback( WP_REST_Request $request ): WP_REST_Response {
$wp_rainbow = WP_Rainbow::instance();
$filtered_infura_id = $wp_rainbow->get_infura_id_filtered();
$filtered_infura_network = $wp_rainbow->get_infura_network_filtered();
$filtered_rpc_url = $wp_rainbow->get_rpc_url();

if ( ! empty( $wp_rainbow_options['wp_rainbow_field_required_token'] ) && ! empty( $filtered_infura_id ) && ! empty( $filtered_infura_network ) ) {
// @TODO Figure out if ABI should be an option (or formatted differently).

$example_abi = '[{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]';
$contract = new Contract( 'https://' . map_filtered_network_to_infura_endpoint( $filtered_infura_network ) . '.infura.io/v3/' . $filtered_infura_id, $example_abi );
$contract = new Contract( 'https://' . wp_rainbow_map_filtered_network_to_infura_endpoint( $filtered_infura_network ) . '.infura.io/v3/' . $filtered_infura_id, $example_abi );
$contract->at( $wp_rainbow_options['wp_rainbow_field_required_token'] )->call(
'balanceOf',
$address,
Expand All @@ -311,7 +323,7 @@ function ( $err, $balance ) use ( $wp_rainbow_options ) {
// Lookup or generate user and then sign them in.
$user = get_user_by( 'login', $address );
$sanitized_display_name = sanitize_text_field( $display_name );
$role = $this->get_role_for_address_filtered( $address, $filtered_infura_id, $filtered_infura_network, $user );
$role = $this->get_role_for_address_filtered( $address, $filtered_infura_id, $filtered_infura_network, $user, $filtered_rpc_url );
$should_set_role = $this->get_should_set_role_filtered();

if ( ! $user ) {
Expand Down
1 change: 1 addition & 0 deletions inc/class-wp-rainbow-login-styling.php
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ public function action_login_head() {
}

#wp-rainbow-button div[role="button"] {
padding: 0 18px;
text-align: center;
width: 100%;
}
Expand Down
27 changes: 25 additions & 2 deletions inc/class-wp-rainbow-settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -150,13 +150,22 @@ public function action_rest_api_init() {
'description' => 'Default RainbowKit Login user role',
],
'wp_rainbow_field_infura_id' => [
'required' => true,
'required' => false,
'type' => 'string',
'description' => 'Infura ID field',
],
'wp_rainbow_field_infura_network' => [
'wp_rainbow_field_provider' => [
'required' => true,
'type' => 'string',
'description' => 'RPC provider to use for RainbowKit login',
'enum' => [
'infura',
'other',
],
],
'wp_rainbow_field_infura_network' => [
'required' => false,
'type' => 'string',
'description' => 'Infura network',
'enum' => [
'mainnet',
Expand All @@ -170,8 +179,22 @@ public function action_rest_api_init() {
'arbitrum',
'arbitrumGoerli',
'arbitrumSepolia',
'base',
'baseSepolia',
'zora',
'zoraSepolia',
],
],
'wp_rainbow_field_rpc_url' => [
'required' => false,
'type' => 'string',
'description' => 'RPC URL',
],
'wp_rainbow_field_rpc_url_mainnet' => [
'required' => false,
'type' => 'string',
'description' => 'RPC URL',
],
'wp_rainbow_field_walletconnect_project_id' => [
'required' => true,
'type' => 'string',
Expand Down
88 changes: 82 additions & 6 deletions inc/class-wp-rainbow.php
Original file line number Diff line number Diff line change
Expand Up @@ -76,20 +76,93 @@ public function get_redirect_url_filtered() {
return apply_filters( 'wp_rainbow_redirect_url', $options['wp_rainbow_field_redirect_url'] );
}

/**
* Provide filter for RPC URL. Defaults to settings page value.
*
* @return mixed|void Filtered RPC URL.
*/
public function get_rpc_url() {
$options = get_option(
'wp_rainbow_options',
[
'wp_rainbow_field_provider' => '',
'wp_rainbow_field_rpc_url' => '',
]
);
$rpc_url = '';
if (
! empty( $options['wp_rainbow_field_provider'] ) &&
'other' === $options['wp_rainbow_field_provider'] &&
! empty( $options['wp_rainbow_field_rpc_url'] )
) {
$rpc_url = $options['wp_rainbow_field_rpc_url'];
} elseif (
empty( $options['wp_rainbow_field_provider'] ) ||
'infura' === $options['wp_rainbow_field_provider']
) {
$infura_network = $this->get_infura_network_filtered();
$infura_id = $this->get_infura_id_filtered();
$rpc_url = 'https://' . wp_rainbow_map_filtered_network_to_infura_endpoint( $infura_network ) . '.infura.io/v3/' . $infura_id;
}

/**
* Filter the RPC URL used for WP Rainbow integration.
*
* @param string $default RPC URL as set in WP Rainbow options or derived from Infura ID.
*/
return apply_filters( 'wp_rainbow_rpc_url', $rpc_url );
}

/**
* Provide filter for mainnet RPC URL. Defaults to settings page value.
*
* @return mixed|void Filtered RPC URL for mainnet.
*/
public function get_rpc_url_mainnet() {
$options = get_option(
'wp_rainbow_options',
[
'wp_rainbow_field_provider' => '',
'wp_rainbow_field_rpc_url_mainnet' => '',
]
);
$rpc_url_mainnet = '';
if (
! empty( $options['wp_rainbow_field_provider'] ) &&
'other' === $options['wp_rainbow_field_provider'] &&
! empty( $options['wp_rainbow_field_rpc_url_mainnet'] )
) {
$rpc_url_mainnet = $options['wp_rainbow_field_rpc_url_mainnet'];
} elseif (
empty( $options['wp_rainbow_field_provider'] ) ||
'infura' === $options['wp_rainbow_field_provider']
) {
$infura_id = $this->get_infura_id_filtered();
$rpc_url_mainnet = 'https://mainnet.infura.io/v3/' . $infura_id;
}

/**
* Filter the mainnet RPC URL used for WP Rainbow integration.
*
* @param string $default Mainnet RPC URL as set in WP Rainbow options or derived from Infura ID.
*/
return apply_filters( 'wp_rainbow_rpc_url_mainnet', $rpc_url_mainnet );
}

/**
* Provide filter for Infura ID. Defaults to settings page value.
*
* @return mixed|void Filtered Infura ID.
*/
public function get_infura_id_filtered() {
$options = get_option( 'wp_rainbow_options', [ 'wp_rainbow_field_infura_id' => '' ] );

$options = get_option( 'wp_rainbow_options', [ 'wp_rainbow_field_infura_id' => '' ] );
$infura_id = $options['wp_rainbow_field_infura_id'] ?? '';
/**
* Filter the Infura ID used for WP Rainbow integration.
*
* @param string $default Infura ID as set in WP Rainbow options.
*/
return apply_filters( 'wp_rainbow_infura_id', $options['wp_rainbow_field_infura_id'] );
return apply_filters( 'wp_rainbow_infura_id', $infura_id );
}

/**
Expand Down Expand Up @@ -235,7 +308,8 @@ public function action_init() {
'wpRainbowData',
[
'ADMIN_URL' => get_admin_url(),
'INFURA_ID' => esc_textarea( $this->get_infura_id_filtered() ),
'RPC_URL' => esc_textarea( $this->get_rpc_url() ),
'RPC_URL_MAINNET' => esc_textarea( $this->get_rpc_url_mainnet() ),
'LOGIN_API' => get_rest_url( null, 'wp-rainbow/v1/login' ),
'NONCE_API' => get_rest_url( null, 'wp-rainbow/v1/nonce' ),
'REDIRECT_URL' => esc_url( $this->get_redirect_url_filtered() ),
Expand All @@ -253,7 +327,8 @@ public function action_init() {
'wpRainbowData',
[
'ADMIN_URL' => get_admin_url(),
'INFURA_ID' => esc_textarea( $this->get_infura_id_filtered() ),
'RPC_URL' => esc_textarea( $this->get_rpc_url() ),
'RPC_URL_MAINNET' => esc_textarea( $this->get_rpc_url_mainnet() ),
'LOGIN_API' => get_rest_url( null, 'wp-rainbow/v1/login' ),
'LOGGED_IN' => is_user_logged_in(),
'NONCE_API' => get_rest_url( null, 'wp-rainbow/v1/nonce' ),
Expand Down Expand Up @@ -353,7 +428,8 @@ public function action_login_enqueue_scripts() {
'wpRainbowData',
[
'ADMIN_URL' => get_admin_url(),
'INFURA_ID' => esc_textarea( $this->get_infura_id_filtered() ),
'RPC_URL' => esc_textarea( $this->get_rpc_url() ),
'RPC_URL_MAINNET' => esc_textarea( $this->get_rpc_url_mainnet() ),
'LOGIN_API' => get_rest_url( null, 'wp-rainbow/v1/login' ),
'NONCE_API' => get_rest_url( null, 'wp-rainbow/v1/nonce' ),
'REDIRECT_URL' => esc_url( $this->get_redirect_url_filtered() ),
Expand Down
36 changes: 21 additions & 15 deletions inc/functions.php
Original file line number Diff line number Diff line change
@@ -1,25 +1,31 @@
<?php
/**
* General purpose functions file
*
* @package WP_Rainbow
*/

/**
* Map filtered Infura network to an Infura endpoint value.
*
* @param string $filtered_network Filtered Infura network.
*
* @return string Infura endpoint or default
*/
function map_filtered_network_to_infura_endpoint( string $filtered_network ): string {
$overrides = [
'arbitrum' => 'arbitrum-mainnet',
'arbitrumGoerli' => 'arbitrum-goerli',
'arbitrumSepolia' => 'arbitrum-sepolia',
'optimism' => 'optimism-mainnet',
'optimismGoerli' => 'optimism-goerli',
'optimismSepolia' => 'optimism-sepolia',
'polygon' => 'polygon-mainnet',
'polygonMumbai' => 'polygon-mumbai',
];
if ( ! empty( $overrides[ $filtered_network ] ) ) {
return $overrides[ $filtered_network ];
}
function wp_rainbow_map_filtered_network_to_infura_endpoint( string $filtered_network ): string {
$overrides = [
'arbitrum' => 'arbitrum-mainnet',
'arbitrumGoerli' => 'arbitrum-goerli',
'arbitrumSepolia' => 'arbitrum-sepolia',
'optimism' => 'optimism-mainnet',
'optimismGoerli' => 'optimism-goerli',
'optimismSepolia' => 'optimism-sepolia',
'polygon' => 'polygon-mainnet',
'polygonMumbai' => 'polygon-mumbai',
];
if ( ! empty( $overrides[ $filtered_network ] ) ) {
return $overrides[ $filtered_network ];
}

return $filtered_network;
return $filtered_network;
}
38 changes: 19 additions & 19 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "wp-rainbow",
"version": "0.4.6",
"version": "0.5.0",
"description": "RainbowKit Login (Web3 Integration for Sign-In With Ethereum)",
"author": "Davis Shaver",
"license": "GPL-2.0-or-later",
Expand All @@ -21,31 +21,31 @@
"url": "https://github.com/davisshaver/wp-rainbow/issues"
},
"dependencies": {
"@rainbow-me/rainbowkit": "^1.3.0",
"@wordpress/block-editor": "^12.14.0",
"@wordpress/blocks": "^12.23.0",
"@wordpress/components": "^25.12.0",
"@wordpress/i18n": "^4.46.0",
"classnames": "^2.3.2",
"ethers": "^6.8.1",
"@rainbow-me/rainbowkit": "^2.0.6",
"@tanstack/react-query": "^5.34.2",
"@wordpress/block-editor": "^12.25.0",
"@wordpress/blocks": "^12.34.0",
"@wordpress/components": "^27.4.0",
"@wordpress/i18n": "^4.57.0",
"classnames": "^2.5.1",
"process": "^0.11.10",
"prop-types": "^15.8.1",
"react-hook-form": "^7.48.2",
"react-hook-form": "^7.51.4",
"react-style-proptype": "^3.2.2",
"siwe": "^2.1.4",
"simple-siwe": "^0.1.4",
"util": "^0.12.5",
"viem": "^1.19.9",
"wagmi": "^1.4.7"
"viem": "^2.9.31",
"wagmi": "^2.8.1"
},
"devDependencies": {
"@babel/preset-react": "^7.23.3",
"@wordpress/eslint-plugin": "^17.3.0",
"@wordpress/scripts": "^26.17.0",
"css-loader": "^6.8.1",
"@babel/preset-react": "^7.24.1",
"@wordpress/eslint-plugin": "^17.13.0",
"@wordpress/scripts": "^27.8.0",
"css-loader": "^7.1.1",
"eslint-config-airbnb": "^19.0.4",
"style-loader": "^3.3.3",
"webpack": "^5.89.0",
"webpack-bundle-analyzer": "^4.10.1",
"style-loader": "^3.3.4",
"webpack": "^5.91.0",
"webpack-bundle-analyzer": "^4.10.2",
"webpack-cli": "^5.1.4"
},
"scripts": {
Expand Down
Loading

0 comments on commit 0863665

Please sign in to comment.