From 339b8a3f6efa519d19f2f9a756d8a2afd1b75cd7 Mon Sep 17 00:00:00 2001 From: Marcos Date: Wed, 22 May 2024 11:16:15 +0200 Subject: [PATCH 1/4] add jwt authentication + example --- .gitignore | 1 + examples/auth-caching-relay-signer/auth.js | 24 +++ examples/auth-caching-relay-signer/index.js | 29 +++ .../auth-caching-relay-signer/package.json | 16 ++ packages/account/src/api/index.ts | 8 + packages/action/src/api.ts | 8 + packages/base/src/api/api.ts | 6 +- packages/base/src/api/client.ts | 43 +++-- packages/defender-sdk/src/index.ts | 9 +- packages/deploy/src/api/index.ts | 8 + packages/monitor/src/api/index.ts | 8 + packages/network/src/api/index.ts | 8 + .../notification-channel/src/api/index.ts | 8 + packages/proposal/src/api/index.ts | 8 + packages/relay-signer/src/action/index.ts | 8 + packages/relay-signer/src/api/index.ts | 8 + packages/relay-signer/src/ethers/utils.ts | 2 +- packages/relay-signer/src/models/relayer.ts | 4 +- packages/relay-signer/src/relayer.ts | 10 +- packages/relay/src/api/index.ts | 8 + pnpm-lock.yaml | 181 +++--------------- 21 files changed, 228 insertions(+), 177 deletions(-) create mode 100644 examples/auth-caching-relay-signer/auth.js create mode 100644 examples/auth-caching-relay-signer/index.js create mode 100644 examples/auth-caching-relay-signer/package.json diff --git a/.gitignore b/.gitignore index c62dba71..5c6ca30b 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ dist .DS_Store tmp .pnpm-store +session.json diff --git a/examples/auth-caching-relay-signer/auth.js b/examples/auth-caching-relay-signer/auth.js new file mode 100644 index 00000000..0032c1df --- /dev/null +++ b/examples/auth-caching-relay-signer/auth.js @@ -0,0 +1,24 @@ +require('dotenv').config(); + +const { Defender } = require('@openzeppelin/defender-sdk'); +const fs = require('fs'); + +async function main() { + const creds = { + relayerApiKey: process.env.RELAYER_API_KEY, + relayerApiSecret: process.env.RELAYER_API_SECRET, + }; + const client = new Defender(creds); + + const relayerApiKey = client.relaySigner.getApiKey(); + const accessToken = await client.relaySigner.getAccessToken(); + + // writes session.json with apiKey and accessToken + fs.writeFileSync('session.json', JSON.stringify({ relayerApiKey, accessToken }, null, 2)); + + console.log('Done! ✅'); +} + +if (require.main === module) { + main().catch(console.error); +} diff --git a/examples/auth-caching-relay-signer/index.js b/examples/auth-caching-relay-signer/index.js new file mode 100644 index 00000000..ca2cb016 --- /dev/null +++ b/examples/auth-caching-relay-signer/index.js @@ -0,0 +1,29 @@ +require('dotenv').config(); + +const { Defender } = require('@openzeppelin/defender-sdk'); +const fs = require('fs'); + +async function main() { + let cachedCredentials = {}; + + try { + cachedCredentials = JSON.parse(fs.readFileSync('session.json')); + } catch (e) { + console.error('❌ No credentials found. Please run "auth" command first.'); + return; + } + + try { + const client = new Defender(cachedCredentials); + const info = await client.relaySigner.getRelayerStatus(); + console.log('relayerStatus', JSON.stringify(info, null, 2)); + } catch (e) { + if (e.response?.status === 401) { + console.error('❌ Access token expired. Please run "auth" command again.'); + } + } +} + +if (require.main === module) { + main().catch(console.error); +} diff --git a/examples/auth-caching-relay-signer/package.json b/examples/auth-caching-relay-signer/package.json new file mode 100644 index 00000000..dc4052d0 --- /dev/null +++ b/examples/auth-caching-relay-signer/package.json @@ -0,0 +1,16 @@ +{ + "name": "@openzeppelin/defender-sdk-example-auth-caching", + "version": "1.13.1", + "private": true, + "main": "index.js", + "author": "Marcos Carlomagno ", + "license": "MIT", + "scripts": { + "auth": "node auth.js", + "start": "node index.js" + }, + "dependencies": { + "@openzeppelin/defender-sdk": "1.13.1", + "dotenv": "^16.3.1" + } +} diff --git a/packages/account/src/api/index.ts b/packages/account/src/api/index.ts index f216f884..c7df18a8 100644 --- a/packages/account/src/api/index.ts +++ b/packages/account/src/api/index.ts @@ -16,6 +16,14 @@ export class AccountClient extends BaseApiClient { return process.env.DEFENDER_API_URL ?? 'https://defender-api.openzeppelin.com/v2/'; } + public getApiKey(): string { + return this.getKey(); + } + + public getAccessToken(): Promise { + return this.getToken(); + } + public async getUsage(params?: { date?: string | Date; quotas: string[] }): Promise { const searchParams = new URLSearchParams({ ...(params?.quotas && { quotas: params.quotas.join(',') }), diff --git a/packages/action/src/api.ts b/packages/action/src/api.ts index 87dc0f56..ea5b8b4e 100644 --- a/packages/action/src/api.ts +++ b/packages/action/src/api.ts @@ -37,6 +37,14 @@ export class ActionClient extends BaseApiClient { return process.env.DEFENDER_API_URL || 'https://defender-api.openzeppelin.com/v2/'; } + public getApiKey(): string { + return this.getKey(); + } + + public getAccessToken(): Promise { + return this.getToken(); + } + public async list(): Promise { return this.apiCall(async (api) => { return await api.get(`/actions`); diff --git a/packages/base/src/api/api.ts b/packages/base/src/api/api.ts index 68477ed3..65688630 100644 --- a/packages/base/src/api/api.ts +++ b/packages/base/src/api/api.ts @@ -32,12 +32,10 @@ export function createApi( export function createAuthenticatedApi( username: string, - session: CognitoUserSession, + token: string, apiUrl: string, httpsAgent?: https.Agent, headers?: Record, ): AxiosInstance { - const accessToken = session.getAccessToken().getJwtToken(); - - return createApi(username, accessToken, apiUrl, httpsAgent, headers); + return createApi(username, token, apiUrl, httpsAgent, headers); } diff --git a/packages/base/src/api/client.ts b/packages/base/src/api/client.ts index d2d90bde..e660e4a4 100644 --- a/packages/base/src/api/client.ts +++ b/packages/base/src/api/client.ts @@ -18,35 +18,50 @@ export abstract class BaseApiClient { private api: AxiosInstance | undefined; private apiKey: string; private session: CognitoUserSession | undefined; - private apiSecret: string; + private apiSecret: string | undefined; private httpsAgent?: https.Agent; private retryConfig: RetryConfig; + private accessToken: string | undefined; protected abstract getPoolId(): string; protected abstract getPoolClientId(): string; protected abstract getApiUrl(): string; public constructor(params: { - apiKey: string; - apiSecret: string; + apiKey?: string; + apiSecret?: string; httpsAgent?: https.Agent; retryConfig?: Partial; + accessToken?: string; }) { if (!params.apiKey) throw new Error(`API key is required`); - if (!params.apiSecret) throw new Error(`API secret is required`); + if (!params.apiSecret && !params.accessToken) throw new Error(`API secret or access token is required`); this.apiKey = params.apiKey; this.apiSecret = params.apiSecret; + this.accessToken = params.accessToken; this.httpsAgent = params.httpsAgent; this.retryConfig = { retries: 3, retryDelay: exponentialDelay, ...params.retryConfig }; } + protected getKey(): string { + return this.apiKey; + } + + protected async getToken(): Promise { + if (this.accessToken) return this.accessToken; + if (!this.apiSecret) throw new Error('Cannot authenticate without API secret.'); + + const userPass = { Username: this.apiKey, Password: this.apiSecret }; + const poolData = { UserPoolId: this.getPoolId(), ClientId: this.getPoolClientId() }; + this.session = await authenticate(userPass, poolData); + return this.session.getAccessToken().getJwtToken(); + } + protected async init(): Promise { if (!this.api) { - const userPass = { Username: this.apiKey, Password: this.apiSecret }; - const poolData = { UserPoolId: this.getPoolId(), ClientId: this.getPoolClientId() }; - this.session = await authenticate(userPass, poolData); - this.api = createAuthenticatedApi(userPass.Username, this.session, this.getApiUrl(), this.httpsAgent); + const token = await this.getToken(); + this.api = createAuthenticatedApi(this.apiKey, token, this.getApiUrl(), this.httpsAgent); } return this.api; } @@ -55,13 +70,16 @@ export abstract class BaseApiClient { if (!this.session) { return this.init(); } + if (!this.apiSecret) { + throw new Error('Cannot refresh session without API secret.'); + } try { const userPass = { Username: this.apiKey, Password: this.apiSecret }; const poolData = { UserPoolId: this.getPoolId(), ClientId: this.getPoolClientId() }; this.session = await refreshSession(userPass, poolData, this.session); this.api = createAuthenticatedApi( userPass.Username, - this.session, + this.session.getAccessToken().getJwtToken(), this.getApiUrl(), this.httpsAgent, overrides?.headers, @@ -82,8 +100,11 @@ export abstract class BaseApiClient { await sleep(retryDelay); return await apiFunction(axiosInstance); } catch (error: any) { - // this means ID token has expired so we'll recreate session and try again + // this means ID token has expired if (isAuthenticationError(error)) { + // if using custom access token, throw error. + if (this.accessToken) throw error; + this.api = undefined; const api = await this.refresh(); @@ -97,7 +118,7 @@ export abstract class BaseApiClient { if (updatedRetryState.retryCount > this.retryConfig.retries) throw error; - if (isCloudFlareError(error)) { + if (isCloudFlareError(error) && this.apiSecret) { const apiWithUpgradeHeaders = await this.refresh({ headers: { Connection: 'upgrade', diff --git a/packages/defender-sdk/src/index.ts b/packages/defender-sdk/src/index.ts index 70b5a954..695a450c 100644 --- a/packages/defender-sdk/src/index.ts +++ b/packages/defender-sdk/src/index.ts @@ -18,6 +18,7 @@ interface DefenderOptions { apiSecret?: string; relayerApiKey?: string; relayerApiSecret?: string; + accessToken?: string; credentials?: ActionRelayerParams; relayerARN?: string; httpsAgent?: https.Agent; @@ -27,9 +28,10 @@ interface DefenderOptions { function getClient(Client: Newable, credentials: Partial | ActionRelayerParams): T { if ( !('credentials' in credentials && 'relayerARN' in credentials) && - !('apiKey' in credentials && 'apiSecret' in credentials) + !('apiKey' in credentials) && + !('accessToken' in credentials || 'apiSecret' in credentials) ) { - throw new Error(`API key and secret are required`); + throw new Error(`API authentication credentials required`); } return new Client(credentials); @@ -40,6 +42,7 @@ export class Defender { private apiSecret: string | undefined; private relayerApiKey: string | undefined; private relayerApiSecret: string | undefined; + private accessToken: string | undefined; private actionCredentials: ActionRelayerParams | undefined; private actionRelayerArn: string | undefined; private httpsAgent?: https.Agent; @@ -50,6 +53,7 @@ export class Defender { this.apiSecret = options.apiSecret; this.relayerApiKey = options.relayerApiKey; this.relayerApiSecret = options.relayerApiSecret; + this.accessToken = options.accessToken; // support for using relaySigner from Defender Actions this.actionCredentials = options.credentials; this.actionRelayerArn = options.relayerARN; @@ -146,6 +150,7 @@ export class Defender { ...(this.actionRelayerArn ? { relayerARN: this.actionRelayerArn } : undefined), ...(this.relayerApiKey ? { apiKey: this.relayerApiKey } : undefined), ...(this.relayerApiSecret ? { apiSecret: this.relayerApiSecret } : undefined), + ...(this.accessToken ? { accessToken: this.accessToken } : undefined), }); } } diff --git a/packages/deploy/src/api/index.ts b/packages/deploy/src/api/index.ts index d3e6babc..15a26bb8 100644 --- a/packages/deploy/src/api/index.ts +++ b/packages/deploy/src/api/index.ts @@ -31,6 +31,14 @@ export class DeployClient extends BaseApiClient { return process.env.DEFENDER_API_URL || 'https://defender-api.openzeppelin.com/v2/'; } + public getApiKey(): string { + return this.getKey(); + } + + public getAccessToken(): Promise { + return this.getToken(); + } + public async deployContract(params: DeployContractRequest): Promise { if (isEmpty(params.artifactUri) && isEmpty(params.artifactPayload)) throw new Error( diff --git a/packages/monitor/src/api/index.ts b/packages/monitor/src/api/index.ts index 52c29ece..fabbb16f 100644 --- a/packages/monitor/src/api/index.ts +++ b/packages/monitor/src/api/index.ts @@ -34,6 +34,14 @@ export class MonitorClient extends BaseApiClient { return process.env.DEFENDER_API_URL || 'https://defender-api.openzeppelin.com/v2/'; } + public getApiKey(): string { + return this.getKey(); + } + + public getAccessToken(): Promise { + return this.getToken(); + } + public async list(): Promise { return this.apiCall(async (api) => { return await api.get(`/monitors`); diff --git a/packages/network/src/api/index.ts b/packages/network/src/api/index.ts index 533c42b0..5a95055a 100644 --- a/packages/network/src/api/index.ts +++ b/packages/network/src/api/index.ts @@ -23,6 +23,14 @@ export class NetworkClient extends BaseApiClient { return process.env.DEFENDER_API_URL || 'https://defender-api.openzeppelin.com/v2/'; } + public getApiKey(): string { + return this.getKey(); + } + + public getAccessToken(): Promise { + return this.getToken(); + } + public async listSupportedNetworks(params?: ListNetworkRequestOptions): Promise { return this.apiCall(async (api) => { return await api.get(params && params.networkType ? `${PATH}?type=${params.networkType}` : `${PATH}`); diff --git a/packages/notification-channel/src/api/index.ts b/packages/notification-channel/src/api/index.ts index 61ff7cf4..1a5a92a9 100644 --- a/packages/notification-channel/src/api/index.ts +++ b/packages/notification-channel/src/api/index.ts @@ -22,6 +22,14 @@ export class NotificationChannelClient extends BaseApiClient { return process.env.DEFENDER_API_URL || 'https://defender-api.openzeppelin.com/v2/'; } + public getApiKey(): string { + return this.getKey(); + } + + public getAccessToken(): Promise { + return this.getToken(); + } + public async create(notification: CreateNotificationRequest): Promise { return this.apiCall(async (api) => { return await api.post(`${PATH}/${notification.type}`, notification); diff --git a/packages/proposal/src/api/index.ts b/packages/proposal/src/api/index.ts index 600cd7e3..7c4d9cd8 100644 --- a/packages/proposal/src/api/index.ts +++ b/packages/proposal/src/api/index.ts @@ -30,6 +30,14 @@ export class ProposalClient extends BaseApiClient { return process.env.DEFENDER_API_URL || 'https://defender-api.openzeppelin.com/v2/'; } + public getApiKey(): string { + return this.getKey(); + } + + public getAccessToken(): Promise { + return this.getToken(); + } + public async addContract(contract: Contract): Promise { return this.apiCall(async (api) => { return (await api.put('/contracts', contract)) as Contract; diff --git a/packages/relay-signer/src/action/index.ts b/packages/relay-signer/src/action/index.ts index 2c91934f..dc4c2300 100644 --- a/packages/relay-signer/src/action/index.ts +++ b/packages/relay-signer/src/action/index.ts @@ -43,6 +43,14 @@ export class ActionRelayer extends BaseActionClient implements IRelayer { this.jsonRpcRequestNextId = 0; } + public getApiKey(): string { + throw new Error('Method not available for action relayers.'); + } + + public getAccessToken(): Promise { + throw new Error('Method not available for action relayers.'); + } + public async sendTransaction(payload: RelayerTransactionPayload): Promise { return this.execute({ action: 'send-tx', payload }); } diff --git a/packages/relay-signer/src/api/index.ts b/packages/relay-signer/src/api/index.ts index d65ecde6..200e084c 100644 --- a/packages/relay-signer/src/api/index.ts +++ b/packages/relay-signer/src/api/index.ts @@ -31,6 +31,14 @@ export class RelaySignerClient extends BaseApiClient implements IRelayer { return getRelaySignerApiUrl(); } + public getApiKey(): string { + return this.getKey(); + } + + public getAccessToken(): Promise { + return this.getToken(); + } + public async getRelayer(): Promise { return this.apiCall(async (api) => { return (await api.get('/relayer')) as RelayerGetResponse; diff --git a/packages/relay-signer/src/ethers/utils.ts b/packages/relay-signer/src/ethers/utils.ts index 3238a814..52139beb 100644 --- a/packages/relay-signer/src/ethers/utils.ts +++ b/packages/relay-signer/src/ethers/utils.ts @@ -11,7 +11,7 @@ export function isActionCredentials( export function isApiCredentials(credentials: ActionRelayerParams | ApiRelayerParams): credentials is ApiRelayerParams { const apiCredentials = credentials as ApiRelayerParams; - return !!apiCredentials.apiKey && !!apiCredentials.apiSecret; + return !!apiCredentials.apiKey && !!(apiCredentials.apiSecret || apiCredentials.accessToken); } export function validatePayload(payload: RelayerTransactionPayload) { diff --git a/packages/relay-signer/src/models/relayer.ts b/packages/relay-signer/src/models/relayer.ts index 4bf4dd9b..3cb0495a 100644 --- a/packages/relay-signer/src/models/relayer.ts +++ b/packages/relay-signer/src/models/relayer.ts @@ -15,7 +15,7 @@ export type Address = string; export type BigUInt = string | number; export type RelayerParams = ApiRelayerParams | ActionRelayerParams; -export type ApiRelayerParams = { apiKey: string; apiSecret: string; httpsAgent?: https.Agent }; +export type ApiRelayerParams = { apiKey: string; apiSecret?: string; accessToken?: string; httpsAgent?: https.Agent }; export type ActionRelayerParams = { credentials: string; relayerARN: string; httpsAgent?: https.Agent }; export interface RelayerGetResponse { @@ -72,4 +72,6 @@ export interface IRelayer { sign(payload: SignMessagePayload): Promise; signTypedData(payload: SignTypedDataPayload): Promise; call(params: { method: string; params: string[] }): Promise; + getApiKey(): string; + getAccessToken(): Promise; } diff --git a/packages/relay-signer/src/relayer.ts b/packages/relay-signer/src/relayer.ts index ff815776..be0ee76d 100644 --- a/packages/relay-signer/src/relayer.ts +++ b/packages/relay-signer/src/relayer.ts @@ -25,11 +25,19 @@ export class Relayer implements IRelayer { this.relayer = new RelaySignerClient(credentials); } else { throw new Error( - `Missing credentials for creating a Relayer instance. If you are running this code in an Action, make sure you pass the "credentials" parameter from the handler to the Relayer constructor. If you are running this on your own process, then pass an object with the "apiKey" and "apiSecret" generated by the relayer.`, + `Missing credentials for creating a Relayer instance. If you are running this code in an Action, make sure you pass the "credentials" parameter from the handler to the Relayer constructor. If you are running this on your own process, then pass an object with the "apiKey" and "apiSecret" or "accessToken" generated by the relayer.`, ); } } + public getApiKey(): string { + return this.relayer.getApiKey(); + } + + public getAccessToken(): Promise { + return this.relayer.getAccessToken(); + } + public getRelayer(): Promise { return this.relayer.getRelayer(); } diff --git a/packages/relay/src/api/index.ts b/packages/relay/src/api/index.ts index c40e87b4..7bdc98b2 100644 --- a/packages/relay/src/api/index.ts +++ b/packages/relay/src/api/index.ts @@ -23,6 +23,14 @@ export class RelayClient extends BaseApiClient { return process.env.DEFENDER_API_URL || 'https://defender-api.openzeppelin.com/v2/'; } + public getApiKey(): string { + return this.getKey(); + } + + public getAccessToken(): Promise { + return this.getToken(); + } + public async get(id: string): Promise { return this.apiCall(async (api) => { return await api.get(`/relayers/${id}`); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b4d2a565..2123f86e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -76,6 +76,15 @@ importers: specifier: ^4.9.3 version: 4.9.5 + examples/auth-caching-relay-signer: + dependencies: + '@openzeppelin/defender-sdk': + specifier: 1.13.1 + version: link:../../packages/defender-sdk + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + examples/create-action: dependencies: '@openzeppelin/defender-sdk': @@ -106,8 +115,8 @@ importers: examples/create-monitor: dependencies: '@openzeppelin/defender-sdk': - specifier: 1.12.0 - version: 1.12.0(ethers@6.9.0)(web3-core-helpers@1.10.3)(web3-core@1.10.3)(web3-utils@1.10.3)(web3@1.8.2) + specifier: 1.13.1 + version: link:../../packages/defender-sdk dotenv: specifier: ^16.3.1 version: 16.3.1 @@ -1628,6 +1637,7 @@ packages: '@ethereumjs/rlp': 4.0.1 ethereum-cryptography: 2.1.2 micro-ftch: 0.3.1 + dev: true /@ethersproject/abi@5.7.0: resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} @@ -2293,161 +2303,6 @@ packages: dev: true optional: true - /@openzeppelin/defender-sdk-account-client@1.12.0: - resolution: {integrity: sha512-5xAQuDjaCaOcynjNYyhyGf6QTOwC01kJdM+WAXcpCmBE04NfFvhH+syIIEWD1dqCPEtdqKjYscMIkmLRZwCf3Q==} - dependencies: - '@openzeppelin/defender-sdk-base-client': 1.12.0 - axios: 1.6.7 - lodash: 4.17.21 - transitivePeerDependencies: - - debug - - encoding - dev: false - - /@openzeppelin/defender-sdk-action-client@1.12.0: - resolution: {integrity: sha512-nK/qwJ3rX5fjaxKuU4LLeADrAG7lEEbqsYnXJFlNZRzND6iOqCM6N3P3/96x7ZHc7kjKdIU+tp9QT4KI8rWtrw==} - hasBin: true - dependencies: - '@openzeppelin/defender-sdk-base-client': 1.12.0 - axios: 1.6.7 - dotenv: 16.3.1 - glob: 7.2.3 - jszip: 3.10.1 - lodash: 4.17.21 - transitivePeerDependencies: - - debug - - encoding - dev: false - - /@openzeppelin/defender-sdk-base-client@1.12.0: - resolution: {integrity: sha512-6n5SwJWCjFciC+T7QhfXnkEmkNZGKK0efkCZDAfu/Kd8L1AICnIkWwVte71dnzCBln7wglMiZupSHL3fZqePmQ==} - dependencies: - amazon-cognito-identity-js: 6.3.6 - async-retry: 1.3.3 - transitivePeerDependencies: - - encoding - dev: false - - /@openzeppelin/defender-sdk-deploy-client@1.12.0: - resolution: {integrity: sha512-E1RTyh0kXGRJJy7Kq/qSjQlyHJmtytLLKGHIVbI4Ijo9vwRZ7FZhZgK9lapJNshS4E1p3WgXHSOUJtOfn3F1bg==} - dependencies: - '@openzeppelin/defender-sdk-base-client': 1.12.0 - axios: 1.6.7 - lodash: 4.17.21 - transitivePeerDependencies: - - debug - - encoding - dev: false - - /@openzeppelin/defender-sdk-monitor-client@1.12.0: - resolution: {integrity: sha512-oiDTHLpZeod/0TMyvFeMEFFSYDTCdNL6Tz57vlxAuq3HiFX91c6lcjXULryPvo7wVvHnZHpDvzMfXOk7XC+pcQ==} - dependencies: - '@openzeppelin/defender-sdk-base-client': 1.12.0 - axios: 1.6.7 - ethers: 6.9.0 - lodash: 4.17.21 - transitivePeerDependencies: - - bufferutil - - debug - - encoding - - utf-8-validate - dev: false - - /@openzeppelin/defender-sdk-network-client@1.12.0: - resolution: {integrity: sha512-0dlEHC27hOVRY+iVcoP2zH8K0jy4O+sOGKz2Ep9eebNcWc7GO6z1wsc4fU51AoiMh+G7cYb+l5z1wQ4Q3Y9vIA==} - dependencies: - '@openzeppelin/defender-sdk-base-client': 1.12.0 - axios: 1.6.7 - lodash: 4.17.21 - transitivePeerDependencies: - - debug - - encoding - dev: false - - /@openzeppelin/defender-sdk-notification-channel-client@1.12.0: - resolution: {integrity: sha512-GMNI2UePtVFv/I6ej6Gy8ogx9Q8fbPgQ8oY+v8Z7L2ibcrMM601Di0hdPx7AUO+HpXcua3WtkTF3JCPiwzOpKA==} - dependencies: - '@openzeppelin/defender-sdk-base-client': 1.12.0 - axios: 1.6.7 - lodash: 4.17.21 - transitivePeerDependencies: - - debug - - encoding - dev: false - - /@openzeppelin/defender-sdk-proposal-client@1.12.0: - resolution: {integrity: sha512-UHaPMnpmCAime7SnkBzWcERd5Swl6LvjbMe2ChIiPgWjvQKB4WLobZbPkuzRT7SuLQGTNYsWH7vLughsVz0tKw==} - dependencies: - '@openzeppelin/defender-sdk-base-client': 1.12.0 - axios: 1.6.7 - ethers: 6.9.0 - lodash: 4.17.21 - transitivePeerDependencies: - - bufferutil - - debug - - encoding - - utf-8-validate - dev: false - - /@openzeppelin/defender-sdk-relay-client@1.12.0: - resolution: {integrity: sha512-CkQUpSli6uW+q477nZHvcgdSw5AcoQt7WT/d0+tcluyPF6+5srb3AgCUR3+Sl9JG7vMjmeZSaDnwu2sJtOcDOg==} - dependencies: - '@openzeppelin/defender-sdk-base-client': 1.12.0 - axios: 1.6.7 - lodash: 4.17.21 - transitivePeerDependencies: - - debug - - encoding - dev: false - - /@openzeppelin/defender-sdk-relay-signer-client@1.12.0(ethers@6.9.0)(web3-core-helpers@1.10.3)(web3-core@1.10.3)(web3-utils@1.10.3)(web3@1.8.2): - resolution: {integrity: sha512-PLgK6bCbmB+TftqPg6jepbjPYouOy4Zge8N+NKQ1V0ayGe39QR10jC/1+9LuJa+CLbmptDC8SatYoV3LS4oYeQ==} - peerDependencies: - ethers: ^6.9.0 - web3: ^1.8.2 - web3-core: ^1.10.3 - web3-core-helpers: ^1.8.2 - web3-utils: ^1.8.2 - dependencies: - '@openzeppelin/defender-sdk-base-client': 1.12.0 - amazon-cognito-identity-js: 6.3.6 - axios: 1.6.7 - ethers: 6.9.0 - lodash: 4.17.21 - web3: 1.8.2 - web3-core: 1.10.3 - web3-core-helpers: 1.10.3 - web3-utils: 1.10.3 - transitivePeerDependencies: - - debug - - encoding - dev: false - - /@openzeppelin/defender-sdk@1.12.0(ethers@6.9.0)(web3-core-helpers@1.10.3)(web3-core@1.10.3)(web3-utils@1.10.3)(web3@1.8.2): - resolution: {integrity: sha512-1w1KxTX+ESPkB1GABSg7pIBXvU86zxaT9Wll6RnIyOuhPBHnQQJiduuCdKxTFy7nMowj04T7WwmPs9M4Su7bKg==} - dependencies: - '@openzeppelin/defender-sdk-account-client': 1.12.0 - '@openzeppelin/defender-sdk-action-client': 1.12.0 - '@openzeppelin/defender-sdk-base-client': 1.12.0 - '@openzeppelin/defender-sdk-deploy-client': 1.12.0 - '@openzeppelin/defender-sdk-monitor-client': 1.12.0 - '@openzeppelin/defender-sdk-network-client': 1.12.0 - '@openzeppelin/defender-sdk-notification-channel-client': 1.12.0 - '@openzeppelin/defender-sdk-proposal-client': 1.12.0 - '@openzeppelin/defender-sdk-relay-client': 1.12.0 - '@openzeppelin/defender-sdk-relay-signer-client': 1.12.0(ethers@6.9.0)(web3-core-helpers@1.10.3)(web3-core@1.10.3)(web3-utils@1.10.3)(web3@1.8.2) - transitivePeerDependencies: - - bufferutil - - debug - - encoding - - ethers - - utf-8-validate - - web3 - - web3-core - - web3-core-helpers - - web3-utils - dev: false - /@parcel/watcher@2.0.4: resolution: {integrity: sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==} engines: {node: '>= 10.0.0'} @@ -6539,6 +6394,7 @@ packages: /micro-ftch@0.3.1: resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + dev: true /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} @@ -8392,6 +8248,7 @@ packages: dependencies: web3-eth-iban: 1.10.3 web3-utils: 1.10.3 + dev: true /web3-core-helpers@1.8.2: resolution: {integrity: sha512-6B1eLlq9JFrfealZBomd1fmlq1o4A09vrCVQSa51ANoib/jllT3atZrRDr0zt1rfI7TSZTZBXdN/aTdeN99DWw==} @@ -8409,6 +8266,7 @@ packages: web3-core-promievent: 1.10.3 web3-core-subscriptions: 1.10.3 web3-utils: 1.10.3 + dev: true /web3-core-method@1.8.2: resolution: {integrity: sha512-1qnr5mw5wVyULzLOrk4B+ryO3gfGjGd/fx8NR+J2xCGLf1e6OSjxT9vbfuQ3fErk/NjSTWWreieYWLMhaogcRA==} @@ -8426,6 +8284,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.4 + dev: true /web3-core-promievent@1.8.2: resolution: {integrity: sha512-nvkJWDVgoOSsolJldN33tKW6bKKRJX3MCPDYMwP5SUFOA/mCzDEoI88N0JFofDTXkh1k7gOqp1pvwi9heuaxGg==} @@ -8446,6 +8305,7 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: true /web3-core-requestmanager@1.8.2: resolution: {integrity: sha512-p1d090RYs5Mu7DK1yyc3GCBVZB/03rBtFhYFoS2EruGzOWs/5Q0grgtpwS/DScdRAm8wB8mYEBhY/RKJWF6B2g==} @@ -8467,6 +8327,7 @@ packages: dependencies: eventemitter3: 4.0.4 web3-core-helpers: 1.10.3 + dev: true /web3-core-subscriptions@1.8.2: resolution: {integrity: sha512-vXQogHDmAIQcKpXvGiMddBUeP9lnKgYF64+yQJhPNE5PnWr1sAibXuIPV7mIPihpFr/n/DORRj6Wh1pUv9zaTw==} @@ -8490,6 +8351,7 @@ packages: transitivePeerDependencies: - encoding - supports-color + dev: true /web3-core@1.8.2: resolution: {integrity: sha512-DJTVEAYcNqxkqruJE+Rxp3CIv0y5AZMwPHQmOkz/cz+MM75SIzMTc0AUdXzGyTS8xMF8h3YWMQGgGEy8SBf1PQ==} @@ -8668,6 +8530,7 @@ packages: dependencies: bn.js: 5.2.1 web3-utils: 1.10.3 + dev: true /web3-eth-iban@1.8.2: resolution: {integrity: sha512-h3vNblDWkWMuYx93Q27TAJz6lhzpP93EiC3+45D6xoz983p6si773vntoQ+H+5aZhwglBtoiBzdh7PSSOnP/xQ==} @@ -8799,6 +8662,7 @@ packages: web3-core-helpers: 1.10.3 transitivePeerDependencies: - encoding + dev: true /web3-providers-http@1.8.2: resolution: {integrity: sha512-2xY94IIEQd16+b+vIBF4IC1p7GVaz9q4EUFscvMUjtEq4ru4Atdzjs9GP+jmcoo49p70II0UV3bqQcz0TQfVyQ==} @@ -8830,6 +8694,7 @@ packages: dependencies: oboe: 2.1.5 web3-core-helpers: 1.10.3 + dev: true /web3-providers-ipc@1.8.2: resolution: {integrity: sha512-p6fqKVGFg+WiXGHWnB1hu43PbvPkDHTz4RgoEzbXugv5rtv5zfYLqm8Ba6lrJOS5ks9kGKR21a0y3NzE3u7V4w==} @@ -8859,6 +8724,7 @@ packages: websocket: 1.0.34 transitivePeerDependencies: - supports-color + dev: true /web3-providers-ws@1.8.2: resolution: {integrity: sha512-3s/4K+wHgbiN+Zrp9YjMq2eqAF6QGABw7wFftPdx+m5hWImV27/MoIx57c6HffNRqZXmCHnfWWFCNHHsi7wXnA==} @@ -8930,6 +8796,7 @@ packages: number-to-bn: 1.7.0 randombytes: 2.1.0 utf8: 3.0.0 + dev: true /web3-utils@1.8.2: resolution: {integrity: sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA==} From 772482b07751a5d9ca92641c51d042b447165c66 Mon Sep 17 00:00:00 2001 From: Marcos Date: Wed, 22 May 2024 11:31:56 +0200 Subject: [PATCH 2/4] allow throwing error when trying to refresh session --- packages/base/src/api/client.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/base/src/api/client.ts b/packages/base/src/api/client.ts index e660e4a4..fff91525 100644 --- a/packages/base/src/api/client.ts +++ b/packages/base/src/api/client.ts @@ -118,7 +118,7 @@ export abstract class BaseApiClient { if (updatedRetryState.retryCount > this.retryConfig.retries) throw error; - if (isCloudFlareError(error) && this.apiSecret) { + if (isCloudFlareError(error)) { const apiWithUpgradeHeaders = await this.refresh({ headers: { Connection: 'upgrade', From 0cd3c8f06b63089c38cdc6fbcd0b86fa82e8321b Mon Sep 17 00:00:00 2001 From: Marcos Date: Wed, 27 Nov 2024 15:24:20 -0300 Subject: [PATCH 3/4] fix: getters --- packages/relay-signer/src/api/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/relay-signer/src/api/index.ts b/packages/relay-signer/src/api/index.ts index d75c12b8..7eaad12c 100644 --- a/packages/relay-signer/src/api/index.ts +++ b/packages/relay-signer/src/api/index.ts @@ -49,10 +49,10 @@ export class RelaySignerClient extends BaseApiClient implements IRelayer { } public getApiKey(): string { - return this.getApiKey(); + return this.apiKey; } - public getAccessToken(): Promise { + public getToken(): Promise { return this.getAccessToken(); } From d5a26c9f7343bf492efa9b5767a34d206dd14623 Mon Sep 17 00:00:00 2001 From: Marcos Date: Wed, 27 Nov 2024 15:29:51 -0300 Subject: [PATCH 4/4] prefer getKey --- packages/relay-signer/src/api/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/relay-signer/src/api/index.ts b/packages/relay-signer/src/api/index.ts index 7eaad12c..920e6442 100644 --- a/packages/relay-signer/src/api/index.ts +++ b/packages/relay-signer/src/api/index.ts @@ -49,7 +49,7 @@ export class RelaySignerClient extends BaseApiClient implements IRelayer { } public getApiKey(): string { - return this.apiKey; + return this.getKey(); } public getToken(): Promise {