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.
Files changed (303) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +34 -0
  3. data/README.md +1 -1
  4. data/lib/privy/base58.rb +41 -0
  5. data/lib/privy/client.rb +12 -3
  6. data/lib/privy/cryptography.rb +34 -0
  7. data/lib/privy/models/analytics_event_input.rb +2 -2
  8. data/lib/privy/models/bitcoin_address.rb +7 -0
  9. data/lib/privy/models/bridge_destination_asset.rb +1 -0
  10. data/lib/privy/models/bridge_fiat_virtual_account_destination.rb +6 -1
  11. data/lib/privy/models/bridge_fiat_virtual_account_request.rb +6 -2
  12. data/lib/privy/models/bridge_fiat_virtual_account_response.rb +2 -1
  13. data/lib/privy/models/bridge_fiat_virtual_account_source.rb +4 -1
  14. data/lib/privy/models/bridge_sandbox_fiat_virtual_account_request.rb +6 -2
  15. data/lib/privy/models/bridge_sandbox_fiat_virtual_account_response.rb +2 -1
  16. data/lib/privy/models/bridge_source_asset.rb +1 -0
  17. data/lib/privy/models/create_link_auth_intent_input.rb +17 -0
  18. data/lib/privy/models/create_link_auth_intent_response.rb +36 -0
  19. data/lib/privy/models/create_stripe_onramp_session_input.rb +33 -0
  20. data/lib/privy/models/create_stripe_onramp_session_response.rb +38 -0
  21. data/lib/privy/models/device_authorization_response.rb +63 -0
  22. data/lib/privy/models/device_verify_action.rb +16 -0
  23. data/lib/privy/models/device_verify_request_body.rb +27 -0
  24. data/lib/privy/models/device_verify_response.rb +18 -0
  25. data/lib/privy/models/earn_incentive_reward_entry.rb +50 -0
  26. data/lib/privy/models/earn_incentive_rewards_query.rb +18 -0
  27. data/lib/privy/models/earn_incentive_rewards_response.rb +19 -0
  28. data/lib/privy/models/evm_address.rb +7 -0
  29. data/lib/privy/models/evm_checksum_address.rb +7 -0
  30. data/lib/privy/models/exchange_stripe_tokens_input.rb +23 -0
  31. data/lib/privy/models/exchange_stripe_tokens_response.rb +17 -0
  32. data/lib/privy/models/fiat_onramp_provider.rb +2 -0
  33. data/lib/privy/models/fiat_onramp_stripe_sdk_session_response.rb +45 -0
  34. data/lib/privy/models/fiat_onramp_url_session_response.rb +39 -0
  35. data/lib/privy/models/gas.rb +35 -0
  36. data/lib/privy/models/get_fiat_onramp_url_response.rb +12 -14
  37. data/lib/privy/models/get_stripe_crypto_customer_response.rb +39 -0
  38. data/lib/privy/models/hyperliquid_token_address.rb +7 -0
  39. data/lib/privy/models/kraken_embed_custom_order_cancelled_webhook_payload.rb +66 -0
  40. data/lib/privy/models/kraken_embed_custom_order_executed_webhook_payload.rb +54 -0
  41. data/lib/privy/models/kraken_embed_custom_order_execution_failed_webhook_payload.rb +67 -0
  42. data/lib/privy/models/link_auth_intent_created.rb +35 -0
  43. data/lib/privy/models/link_auth_intent_no_account.rb +27 -0
  44. data/lib/privy/models/linked_account_embedded_wallet.rb +1 -0
  45. data/lib/privy/models/list_stripe_consumer_wallets_response.rb +17 -0
  46. data/lib/privy/models/list_stripe_payment_tokens_response.rb +17 -0
  47. data/lib/privy/models/oauth_grant.rb +54 -0
  48. data/lib/privy/models/oauth_grant_list_response.rb +18 -0
  49. data/lib/privy/models/oauth_grant_revoke_response.rb +30 -0
  50. data/lib/privy/models/oauth_token_authorization_code_request_body.rb +59 -0
  51. data/lib/privy/models/oauth_token_device_code_pending_error.rb +50 -0
  52. data/lib/privy/models/oauth_token_device_code_request_body.rb +36 -0
  53. data/lib/privy/models/oauth_token_grant_type.rb +17 -0
  54. data/lib/privy/models/oauth_token_refresh_token_request_body.rb +36 -0
  55. data/lib/privy/models/oauth_token_request_body.rb +24 -0
  56. data/lib/privy/models/oauth_token_success_response.rb +58 -0
  57. data/lib/privy/models/onramp_session_fees.rb +23 -0
  58. data/lib/privy/models/onramp_session_params.rb +61 -0
  59. data/lib/privy/models/onramp_session_transaction_details.rb +59 -0
  60. data/lib/privy/models/refresh_stripe_quote_response.rb +18 -0
  61. data/lib/privy/models/rule_delete_intent_response.rb +63 -0
  62. data/lib/privy/models/rule_intent_response.rb +0 -1
  63. data/lib/privy/models/rule_mutate_intent_response.rb +64 -0
  64. data/lib/privy/models/solana_address.rb +7 -0
  65. data/lib/privy/models/stripe_consumer_wallet.rb +29 -0
  66. data/lib/privy/models/stripe_crypto_customer_active.rb +39 -0
  67. data/lib/privy/models/stripe_crypto_customer_expired.rb +33 -0
  68. data/lib/privy/models/stripe_crypto_customer_none.rb +27 -0
  69. data/lib/privy/models/stripe_onramp_checkout_response.rb +25 -0
  70. data/lib/privy/models/stripe_onramp_session_status.rb +17 -0
  71. data/lib/privy/models/stripe_payment_token.rb +23 -0
  72. data/lib/privy/models/stripe_quote.rb +17 -0
  73. data/lib/privy/models/stripe_transaction_details.rb +17 -0
  74. data/lib/privy/models/stripe_verification.rb +23 -0
  75. data/lib/privy/models/swap_action_response.rb +46 -1
  76. data/lib/privy/models/swap_destination.rb +13 -4
  77. data/lib/privy/models/swap_quote_destination.rb +15 -4
  78. data/lib/privy/models/swap_quote_request_body.rb +12 -4
  79. data/lib/privy/models/swap_quote_response.rb +40 -3
  80. data/lib/privy/models/swap_request_body.rb +12 -4
  81. data/lib/privy/models/token_transfer_destination.rb +2 -2
  82. data/lib/privy/models/transfer_action_response.rb +29 -3
  83. data/lib/privy/models/transfer_quote_request_body.rb +3 -2
  84. data/lib/privy/models/transfer_quote_response.rb +10 -1
  85. data/lib/privy/models/transfer_received_transaction_detail.rb +5 -0
  86. data/lib/privy/models/transfer_request_body.rb +3 -2
  87. data/lib/privy/models/transfer_sent_transaction_detail.rb +5 -0
  88. data/lib/privy/models/tron_address.rb +7 -0
  89. data/lib/privy/models/wallet_asset.rb +1 -0
  90. data/lib/privy/models/wallet_batch_create_response.rb +1 -0
  91. data/lib/privy/models/wallet_create_batch_params.rb +14 -0
  92. data/lib/privy/models/wallet_ethereum_asset.rb +1 -0
  93. data/lib/privy/models/wallets/balance_get_params.rb +11 -0
  94. data/lib/privy/models/wallets/balance_get_response.rb +5 -0
  95. data/lib/privy/models/wallets/swap_execute_params.rb +45 -0
  96. data/lib/privy/models/wallets/swap_quote_params.rb +36 -0
  97. data/lib/privy/models/wallets/transaction_get_params.rb +3 -0
  98. data/lib/privy/models.rb +117 -4
  99. data/lib/privy/public_api/privy_client.rb +2 -1
  100. data/lib/privy/public_api/services/earn/ethereum/incentive.rb +61 -0
  101. data/lib/privy/public_api/services/earn/ethereum.rb +131 -0
  102. data/lib/privy/public_api/services/earn.rb +18 -0
  103. data/lib/privy/public_api/services/key_quorums.rb +7 -1
  104. data/lib/privy/public_api/services/policies.rb +21 -3
  105. data/lib/privy/public_api/services/transactions.rb +14 -0
  106. data/lib/privy/public_api/services/wallets.rb +153 -1
  107. data/lib/privy/resources/intents.rb +8 -7
  108. data/lib/privy/resources/oauth.rb +14 -0
  109. data/lib/privy/resources/onramps.rb +14 -0
  110. data/lib/privy/resources/wallets/swap.rb +105 -0
  111. data/lib/privy/resources/wallets.rb +35 -3
  112. data/lib/privy/version.rb +1 -1
  113. data/lib/privy/wallet_entropy.rb +60 -0
  114. data/lib/privy.rb +71 -5
  115. data/rbi/privy/client.rbi +9 -2
  116. data/rbi/privy/models/analytics_event_input.rbi +3 -6
  117. data/rbi/privy/models/bitcoin_address.rbi +7 -0
  118. data/rbi/privy/models/bridge_destination_asset.rbi +1 -0
  119. data/rbi/privy/models/bridge_fiat_virtual_account_destination.rbi +8 -1
  120. data/rbi/privy/models/bridge_fiat_virtual_account_request.rbi +9 -1
  121. data/rbi/privy/models/bridge_fiat_virtual_account_response.rbi +2 -0
  122. data/rbi/privy/models/bridge_fiat_virtual_account_source.rbi +6 -1
  123. data/rbi/privy/models/bridge_sandbox_fiat_virtual_account_request.rbi +9 -1
  124. data/rbi/privy/models/bridge_sandbox_fiat_virtual_account_response.rbi +2 -0
  125. data/rbi/privy/models/bridge_source_asset.rbi +1 -0
  126. data/rbi/privy/models/create_link_auth_intent_input.rbi +27 -0
  127. data/rbi/privy/models/create_link_auth_intent_response.rbi +68 -0
  128. data/rbi/privy/models/create_stripe_onramp_session_input.rbi +55 -0
  129. data/rbi/privy/models/create_stripe_onramp_session_response.rbi +88 -0
  130. data/rbi/privy/models/device_authorization_response.rbi +81 -0
  131. data/rbi/privy/models/device_verify_action.rbi +22 -0
  132. data/rbi/privy/models/device_verify_request_body.rbi +44 -0
  133. data/rbi/privy/models/device_verify_response.rbi +28 -0
  134. data/rbi/privy/models/earn_incentive_reward_entry.rbi +73 -0
  135. data/rbi/privy/models/earn_incentive_rewards_query.rbi +28 -0
  136. data/rbi/privy/models/earn_incentive_rewards_response.rbi +35 -0
  137. data/rbi/privy/models/evm_address.rbi +7 -0
  138. data/rbi/privy/models/evm_checksum_address.rbi +7 -0
  139. data/rbi/privy/models/exchange_stripe_tokens_input.rbi +33 -0
  140. data/rbi/privy/models/exchange_stripe_tokens_response.rbi +24 -0
  141. data/rbi/privy/models/fiat_onramp_provider.rbi +3 -0
  142. data/rbi/privy/models/fiat_onramp_stripe_sdk_session_response.rbi +78 -0
  143. data/rbi/privy/models/fiat_onramp_url_session_response.rbi +65 -0
  144. data/rbi/privy/models/gas.rbi +46 -0
  145. data/rbi/privy/models/get_fiat_onramp_url_response.rbi +12 -15
  146. data/rbi/privy/models/get_stripe_crypto_customer_response.rbi +81 -0
  147. data/rbi/privy/models/hyperliquid_token_address.rbi +7 -0
  148. data/rbi/privy/models/kraken_embed_custom_order_cancelled_webhook_payload.rbi +111 -0
  149. data/rbi/privy/models/kraken_embed_custom_order_executed_webhook_payload.rbi +101 -0
  150. data/rbi/privy/models/kraken_embed_custom_order_execution_failed_webhook_payload.rbi +111 -0
  151. data/rbi/privy/models/link_auth_intent_created.rbi +60 -0
  152. data/rbi/privy/models/link_auth_intent_no_account.rbi +54 -0
  153. data/rbi/privy/models/linked_account_embedded_wallet.rbi +1 -0
  154. data/rbi/privy/models/list_stripe_consumer_wallets_response.rbi +31 -0
  155. data/rbi/privy/models/list_stripe_payment_tokens_response.rbi +31 -0
  156. data/rbi/privy/models/oauth_grant.rbi +78 -0
  157. data/rbi/privy/models/oauth_grant_list_response.rbi +32 -0
  158. data/rbi/privy/models/oauth_grant_revoke_response.rbi +58 -0
  159. data/rbi/privy/models/oauth_token_authorization_code_request_body.rbi +115 -0
  160. data/rbi/privy/models/oauth_token_device_code_pending_error.rbi +106 -0
  161. data/rbi/privy/models/oauth_token_device_code_request_body.rbi +78 -0
  162. data/rbi/privy/models/oauth_token_grant_type.rbi +29 -0
  163. data/rbi/privy/models/oauth_token_refresh_token_request_body.rbi +78 -0
  164. data/rbi/privy/models/oauth_token_request_body.rbi +23 -0
  165. data/rbi/privy/models/oauth_token_success_response.rbi +95 -0
  166. data/rbi/privy/models/onramp_session_fees.rbi +39 -0
  167. data/rbi/privy/models/onramp_session_params.rbi +76 -0
  168. data/rbi/privy/models/onramp_session_transaction_details.rbi +95 -0
  169. data/rbi/privy/models/refresh_stripe_quote_response.rbi +33 -0
  170. data/rbi/privy/models/rule_delete_intent_response.rbi +113 -0
  171. data/rbi/privy/models/rule_mutate_intent_response.rbi +113 -0
  172. data/rbi/privy/models/solana_address.rbi +7 -0
  173. data/rbi/privy/models/stripe_consumer_wallet.rbi +38 -0
  174. data/rbi/privy/models/stripe_crypto_customer_active.rbi +68 -0
  175. data/rbi/privy/models/stripe_crypto_customer_expired.rbi +63 -0
  176. data/rbi/privy/models/stripe_crypto_customer_none.rbi +53 -0
  177. data/rbi/privy/models/stripe_onramp_checkout_response.rbi +51 -0
  178. data/rbi/privy/models/stripe_onramp_session_status.rbi +26 -0
  179. data/rbi/privy/models/stripe_payment_token.rbi +27 -0
  180. data/rbi/privy/models/stripe_quote.rbi +22 -0
  181. data/rbi/privy/models/stripe_transaction_details.rbi +24 -0
  182. data/rbi/privy/models/stripe_verification.rbi +27 -0
  183. data/rbi/privy/models/swap_action_response.rbi +96 -22
  184. data/rbi/privy/models/swap_destination.rbi +26 -7
  185. data/rbi/privy/models/swap_quote_destination.rbi +30 -7
  186. data/rbi/privy/models/swap_quote_request_body.rbi +15 -4
  187. data/rbi/privy/models/swap_quote_response.rbi +71 -5
  188. data/rbi/privy/models/swap_request_body.rbi +15 -4
  189. data/rbi/privy/models/token_transfer_destination.rbi +2 -2
  190. data/rbi/privy/models/transfer_action_response.rbi +57 -2
  191. data/rbi/privy/models/transfer_quote_request_body.rbi +4 -2
  192. data/rbi/privy/models/transfer_quote_response.rbi +16 -3
  193. data/rbi/privy/models/transfer_received_transaction_detail.rbi +15 -0
  194. data/rbi/privy/models/transfer_request_body.rbi +4 -2
  195. data/rbi/privy/models/transfer_sent_transaction_detail.rbi +15 -0
  196. data/rbi/privy/models/tron_address.rbi +7 -0
  197. data/rbi/privy/models/wallet_asset.rbi +1 -0
  198. data/rbi/privy/models/wallet_batch_create_response.rbi +2 -19
  199. data/rbi/privy/models/wallet_batch_create_result.rbi +4 -4
  200. data/rbi/privy/models/wallet_create_batch_params.rbi +27 -0
  201. data/rbi/privy/models/wallet_ethereum_asset.rbi +1 -0
  202. data/rbi/privy/models/wallets/balance_get_params.rbi +22 -0
  203. data/rbi/privy/models/wallets/balance_get_response.rbi +15 -0
  204. data/rbi/privy/models/wallets/swap_execute_params.rbi +71 -0
  205. data/rbi/privy/models/wallets/swap_quote_params.rbi +58 -0
  206. data/rbi/privy/models/wallets/transaction_get_params.rbi +5 -0
  207. data/rbi/privy/models.rbi +127 -5
  208. data/rbi/privy/resources/intents.rbi +7 -4
  209. data/rbi/privy/resources/oauth.rbi +12 -0
  210. data/rbi/privy/resources/onramps.rbi +12 -0
  211. data/rbi/privy/resources/wallets/swap.rbi +94 -0
  212. data/rbi/privy/resources/wallets.rbi +28 -3
  213. data/sig/privy/client.rbs +5 -1
  214. data/sig/privy/models/analytics_event_input.rbs +4 -6
  215. data/sig/privy/models/bitcoin_address.rbs +5 -0
  216. data/sig/privy/models/create_link_auth_intent_input.rbs +15 -0
  217. data/sig/privy/models/create_link_auth_intent_response.rbs +26 -0
  218. data/sig/privy/models/create_stripe_onramp_session_input.rbs +30 -0
  219. data/sig/privy/models/create_stripe_onramp_session_response.rbs +42 -0
  220. data/sig/privy/models/device_authorization_response.rbs +45 -0
  221. data/sig/privy/models/device_verify_action.rbs +14 -0
  222. data/sig/privy/models/device_verify_request_body.rbs +22 -0
  223. data/sig/privy/models/device_verify_response.rbs +13 -0
  224. data/sig/privy/models/earn_incentive_reward_entry.rbs +42 -0
  225. data/sig/privy/models/earn_incentive_rewards_query.rbs +13 -0
  226. data/sig/privy/models/earn_incentive_rewards_response.rbs +16 -0
  227. data/sig/privy/models/evm_address.rbs +5 -0
  228. data/sig/privy/models/evm_checksum_address.rbs +5 -0
  229. data/sig/privy/models/exchange_stripe_tokens_input.rbs +19 -0
  230. data/sig/privy/models/exchange_stripe_tokens_response.rbs +13 -0
  231. data/sig/privy/models/fiat_onramp_provider.rbs +4 -0
  232. data/sig/privy/models/fiat_onramp_stripe_sdk_session_response.rbs +45 -0
  233. data/sig/privy/models/fiat_onramp_url_session_response.rbs +40 -0
  234. data/sig/privy/models/gas.rbs +21 -0
  235. data/sig/privy/models/get_fiat_onramp_url_response.rbs +6 -8
  236. data/sig/privy/models/get_stripe_crypto_customer_response.rbs +29 -0
  237. data/sig/privy/models/hyperliquid_token_address.rbs +5 -0
  238. data/sig/privy/models/kraken_embed_custom_order_cancelled_webhook_payload.rbs +50 -0
  239. data/sig/privy/models/kraken_embed_custom_order_executed_webhook_payload.rbs +45 -0
  240. data/sig/privy/models/kraken_embed_custom_order_execution_failed_webhook_payload.rbs +50 -0
  241. data/sig/privy/models/link_auth_intent_created.rbs +32 -0
  242. data/sig/privy/models/link_auth_intent_no_account.rbs +26 -0
  243. data/sig/privy/models/list_stripe_consumer_wallets_response.rbs +14 -0
  244. data/sig/privy/models/list_stripe_payment_tokens_response.rbs +14 -0
  245. data/sig/privy/models/oauth_grant.rbs +45 -0
  246. data/sig/privy/models/oauth_grant_list_response.rbs +13 -0
  247. data/sig/privy/models/oauth_grant_revoke_response.rbs +28 -0
  248. data/sig/privy/models/oauth_token_authorization_code_request_body.rbs +56 -0
  249. data/sig/privy/models/oauth_token_device_code_pending_error.rbs +48 -0
  250. data/sig/privy/models/oauth_token_device_code_request_body.rbs +35 -0
  251. data/sig/privy/models/oauth_token_grant_type.rbs +18 -0
  252. data/sig/privy/models/oauth_token_refresh_token_request_body.rbs +35 -0
  253. data/sig/privy/models/oauth_token_request_body.rbs +14 -0
  254. data/sig/privy/models/oauth_token_success_response.rbs +49 -0
  255. data/sig/privy/models/onramp_session_fees.rbs +22 -0
  256. data/sig/privy/models/onramp_session_params.rbs +50 -0
  257. data/sig/privy/models/onramp_session_transaction_details.rbs +53 -0
  258. data/sig/privy/models/refresh_stripe_quote_response.rbs +13 -0
  259. data/sig/privy/models/rule_delete_intent_response.rbs +66 -0
  260. data/sig/privy/models/rule_mutate_intent_response.rbs +66 -0
  261. data/sig/privy/models/solana_address.rbs +5 -0
  262. data/sig/privy/models/stripe_consumer_wallet.rbs +22 -0
  263. data/sig/privy/models/stripe_crypto_customer_active.rbs +40 -0
  264. data/sig/privy/models/stripe_crypto_customer_expired.rbs +35 -0
  265. data/sig/privy/models/stripe_crypto_customer_none.rbs +28 -0
  266. data/sig/privy/models/stripe_onramp_checkout_response.rbs +29 -0
  267. data/sig/privy/models/stripe_onramp_session_status.rbs +15 -0
  268. data/sig/privy/models/stripe_payment_token.rbs +15 -0
  269. data/sig/privy/models/stripe_quote.rbs +13 -0
  270. data/sig/privy/models/stripe_transaction_details.rbs +13 -0
  271. data/sig/privy/models/stripe_verification.rbs +15 -0
  272. data/sig/privy/models/swap_action_response.rbs +39 -0
  273. data/sig/privy/models/swap_destination.rbs +16 -3
  274. data/sig/privy/models/swap_quote_destination.rbs +16 -3
  275. data/sig/privy/models/swap_quote_request_body.rbs +14 -5
  276. data/sig/privy/models/swap_quote_response.rbs +33 -3
  277. data/sig/privy/models/swap_request_body.rbs +14 -5
  278. data/sig/privy/models/transfer_action_response.rbs +23 -0
  279. data/sig/privy/models/transfer_quote_response.rbs +10 -3
  280. data/sig/privy/models/transfer_received_transaction_detail.rbs +15 -1
  281. data/sig/privy/models/transfer_sent_transaction_detail.rbs +15 -1
  282. data/sig/privy/models/tron_address.rbs +5 -0
  283. data/sig/privy/models/wallet_asset.rbs +2 -1
  284. data/sig/privy/models/wallet_create_batch_params.rbs +15 -0
  285. data/sig/privy/models/wallet_ethereum_asset.rbs +2 -1
  286. data/sig/privy/models/wallets/balance_get_params.rbs +10 -0
  287. data/sig/privy/models/wallets/balance_get_response.rbs +6 -0
  288. data/sig/privy/models/wallets/swap_execute_params.rbs +44 -0
  289. data/sig/privy/models/wallets/swap_quote_params.rbs +34 -0
  290. data/sig/privy/models/wallets/transaction_get_params.rbs +2 -0
  291. data/sig/privy/models.rbs +115 -5
  292. data/sig/privy/resources/intents.rbs +3 -3
  293. data/sig/privy/resources/oauth.rbs +7 -0
  294. data/sig/privy/resources/onramps.rbs +7 -0
  295. data/sig/privy/resources/wallets/swap.rbs +34 -0
  296. data/sig/privy/resources/wallets.rbs +7 -0
  297. metadata +194 -8
  298. data/lib/privy/models/gas_sponsorship_configuration.rb +0 -29
  299. data/lib/privy/models/gas_sponsorship_configuration_input.rb +0 -29
  300. data/rbi/privy/models/gas_sponsorship_configuration.rbi +0 -48
  301. data/rbi/privy/models/gas_sponsorship_configuration_input.rbi +0 -60
  302. data/sig/privy/models/gas_sponsorship_configuration.rbs +0 -30
  303. 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(wallet_id, wallet_update_params:, authorization_context: nil, request_expiry: nil, request_options: nil)
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::RuleIntentResponse]
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::RuleIntentResponse,
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::RuleIntentResponse]
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::RuleIntentResponse,
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::RuleIntentResponse]
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::RuleIntentResponse,
329
+ model: Privy::RuleMutateIntentResponse,
329
330
  options: options
330
331
  )
331
332
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Privy
4
+ module Resources
5
+ class OAuth
6
+ # @api private
7
+ #
8
+ # @param client [Privy::Client]
9
+ def initialize(client:)
10
+ @client = client
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Privy
4
+ module Resources
5
+ class Onramps
6
+ # @api private
7
+ #
8
+ # @param client [Privy::Client]
9
+ def initialize(client:)
10
+ @client = client
11
+ end
12
+ end
13
+ end
14
+ 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
- # Obtain a session key to enable wallet access.
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 an associated recovery user.
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Privy
4
- VERSION = "0.0.2"
4
+ VERSION = "0.2.0"
5
5
  end
@@ -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