Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
19 changes: 8 additions & 11 deletions backend/src/auth/auth.module.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,25 @@
import { Module } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';
import { PassportModule } from '@nestjs/passport';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { AuthController } from './auth.controller.js';
import { AuthService } from './auth.service.js';
import { JwtStrategy } from './strategies/jwt.strategy.js';
import { WalletStrategy } from './strategies/wallet.strategy.js';
import { JwtAuthGuard } from './guards/jwt-auth.guard.js';
import { RolesGuard } from './guards/roles.guard.js';
import { jwtModuleConfig } from '../config/jwt.config.js';
import { UsersModule } from '../users/users.module.js';

/**
* #971: Self-contained Auth module.
*
* Exports guards and strategies for use in other modules.
* Handles wallet authentication, JWT lifecycle, session management, and RBAC.
*/
@Module({
imports: [
PassportModule.register({ defaultStrategy: 'jwt' }),
JwtModule.registerAsync({
imports: [ConfigModule],
useFactory: (configService: ConfigService) => ({
secret: configService.get('JWT_SECRET', 'dev-secret'),
signOptions: {
expiresIn: configService.get('JWT_ACCESS_TTL', '900'),
},
}),
inject: [ConfigService],
}),
JwtModule.registerAsync(jwtModuleConfig),
UsersModule,
],
controllers: [AuthController],
Expand Down
19 changes: 14 additions & 5 deletions backend/src/auth/auth.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { JwtAccessTokenPayload } from './interfaces/jwt-payload.interface.js';
import { WalletStrategy } from './strategies/wallet.strategy.js';
import { UsersService } from '../users/users.service.js';
import { AuthRole } from '../common/enums/auth-role.enum.js';
import { ROLE_PERMISSIONS } from '../common/constants/role-permissions.constant.js';

/**
* #971-978: Auth service handling wallet login, JWT lifecycle, and session management.
Expand Down Expand Up @@ -125,6 +126,7 @@ export class AuthService {
const roles = user.roles?.length
? user.roles.map((role) => role.name)
: [AuthRole.MENTEE];
const permissions = this.resolvePermissions(roles);

const accessPayload: JwtAccessTokenPayload = {
sub: user.id,
Expand All @@ -133,6 +135,7 @@ export class AuthService {
iat: Math.floor(Date.now() / 1000),
exp: Math.floor(Date.now() / 1000) + accessTtl,
roles,
permissions,
status: user.status,
};

Expand Down Expand Up @@ -222,11 +225,17 @@ export class AuthService {
// In production: persist to database via UsersService
}

private resolveRoles(walletAddress: string): Promise<string[]> {
// In production: query from database, keyed by walletAddress
// Default role for all authenticated users
void walletAddress;
return Promise.resolve(['MENTEE']);
/**
* #974: Resolve the union of permissions granted by a set of roles.
*/
private resolvePermissions(roles: AuthRole[]): string[] {
const permissions = new Set<string>();
for (const role of roles) {
for (const permission of ROLE_PERMISSIONS[role] ?? []) {
permissions.add(permission);
}
}
return Array.from(permissions);
}

private cleanExpiredNonces(): void {
Expand Down
2 changes: 1 addition & 1 deletion backend/src/auth/guards/jwt-auth.guard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
import { ConfigService } from '@nestjs/config';
import { JwtService } from '@nestjs/jwt';
import { Request } from 'express';
import { JwtAccessTokenPayload } from '../interfaces/jwt-payload.interface';
import { JwtAccessTokenPayload } from '../interfaces/jwt-payload.interface.js';
import { UserStatus } from '../../users/enums/user-status.enum.js';

/**
Expand Down
1 change: 1 addition & 0 deletions backend/src/auth/interfaces/jwt-payload.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@ export interface JwtAccessTokenPayload {
iat: number;
exp: number;
roles?: string[];
permissions?: string[];
status: UserStatus;
}
1 change: 1 addition & 0 deletions backend/src/auth/strategies/jwt.strategy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ export class JwtStrategy extends PassportStrategy(Strategy) {
iat: payload.iat,
exp: payload.exp,
roles: payload.roles || [],
permissions: payload.permissions || [],
status: payload.status,
};
}
Expand Down
15 changes: 15 additions & 0 deletions backend/src/common/constants/role-permissions.constant.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { AuthRole } from '../enums/auth-role.enum.js';
import { Permission } from '../enums/permission.enum.js';

export const ROLE_PERMISSIONS: Record<AuthRole, Permission[]> = {
[AuthRole.USER]: [Permission.PROFILE_READ],
[AuthRole.MENTEE]: [Permission.PROFILE_READ, Permission.MENTEE_PROFILE_WRITE],
[AuthRole.MENTOR]: [Permission.PROFILE_READ, Permission.MENTOR_PROFILE_WRITE],
[AuthRole.ADMIN]: [
Permission.PROFILE_READ,
Permission.PROFILE_WRITE,
Permission.MENTOR_PROFILE_WRITE,
Permission.MENTEE_PROFILE_WRITE,
Permission.USER_MANAGE,
],
};
7 changes: 7 additions & 0 deletions backend/src/common/enums/permission.enum.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export enum Permission {
PROFILE_READ = 'profile:read',
PROFILE_WRITE = 'profile:write',
MENTOR_PROFILE_WRITE = 'mentor_profile:write',
MENTEE_PROFILE_WRITE = 'mentee_profile:write',
USER_MANAGE = 'user:manage',
}
26 changes: 26 additions & 0 deletions backend/src/config/jwt.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { ConfigModule, ConfigService } from '@nestjs/config';
import { JwtModuleOptions } from '@nestjs/jwt';
import { Algorithm } from 'jsonwebtoken';

export const jwtModuleConfig = {
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (config: ConfigService): JwtModuleOptions => {
const algorithm = config.get<Algorithm>('JWT_ALGORITHM', 'HS256');

if (algorithm === 'RS256') {
return {
privateKey: config.get<string>('JWT_PRIVATE_KEY'),
publicKey: config.get<string>('JWT_PUBLIC_KEY'),
signOptions: { algorithm },
verifyOptions: { algorithms: [algorithm] },
};
}

return {
secret: config.get<string>('JWT_SECRET', 'dev-secret'),
signOptions: { algorithm },
verifyOptions: { algorithms: [algorithm] },
};
},
};
2 changes: 2 additions & 0 deletions backend/src/users/users.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,8 @@ export class UsersController {
dto.username,
);
return UserResponseDto.fromEntity(user);
}

@Get('admin/completeness')
@UseGuards(RolesGuard)
@Roles(AuthRole.ADMIN)
Expand Down
15 changes: 3 additions & 12 deletions backend/src/users/users.module.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { JwtModule } from '@nestjs/jwt';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { ConfigModule } from '@nestjs/config';
import { UsersController } from './users.controller.js';
import { ProfilesController } from './profiles.controller.js';
import { UsersService } from './users.service.js';
Expand All @@ -14,6 +14,7 @@ import { MenteeProfile } from './entities/mentee-profile.entity.js';
import { PortfolioLink } from './entities/portfolio-link.entity.js';
import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard.js';
import { RolesGuard } from '../auth/guards/roles.guard.js';
import { jwtModuleConfig } from '../config/jwt.config.js';
import { StorageModule } from '../storage/storage.module.js';
import { AvailabilityModule } from '../availability/availability.module.js';
import { ProfileCompletenessService } from './profile-completeness.service.js';
Expand All @@ -27,22 +28,12 @@ import { ProfileCompletenessService } from './profile-completeness.service.js';
MenteeProfile,
PortfolioLink,
]),
JwtModule.registerAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (config: ConfigService) => ({
secret: config.get<string>('JWT_SECRET'),
signOptions: { expiresIn: '1h' },
}),
}),
JwtModule.registerAsync(jwtModuleConfig),
ConfigModule,
StorageModule,
AvailabilityModule,
],
controllers: [UsersController, ProfilesController, AvatarController],
providers: [UsersService, JwtAuthGuard, RolesGuard],
exports: [UsersService],
controllers: [UsersController],
providers: [
UsersService,
JwtAuthGuard,
Expand Down
1 change: 0 additions & 1 deletion backend/src/users/users.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import {
} from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Not, Repository } from 'typeorm';
import { Repository } from 'typeorm';
import {
PaginatedResponse,
PaginationService,
Expand Down
2 changes: 1 addition & 1 deletion contract/target/.rustc_info.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"rustc_fingerprint":15719501680474245027,"outputs":{"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___.exe\nlib___.rlib\n___.dll\n___.dll\n___.lib\n___.dll\nC:\\Users\\a-abdulkareem\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\npacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"msvc\"\ntarget_family=\"windows\"\ntarget_feature=\"cmpxchg16b\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_feature=\"sse3\"\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_has_atomic_primitive_alignment=\"128\"\ntarget_has_atomic_primitive_alignment=\"16\"\ntarget_has_atomic_primitive_alignment=\"32\"\ntarget_has_atomic_primitive_alignment=\"64\"\ntarget_has_atomic_primitive_alignment=\"8\"\ntarget_has_atomic_primitive_alignment=\"ptr\"\ntarget_os=\"windows\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"pc\"\nwindows\n","stderr":""},"1434569230290955211":{"success":true,"status":"","code":0,"stdout":"rustc 1.97.1 (8bab26f4f 2026-07-14)\nbinary: rustc\ncommit-hash: 8bab26f4f68e0e26f0bb7960be334d5b520ea452\ncommit-date: 2026-07-14\nhost: x86_64-pc-windows-msvc\nrelease: 1.97.1\nLLVM version: 22.1.6\n","stderr":""}},"successes":{}}
{"rustc_fingerprint":678832330695229064,"outputs":{"12522964844413219576":{"success":true,"status":"","code":0,"stdout":"rustc 1.97.1 (8bab26f4f 2026-07-14)\nbinary: rustc\ncommit-hash: 8bab26f4f68e0e26f0bb7960be334d5b520ea452\ncommit-date: 2026-07-14\nhost: x86_64-pc-windows-msvc\nrelease: 1.97.1\nLLVM version: 22.1.6\n","stderr":""},"12004014463585500860":{"success":true,"status":"","code":0,"stdout":"___.exe\nlib___.rlib\n___.dll\n___.dll\n___.lib\n___.dll\nC:\\Users\\thefo\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\npacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"msvc\"\ntarget_family=\"windows\"\ntarget_feature=\"cmpxchg16b\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_feature=\"sse3\"\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_has_atomic_primitive_alignment=\"128\"\ntarget_has_atomic_primitive_alignment=\"16\"\ntarget_has_atomic_primitive_alignment=\"32\"\ntarget_has_atomic_primitive_alignment=\"64\"\ntarget_has_atomic_primitive_alignment=\"8\"\ntarget_has_atomic_primitive_alignment=\"ptr\"\ntarget_os=\"windows\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"pc\"\nwindows\n","stderr":""},"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___.exe\nlib___.rlib\n___.dll\n___.dll\n___.lib\n___.dll\nC:\\Users\\thefo\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\npacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"msvc\"\ntarget_family=\"windows\"\ntarget_feature=\"cmpxchg16b\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_feature=\"sse3\"\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_has_atomic_primitive_alignment=\"128\"\ntarget_has_atomic_primitive_alignment=\"16\"\ntarget_has_atomic_primitive_alignment=\"32\"\ntarget_has_atomic_primitive_alignment=\"64\"\ntarget_has_atomic_primitive_alignment=\"8\"\ntarget_has_atomic_primitive_alignment=\"ptr\"\ntarget_os=\"windows\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"pc\"\nwindows\n","stderr":""}},"successes":{}}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
a21b1d8f4770fcc8
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"rustc":3720210673988096810,"features":"[]","declared_features":"[\"atomic-polyfill\", \"compile-time-rng\", \"const-random\", \"default\", \"getrandom\", \"nightly-arm-aes\", \"no-rng\", \"runtime-rng\", \"serde\", \"std\"]","target":17883862002600103897,"profile":2225463790103693989,"path":11326107204811762440,"deps":[[5398981501050481332,"version_check",false,1154885568704705614]],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\ahash-3b10494017b17ec3\\dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This file has an mtime of when this was started.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This file has an mtime of when this was started.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3f3036ce23b4d583
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"rustc":3720210673988096810,"features":"[]","declared_features":"[\"atomic-polyfill\", \"compile-time-rng\", \"const-random\", \"default\", \"getrandom\", \"nightly-arm-aes\", \"no-rng\", \"runtime-rng\", \"serde\", \"std\"]","target":8470944000320059508,"profile":2241668132362809309,"path":11833373052247602141,"deps":[[966925859616469517,"build_script_build",false,3800067462974793790],[5855319743879205494,"once_cell",false,12079581861778231915],[7068267936014523539,"zerocopy",false,16576564092653715563],[7667230146095136825,"cfg_if",false,14580704483308299694]],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\ahash-6026c6e370234e71\\dep-lib-ahash","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3ee82155398dbc34
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"rustc":3720210673988096810,"features":"","declared_features":"","target":0,"profile":0,"path":0,"deps":[[966925859616469517,"build_script_build",false,14482573954362710946]],"local":[{"RerunIfChanged":{"output":"debug\\build\\ahash-ec94a37b018baea8\\output","paths":["build.rs"]}}],"rustflags":[],"config":0,"compile_kind":0}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This file has an mtime of when this was started.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
92cdbcdcec9fc49f
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"rustc":3720210673988096810,"features":"[\"curve\", \"default\", \"scalar_field\"]","declared_features":"[\"curve\", \"default\", \"scalar_field\", \"std\"]","target":5756399181311494987,"profile":2241668132362809309,"path":7725049387758982350,"deps":[[520424413174385823,"ark_ff",false,9003824555463781612],[10325592727886569959,"ark_ec",false,13775902711808219870],[15179503056858879355,"ark_std",false,12355358832257566243],[16925068697324277505,"ark_serialize",false,14369722264898510125]],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\ark-bls12-381-ab41c2a5d0395872\\dep-lib-ark_bls12_381","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This file has an mtime of when this was started.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
de5aab4d87d62dbf
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"rustc":3720210673988096810,"features":"[\"default\"]","declared_features":"[\"default\", \"parallel\", \"rayon\", \"std\"]","target":8834256766163795218,"profile":2241668132362809309,"path":3705639445361500713,"deps":[[520424413174385823,"ark_ff",false,9003824555463781612],[5157631553186200874,"num_traits",false,5480453699087360752],[6124836340423303934,"hashbrown",false,11108361702329286579],[6971842703803247244,"zeroize",false,6355248589562004251],[7095394906197176013,"ark_poly",false,14898056450058739232],[11903278875415370753,"itertools",false,11865467587288215868],[13859769749131231458,"derivative",false,16343474140812885451],[15179503056858879355,"ark_std",false,12355358832257566243],[16925068697324277505,"ark_serialize",false,14369722264898510125]],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\ark-ec-c483394cf407ade2\\dep-lib-ark_ec","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This file has an mtime of when this was started.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ecac5b98ba02f47c
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"rustc":3720210673988096810,"features":"[\"default\"]","declared_features":"[\"asm\", \"default\", \"parallel\", \"rayon\", \"std\"]","target":4360302069253712615,"profile":2241668132362809309,"path":4330247493060772562,"deps":[[477150410136574819,"ark_ff_macros",false,1026853950203388151],[5157631553186200874,"num_traits",false,5480453699087360752],[6971842703803247244,"zeroize",false,6355248589562004251],[11509331996780215580,"num_bigint",false,6488193950930459156],[11903278875415370753,"itertools",false,11865467587288215868],[13859769749131231458,"derivative",false,16343474140812885451],[15179503056858879355,"ark_std",false,12355358832257566243],[16925068697324277505,"ark_serialize",false,14369722264898510125],[17475753849556516473,"digest",false,5570122084459515434],[17605717126308396068,"paste",false,7733494523132962327],[17996237327373919127,"ark_ff_asm",false,18283700481728419214]],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\ark-ff-4e2a5acf712646e6\\dep-lib-ark_ff","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This file has an mtime of when this was started.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
8e950f89b7c0bcfd
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"rustc":3720210673988096810,"features":"[]","declared_features":"[]","target":11822302939647499019,"profile":2225463790103693989,"path":15254957438493565690,"deps":[[2713742371683562785,"syn",false,895688156656210025],[8949245912927223590,"quote",false,12072665690359756742]],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\ark-ff-asm-22d8aa5f352a625d\\dep-lib-ark_ff_asm","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This file has an mtime of when this was started.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
f760142a3a1e400e
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"rustc":3720210673988096810,"features":"[]","declared_features":"[]","target":15670781153017545859,"profile":2225463790103693989,"path":16014039409207320635,"deps":[[2713742371683562785,"syn",false,895688156656210025],[5157631553186200874,"num_traits",false,4932890178861058077],[8949245912927223590,"quote",false,12072665690359756742],[11509331996780215580,"num_bigint",false,12917678012020612994],[16346726298725429545,"proc_macro2",false,169897430408327436]],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\ark-ff-macros-7a508dd1075565d2\\dep-lib-ark_ff_macros","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This file has an mtime of when this was started.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
20de77756887c0ce
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"rustc":3720210673988096810,"features":"[]","declared_features":"[\"default\", \"parallel\", \"rayon\", \"std\"]","target":5077770153215708384,"profile":2241668132362809309,"path":5387916160894111152,"deps":[[520424413174385823,"ark_ff",false,9003824555463781612],[6124836340423303934,"hashbrown",false,11108361702329286579],[13859769749131231458,"derivative",false,16343474140812885451],[15179503056858879355,"ark_std",false,12355358832257566243],[16925068697324277505,"ark_serialize",false,14369722264898510125]],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\ark-poly-d444de5d3dd63f1b\\dep-lib-ark_poly","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This file has an mtime of when this was started.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
2d1d4c1044826bc7
Loading
Loading