privy_ruby 0.0.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +34 -0
- data/README.md +1 -1
- data/lib/privy/base58.rb +41 -0
- data/lib/privy/client.rb +12 -3
- data/lib/privy/cryptography.rb +34 -0
- data/lib/privy/models/analytics_event_input.rb +2 -2
- data/lib/privy/models/bitcoin_address.rb +7 -0
- data/lib/privy/models/bridge_destination_asset.rb +1 -0
- data/lib/privy/models/bridge_fiat_virtual_account_destination.rb +6 -1
- data/lib/privy/models/bridge_fiat_virtual_account_request.rb +6 -2
- data/lib/privy/models/bridge_fiat_virtual_account_response.rb +2 -1
- data/lib/privy/models/bridge_fiat_virtual_account_source.rb +4 -1
- data/lib/privy/models/bridge_sandbox_fiat_virtual_account_request.rb +6 -2
- data/lib/privy/models/bridge_sandbox_fiat_virtual_account_response.rb +2 -1
- data/lib/privy/models/bridge_source_asset.rb +1 -0
- data/lib/privy/models/create_link_auth_intent_input.rb +17 -0
- data/lib/privy/models/create_link_auth_intent_response.rb +36 -0
- data/lib/privy/models/create_stripe_onramp_session_input.rb +33 -0
- data/lib/privy/models/create_stripe_onramp_session_response.rb +38 -0
- data/lib/privy/models/device_authorization_response.rb +63 -0
- data/lib/privy/models/device_verify_action.rb +16 -0
- data/lib/privy/models/device_verify_request_body.rb +27 -0
- data/lib/privy/models/device_verify_response.rb +18 -0
- data/lib/privy/models/earn_incentive_reward_entry.rb +50 -0
- data/lib/privy/models/earn_incentive_rewards_query.rb +18 -0
- data/lib/privy/models/earn_incentive_rewards_response.rb +19 -0
- data/lib/privy/models/evm_address.rb +7 -0
- data/lib/privy/models/evm_checksum_address.rb +7 -0
- data/lib/privy/models/exchange_stripe_tokens_input.rb +23 -0
- data/lib/privy/models/exchange_stripe_tokens_response.rb +17 -0
- data/lib/privy/models/fiat_onramp_provider.rb +2 -0
- data/lib/privy/models/fiat_onramp_stripe_sdk_session_response.rb +45 -0
- data/lib/privy/models/fiat_onramp_url_session_response.rb +39 -0
- data/lib/privy/models/gas.rb +35 -0
- data/lib/privy/models/get_fiat_onramp_url_response.rb +12 -14
- data/lib/privy/models/get_stripe_crypto_customer_response.rb +39 -0
- data/lib/privy/models/hyperliquid_token_address.rb +7 -0
- data/lib/privy/models/kraken_embed_custom_order_cancelled_webhook_payload.rb +66 -0
- data/lib/privy/models/kraken_embed_custom_order_executed_webhook_payload.rb +54 -0
- data/lib/privy/models/kraken_embed_custom_order_execution_failed_webhook_payload.rb +67 -0
- data/lib/privy/models/link_auth_intent_created.rb +35 -0
- data/lib/privy/models/link_auth_intent_no_account.rb +27 -0
- data/lib/privy/models/linked_account_embedded_wallet.rb +1 -0
- data/lib/privy/models/list_stripe_consumer_wallets_response.rb +17 -0
- data/lib/privy/models/list_stripe_payment_tokens_response.rb +17 -0
- data/lib/privy/models/oauth_grant.rb +54 -0
- data/lib/privy/models/oauth_grant_list_response.rb +18 -0
- data/lib/privy/models/oauth_grant_revoke_response.rb +30 -0
- data/lib/privy/models/oauth_token_authorization_code_request_body.rb +59 -0
- data/lib/privy/models/oauth_token_device_code_pending_error.rb +50 -0
- data/lib/privy/models/oauth_token_device_code_request_body.rb +36 -0
- data/lib/privy/models/oauth_token_grant_type.rb +17 -0
- data/lib/privy/models/oauth_token_refresh_token_request_body.rb +36 -0
- data/lib/privy/models/oauth_token_request_body.rb +24 -0
- data/lib/privy/models/oauth_token_success_response.rb +58 -0
- data/lib/privy/models/onramp_session_fees.rb +23 -0
- data/lib/privy/models/onramp_session_params.rb +61 -0
- data/lib/privy/models/onramp_session_transaction_details.rb +59 -0
- data/lib/privy/models/refresh_stripe_quote_response.rb +18 -0
- data/lib/privy/models/rule_delete_intent_response.rb +63 -0
- data/lib/privy/models/rule_intent_response.rb +0 -1
- data/lib/privy/models/rule_mutate_intent_response.rb +64 -0
- data/lib/privy/models/solana_address.rb +7 -0
- data/lib/privy/models/stripe_consumer_wallet.rb +29 -0
- data/lib/privy/models/stripe_crypto_customer_active.rb +39 -0
- data/lib/privy/models/stripe_crypto_customer_expired.rb +33 -0
- data/lib/privy/models/stripe_crypto_customer_none.rb +27 -0
- data/lib/privy/models/stripe_onramp_checkout_response.rb +25 -0
- data/lib/privy/models/stripe_onramp_session_status.rb +17 -0
- data/lib/privy/models/stripe_payment_token.rb +23 -0
- data/lib/privy/models/stripe_quote.rb +17 -0
- data/lib/privy/models/stripe_transaction_details.rb +17 -0
- data/lib/privy/models/stripe_verification.rb +23 -0
- data/lib/privy/models/swap_action_response.rb +46 -1
- data/lib/privy/models/swap_destination.rb +13 -4
- data/lib/privy/models/swap_quote_destination.rb +15 -4
- data/lib/privy/models/swap_quote_request_body.rb +12 -4
- data/lib/privy/models/swap_quote_response.rb +40 -3
- data/lib/privy/models/swap_request_body.rb +12 -4
- data/lib/privy/models/token_transfer_destination.rb +2 -2
- data/lib/privy/models/transfer_action_response.rb +29 -3
- data/lib/privy/models/transfer_quote_request_body.rb +3 -2
- data/lib/privy/models/transfer_quote_response.rb +10 -1
- data/lib/privy/models/transfer_received_transaction_detail.rb +5 -0
- data/lib/privy/models/transfer_request_body.rb +3 -2
- data/lib/privy/models/transfer_sent_transaction_detail.rb +5 -0
- data/lib/privy/models/tron_address.rb +7 -0
- data/lib/privy/models/wallet_asset.rb +1 -0
- data/lib/privy/models/wallet_batch_create_response.rb +1 -0
- data/lib/privy/models/wallet_create_batch_params.rb +14 -0
- data/lib/privy/models/wallet_ethereum_asset.rb +1 -0
- data/lib/privy/models/wallets/balance_get_params.rb +11 -0
- data/lib/privy/models/wallets/balance_get_response.rb +5 -0
- data/lib/privy/models/wallets/swap_execute_params.rb +45 -0
- data/lib/privy/models/wallets/swap_quote_params.rb +36 -0
- data/lib/privy/models/wallets/transaction_get_params.rb +3 -0
- data/lib/privy/models.rb +117 -4
- data/lib/privy/public_api/privy_client.rb +2 -1
- data/lib/privy/public_api/services/earn/ethereum/incentive.rb +61 -0
- data/lib/privy/public_api/services/earn/ethereum.rb +131 -0
- data/lib/privy/public_api/services/earn.rb +18 -0
- data/lib/privy/public_api/services/key_quorums.rb +7 -1
- data/lib/privy/public_api/services/policies.rb +21 -3
- data/lib/privy/public_api/services/transactions.rb +14 -0
- data/lib/privy/public_api/services/wallets.rb +153 -1
- data/lib/privy/resources/intents.rb +8 -7
- data/lib/privy/resources/oauth.rb +14 -0
- data/lib/privy/resources/onramps.rb +14 -0
- data/lib/privy/resources/wallets/swap.rb +105 -0
- data/lib/privy/resources/wallets.rb +35 -3
- data/lib/privy/version.rb +1 -1
- data/lib/privy/wallet_entropy.rb +60 -0
- data/lib/privy.rb +71 -5
- data/rbi/privy/client.rbi +9 -2
- data/rbi/privy/models/analytics_event_input.rbi +3 -6
- data/rbi/privy/models/bitcoin_address.rbi +7 -0
- data/rbi/privy/models/bridge_destination_asset.rbi +1 -0
- data/rbi/privy/models/bridge_fiat_virtual_account_destination.rbi +8 -1
- data/rbi/privy/models/bridge_fiat_virtual_account_request.rbi +9 -1
- data/rbi/privy/models/bridge_fiat_virtual_account_response.rbi +2 -0
- data/rbi/privy/models/bridge_fiat_virtual_account_source.rbi +6 -1
- data/rbi/privy/models/bridge_sandbox_fiat_virtual_account_request.rbi +9 -1
- data/rbi/privy/models/bridge_sandbox_fiat_virtual_account_response.rbi +2 -0
- data/rbi/privy/models/bridge_source_asset.rbi +1 -0
- data/rbi/privy/models/create_link_auth_intent_input.rbi +27 -0
- data/rbi/privy/models/create_link_auth_intent_response.rbi +68 -0
- data/rbi/privy/models/create_stripe_onramp_session_input.rbi +55 -0
- data/rbi/privy/models/create_stripe_onramp_session_response.rbi +88 -0
- data/rbi/privy/models/device_authorization_response.rbi +81 -0
- data/rbi/privy/models/device_verify_action.rbi +22 -0
- data/rbi/privy/models/device_verify_request_body.rbi +44 -0
- data/rbi/privy/models/device_verify_response.rbi +28 -0
- data/rbi/privy/models/earn_incentive_reward_entry.rbi +73 -0
- data/rbi/privy/models/earn_incentive_rewards_query.rbi +28 -0
- data/rbi/privy/models/earn_incentive_rewards_response.rbi +35 -0
- data/rbi/privy/models/evm_address.rbi +7 -0
- data/rbi/privy/models/evm_checksum_address.rbi +7 -0
- data/rbi/privy/models/exchange_stripe_tokens_input.rbi +33 -0
- data/rbi/privy/models/exchange_stripe_tokens_response.rbi +24 -0
- data/rbi/privy/models/fiat_onramp_provider.rbi +3 -0
- data/rbi/privy/models/fiat_onramp_stripe_sdk_session_response.rbi +78 -0
- data/rbi/privy/models/fiat_onramp_url_session_response.rbi +65 -0
- data/rbi/privy/models/gas.rbi +46 -0
- data/rbi/privy/models/get_fiat_onramp_url_response.rbi +12 -15
- data/rbi/privy/models/get_stripe_crypto_customer_response.rbi +81 -0
- data/rbi/privy/models/hyperliquid_token_address.rbi +7 -0
- data/rbi/privy/models/kraken_embed_custom_order_cancelled_webhook_payload.rbi +111 -0
- data/rbi/privy/models/kraken_embed_custom_order_executed_webhook_payload.rbi +101 -0
- data/rbi/privy/models/kraken_embed_custom_order_execution_failed_webhook_payload.rbi +111 -0
- data/rbi/privy/models/link_auth_intent_created.rbi +60 -0
- data/rbi/privy/models/link_auth_intent_no_account.rbi +54 -0
- data/rbi/privy/models/linked_account_embedded_wallet.rbi +1 -0
- data/rbi/privy/models/list_stripe_consumer_wallets_response.rbi +31 -0
- data/rbi/privy/models/list_stripe_payment_tokens_response.rbi +31 -0
- data/rbi/privy/models/oauth_grant.rbi +78 -0
- data/rbi/privy/models/oauth_grant_list_response.rbi +32 -0
- data/rbi/privy/models/oauth_grant_revoke_response.rbi +58 -0
- data/rbi/privy/models/oauth_token_authorization_code_request_body.rbi +115 -0
- data/rbi/privy/models/oauth_token_device_code_pending_error.rbi +106 -0
- data/rbi/privy/models/oauth_token_device_code_request_body.rbi +78 -0
- data/rbi/privy/models/oauth_token_grant_type.rbi +29 -0
- data/rbi/privy/models/oauth_token_refresh_token_request_body.rbi +78 -0
- data/rbi/privy/models/oauth_token_request_body.rbi +23 -0
- data/rbi/privy/models/oauth_token_success_response.rbi +95 -0
- data/rbi/privy/models/onramp_session_fees.rbi +39 -0
- data/rbi/privy/models/onramp_session_params.rbi +76 -0
- data/rbi/privy/models/onramp_session_transaction_details.rbi +95 -0
- data/rbi/privy/models/refresh_stripe_quote_response.rbi +33 -0
- data/rbi/privy/models/rule_delete_intent_response.rbi +113 -0
- data/rbi/privy/models/rule_mutate_intent_response.rbi +113 -0
- data/rbi/privy/models/solana_address.rbi +7 -0
- data/rbi/privy/models/stripe_consumer_wallet.rbi +38 -0
- data/rbi/privy/models/stripe_crypto_customer_active.rbi +68 -0
- data/rbi/privy/models/stripe_crypto_customer_expired.rbi +63 -0
- data/rbi/privy/models/stripe_crypto_customer_none.rbi +53 -0
- data/rbi/privy/models/stripe_onramp_checkout_response.rbi +51 -0
- data/rbi/privy/models/stripe_onramp_session_status.rbi +26 -0
- data/rbi/privy/models/stripe_payment_token.rbi +27 -0
- data/rbi/privy/models/stripe_quote.rbi +22 -0
- data/rbi/privy/models/stripe_transaction_details.rbi +24 -0
- data/rbi/privy/models/stripe_verification.rbi +27 -0
- data/rbi/privy/models/swap_action_response.rbi +96 -22
- data/rbi/privy/models/swap_destination.rbi +26 -7
- data/rbi/privy/models/swap_quote_destination.rbi +30 -7
- data/rbi/privy/models/swap_quote_request_body.rbi +15 -4
- data/rbi/privy/models/swap_quote_response.rbi +71 -5
- data/rbi/privy/models/swap_request_body.rbi +15 -4
- data/rbi/privy/models/token_transfer_destination.rbi +2 -2
- data/rbi/privy/models/transfer_action_response.rbi +57 -2
- data/rbi/privy/models/transfer_quote_request_body.rbi +4 -2
- data/rbi/privy/models/transfer_quote_response.rbi +16 -3
- data/rbi/privy/models/transfer_received_transaction_detail.rbi +15 -0
- data/rbi/privy/models/transfer_request_body.rbi +4 -2
- data/rbi/privy/models/transfer_sent_transaction_detail.rbi +15 -0
- data/rbi/privy/models/tron_address.rbi +7 -0
- data/rbi/privy/models/wallet_asset.rbi +1 -0
- data/rbi/privy/models/wallet_batch_create_response.rbi +2 -19
- data/rbi/privy/models/wallet_batch_create_result.rbi +4 -4
- data/rbi/privy/models/wallet_create_batch_params.rbi +27 -0
- data/rbi/privy/models/wallet_ethereum_asset.rbi +1 -0
- data/rbi/privy/models/wallets/balance_get_params.rbi +22 -0
- data/rbi/privy/models/wallets/balance_get_response.rbi +15 -0
- data/rbi/privy/models/wallets/swap_execute_params.rbi +71 -0
- data/rbi/privy/models/wallets/swap_quote_params.rbi +58 -0
- data/rbi/privy/models/wallets/transaction_get_params.rbi +5 -0
- data/rbi/privy/models.rbi +127 -5
- data/rbi/privy/resources/intents.rbi +7 -4
- data/rbi/privy/resources/oauth.rbi +12 -0
- data/rbi/privy/resources/onramps.rbi +12 -0
- data/rbi/privy/resources/wallets/swap.rbi +94 -0
- data/rbi/privy/resources/wallets.rbi +28 -3
- data/sig/privy/client.rbs +5 -1
- data/sig/privy/models/analytics_event_input.rbs +4 -6
- data/sig/privy/models/bitcoin_address.rbs +5 -0
- data/sig/privy/models/create_link_auth_intent_input.rbs +15 -0
- data/sig/privy/models/create_link_auth_intent_response.rbs +26 -0
- data/sig/privy/models/create_stripe_onramp_session_input.rbs +30 -0
- data/sig/privy/models/create_stripe_onramp_session_response.rbs +42 -0
- data/sig/privy/models/device_authorization_response.rbs +45 -0
- data/sig/privy/models/device_verify_action.rbs +14 -0
- data/sig/privy/models/device_verify_request_body.rbs +22 -0
- data/sig/privy/models/device_verify_response.rbs +13 -0
- data/sig/privy/models/earn_incentive_reward_entry.rbs +42 -0
- data/sig/privy/models/earn_incentive_rewards_query.rbs +13 -0
- data/sig/privy/models/earn_incentive_rewards_response.rbs +16 -0
- data/sig/privy/models/evm_address.rbs +5 -0
- data/sig/privy/models/evm_checksum_address.rbs +5 -0
- data/sig/privy/models/exchange_stripe_tokens_input.rbs +19 -0
- data/sig/privy/models/exchange_stripe_tokens_response.rbs +13 -0
- data/sig/privy/models/fiat_onramp_provider.rbs +4 -0
- data/sig/privy/models/fiat_onramp_stripe_sdk_session_response.rbs +45 -0
- data/sig/privy/models/fiat_onramp_url_session_response.rbs +40 -0
- data/sig/privy/models/gas.rbs +21 -0
- data/sig/privy/models/get_fiat_onramp_url_response.rbs +6 -8
- data/sig/privy/models/get_stripe_crypto_customer_response.rbs +29 -0
- data/sig/privy/models/hyperliquid_token_address.rbs +5 -0
- data/sig/privy/models/kraken_embed_custom_order_cancelled_webhook_payload.rbs +50 -0
- data/sig/privy/models/kraken_embed_custom_order_executed_webhook_payload.rbs +45 -0
- data/sig/privy/models/kraken_embed_custom_order_execution_failed_webhook_payload.rbs +50 -0
- data/sig/privy/models/link_auth_intent_created.rbs +32 -0
- data/sig/privy/models/link_auth_intent_no_account.rbs +26 -0
- data/sig/privy/models/list_stripe_consumer_wallets_response.rbs +14 -0
- data/sig/privy/models/list_stripe_payment_tokens_response.rbs +14 -0
- data/sig/privy/models/oauth_grant.rbs +45 -0
- data/sig/privy/models/oauth_grant_list_response.rbs +13 -0
- data/sig/privy/models/oauth_grant_revoke_response.rbs +28 -0
- data/sig/privy/models/oauth_token_authorization_code_request_body.rbs +56 -0
- data/sig/privy/models/oauth_token_device_code_pending_error.rbs +48 -0
- data/sig/privy/models/oauth_token_device_code_request_body.rbs +35 -0
- data/sig/privy/models/oauth_token_grant_type.rbs +18 -0
- data/sig/privy/models/oauth_token_refresh_token_request_body.rbs +35 -0
- data/sig/privy/models/oauth_token_request_body.rbs +14 -0
- data/sig/privy/models/oauth_token_success_response.rbs +49 -0
- data/sig/privy/models/onramp_session_fees.rbs +22 -0
- data/sig/privy/models/onramp_session_params.rbs +50 -0
- data/sig/privy/models/onramp_session_transaction_details.rbs +53 -0
- data/sig/privy/models/refresh_stripe_quote_response.rbs +13 -0
- data/sig/privy/models/rule_delete_intent_response.rbs +66 -0
- data/sig/privy/models/rule_mutate_intent_response.rbs +66 -0
- data/sig/privy/models/solana_address.rbs +5 -0
- data/sig/privy/models/stripe_consumer_wallet.rbs +22 -0
- data/sig/privy/models/stripe_crypto_customer_active.rbs +40 -0
- data/sig/privy/models/stripe_crypto_customer_expired.rbs +35 -0
- data/sig/privy/models/stripe_crypto_customer_none.rbs +28 -0
- data/sig/privy/models/stripe_onramp_checkout_response.rbs +29 -0
- data/sig/privy/models/stripe_onramp_session_status.rbs +15 -0
- data/sig/privy/models/stripe_payment_token.rbs +15 -0
- data/sig/privy/models/stripe_quote.rbs +13 -0
- data/sig/privy/models/stripe_transaction_details.rbs +13 -0
- data/sig/privy/models/stripe_verification.rbs +15 -0
- data/sig/privy/models/swap_action_response.rbs +39 -0
- data/sig/privy/models/swap_destination.rbs +16 -3
- data/sig/privy/models/swap_quote_destination.rbs +16 -3
- data/sig/privy/models/swap_quote_request_body.rbs +14 -5
- data/sig/privy/models/swap_quote_response.rbs +33 -3
- data/sig/privy/models/swap_request_body.rbs +14 -5
- data/sig/privy/models/transfer_action_response.rbs +23 -0
- data/sig/privy/models/transfer_quote_response.rbs +10 -3
- data/sig/privy/models/transfer_received_transaction_detail.rbs +15 -1
- data/sig/privy/models/transfer_sent_transaction_detail.rbs +15 -1
- data/sig/privy/models/tron_address.rbs +5 -0
- data/sig/privy/models/wallet_asset.rbs +2 -1
- data/sig/privy/models/wallet_create_batch_params.rbs +15 -0
- data/sig/privy/models/wallet_ethereum_asset.rbs +2 -1
- data/sig/privy/models/wallets/balance_get_params.rbs +10 -0
- data/sig/privy/models/wallets/balance_get_response.rbs +6 -0
- data/sig/privy/models/wallets/swap_execute_params.rbs +44 -0
- data/sig/privy/models/wallets/swap_quote_params.rbs +34 -0
- data/sig/privy/models/wallets/transaction_get_params.rbs +2 -0
- data/sig/privy/models.rbs +115 -5
- data/sig/privy/resources/intents.rbs +3 -3
- data/sig/privy/resources/oauth.rbs +7 -0
- data/sig/privy/resources/onramps.rbs +7 -0
- data/sig/privy/resources/wallets/swap.rbs +34 -0
- data/sig/privy/resources/wallets.rbs +7 -0
- metadata +194 -8
- data/lib/privy/models/gas_sponsorship_configuration.rb +0 -29
- data/lib/privy/models/gas_sponsorship_configuration_input.rb +0 -29
- data/rbi/privy/models/gas_sponsorship_configuration.rbi +0 -48
- data/rbi/privy/models/gas_sponsorship_configuration_input.rbi +0 -60
- data/sig/privy/models/gas_sponsorship_configuration.rbs +0 -30
- data/sig/privy/models/gas_sponsorship_configuration_input.rbs +0 -36
|
@@ -5,9 +5,13 @@ module Privy
|
|
|
5
5
|
class Wallets < Privy::Resources::Wallets
|
|
6
6
|
attr_reader :privy_client
|
|
7
7
|
|
|
8
|
+
# @return [Privy::Services::Earn]
|
|
9
|
+
attr_reader :earn
|
|
10
|
+
|
|
8
11
|
def initialize(client:, privy_client:)
|
|
9
12
|
super(client: client)
|
|
10
13
|
@privy_client = privy_client
|
|
14
|
+
@earn = Privy::Services::Earn.new(client: client, privy_client: privy_client)
|
|
11
15
|
end
|
|
12
16
|
|
|
13
17
|
# Create a new wallet on the requested chain and for the requested owner.
|
|
@@ -39,6 +43,74 @@ module Privy
|
|
|
39
43
|
super(combined_params)
|
|
40
44
|
end
|
|
41
45
|
|
|
46
|
+
# Import an externally generated wallet by encrypting its entropy with HPKE.
|
|
47
|
+
#
|
|
48
|
+
# @param wallet [Hash] Import wallet parameters plus :private_key entropy.
|
|
49
|
+
# @option wallet [String] :private_key Private key or seed phrase entropy to import.
|
|
50
|
+
# @option wallet [String, Symbol] :entropy_type "hd" or "private-key".
|
|
51
|
+
# @option wallet [String, Symbol] :chain_type "ethereum" or "solana".
|
|
52
|
+
# @param request_options [Privy::RequestOptions, Hash, nil] Transport-level config (timeouts, retries).
|
|
53
|
+
#
|
|
54
|
+
# @return [Privy::Models::Wallet]
|
|
55
|
+
def import(
|
|
56
|
+
wallet:,
|
|
57
|
+
additional_signers: nil,
|
|
58
|
+
display_name: nil,
|
|
59
|
+
external_id: nil,
|
|
60
|
+
owner: nil,
|
|
61
|
+
owner_id: nil,
|
|
62
|
+
policy_ids: nil,
|
|
63
|
+
request_options: nil
|
|
64
|
+
)
|
|
65
|
+
import_wallet = wallet.transform_keys { |key| key.respond_to?(:to_sym) ? key.to_sym : key }
|
|
66
|
+
private_key = import_wallet.delete(:private_key)
|
|
67
|
+
raise Privy::Errors::Error, "wallet.private_key is required" if private_key.nil?
|
|
68
|
+
if import_wallet.key?(:hpke_config)
|
|
69
|
+
raise Privy::Errors::Error,
|
|
70
|
+
"wallet.hpke_config is not supported: encryption parameters are fixed by the SDK"
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
private_key_bytes = Privy::WalletEntropy.entropy_to_bytes(
|
|
74
|
+
entropy: private_key,
|
|
75
|
+
entropy_type: import_wallet.fetch(:entropy_type),
|
|
76
|
+
chain_type: import_wallet.fetch(:chain_type)
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
init_response = _init_import(
|
|
80
|
+
body: import_wallet.merge(encryption_type: "HPKE"),
|
|
81
|
+
request_options: request_options
|
|
82
|
+
)
|
|
83
|
+
unless init_response.encryption_type.to_s == "HPKE"
|
|
84
|
+
raise Privy::Errors::Error, "Invalid encryption type: #{init_response.encryption_type}"
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
encrypted = Privy::Cryptography::HpkeSender.new.encrypt(
|
|
88
|
+
Base64.strict_decode64(init_response.encryption_public_key),
|
|
89
|
+
private_key_bytes
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
submit_params = {
|
|
93
|
+
wallet: import_wallet.merge(
|
|
94
|
+
encryption_type: "HPKE",
|
|
95
|
+
encapsulated_key: Base64.strict_encode64(encrypted.encapsulated_key),
|
|
96
|
+
ciphertext: Base64.strict_encode64(encrypted.ciphertext)
|
|
97
|
+
),
|
|
98
|
+
request_options: request_options
|
|
99
|
+
}
|
|
100
|
+
{
|
|
101
|
+
additional_signers: additional_signers,
|
|
102
|
+
display_name: display_name,
|
|
103
|
+
external_id: external_id,
|
|
104
|
+
owner: owner,
|
|
105
|
+
owner_id: owner_id,
|
|
106
|
+
policy_ids: policy_ids
|
|
107
|
+
}.each do |key, value|
|
|
108
|
+
submit_params[key] = value unless value.nil?
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
_submit_import(submit_params)
|
|
112
|
+
end
|
|
113
|
+
|
|
42
114
|
# Update a wallet's policies or authorization key configuration.
|
|
43
115
|
#
|
|
44
116
|
# @example Update wallet policies
|
|
@@ -60,7 +132,13 @@ module Privy
|
|
|
60
132
|
# @param request_options [Privy::RequestOptions, Hash, nil] Transport-level config (timeouts, retries).
|
|
61
133
|
#
|
|
62
134
|
# @return [Privy::Models::Wallet]
|
|
63
|
-
def update(
|
|
135
|
+
def update(
|
|
136
|
+
wallet_id,
|
|
137
|
+
wallet_update_params:,
|
|
138
|
+
authorization_context: nil,
|
|
139
|
+
request_expiry: nil,
|
|
140
|
+
request_options: nil
|
|
141
|
+
)
|
|
64
142
|
prepared = Privy::Authorization.prepare_request(
|
|
65
143
|
privy_client,
|
|
66
144
|
method: :patch,
|
|
@@ -221,6 +299,80 @@ module Privy
|
|
|
221
299
|
Privy::Authorization.merge_prepared_headers!(combined_params, prepared.headers)
|
|
222
300
|
_transfer(wallet_id, combined_params)
|
|
223
301
|
end
|
|
302
|
+
|
|
303
|
+
# Export a wallet's private key or seed phrase via HPKE.
|
|
304
|
+
#
|
|
305
|
+
# @param wallet_id [String] ID of the wallet to export.
|
|
306
|
+
# @param export_seed_phrase [Boolean, nil] Whether to export the seed phrase instead of the private key.
|
|
307
|
+
# @param authorization_context [Privy::Authorization::AuthorizationContext, nil] Authorization context for owned wallets.
|
|
308
|
+
# @param request_expiry [Integer, nil] Absolute Unix-ms timestamp at which the request expires.
|
|
309
|
+
# @param request_options [Privy::RequestOptions, Hash, nil] Transport-level config (timeouts, retries).
|
|
310
|
+
#
|
|
311
|
+
# @return [Hash] {private_key: String}
|
|
312
|
+
def export(
|
|
313
|
+
wallet_id,
|
|
314
|
+
export_seed_phrase: nil,
|
|
315
|
+
authorization_context: nil,
|
|
316
|
+
request_expiry: nil,
|
|
317
|
+
request_options: nil
|
|
318
|
+
)
|
|
319
|
+
recipient = Privy::Cryptography::HpkeRecipient.new
|
|
320
|
+
export_params = {
|
|
321
|
+
encryption_type: "HPKE",
|
|
322
|
+
recipient_public_key: Base64.strict_encode64(recipient.public_key_spki)
|
|
323
|
+
}
|
|
324
|
+
export_params[:export_seed_phrase] = export_seed_phrase unless export_seed_phrase.nil?
|
|
325
|
+
|
|
326
|
+
prepared = Privy::Authorization.prepare_request(
|
|
327
|
+
privy_client,
|
|
328
|
+
method: :post,
|
|
329
|
+
url: Privy::Authorization.signed_url(privy_client, "v1/wallets/#{wallet_id}/export"),
|
|
330
|
+
body: export_params,
|
|
331
|
+
authorization_context: authorization_context,
|
|
332
|
+
request_expiry: privy_client.compute_request_expiry(request_expiry)
|
|
333
|
+
)
|
|
334
|
+
combined_params = export_params.merge(request_options: request_options)
|
|
335
|
+
Privy::Authorization.merge_prepared_headers!(combined_params, prepared.headers)
|
|
336
|
+
|
|
337
|
+
response = super(wallet_id, combined_params)
|
|
338
|
+
unless response.encryption_type.to_s == "HPKE"
|
|
339
|
+
raise Privy::Errors::Error, "Invalid encryption type: #{response.encryption_type}"
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
private_key = recipient.decrypt(
|
|
343
|
+
Base64.strict_decode64(response.encapsulated_key),
|
|
344
|
+
Base64.strict_decode64(response.ciphertext)
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
{private_key: private_key.force_encoding(Encoding::UTF_8)}
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
# Export a wallet's private key via HPKE.
|
|
351
|
+
#
|
|
352
|
+
# @return [Hash] {private_key: String}
|
|
353
|
+
def export_private_key(wallet_id, authorization_context: nil, request_expiry: nil, request_options: nil)
|
|
354
|
+
export(
|
|
355
|
+
wallet_id,
|
|
356
|
+
export_seed_phrase: false,
|
|
357
|
+
authorization_context: authorization_context,
|
|
358
|
+
request_expiry: request_expiry,
|
|
359
|
+
request_options: request_options
|
|
360
|
+
)
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
# Export a wallet's seed phrase via HPKE.
|
|
364
|
+
#
|
|
365
|
+
# @return [Hash] {seed_phrase: String}
|
|
366
|
+
def export_seed_phrase(wallet_id, authorization_context: nil, request_expiry: nil, request_options: nil)
|
|
367
|
+
exported = export(
|
|
368
|
+
wallet_id,
|
|
369
|
+
export_seed_phrase: true,
|
|
370
|
+
authorization_context: authorization_context,
|
|
371
|
+
request_expiry: request_expiry,
|
|
372
|
+
request_options: request_options
|
|
373
|
+
)
|
|
374
|
+
{seed_phrase: exported.fetch(:private_key)}
|
|
375
|
+
end
|
|
224
376
|
end
|
|
225
377
|
end
|
|
226
378
|
end
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
module Privy
|
|
4
4
|
module Resources
|
|
5
|
+
# Operations related to authorization intents for wallet actions
|
|
5
6
|
class Intents
|
|
6
7
|
# List intents for an app. Returns a paginated list of intents with their current
|
|
7
8
|
# status and details.
|
|
@@ -66,7 +67,7 @@ module Privy
|
|
|
66
67
|
#
|
|
67
68
|
# @param request_options [Privy::RequestOptions, Hash{Symbol=>Object}, nil]
|
|
68
69
|
#
|
|
69
|
-
# @return [Privy::Models::
|
|
70
|
+
# @return [Privy::Models::RuleMutateIntentResponse]
|
|
70
71
|
#
|
|
71
72
|
# @see Privy::Models::IntentCreatePolicyRuleParams
|
|
72
73
|
def create_policy_rule(policy_id, params)
|
|
@@ -77,7 +78,7 @@ module Privy
|
|
|
77
78
|
path: ["v1/intents/policies/%1$s/rules", policy_id],
|
|
78
79
|
headers: parsed.slice(*header_params.keys).transform_keys(header_params),
|
|
79
80
|
body: parsed.except(*header_params.keys),
|
|
80
|
-
model: Privy::
|
|
81
|
+
model: Privy::RuleMutateIntentResponse,
|
|
81
82
|
options: options
|
|
82
83
|
)
|
|
83
84
|
end
|
|
@@ -98,7 +99,7 @@ module Privy
|
|
|
98
99
|
#
|
|
99
100
|
# @param request_options [Privy::RequestOptions, Hash{Symbol=>Object}, nil]
|
|
100
101
|
#
|
|
101
|
-
# @return [Privy::Models::
|
|
102
|
+
# @return [Privy::Models::RuleDeleteIntentResponse]
|
|
102
103
|
#
|
|
103
104
|
# @see Privy::Models::IntentDeletePolicyRuleParams
|
|
104
105
|
def delete_policy_rule(rule_id, params)
|
|
@@ -111,7 +112,7 @@ module Privy
|
|
|
111
112
|
method: :delete,
|
|
112
113
|
path: ["v1/intents/policies/%1$s/rules/%2$s", policy_id, rule_id],
|
|
113
114
|
headers: parsed.transform_keys(privy_request_expiry: "privy-request-expiry"),
|
|
114
|
-
model: Privy::
|
|
115
|
+
model: Privy::RuleDeleteIntentResponse,
|
|
115
116
|
options: options
|
|
116
117
|
)
|
|
117
118
|
end
|
|
@@ -186,7 +187,7 @@ module Privy
|
|
|
186
187
|
#
|
|
187
188
|
# @param fee_configuration [Privy::Models::FeeConfiguration] Body param: Total fees assessed on a transfer, in BPS
|
|
188
189
|
#
|
|
189
|
-
# @param slippage_bps [Integer] Body param: Maximum allowed slippage in basis points (1 bps = 0.01%).
|
|
190
|
+
# @param slippage_bps [Integer] Body param: Maximum allowed slippage in basis points (1 bps = 0.01%). Only appli
|
|
190
191
|
#
|
|
191
192
|
# @param privy_request_expiry [String] Header param: Request expiry. Value is a Unix timestamp in milliseconds represen
|
|
192
193
|
#
|
|
@@ -310,7 +311,7 @@ module Privy
|
|
|
310
311
|
#
|
|
311
312
|
# @param request_options [Privy::RequestOptions, Hash{Symbol=>Object}, nil]
|
|
312
313
|
#
|
|
313
|
-
# @return [Privy::Models::
|
|
314
|
+
# @return [Privy::Models::RuleMutateIntentResponse]
|
|
314
315
|
#
|
|
315
316
|
# @see Privy::Models::IntentUpdatePolicyRuleParams
|
|
316
317
|
def update_policy_rule(rule_id, params)
|
|
@@ -325,7 +326,7 @@ module Privy
|
|
|
325
326
|
path: ["v1/intents/policies/%1$s/rules/%2$s", policy_id, rule_id],
|
|
326
327
|
headers: parsed.slice(*header_params.keys).transform_keys(header_params),
|
|
327
328
|
body: parsed.except(*header_params.keys),
|
|
328
|
-
model: Privy::
|
|
329
|
+
model: Privy::RuleMutateIntentResponse,
|
|
329
330
|
options: options
|
|
330
331
|
)
|
|
331
332
|
end
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Privy
|
|
4
|
+
module Resources
|
|
5
|
+
class Wallets
|
|
6
|
+
# Operations for swapping tokens within wallets
|
|
7
|
+
class Swap
|
|
8
|
+
# Some parameter documentations has been truncated, see
|
|
9
|
+
# {Privy::Models::Wallets::SwapExecuteParams} for more details.
|
|
10
|
+
#
|
|
11
|
+
# Execute a token swap within a wallet.
|
|
12
|
+
#
|
|
13
|
+
# @overload execute(wallet_id, base_amount:, destination:, source:, amount_type: nil, fee_configuration: nil, slippage_bps: nil, privy_authorization_signature: nil, privy_idempotency_key: nil, request_options: {})
|
|
14
|
+
#
|
|
15
|
+
# @param wallet_id [String] Path param: ID of the wallet.
|
|
16
|
+
#
|
|
17
|
+
# @param base_amount [String] Body param: Amount in base units (e.g., wei for ETH). Must be a non-negative int
|
|
18
|
+
#
|
|
19
|
+
# @param destination [Privy::Models::SwapDestination] Body param: The output side of a swap execution request.
|
|
20
|
+
#
|
|
21
|
+
# @param source [Privy::Models::SwapSource] Body param: The input side of a swap request, including token and chain.
|
|
22
|
+
#
|
|
23
|
+
# @param amount_type [Symbol, Privy::Models::AmountType] Body param: Whether the amount refers to the input token or output token.
|
|
24
|
+
#
|
|
25
|
+
# @param fee_configuration [Privy::Models::FeeConfiguration] Body param: Total fees assessed on a transfer, in BPS
|
|
26
|
+
#
|
|
27
|
+
# @param slippage_bps [Integer] Body param: Maximum slippage tolerance in basis points (e.g., 50 for 0.5%).
|
|
28
|
+
#
|
|
29
|
+
# @param privy_authorization_signature [String] Header param: Request authorization signature. If multiple signatures are requir
|
|
30
|
+
#
|
|
31
|
+
# @param privy_idempotency_key [String] Header param: Idempotency keys ensure API requests are executed only once within
|
|
32
|
+
#
|
|
33
|
+
# @param request_options [Privy::RequestOptions, Hash{Symbol=>Object}, nil]
|
|
34
|
+
#
|
|
35
|
+
# @return [Privy::Models::SwapActionResponse]
|
|
36
|
+
#
|
|
37
|
+
# @see Privy::Models::Wallets::SwapExecuteParams
|
|
38
|
+
def execute(wallet_id, params)
|
|
39
|
+
parsed, options = Privy::Wallets::SwapExecuteParams.dump_request(params)
|
|
40
|
+
header_params =
|
|
41
|
+
{
|
|
42
|
+
privy_authorization_signature: "privy-authorization-signature",
|
|
43
|
+
privy_idempotency_key: "privy-idempotency-key"
|
|
44
|
+
}
|
|
45
|
+
@client.request(
|
|
46
|
+
method: :post,
|
|
47
|
+
path: ["v1/wallets/%1$s/swap", wallet_id],
|
|
48
|
+
headers: parsed.slice(*header_params.keys).transform_keys(header_params),
|
|
49
|
+
body: parsed.except(*header_params.keys),
|
|
50
|
+
model: Privy::SwapActionResponse,
|
|
51
|
+
options: options
|
|
52
|
+
)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Some parameter documentations has been truncated, see
|
|
56
|
+
# {Privy::Models::Wallets::SwapQuoteParams} for more details.
|
|
57
|
+
#
|
|
58
|
+
# Get a price quote for swapping tokens within a wallet.
|
|
59
|
+
#
|
|
60
|
+
# @overload quote(wallet_id, base_amount:, destination:, source:, amount_type: nil, fee_configuration: nil, slippage_bps: nil, privy_authorization_signature: nil, request_options: {})
|
|
61
|
+
#
|
|
62
|
+
# @param wallet_id [String] Path param: ID of the wallet.
|
|
63
|
+
#
|
|
64
|
+
# @param base_amount [String] Body param: Amount in base units (e.g., wei for ETH). Must be a non-negative int
|
|
65
|
+
#
|
|
66
|
+
# @param destination [Privy::Models::SwapQuoteDestination] Body param: The output side of a swap quote request.
|
|
67
|
+
#
|
|
68
|
+
# @param source [Privy::Models::SwapSource] Body param: The input side of a swap request, including token and chain.
|
|
69
|
+
#
|
|
70
|
+
# @param amount_type [Symbol, Privy::Models::AmountType] Body param: Whether the amount refers to the input token or output token.
|
|
71
|
+
#
|
|
72
|
+
# @param fee_configuration [Privy::Models::FeeConfiguration] Body param: Total fees assessed on a transfer, in BPS
|
|
73
|
+
#
|
|
74
|
+
# @param slippage_bps [Integer] Body param: Maximum slippage tolerance in basis points (e.g., 50 for 0.5%). If o
|
|
75
|
+
#
|
|
76
|
+
# @param privy_authorization_signature [String] Header param: Request authorization signature. If multiple signatures are requir
|
|
77
|
+
#
|
|
78
|
+
# @param request_options [Privy::RequestOptions, Hash{Symbol=>Object}, nil]
|
|
79
|
+
#
|
|
80
|
+
# @return [Privy::Models::SwapQuoteResponse]
|
|
81
|
+
#
|
|
82
|
+
# @see Privy::Models::Wallets::SwapQuoteParams
|
|
83
|
+
def quote(wallet_id, params)
|
|
84
|
+
parsed, options = Privy::Wallets::SwapQuoteParams.dump_request(params)
|
|
85
|
+
header_params = {privy_authorization_signature: "privy-authorization-signature"}
|
|
86
|
+
@client.request(
|
|
87
|
+
method: :post,
|
|
88
|
+
path: ["v1/wallets/%1$s/swap/quote", wallet_id],
|
|
89
|
+
headers: parsed.slice(*header_params.keys).transform_keys(header_params),
|
|
90
|
+
body: parsed.except(*header_params.keys),
|
|
91
|
+
model: Privy::SwapQuoteResponse,
|
|
92
|
+
options: options
|
|
93
|
+
)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# @api private
|
|
97
|
+
#
|
|
98
|
+
# @param client [Privy::Client]
|
|
99
|
+
def initialize(client:)
|
|
100
|
+
@client = client
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
@@ -14,6 +14,10 @@ module Privy
|
|
|
14
14
|
# @return [Privy::Resources::Wallets::Balance]
|
|
15
15
|
attr_reader :balance
|
|
16
16
|
|
|
17
|
+
# Operations for swapping tokens within wallets
|
|
18
|
+
# @return [Privy::Resources::Wallets::Swap]
|
|
19
|
+
attr_reader :swap
|
|
20
|
+
|
|
17
21
|
# Some parameter documentations has been truncated, see
|
|
18
22
|
# {Privy::Models::WalletCreateParams} for more details.
|
|
19
23
|
#
|
|
@@ -213,7 +217,7 @@ module Privy
|
|
|
213
217
|
#
|
|
214
218
|
# @param fee_configuration [Privy::Models::FeeConfiguration] Body param: Total fees assessed on a transfer, in BPS
|
|
215
219
|
#
|
|
216
|
-
# @param slippage_bps [Integer] Body param: Maximum allowed slippage in basis points (1 bps = 0.01%).
|
|
220
|
+
# @param slippage_bps [Integer] Body param: Maximum allowed slippage in basis points (1 bps = 0.01%). Only appli
|
|
217
221
|
#
|
|
218
222
|
# @param privy_authorization_signature [String] Header param: Request authorization signature. If multiple signatures are requir
|
|
219
223
|
#
|
|
@@ -247,7 +251,8 @@ module Privy
|
|
|
247
251
|
# Some parameter documentations has been truncated, see
|
|
248
252
|
# {Privy::Models::WalletAuthenticateWithJwtParams} for more details.
|
|
249
253
|
#
|
|
250
|
-
#
|
|
254
|
+
# Exchange a user JWT for a session key authorized to act on the user's wallets.
|
|
255
|
+
# Returns the encrypted authorization key and the list of wallets it can access.
|
|
251
256
|
#
|
|
252
257
|
# @overload authenticate_with_jwt(encryption_type:, recipient_public_key:, user_jwt:, request_options: {})
|
|
253
258
|
#
|
|
@@ -273,9 +278,35 @@ module Privy
|
|
|
273
278
|
)
|
|
274
279
|
end
|
|
275
280
|
|
|
281
|
+
# Creates multiple wallets in a single request. Each wallet creation is
|
|
282
|
+
# independent; failures for one wallet do not affect others. Maximum batch size is
|
|
283
|
+
# 100 wallets.
|
|
284
|
+
#
|
|
285
|
+
# @overload create_batch(wallets:, request_options: {})
|
|
286
|
+
#
|
|
287
|
+
# @param wallets [Array<Privy::Models::WalletBatchItemInput>] Array of wallet creation requests. Minimum 1, maximum 100.
|
|
288
|
+
#
|
|
289
|
+
# @param request_options [Privy::RequestOptions, Hash{Symbol=>Object}, nil]
|
|
290
|
+
#
|
|
291
|
+
# @return [Privy::Models::WalletBatchCreateResponse]
|
|
292
|
+
#
|
|
293
|
+
# @see Privy::Models::WalletCreateBatchParams
|
|
294
|
+
def create_batch(params)
|
|
295
|
+
parsed, options = Privy::WalletCreateBatchParams.dump_request(params)
|
|
296
|
+
@client.request(
|
|
297
|
+
method: :post,
|
|
298
|
+
path: "v1/wallets/batch",
|
|
299
|
+
body: parsed,
|
|
300
|
+
model: Privy::WalletBatchCreateResponse,
|
|
301
|
+
options: options
|
|
302
|
+
)
|
|
303
|
+
end
|
|
304
|
+
|
|
276
305
|
# @deprecated
|
|
277
306
|
#
|
|
278
|
-
# Create wallets with
|
|
307
|
+
# Create one or more wallets associated with a recovery user, so the user can
|
|
308
|
+
# later regain wallet access via the linked accounts. Deprecated; prefer the
|
|
309
|
+
# standard wallet creation flow combined with a separate recovery setup.
|
|
279
310
|
#
|
|
280
311
|
# @overload create_wallets_with_recovery(primary_signer:, recovery_user:, wallets:, request_options: {})
|
|
281
312
|
#
|
|
@@ -467,6 +498,7 @@ module Privy
|
|
|
467
498
|
@earn = Privy::Resources::Wallets::Earn.new(client: client)
|
|
468
499
|
@transactions = Privy::Resources::Wallets::Transactions.new(client: client)
|
|
469
500
|
@balance = Privy::Resources::Wallets::Balance.new(client: client)
|
|
501
|
+
@swap = Privy::Resources::Wallets::Swap.new(client: client)
|
|
470
502
|
end
|
|
471
503
|
end
|
|
472
504
|
end
|
data/lib/privy/version.rb
CHANGED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base58"
|
|
4
|
+
|
|
5
|
+
module Privy
|
|
6
|
+
module WalletEntropy
|
|
7
|
+
SECP256K1_ORDER = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
|
|
8
|
+
|
|
9
|
+
module_function
|
|
10
|
+
|
|
11
|
+
def entropy_to_bytes(entropy:, entropy_type:, chain_type:)
|
|
12
|
+
case entropy_type.to_s
|
|
13
|
+
when "hd"
|
|
14
|
+
entropy.to_s.encode(Encoding::UTF_8).b
|
|
15
|
+
when "private-key"
|
|
16
|
+
private_key_to_bytes(entropy.to_s, chain_type.to_s)
|
|
17
|
+
else
|
|
18
|
+
raise Privy::Errors::Error, "Invalid entropy type: #{entropy_type}"
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def private_key_to_bytes(entropy, chain_type)
|
|
23
|
+
case chain_type
|
|
24
|
+
when "ethereum"
|
|
25
|
+
ethereum_private_key_to_bytes(entropy)
|
|
26
|
+
when "solana"
|
|
27
|
+
solana_private_key_to_bytes(entropy)
|
|
28
|
+
else
|
|
29
|
+
raise Privy::Errors::Error, "Invalid chain type for imports: #{chain_type}"
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def ethereum_private_key_to_bytes(entropy)
|
|
34
|
+
hex = entropy.start_with?("0x") ? entropy[2..] : entropy
|
|
35
|
+
unless hex.match?(/\A[0-9a-fA-F]{64}\z/)
|
|
36
|
+
raise Privy::Errors::Error,
|
|
37
|
+
"Invalid private key: Ethereum entropy must be 64 hex characters (32 bytes)"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
scalar = hex.to_i(16)
|
|
41
|
+
if scalar.zero? || scalar >= SECP256K1_ORDER
|
|
42
|
+
raise Privy::Errors::Error,
|
|
43
|
+
"Invalid private key: Ethereum entropy must be in range [1, secp256k1 order)"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
[hex].pack("H*")
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def solana_private_key_to_bytes(entropy)
|
|
50
|
+
if entropy.empty?
|
|
51
|
+
raise Privy::Errors::Error,
|
|
52
|
+
"Invalid private key: Solana entropy must be base58 encoded"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
Privy::Base58.decode(entropy)
|
|
56
|
+
rescue ArgumentError
|
|
57
|
+
raise Privy::Errors::Error, "Invalid private key: Solana entropy must be base58 encoded"
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|