Skip to main content

polymarket_client/secure/
credentials.rs

1use polymarket_client_sdk_v2::auth::Credentials;
2use secrecy::{ExposeSecret, SecretString};
3use serde::Deserialize;
4use uuid::Uuid;
5
6/// Persisted L2 API credentials for session reuse.
7///
8/// Store securely — the secret and passphrase grant trading access.
9#[derive(Clone, Debug, Deserialize)]
10pub struct ApiCredentials {
11    pub key: String,
12    secret: SecretString,
13    passphrase: SecretString,
14}
15
16impl ApiCredentials {
17    pub fn new(
18        key: impl Into<String>,
19        secret: impl Into<String>,
20        passphrase: impl Into<String>,
21    ) -> Self {
22        Self {
23            key: key.into(),
24            secret: SecretString::from(secret.into()),
25            passphrase: SecretString::from(passphrase.into()),
26        }
27    }
28
29    pub fn key_uuid(&self) -> Result<Uuid, uuid::Error> {
30        Uuid::parse_str(&self.key)
31    }
32
33    pub fn secret(&self) -> &SecretString {
34        &self.secret
35    }
36
37    pub fn passphrase(&self) -> &SecretString {
38        &self.passphrase
39    }
40
41    pub(crate) fn to_sdk_credentials(&self) -> Result<Credentials, uuid::Error> {
42        Ok(Credentials::new(
43            self.key_uuid()?,
44            self.secret.expose_secret().to_string(),
45            self.passphrase.expose_secret().to_string(),
46        ))
47    }
48
49    pub(crate) fn from_sdk(credentials: &Credentials) -> Self {
50        Self {
51            key: credentials.key().to_string(),
52            secret: credentials.secret().clone(),
53            passphrase: credentials.passphrase().clone(),
54        }
55    }
56}
57
58#[cfg(test)]
59mod tests {
60    use super::*;
61
62    #[test]
63    fn round_trips_key() {
64        let id = Uuid::new_v4();
65        let creds = ApiCredentials::new(id.to_string(), "secret", "pass");
66        assert_eq!(creds.key_uuid().unwrap(), id);
67    }
68}