fix: update generated files and fix validations (#2595)

## Why is this change needed?

Fixes the previous release.

## Merge Checklist

_Choose all relevant options below by adding an `x` now or at any time
before submitting for review_

- [x] PR title adheres to the [conventional
commits](https://www.conventionalcommits.org/en/v1.0.0/) standard
- [ ] PR has a
[changeset](https://github.com/farcasterxyz/hub-monorepo/blob/main/CONTRIBUTING.md#35-adding-changesets)
- [x] PR has been tagged with a change label(s) (i.e. documentation,
feature, bugfix, or chore)
- [x] PR includes
[documentation](https://github.com/farcasterxyz/hub-monorepo/blob/main/CONTRIBUTING.md#32-writing-docs)
if necessary.

<!-- start pr-codex -->

---

## PR-Codex overview
This PR introduces new user data types, expands username validation, and
adds tier-related functionalities across multiple files. It enhances the
handling of usernames, addresses, and event types while improving
validations and error handling.

### Detailed summary
- Added `USERNAME_TYPE_BASENAME` to `UserNameType` enums.
- Introduced `BANNER`, `USER_DATA_PRIMARY_ADDRESS_ETHEREUM`, and
`USER_DATA_PRIMARY_ADDRESS_SOLANA` to `UserDataType` enums.
- Updated `CastType` enum to include `TEN_K_CAST`.
- Modified username validation to support `USERNAME_TYPE_BASENAME`.
- Enhanced user data validation for Ethereum and Solana addresses.
- Updated maximum username length from 20 to 25 characters.
- Changed embed limit from 2 to 4 in validations.
- Added `TierType` enum with `None` and `Pro` values.
- Introduced `TierPurchaseBody` interface for tier purchases.
- Added handling for `EVENT_TYPE_TIER_PURCHASE` in `OnChainEventType`.

>  Ask PR-Codex anything about this PR by commenting with `/codex {your
question}`

<!-- end pr-codex -->

---------

Co-authored-by: Sanjay Raveendran <sanjayprabhu@gmail.com>
This commit is contained in:
Aditi Srinivasan
2025-06-09 21:01:36 -04:00
committed by GitHub
parent d928ba27cd
commit 6307171a87
11 changed files with 701 additions and 16 deletions

View File

@@ -0,0 +1,7 @@
---
"@farcaster/hub-nodejs": minor
"@farcaster/hub-web": minor
"@farcaster/core": minor
---
feat: Support snapchain 0.3 protocol features: pro, basenames and primary address

View File

@@ -122,8 +122,8 @@ describe("validateENSname", () => {
expect(validations.validateEnsName(ensName)).toEqual(ok(ensName));
});
test("fails when greater than 20 characters", () => {
const ensName = faker.random.alpha(17).concat(".eth");
test("fails when greater than 25 characters", () => {
const ensName = faker.random.alpha(22).concat(".eth");
expect(validations.validateEnsName(ensName)).toEqual(
err(new HubError("bad_request.validation_failure", `ensName "${ensName}" > 20 characters`)),
);
@@ -327,7 +327,7 @@ describe("validateCastAddBody", () => {
test("fails with unrecognized type", () => {
const body = Factories.CastAddBody.build({
text: "Hello",
type: 2,
type: 3,
});
expect(validations.validateCastAddBody(body)).toEqual(
err(new HubError("bad_request.validation_failure", "invalid cast type")),
@@ -435,11 +435,17 @@ describe("validateCastAddBody", () => {
hubErrorMessage = "text > 320 bytes";
});
test("with more than 2 embeds", () => {
test("with more than 4 embeds", () => {
body = Factories.CastAddBody.build({
embeds: [Factories.Embed.build(), Factories.Embed.build(), Factories.Embed.build()],
embeds: [
Factories.Embed.build(),
Factories.Embed.build(),
Factories.Embed.build(),
Factories.Embed.build(),
Factories.Embed.build(),
],
});
hubErrorMessage = "embeds > 2";
hubErrorMessage = "embeds > 4";
});
test("with an empty embed url string", () => {
@@ -1042,6 +1048,50 @@ describe("validateUserDataAddBody", () => {
expect(validations.validateUserDataAddBody(body)).toEqual(ok(body));
});
test("succeeds for base names", async () => {
const body = Factories.UserDataBody.build({
type: UserDataType.USERNAME,
value: "averylongname.base.eth",
});
expect(validations.validateUserDataAddBody(body)).toEqual(ok(body));
});
test("succeeds for primary address", async () => {
const eth = Factories.UserDataBody.build({
type: UserDataType.USER_DATA_PRIMARY_ADDRESS_ETHEREUM,
value: "0xdadB0d80178819F2319190D340ce9A924f783711",
});
expect(validations.validateUserDataAddBody(eth)).toEqual(ok(eth));
const sol = Factories.UserDataBody.build({
type: UserDataType.USER_DATA_PRIMARY_ADDRESS_SOLANA,
value: "8TPWakvWw4xQbk7uAYdNjZiDKKHgv9GE5GebzsbtUaHr",
});
expect(validations.validateUserDataAddBody(sol)).toEqual(ok(sol));
const empty = Factories.UserDataBody.build({
type: UserDataType.USER_DATA_PRIMARY_ADDRESS_ETHEREUM,
value: "",
});
expect(validations.validateUserDataAddBody(empty)).toEqual(ok(empty));
const invalidEth = Factories.UserDataBody.build({
type: UserDataType.USER_DATA_PRIMARY_ADDRESS_ETHEREUM,
value: "0xdadB0d80178819F2319190D340ce9A924f783711123",
});
let result = validations.validateUserDataAddBody(invalidEth);
expect(result._unsafeUnwrapErr()).toEqual(
new HubError("bad_request.validation_failure", "invalid length for eth address"),
);
const invalidSol = Factories.UserDataBody.build({
type: UserDataType.USER_DATA_PRIMARY_ADDRESS_SOLANA,
value: "8TPWakvWw4xQbk7uAYdNjZiDKKHgv9GE5GebzsbtUaHrasd",
});
result = validations.validateUserDataAddBody(invalidSol);
expect(result._unsafeUnwrapErr()).toEqual(
new HubError("bad_request.validation_failure", "invalid length for sol address"),
);
});
test("succeeds for empty location", async () => {
const body = Factories.UserDataBody.build({
type: UserDataType.LOCATION,
@@ -1303,6 +1353,32 @@ describe("validateUsernameProof", () => {
const result = await validations.validateUsernameProofBody(proof.data.usernameProofBody, proof.data);
expect(result.isOk()).toBeTruthy();
});
test("succeeds for basenames", async () => {
const proof = await Factories.UsernameProofMessage.create({
data: {
usernameProofBody: {
name: utf8StringToBytes("alongname.base.eth")._unsafeUnwrap(),
type: UserNameType.USERNAME_TYPE_BASENAME,
},
},
});
const result = validations.validateUsernameProofBody(proof.data.usernameProofBody, proof.data);
expect(result.isOk()).toBeTruthy();
});
test("fails for non base name", async () => {
const proof = await Factories.UsernameProofMessage.create({
data: {
usernameProofBody: {
name: utf8StringToBytes("alongname.esab.eth")._unsafeUnwrap(),
type: UserNameType.USERNAME_TYPE_BASENAME,
},
},
});
const result = validations.validateUsernameProofBody(proof.data.usernameProofBody, proof.data);
expect(result._unsafeUnwrapErr()).toEqual(
new HubError("bad_request.validation_failure", 'ensName "alongname.esab.eth" unsupported subdomain'),
);
});
});
describe("validateMessage", () => {

View File

@@ -22,7 +22,7 @@ export const HEX_REGEX = /^(0x)?[0-9A-Fa-f]+$/;
export const TWITTER_REGEX = /^[a-z0-9_]{0,15}$/;
export const GITHUB_REGEX = /^[a-z\d](?:[a-z\d]|-(?!-)){0,38}$/i;
export const USERNAME_MAX_LENGTH = 20;
export const USERNAME_MAX_LENGTH = 25;
export const EMBEDS_V1_CUTOFF = 73612800; // 5/3/23 00:00 UTC
@@ -599,12 +599,20 @@ export const validateCastAddBody = (
return err(new HubError("bad_request.validation_failure", "text too short for long cast"));
}
if (body.type !== CastType.CAST && body.type !== CastType.LONG_CAST) {
if (body.type === CastType.TEN_K_CAST && textBytes.length > 10_000) {
return err(new HubError("bad_request.validation_failure", "text > 10,000 bytes for 10k cast"));
}
if (body.type === CastType.TEN_K_CAST && textBytes.length <= 1024) {
return err(new HubError("bad_request.validation_failure", "text too short for 10k cast"));
}
if (body.type !== CastType.CAST && body.type !== CastType.LONG_CAST && body.type !== CastType.TEN_K_CAST) {
return err(new HubError("bad_request.validation_failure", "invalid cast type"));
}
if (body.embeds.length > 2) {
return err(new HubError("bad_request.validation_failure", "embeds > 2"));
if (body.embeds.length > 4) {
return err(new HubError("bad_request.validation_failure", "embeds > 4"));
}
if (allowEmbedsDeprecated && body.embedsDeprecated.length > 2) {
@@ -892,7 +900,7 @@ export const validateUsernameProofBody = (
data: protobufs.MessageData,
): HubResult<protobufs.UserNameProof> => {
// Gossiped username proofs must only have an ENS type
if (body.type !== UserNameType.USERNAME_TYPE_ENS_L1) {
if (!(body.type === UserNameType.USERNAME_TYPE_ENS_L1 || body.type === UserNameType.USERNAME_TYPE_BASENAME)) {
return err(new HubError("bad_request.validation_failure", `invalid username type: ${body.type}`));
}
const validateName = validateEnsName(body.name);
@@ -1045,6 +1053,26 @@ export const validateUserDataAddBody = (body: protobufs.UserDataBody): HubResult
}
break;
}
case protobufs.UserDataType.USER_DATA_PRIMARY_ADDRESS_ETHEREUM: {
// Users can remove their primary address
if (valueBytes.length > 42) {
return err(new HubError("bad_request.validation_failure", "invalid length for eth address"));
}
break;
}
case protobufs.UserDataType.USER_DATA_PRIMARY_ADDRESS_SOLANA: {
// Users can remove their primary address
if (valueBytes.length > 44) {
return err(new HubError("bad_request.validation_failure", "invalid length for sol address"));
}
break;
}
case protobufs.UserDataType.BANNER: {
if (valueBytes.length > 256) {
return err(new HubError("bad_request.validation_failure", "banner value > 256"));
}
break;
}
default:
return err(new HubError("bad_request.validation_failure", "invalid user data type"));
}
@@ -1116,7 +1144,11 @@ export const validateEnsName = <T extends string | Uint8Array>(ensNameP?: T | nu
}
const nameParts = ensName.split(".");
if (nameParts[0] === undefined || nameParts.length !== 2) {
if (nameParts[0] === undefined || !(nameParts.length === 2 || nameParts.length === 3)) {
return err(new HubError("bad_request.validation_failure", `ensName "${ensName}" unsupported subdomain`));
}
if (nameParts.length === 3 && nameParts[1] !== "base") {
return err(new HubError("bad_request.validation_failure", `ensName "${ensName}" unsupported subdomain`));
}

View File

@@ -248,6 +248,12 @@ export enum UserDataType {
TWITTER = 8,
/** GITHUB - Username of user on github */
GITHUB = 9,
/** BANNER - Banner image for the user */
BANNER = 10,
/** USER_DATA_PRIMARY_ADDRESS_ETHEREUM - Primary address for the user on Ethereum */
USER_DATA_PRIMARY_ADDRESS_ETHEREUM = 11,
/** USER_DATA_PRIMARY_ADDRESS_SOLANA - Primary address for the user on Solana */
USER_DATA_PRIMARY_ADDRESS_SOLANA = 12,
}
export function userDataTypeFromJSON(object: any): UserDataType {
@@ -279,6 +285,15 @@ export function userDataTypeFromJSON(object: any): UserDataType {
case 9:
case "USER_DATA_TYPE_GITHUB":
return UserDataType.GITHUB;
case 10:
case "USER_DATA_TYPE_BANNER":
return UserDataType.BANNER;
case 11:
case "USER_DATA_PRIMARY_ADDRESS_ETHEREUM":
return UserDataType.USER_DATA_PRIMARY_ADDRESS_ETHEREUM;
case 12:
case "USER_DATA_PRIMARY_ADDRESS_SOLANA":
return UserDataType.USER_DATA_PRIMARY_ADDRESS_SOLANA;
default:
throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum UserDataType");
}
@@ -304,6 +319,12 @@ export function userDataTypeToJSON(object: UserDataType): string {
return "USER_DATA_TYPE_TWITTER";
case UserDataType.GITHUB:
return "USER_DATA_TYPE_GITHUB";
case UserDataType.BANNER:
return "USER_DATA_TYPE_BANNER";
case UserDataType.USER_DATA_PRIMARY_ADDRESS_ETHEREUM:
return "USER_DATA_PRIMARY_ADDRESS_ETHEREUM";
case UserDataType.USER_DATA_PRIMARY_ADDRESS_SOLANA:
return "USER_DATA_PRIMARY_ADDRESS_SOLANA";
default:
throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum UserDataType");
}
@@ -313,6 +334,7 @@ export function userDataTypeToJSON(object: UserDataType): string {
export enum CastType {
CAST = 0,
LONG_CAST = 1,
TEN_K_CAST = 2,
}
export function castTypeFromJSON(object: any): CastType {
@@ -323,6 +345,9 @@ export function castTypeFromJSON(object: any): CastType {
case 1:
case "LONG_CAST":
return CastType.LONG_CAST;
case 2:
case "TEN_K_CAST":
return CastType.TEN_K_CAST;
default:
throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum CastType");
}
@@ -334,6 +359,8 @@ export function castTypeToJSON(object: CastType): string {
return "CAST";
case CastType.LONG_CAST:
return "LONG_CAST";
case CastType.TEN_K_CAST:
return "TEN_K_CAST";
default:
throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum CastType");
}

View File

@@ -8,6 +8,7 @@ export enum OnChainEventType {
EVENT_TYPE_SIGNER_MIGRATED = 2,
EVENT_TYPE_ID_REGISTER = 3,
EVENT_TYPE_STORAGE_RENT = 4,
EVENT_TYPE_TIER_PURCHASE = 5,
}
export function onChainEventTypeFromJSON(object: any): OnChainEventType {
@@ -27,6 +28,9 @@ export function onChainEventTypeFromJSON(object: any): OnChainEventType {
case 4:
case "EVENT_TYPE_STORAGE_RENT":
return OnChainEventType.EVENT_TYPE_STORAGE_RENT;
case 5:
case "EVENT_TYPE_TIER_PURCHASE":
return OnChainEventType.EVENT_TYPE_TIER_PURCHASE;
default:
throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum OnChainEventType");
}
@@ -44,11 +48,42 @@ export function onChainEventTypeToJSON(object: OnChainEventType): string {
return "EVENT_TYPE_ID_REGISTER";
case OnChainEventType.EVENT_TYPE_STORAGE_RENT:
return "EVENT_TYPE_STORAGE_RENT";
case OnChainEventType.EVENT_TYPE_TIER_PURCHASE:
return "EVENT_TYPE_TIER_PURCHASE";
default:
throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum OnChainEventType");
}
}
export enum TierType {
None = 0,
Pro = 1,
}
export function tierTypeFromJSON(object: any): TierType {
switch (object) {
case 0:
case "None":
return TierType.None;
case 1:
case "Pro":
return TierType.Pro;
default:
throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum TierType");
}
}
export function tierTypeToJSON(object: TierType): string {
switch (object) {
case TierType.None:
return "None";
case TierType.Pro:
return "Pro";
default:
throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum TierType");
}
}
export enum SignerEventType {
NONE = 0,
ADD = 1,
@@ -144,10 +179,17 @@ export interface OnChainEvent {
signerMigratedEventBody?: SignerMigratedEventBody | undefined;
idRegisterEventBody?: IdRegisterEventBody | undefined;
storageRentEventBody?: StorageRentEventBody | undefined;
tierPurchaseEventBody?: TierPurchaseBody | undefined;
txIndex: number;
version: number;
}
export interface TierPurchaseBody {
tierType: TierType;
forDays: number;
payer: Uint8Array;
}
export interface SignerEventBody {
key: Uint8Array;
keyType: number;
@@ -187,6 +229,7 @@ function createBaseOnChainEvent(): OnChainEvent {
signerMigratedEventBody: undefined,
idRegisterEventBody: undefined,
storageRentEventBody: undefined,
tierPurchaseEventBody: undefined,
txIndex: 0,
version: 0,
};
@@ -230,6 +273,9 @@ export const OnChainEvent = {
if (message.storageRentEventBody !== undefined) {
StorageRentEventBody.encode(message.storageRentEventBody, writer.uint32(98).fork()).ldelim();
}
if (message.tierPurchaseEventBody !== undefined) {
TierPurchaseBody.encode(message.tierPurchaseEventBody, writer.uint32(122).fork()).ldelim();
}
if (message.txIndex !== 0) {
writer.uint32(104).uint32(message.txIndex);
}
@@ -330,6 +376,13 @@ export const OnChainEvent = {
message.storageRentEventBody = StorageRentEventBody.decode(reader, reader.uint32());
continue;
case 15:
if (tag != 122) {
break;
}
message.tierPurchaseEventBody = TierPurchaseBody.decode(reader, reader.uint32());
continue;
case 13:
if (tag != 104) {
break;
@@ -373,6 +426,9 @@ export const OnChainEvent = {
storageRentEventBody: isSet(object.storageRentEventBody)
? StorageRentEventBody.fromJSON(object.storageRentEventBody)
: undefined,
tierPurchaseEventBody: isSet(object.tierPurchaseEventBody)
? TierPurchaseBody.fromJSON(object.tierPurchaseEventBody)
: undefined,
txIndex: isSet(object.txIndex) ? Number(object.txIndex) : 0,
version: isSet(object.version) ? Number(object.version) : 0,
};
@@ -403,6 +459,9 @@ export const OnChainEvent = {
message.storageRentEventBody !== undefined && (obj.storageRentEventBody = message.storageRentEventBody
? StorageRentEventBody.toJSON(message.storageRentEventBody)
: undefined);
message.tierPurchaseEventBody !== undefined && (obj.tierPurchaseEventBody = message.tierPurchaseEventBody
? TierPurchaseBody.toJSON(message.tierPurchaseEventBody)
: undefined);
message.txIndex !== undefined && (obj.txIndex = Math.round(message.txIndex));
message.version !== undefined && (obj.version = Math.round(message.version));
return obj;
@@ -435,12 +494,101 @@ export const OnChainEvent = {
message.storageRentEventBody = (object.storageRentEventBody !== undefined && object.storageRentEventBody !== null)
? StorageRentEventBody.fromPartial(object.storageRentEventBody)
: undefined;
message.tierPurchaseEventBody =
(object.tierPurchaseEventBody !== undefined && object.tierPurchaseEventBody !== null)
? TierPurchaseBody.fromPartial(object.tierPurchaseEventBody)
: undefined;
message.txIndex = object.txIndex ?? 0;
message.version = object.version ?? 0;
return message;
},
};
function createBaseTierPurchaseBody(): TierPurchaseBody {
return { tierType: 0, forDays: 0, payer: new Uint8Array() };
}
export const TierPurchaseBody = {
encode(message: TierPurchaseBody, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
if (message.tierType !== 0) {
writer.uint32(8).int32(message.tierType);
}
if (message.forDays !== 0) {
writer.uint32(16).uint64(message.forDays);
}
if (message.payer.length !== 0) {
writer.uint32(26).bytes(message.payer);
}
return writer;
},
decode(input: _m0.Reader | Uint8Array, length?: number): TierPurchaseBody {
const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseTierPurchaseBody();
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1:
if (tag != 8) {
break;
}
message.tierType = reader.int32() as any;
continue;
case 2:
if (tag != 16) {
break;
}
message.forDays = longToNumber(reader.uint64() as Long);
continue;
case 3:
if (tag != 26) {
break;
}
message.payer = reader.bytes();
continue;
}
if ((tag & 7) == 4 || tag == 0) {
break;
}
reader.skipType(tag & 7);
}
return message;
},
fromJSON(object: any): TierPurchaseBody {
return {
tierType: isSet(object.tierType) ? tierTypeFromJSON(object.tierType) : 0,
forDays: isSet(object.forDays) ? Number(object.forDays) : 0,
payer: isSet(object.payer) ? bytesFromBase64(object.payer) : new Uint8Array(),
};
},
toJSON(message: TierPurchaseBody): unknown {
const obj: any = {};
message.tierType !== undefined && (obj.tierType = tierTypeToJSON(message.tierType));
message.forDays !== undefined && (obj.forDays = Math.round(message.forDays));
message.payer !== undefined &&
(obj.payer = base64FromBytes(message.payer !== undefined ? message.payer : new Uint8Array()));
return obj;
},
create<I extends Exact<DeepPartial<TierPurchaseBody>, I>>(base?: I): TierPurchaseBody {
return TierPurchaseBody.fromPartial(base ?? {});
},
fromPartial<I extends Exact<DeepPartial<TierPurchaseBody>, I>>(object: I): TierPurchaseBody {
const message = createBaseTierPurchaseBody();
message.tierType = object.tierType ?? 0;
message.forDays = object.forDays ?? 0;
message.payer = object.payer ?? new Uint8Array();
return message;
},
};
function createBaseSignerEventBody(): SignerEventBody {
return { key: new Uint8Array(), keyType: 0, eventType: 0, metadata: new Uint8Array(), metadataType: 0 };
}

View File

@@ -13,7 +13,15 @@ import {
userDataTypeFromJSON,
userDataTypeToJSON,
} from "./message";
import { OnChainEvent, OnChainEventType, onChainEventTypeFromJSON, onChainEventTypeToJSON } from "./onchain_event";
import {
OnChainEvent,
OnChainEventType,
onChainEventTypeFromJSON,
onChainEventTypeToJSON,
TierType,
tierTypeFromJSON,
tierTypeToJSON,
} from "./onchain_event";
import { UserNameProof } from "./username_proof";
export enum StoreType {
@@ -274,10 +282,16 @@ export interface OnChainEventResponse {
nextPageToken?: Uint8Array | undefined;
}
export interface TierDetails {
tierType: TierType;
expiresAt: number;
}
export interface StorageLimitsResponse {
limits: StorageLimit[];
units: number;
unitDetails: StorageUnitDetails[];
tierSubscriptions: TierDetails[];
}
export interface StorageUnitDetails {
@@ -2881,8 +2895,79 @@ export const OnChainEventResponse = {
},
};
function createBaseTierDetails(): TierDetails {
return { tierType: 0, expiresAt: 0 };
}
export const TierDetails = {
encode(message: TierDetails, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
if (message.tierType !== 0) {
writer.uint32(8).int32(message.tierType);
}
if (message.expiresAt !== 0) {
writer.uint32(16).uint64(message.expiresAt);
}
return writer;
},
decode(input: _m0.Reader | Uint8Array, length?: number): TierDetails {
const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseTierDetails();
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1:
if (tag != 8) {
break;
}
message.tierType = reader.int32() as any;
continue;
case 2:
if (tag != 16) {
break;
}
message.expiresAt = longToNumber(reader.uint64() as Long);
continue;
}
if ((tag & 7) == 4 || tag == 0) {
break;
}
reader.skipType(tag & 7);
}
return message;
},
fromJSON(object: any): TierDetails {
return {
tierType: isSet(object.tierType) ? tierTypeFromJSON(object.tierType) : 0,
expiresAt: isSet(object.expiresAt) ? Number(object.expiresAt) : 0,
};
},
toJSON(message: TierDetails): unknown {
const obj: any = {};
message.tierType !== undefined && (obj.tierType = tierTypeToJSON(message.tierType));
message.expiresAt !== undefined && (obj.expiresAt = Math.round(message.expiresAt));
return obj;
},
create<I extends Exact<DeepPartial<TierDetails>, I>>(base?: I): TierDetails {
return TierDetails.fromPartial(base ?? {});
},
fromPartial<I extends Exact<DeepPartial<TierDetails>, I>>(object: I): TierDetails {
const message = createBaseTierDetails();
message.tierType = object.tierType ?? 0;
message.expiresAt = object.expiresAt ?? 0;
return message;
},
};
function createBaseStorageLimitsResponse(): StorageLimitsResponse {
return { limits: [], units: 0, unitDetails: [] };
return { limits: [], units: 0, unitDetails: [], tierSubscriptions: [] };
}
export const StorageLimitsResponse = {
@@ -2896,6 +2981,9 @@ export const StorageLimitsResponse = {
for (const v of message.unitDetails) {
StorageUnitDetails.encode(v!, writer.uint32(26).fork()).ldelim();
}
for (const v of message.tierSubscriptions) {
TierDetails.encode(v!, writer.uint32(34).fork()).ldelim();
}
return writer;
},
@@ -2927,6 +3015,13 @@ export const StorageLimitsResponse = {
message.unitDetails.push(StorageUnitDetails.decode(reader, reader.uint32()));
continue;
case 4:
if (tag != 34) {
break;
}
message.tierSubscriptions.push(TierDetails.decode(reader, reader.uint32()));
continue;
}
if ((tag & 7) == 4 || tag == 0) {
break;
@@ -2943,6 +3038,9 @@ export const StorageLimitsResponse = {
unitDetails: Array.isArray(object?.unitDetails)
? object.unitDetails.map((e: any) => StorageUnitDetails.fromJSON(e))
: [],
tierSubscriptions: Array.isArray(object?.tierSubscriptions)
? object.tierSubscriptions.map((e: any) => TierDetails.fromJSON(e))
: [],
};
},
@@ -2959,6 +3057,11 @@ export const StorageLimitsResponse = {
} else {
obj.unitDetails = [];
}
if (message.tierSubscriptions) {
obj.tierSubscriptions = message.tierSubscriptions.map((e) => e ? TierDetails.toJSON(e) : undefined);
} else {
obj.tierSubscriptions = [];
}
return obj;
},
@@ -2971,6 +3074,7 @@ export const StorageLimitsResponse = {
message.limits = object.limits?.map((e) => StorageLimit.fromPartial(e)) || [];
message.units = object.units ?? 0;
message.unitDetails = object.unitDetails?.map((e) => StorageUnitDetails.fromPartial(e)) || [];
message.tierSubscriptions = object.tierSubscriptions?.map((e) => TierDetails.fromPartial(e)) || [];
return message;
},
};

View File

@@ -6,6 +6,7 @@ export enum UserNameType {
USERNAME_TYPE_NONE = 0,
USERNAME_TYPE_FNAME = 1,
USERNAME_TYPE_ENS_L1 = 2,
USERNAME_TYPE_BASENAME = 3,
}
export function userNameTypeFromJSON(object: any): UserNameType {
@@ -19,6 +20,9 @@ export function userNameTypeFromJSON(object: any): UserNameType {
case 2:
case "USERNAME_TYPE_ENS_L1":
return UserNameType.USERNAME_TYPE_ENS_L1;
case 3:
case "USERNAME_TYPE_BASENAME":
return UserNameType.USERNAME_TYPE_BASENAME;
default:
throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum UserNameType");
}
@@ -32,6 +36,8 @@ export function userNameTypeToJSON(object: UserNameType): string {
return "USERNAME_TYPE_FNAME";
case UserNameType.USERNAME_TYPE_ENS_L1:
return "USERNAME_TYPE_ENS_L1";
case UserNameType.USERNAME_TYPE_BASENAME:
return "USERNAME_TYPE_BASENAME";
default:
throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum UserNameType");
}

View File

@@ -248,6 +248,12 @@ export enum UserDataType {
TWITTER = 8,
/** GITHUB - Username of user on github */
GITHUB = 9,
/** BANNER - Banner image for the user */
BANNER = 10,
/** USER_DATA_PRIMARY_ADDRESS_ETHEREUM - Primary address for the user on Ethereum */
USER_DATA_PRIMARY_ADDRESS_ETHEREUM = 11,
/** USER_DATA_PRIMARY_ADDRESS_SOLANA - Primary address for the user on Solana */
USER_DATA_PRIMARY_ADDRESS_SOLANA = 12,
}
export function userDataTypeFromJSON(object: any): UserDataType {
@@ -279,6 +285,15 @@ export function userDataTypeFromJSON(object: any): UserDataType {
case 9:
case "USER_DATA_TYPE_GITHUB":
return UserDataType.GITHUB;
case 10:
case "USER_DATA_TYPE_BANNER":
return UserDataType.BANNER;
case 11:
case "USER_DATA_PRIMARY_ADDRESS_ETHEREUM":
return UserDataType.USER_DATA_PRIMARY_ADDRESS_ETHEREUM;
case 12:
case "USER_DATA_PRIMARY_ADDRESS_SOLANA":
return UserDataType.USER_DATA_PRIMARY_ADDRESS_SOLANA;
default:
throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum UserDataType");
}
@@ -304,6 +319,12 @@ export function userDataTypeToJSON(object: UserDataType): string {
return "USER_DATA_TYPE_TWITTER";
case UserDataType.GITHUB:
return "USER_DATA_TYPE_GITHUB";
case UserDataType.BANNER:
return "USER_DATA_TYPE_BANNER";
case UserDataType.USER_DATA_PRIMARY_ADDRESS_ETHEREUM:
return "USER_DATA_PRIMARY_ADDRESS_ETHEREUM";
case UserDataType.USER_DATA_PRIMARY_ADDRESS_SOLANA:
return "USER_DATA_PRIMARY_ADDRESS_SOLANA";
default:
throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum UserDataType");
}
@@ -313,6 +334,7 @@ export function userDataTypeToJSON(object: UserDataType): string {
export enum CastType {
CAST = 0,
LONG_CAST = 1,
TEN_K_CAST = 2,
}
export function castTypeFromJSON(object: any): CastType {
@@ -323,6 +345,9 @@ export function castTypeFromJSON(object: any): CastType {
case 1:
case "LONG_CAST":
return CastType.LONG_CAST;
case 2:
case "TEN_K_CAST":
return CastType.TEN_K_CAST;
default:
throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum CastType");
}
@@ -334,6 +359,8 @@ export function castTypeToJSON(object: CastType): string {
return "CAST";
case CastType.LONG_CAST:
return "LONG_CAST";
case CastType.TEN_K_CAST:
return "TEN_K_CAST";
default:
throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum CastType");
}

View File

@@ -8,6 +8,7 @@ export enum OnChainEventType {
EVENT_TYPE_SIGNER_MIGRATED = 2,
EVENT_TYPE_ID_REGISTER = 3,
EVENT_TYPE_STORAGE_RENT = 4,
EVENT_TYPE_TIER_PURCHASE = 5,
}
export function onChainEventTypeFromJSON(object: any): OnChainEventType {
@@ -27,6 +28,9 @@ export function onChainEventTypeFromJSON(object: any): OnChainEventType {
case 4:
case "EVENT_TYPE_STORAGE_RENT":
return OnChainEventType.EVENT_TYPE_STORAGE_RENT;
case 5:
case "EVENT_TYPE_TIER_PURCHASE":
return OnChainEventType.EVENT_TYPE_TIER_PURCHASE;
default:
throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum OnChainEventType");
}
@@ -44,11 +48,42 @@ export function onChainEventTypeToJSON(object: OnChainEventType): string {
return "EVENT_TYPE_ID_REGISTER";
case OnChainEventType.EVENT_TYPE_STORAGE_RENT:
return "EVENT_TYPE_STORAGE_RENT";
case OnChainEventType.EVENT_TYPE_TIER_PURCHASE:
return "EVENT_TYPE_TIER_PURCHASE";
default:
throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum OnChainEventType");
}
}
export enum TierType {
None = 0,
Pro = 1,
}
export function tierTypeFromJSON(object: any): TierType {
switch (object) {
case 0:
case "None":
return TierType.None;
case 1:
case "Pro":
return TierType.Pro;
default:
throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum TierType");
}
}
export function tierTypeToJSON(object: TierType): string {
switch (object) {
case TierType.None:
return "None";
case TierType.Pro:
return "Pro";
default:
throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum TierType");
}
}
export enum SignerEventType {
NONE = 0,
ADD = 1,
@@ -144,10 +179,17 @@ export interface OnChainEvent {
signerMigratedEventBody?: SignerMigratedEventBody | undefined;
idRegisterEventBody?: IdRegisterEventBody | undefined;
storageRentEventBody?: StorageRentEventBody | undefined;
tierPurchaseEventBody?: TierPurchaseBody | undefined;
txIndex: number;
version: number;
}
export interface TierPurchaseBody {
tierType: TierType;
forDays: number;
payer: Uint8Array;
}
export interface SignerEventBody {
key: Uint8Array;
keyType: number;
@@ -187,6 +229,7 @@ function createBaseOnChainEvent(): OnChainEvent {
signerMigratedEventBody: undefined,
idRegisterEventBody: undefined,
storageRentEventBody: undefined,
tierPurchaseEventBody: undefined,
txIndex: 0,
version: 0,
};
@@ -230,6 +273,9 @@ export const OnChainEvent = {
if (message.storageRentEventBody !== undefined) {
StorageRentEventBody.encode(message.storageRentEventBody, writer.uint32(98).fork()).ldelim();
}
if (message.tierPurchaseEventBody !== undefined) {
TierPurchaseBody.encode(message.tierPurchaseEventBody, writer.uint32(122).fork()).ldelim();
}
if (message.txIndex !== 0) {
writer.uint32(104).uint32(message.txIndex);
}
@@ -330,6 +376,13 @@ export const OnChainEvent = {
message.storageRentEventBody = StorageRentEventBody.decode(reader, reader.uint32());
continue;
case 15:
if (tag != 122) {
break;
}
message.tierPurchaseEventBody = TierPurchaseBody.decode(reader, reader.uint32());
continue;
case 13:
if (tag != 104) {
break;
@@ -373,6 +426,9 @@ export const OnChainEvent = {
storageRentEventBody: isSet(object.storageRentEventBody)
? StorageRentEventBody.fromJSON(object.storageRentEventBody)
: undefined,
tierPurchaseEventBody: isSet(object.tierPurchaseEventBody)
? TierPurchaseBody.fromJSON(object.tierPurchaseEventBody)
: undefined,
txIndex: isSet(object.txIndex) ? Number(object.txIndex) : 0,
version: isSet(object.version) ? Number(object.version) : 0,
};
@@ -403,6 +459,9 @@ export const OnChainEvent = {
message.storageRentEventBody !== undefined && (obj.storageRentEventBody = message.storageRentEventBody
? StorageRentEventBody.toJSON(message.storageRentEventBody)
: undefined);
message.tierPurchaseEventBody !== undefined && (obj.tierPurchaseEventBody = message.tierPurchaseEventBody
? TierPurchaseBody.toJSON(message.tierPurchaseEventBody)
: undefined);
message.txIndex !== undefined && (obj.txIndex = Math.round(message.txIndex));
message.version !== undefined && (obj.version = Math.round(message.version));
return obj;
@@ -435,12 +494,101 @@ export const OnChainEvent = {
message.storageRentEventBody = (object.storageRentEventBody !== undefined && object.storageRentEventBody !== null)
? StorageRentEventBody.fromPartial(object.storageRentEventBody)
: undefined;
message.tierPurchaseEventBody =
(object.tierPurchaseEventBody !== undefined && object.tierPurchaseEventBody !== null)
? TierPurchaseBody.fromPartial(object.tierPurchaseEventBody)
: undefined;
message.txIndex = object.txIndex ?? 0;
message.version = object.version ?? 0;
return message;
},
};
function createBaseTierPurchaseBody(): TierPurchaseBody {
return { tierType: 0, forDays: 0, payer: new Uint8Array() };
}
export const TierPurchaseBody = {
encode(message: TierPurchaseBody, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
if (message.tierType !== 0) {
writer.uint32(8).int32(message.tierType);
}
if (message.forDays !== 0) {
writer.uint32(16).uint64(message.forDays);
}
if (message.payer.length !== 0) {
writer.uint32(26).bytes(message.payer);
}
return writer;
},
decode(input: _m0.Reader | Uint8Array, length?: number): TierPurchaseBody {
const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseTierPurchaseBody();
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1:
if (tag != 8) {
break;
}
message.tierType = reader.int32() as any;
continue;
case 2:
if (tag != 16) {
break;
}
message.forDays = longToNumber(reader.uint64() as Long);
continue;
case 3:
if (tag != 26) {
break;
}
message.payer = reader.bytes();
continue;
}
if ((tag & 7) == 4 || tag == 0) {
break;
}
reader.skipType(tag & 7);
}
return message;
},
fromJSON(object: any): TierPurchaseBody {
return {
tierType: isSet(object.tierType) ? tierTypeFromJSON(object.tierType) : 0,
forDays: isSet(object.forDays) ? Number(object.forDays) : 0,
payer: isSet(object.payer) ? bytesFromBase64(object.payer) : new Uint8Array(),
};
},
toJSON(message: TierPurchaseBody): unknown {
const obj: any = {};
message.tierType !== undefined && (obj.tierType = tierTypeToJSON(message.tierType));
message.forDays !== undefined && (obj.forDays = Math.round(message.forDays));
message.payer !== undefined &&
(obj.payer = base64FromBytes(message.payer !== undefined ? message.payer : new Uint8Array()));
return obj;
},
create<I extends Exact<DeepPartial<TierPurchaseBody>, I>>(base?: I): TierPurchaseBody {
return TierPurchaseBody.fromPartial(base ?? {});
},
fromPartial<I extends Exact<DeepPartial<TierPurchaseBody>, I>>(object: I): TierPurchaseBody {
const message = createBaseTierPurchaseBody();
message.tierType = object.tierType ?? 0;
message.forDays = object.forDays ?? 0;
message.payer = object.payer ?? new Uint8Array();
return message;
},
};
function createBaseSignerEventBody(): SignerEventBody {
return { key: new Uint8Array(), keyType: 0, eventType: 0, metadata: new Uint8Array(), metadataType: 0 };
}

View File

@@ -13,7 +13,15 @@ import {
userDataTypeFromJSON,
userDataTypeToJSON,
} from "./message";
import { OnChainEvent, OnChainEventType, onChainEventTypeFromJSON, onChainEventTypeToJSON } from "./onchain_event";
import {
OnChainEvent,
OnChainEventType,
onChainEventTypeFromJSON,
onChainEventTypeToJSON,
TierType,
tierTypeFromJSON,
tierTypeToJSON,
} from "./onchain_event";
import { UserNameProof } from "./username_proof";
export enum StoreType {
@@ -274,10 +282,16 @@ export interface OnChainEventResponse {
nextPageToken?: Uint8Array | undefined;
}
export interface TierDetails {
tierType: TierType;
expiresAt: number;
}
export interface StorageLimitsResponse {
limits: StorageLimit[];
units: number;
unitDetails: StorageUnitDetails[];
tierSubscriptions: TierDetails[];
}
export interface StorageUnitDetails {
@@ -2881,8 +2895,79 @@ export const OnChainEventResponse = {
},
};
function createBaseTierDetails(): TierDetails {
return { tierType: 0, expiresAt: 0 };
}
export const TierDetails = {
encode(message: TierDetails, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
if (message.tierType !== 0) {
writer.uint32(8).int32(message.tierType);
}
if (message.expiresAt !== 0) {
writer.uint32(16).uint64(message.expiresAt);
}
return writer;
},
decode(input: _m0.Reader | Uint8Array, length?: number): TierDetails {
const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseTierDetails();
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1:
if (tag != 8) {
break;
}
message.tierType = reader.int32() as any;
continue;
case 2:
if (tag != 16) {
break;
}
message.expiresAt = longToNumber(reader.uint64() as Long);
continue;
}
if ((tag & 7) == 4 || tag == 0) {
break;
}
reader.skipType(tag & 7);
}
return message;
},
fromJSON(object: any): TierDetails {
return {
tierType: isSet(object.tierType) ? tierTypeFromJSON(object.tierType) : 0,
expiresAt: isSet(object.expiresAt) ? Number(object.expiresAt) : 0,
};
},
toJSON(message: TierDetails): unknown {
const obj: any = {};
message.tierType !== undefined && (obj.tierType = tierTypeToJSON(message.tierType));
message.expiresAt !== undefined && (obj.expiresAt = Math.round(message.expiresAt));
return obj;
},
create<I extends Exact<DeepPartial<TierDetails>, I>>(base?: I): TierDetails {
return TierDetails.fromPartial(base ?? {});
},
fromPartial<I extends Exact<DeepPartial<TierDetails>, I>>(object: I): TierDetails {
const message = createBaseTierDetails();
message.tierType = object.tierType ?? 0;
message.expiresAt = object.expiresAt ?? 0;
return message;
},
};
function createBaseStorageLimitsResponse(): StorageLimitsResponse {
return { limits: [], units: 0, unitDetails: [] };
return { limits: [], units: 0, unitDetails: [], tierSubscriptions: [] };
}
export const StorageLimitsResponse = {
@@ -2896,6 +2981,9 @@ export const StorageLimitsResponse = {
for (const v of message.unitDetails) {
StorageUnitDetails.encode(v!, writer.uint32(26).fork()).ldelim();
}
for (const v of message.tierSubscriptions) {
TierDetails.encode(v!, writer.uint32(34).fork()).ldelim();
}
return writer;
},
@@ -2927,6 +3015,13 @@ export const StorageLimitsResponse = {
message.unitDetails.push(StorageUnitDetails.decode(reader, reader.uint32()));
continue;
case 4:
if (tag != 34) {
break;
}
message.tierSubscriptions.push(TierDetails.decode(reader, reader.uint32()));
continue;
}
if ((tag & 7) == 4 || tag == 0) {
break;
@@ -2943,6 +3038,9 @@ export const StorageLimitsResponse = {
unitDetails: Array.isArray(object?.unitDetails)
? object.unitDetails.map((e: any) => StorageUnitDetails.fromJSON(e))
: [],
tierSubscriptions: Array.isArray(object?.tierSubscriptions)
? object.tierSubscriptions.map((e: any) => TierDetails.fromJSON(e))
: [],
};
},
@@ -2959,6 +3057,11 @@ export const StorageLimitsResponse = {
} else {
obj.unitDetails = [];
}
if (message.tierSubscriptions) {
obj.tierSubscriptions = message.tierSubscriptions.map((e) => e ? TierDetails.toJSON(e) : undefined);
} else {
obj.tierSubscriptions = [];
}
return obj;
},
@@ -2971,6 +3074,7 @@ export const StorageLimitsResponse = {
message.limits = object.limits?.map((e) => StorageLimit.fromPartial(e)) || [];
message.units = object.units ?? 0;
message.unitDetails = object.unitDetails?.map((e) => StorageUnitDetails.fromPartial(e)) || [];
message.tierSubscriptions = object.tierSubscriptions?.map((e) => TierDetails.fromPartial(e)) || [];
return message;
},
};

View File

@@ -6,6 +6,7 @@ export enum UserNameType {
USERNAME_TYPE_NONE = 0,
USERNAME_TYPE_FNAME = 1,
USERNAME_TYPE_ENS_L1 = 2,
USERNAME_TYPE_BASENAME = 3,
}
export function userNameTypeFromJSON(object: any): UserNameType {
@@ -19,6 +20,9 @@ export function userNameTypeFromJSON(object: any): UserNameType {
case 2:
case "USERNAME_TYPE_ENS_L1":
return UserNameType.USERNAME_TYPE_ENS_L1;
case 3:
case "USERNAME_TYPE_BASENAME":
return UserNameType.USERNAME_TYPE_BASENAME;
default:
throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum UserNameType");
}
@@ -32,6 +36,8 @@ export function userNameTypeToJSON(object: UserNameType): string {
return "USERNAME_TYPE_FNAME";
case UserNameType.USERNAME_TYPE_ENS_L1:
return "USERNAME_TYPE_ENS_L1";
case UserNameType.USERNAME_TYPE_BASENAME:
return "USERNAME_TYPE_BASENAME";
default:
throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum UserNameType");
}