From f77f973269b39f1e2110e874a368ac759af9a0fc Mon Sep 17 00:00:00 2001
From: Piotr Roslaniec
Date: Tue, 25 Jun 2024 10:55:49 +0200
Subject: [PATCH] feat(auth): set defaults for eip4361 providers
---
packages/taco-auth/src/helper.ts | 10 +++++---
packages/taco-auth/src/providers/eip4361.ts | 25 ++++++++++++++-----
packages/taco-auth/test/taco-auth.test.ts | 4 +--
packages/taco/test/conditions/context.test.ts | 4 +--
packages/test-utils/src/variables.ts | 5 ++++
5 files changed, 35 insertions(+), 13 deletions(-)
diff --git a/packages/taco-auth/src/helper.ts b/packages/taco-auth/src/helper.ts
index 864dd4952..22d94a0ad 100644
--- a/packages/taco-auth/src/helper.ts
+++ b/packages/taco-auth/src/helper.ts
@@ -1,12 +1,16 @@
import {ethers} from "ethers";
-import { EIP4361AuthProvider } from './providers/eip4361';
+import { EIP4361AuthProvider, EIP4361AuthProviderParams } from './providers/eip4361';
import { EIP712AuthProvider } from './providers/eip712';
import { AuthProviders, EIP4361_AUTH_METHOD, EIP712_AUTH_METHOD } from './types';
-export const makeAuthProviders = (provider: ethers.providers.Provider, signer?: ethers.Signer): AuthProviders => {
+export const makeAuthProviders = (
+ provider: ethers.providers.Provider,
+ signer?: ethers.Signer,
+ siweDefaultParams?: EIP4361AuthProviderParams
+): AuthProviders => {
return {
[EIP712_AUTH_METHOD]: signer ? new EIP712AuthProvider(provider, signer) : undefined,
- [EIP4361_AUTH_METHOD]: signer ? new EIP4361AuthProvider(provider, signer) : undefined
+ [EIP4361_AUTH_METHOD]: signer ? new EIP4361AuthProvider(provider, signer, siweDefaultParams) : undefined
} as AuthProviders;
};
diff --git a/packages/taco-auth/src/providers/eip4361.ts b/packages/taco-auth/src/providers/eip4361.ts
index db35aee7f..48c3fc1a0 100644
--- a/packages/taco-auth/src/providers/eip4361.ts
+++ b/packages/taco-auth/src/providers/eip4361.ts
@@ -6,6 +6,13 @@ import { AuthSignature, EIP4361_AUTH_METHOD } from '../types';
export type EIP4361TypedData = string;
+export type EIP4361AuthProviderParams = {
+ domain: string;
+ uri: string;
+}
+
+const ERR_MISSING_SIWE_PARAMETERS = 'Missing default SIWE parameters';
+
export class EIP4361AuthProvider {
private readonly storage: LocalStorage;
@@ -13,6 +20,7 @@ export class EIP4361AuthProvider {
// TODO: We only need the provider to fetch the chainId, consider removing it
private readonly provider: ethers.providers.Provider,
private readonly signer: ethers.Signer,
+ private readonly providerParams?: EIP4361AuthProviderParams,
) {
this.storage = new LocalStorage();
}
@@ -55,7 +63,10 @@ export class EIP4361AuthProvider {
}
// TODO: Create a facility to set these parameters or expose them to the user
- private getParametersOrDefault() {
+ private getParametersOrDefault(): {
+ domain: string;
+ uri: string;
+ } {
// If we are in a browser environment, we can get the domain and uri from the window object
if (typeof window !== 'undefined') {
const maybeOrigin = window?.location?.origin;
@@ -64,10 +75,12 @@ export class EIP4361AuthProvider {
uri: maybeOrigin,
};
}
- // TODO: Add a facility to manage this case
- return {
- domain: 'localhost',
- uri: 'http://localhost:3000',
- };
+ if (this.providerParams) {
+ return {
+ domain: this.providerParams.domain,
+ uri: this.providerParams.uri,
+ }
+ }
+ throw new Error(ERR_MISSING_SIWE_PARAMETERS);
}
}
diff --git a/packages/taco-auth/test/taco-auth.test.ts b/packages/taco-auth/test/taco-auth.test.ts
index 80e4da215..7cf7d0175 100644
--- a/packages/taco-auth/test/taco-auth.test.ts
+++ b/packages/taco-auth/test/taco-auth.test.ts
@@ -1,7 +1,7 @@
import {
bobSecretKeyBytes,
fakeProvider,
- fakeSigner,
+ fakeSigner, TEST_SIWE_PARAMS,
} from '@nucypher/test-utils';
import { SiweMessage } from 'siwe';
import { describe, expect, it } from 'vitest';
@@ -43,7 +43,7 @@ describe('taco authorization', () => {
const provider = fakeProvider(bobSecretKeyBytes);
const signer = fakeSigner(bobSecretKeyBytes);
- const eip4361Provider = new EIP4361AuthProvider(provider, signer);
+ const eip4361Provider = new EIP4361AuthProvider(provider, signer, TEST_SIWE_PARAMS);
const typedSignature = await eip4361Provider.getOrCreateAuthSignature();
expect(typedSignature.signature).toBeDefined();
expect(typedSignature.address).toEqual(await signer.getAddress());
diff --git a/packages/taco/test/conditions/context.test.ts b/packages/taco/test/conditions/context.test.ts
index 7b17d16f2..a48aa7e45 100644
--- a/packages/taco/test/conditions/context.test.ts
+++ b/packages/taco/test/conditions/context.test.ts
@@ -11,7 +11,7 @@ import {
USER_ADDRESS_PARAM_EIP4361,
USER_ADDRESS_PARAM_EIP712
} from "@nucypher/taco-auth";
-import {fakeAuthProviders, fakeProvider, fakeSigner} from '@nucypher/test-utils';
+import { fakeAuthProviders, fakeProvider, fakeSigner, TEST_SIWE_PARAMS } from '@nucypher/test-utils';
import { ethers } from 'ethers';
import { beforeAll, describe, expect, it, vi } from 'vitest';
@@ -314,7 +314,7 @@ describe('No authentication provider', () => {
await initialize();
provider = fakeProvider();
signer = fakeSigner();
- authProviders = makeAuthProviders(provider, signer);
+ authProviders = makeAuthProviders(provider, signer, TEST_SIWE_PARAMS);
});
it('throws an error if there is no auth provider', () => {
diff --git a/packages/test-utils/src/variables.ts b/packages/test-utils/src/variables.ts
index 85da75d92..462f56609 100644
--- a/packages/test-utils/src/variables.ts
+++ b/packages/test-utils/src/variables.ts
@@ -14,3 +14,8 @@ export const TEST_CONTRACT_ADDR = '0x0000000000000000000000000000000000000001';
export const TEST_CONTRACT_ADDR_2 =
'0x0000000000000000000000000000000000000002';
export const TEST_CHAIN_ID = ChainId.SEPOLIA;
+
+export const TEST_SIWE_PARAMS = {
+ domain: 'localhost',
+ uri: 'http://localhost:3000',
+};