Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add session keys (alias) for offchain spaces #294

Merged
merged 114 commits into from
May 29, 2024
Merged
Show file tree
Hide file tree
Changes from 112 commits
Commits
Show all changes
114 commits
Select commit Hold shift + click to select a range
681b926
feat: add placeholder page for followings
wa0x6e Apr 9, 2024
17b5bbb
feat: redirect logged user to timeline when on homepage
wa0x6e Apr 9, 2024
3bb02c9
feat: add proposals timeline for followed spaces
wa0x6e Apr 9, 2024
6f53fd2
fix: fix proposal links when outside space route
wa0x6e Apr 9, 2024
69bf728
fix: fix invalid argument type
wa0x6e Apr 9, 2024
bec64be
chore: remove unused import
wa0x6e Apr 9, 2024
83695cd
fix: fix missing redirection on internal page nav
wa0x6e Apr 9, 2024
204f9cd
Merge branch 'master' into fix-217
wa0x6e Apr 9, 2024
6af5758
fix: handle network dynamically
wa0x6e Apr 9, 2024
1ec140f
Merge branch 'master' into fix-217
wa0x6e Apr 10, 2024
2bf20d4
feat: show space name in proposals list
wa0x6e Apr 11, 2024
8cfe54a
fix: avoid "no proposals" message flashing while logging in
wa0x6e Apr 11, 2024
3d59f7d
fix: remove auto redirection to timeline
wa0x6e Apr 11, 2024
a51de45
fix(ux): link space name to space
wa0x6e Apr 11, 2024
41ee28d
fix: resolve author domain name
wa0x6e Apr 11, 2024
7ec905c
fix: fix ignored space showing props
wa0x6e Apr 12, 2024
7319c14
fix(ui): fix proposal title not being truncated
wa0x6e Apr 12, 2024
6d4cc92
fix: rename routes
wa0x6e Apr 12, 2024
4f4400a
fix: add sidebar to timeline pages
wa0x6e Apr 12, 2024
66990d8
fix(ui): add back right sidebar
wa0x6e Apr 13, 2024
ee46b9b
chore: remove debug output
wa0x6e Apr 13, 2024
bda7d72
fix(ui): fix icon alignment
wa0x6e Apr 13, 2024
4a3b7d2
chore: put back line break
wa0x6e Apr 13, 2024
144c6ab
refactor: rename function to avoid confusion
wa0x6e Apr 13, 2024
1598a16
chore: return early on empty arg
wa0x6e Apr 13, 2024
fe493ef
fiix(ux): fix missing message when user has no followed spaces
wa0x6e Apr 13, 2024
d93417a
fix(ux): fix feed app nav on small screen
wa0x6e Apr 13, 2024
5566ed9
fix(ui): show right sidebar on explore page
wa0x6e Apr 13, 2024
e29eb85
refactor: DRY
wa0x6e Apr 13, 2024
81bef09
fix(ux): redirect guest user to landing when visiting /home
wa0x6e Apr 13, 2024
3de8ba8
fix: reset proposals on account change
wa0x6e Apr 13, 2024
752e70a
fix: highlighted voted proposals
wa0x6e Apr 13, 2024
6cd79e5
refactor: code improvement
wa0x6e Apr 13, 2024
afac8eb
refactor: use nested routes for home and explore page
wa0x6e Apr 13, 2024
ad3c8b9
chore: remove leftover
wa0x6e Apr 13, 2024
b5a7a88
fix: improve routes
wa0x6e Apr 13, 2024
c0298d5
chore: remove extra DIV
wa0x6e Apr 13, 2024
18c1b3b
fix: fix appNav visibility on small screen
wa0x6e Apr 13, 2024
8903447
fix(ui): show search form on home and explore page
wa0x6e Apr 13, 2024
08a59bf
refactor: improve code
wa0x6e Apr 13, 2024
1998f1d
refactor: delegate logged in user checking to parent route
wa0x6e Apr 13, 2024
2223b2b
refactor: fix order
wa0x6e Apr 17, 2024
92489e1
refactor: use computed value
wa0x6e Apr 17, 2024
361ef04
refactor: upgrade Follow to first class citizen
wa0x6e Apr 17, 2024
bdafff8
fix: add missing function to unsupported networks
wa0x6e Apr 17, 2024
bb16d7a
fix: skip timeline for unsupported wallet
wa0x6e Apr 18, 2024
09e78c2
refactor: move `loadFollows` to `useAccount` composable
wa0x6e Apr 18, 2024
2fcdd0f
refactor: improve typing
wa0x6e Apr 18, 2024
d1c6c2f
feat: replace space's star button by follow/unfollow status
wa0x6e Apr 18, 2024
83f9e71
refactor: move starredSpaces to useAccount
wa0x6e Apr 18, 2024
52fac22
refactor: rename variable for consistency
wa0x6e Apr 18, 2024
d9cdcee
fix: auto load followed spaces for connected account
wa0x6e Apr 18, 2024
2070c81
fix: keep sidebar order when mixing starred and followed spaces
wa0x6e Apr 18, 2024
baa4caa
fix: fix sidebar spaces not loading for guest user
wa0x6e Apr 19, 2024
6f8f6f2
feat: support custom order for multiple wallets
wa0x6e Apr 19, 2024
c5b2446
rerfactor: code improvement
wa0x6e Apr 19, 2024
44c4872
fix: fix followed space status not being loaded
wa0x6e Apr 19, 2024
966cde4
refactor: DRY
wa0x6e Apr 19, 2024
c62d5a7
refactor: avoid using computed value when not depending on ref
wa0x6e Apr 19, 2024
793d2e7
refactor: remove redundant condition
wa0x6e Apr 19, 2024
a66ec58
fix: fix wrong typing
wa0x6e Apr 19, 2024
7c875f8
refactor: avoid using computed value for simple values
wa0x6e Apr 19, 2024
23c8a10
feat: support offchain spaces follow and unfollow
wa0x6e Apr 20, 2024
bf4f3a9
fix: add follow/unfollow to all networks type
wa0x6e Apr 20, 2024
9e9561f
chore: update changeset
wa0x6e Apr 20, 2024
a3f3946
chore: add missing line break
wa0x6e Apr 20, 2024
6e3dc65
refactor: use simple spaceId instead of Space object
wa0x6e Apr 20, 2024
e0d1cc3
fix(ui): show loading icon while toggling space following
wa0x6e Apr 20, 2024
c81408d
fix(ux): disable button while working
wa0x6e Apr 20, 2024
619ae6b
feat: add support for offchain alias (session key)
wa0x6e Apr 21, 2024
1a34de7
fix: only prompt for alias tx signing
wa0x6e Apr 21, 2024
3028a34
fix(ui): allow sidebar scrolling
wa0x6e Apr 21, 2024
4204e5a
fix: handle client_error thrown by sequencer
wa0x6e Apr 21, 2024
c864696
chore: update changelog
wa0x6e Apr 22, 2024
39613a4
fix(ui): make sidebar scrollable
wa0x6e Apr 23, 2024
3483c55
fix(ui): remove tooltip on follow/unfollow button
wa0x6e Apr 23, 2024
853437c
fix(ui): add red border to unfollow button
wa0x6e Apr 23, 2024
f9071c8
fix: remove favorite feature on offchain spaces for starknet accounts
wa0x6e Apr 25, 2024
efd50bc
Merge branch 'master' into show-followed-spaces-in-sidebar
wa0x6e Apr 30, 2024
07e36d1
Merge branch 'master' into show-followed-spaces-in-sidebar
wa0x6e Apr 30, 2024
4f30785
fix: remove network from space Id
wa0x6e Apr 30, 2024
e646225
fix: move bookmarks to a Store
wa0x6e Apr 30, 2024
70ad395
refactor: code improvement
wa0x6e Apr 30, 2024
23c8246
refactor: code DRYing
wa0x6e Apr 30, 2024
6e0b892
fix: populate spaces store
wa0x6e Apr 30, 2024
f6ca94b
fix: fix spaces fetching for multiple network type
wa0x6e Apr 30, 2024
6c6c3c3
fix: fix variable name
wa0x6e Apr 30, 2024
108cbd8
chore: code cleaning
wa0x6e Apr 30, 2024
bdad473
fix(ux): add missing loading icon while loading follow list in sidebar
wa0x6e May 1, 2024
b384135
chore: remove debug output
wa0x6e May 1, 2024
593d68e
Merge branch 'master' into show-followed-spaces-in-sidebar
wa0x6e May 4, 2024
6727937
Merge branch 'master' into show-followed-spaces-in-sidebar
wa0x6e May 6, 2024
186d532
Merge branch 'show-followed-spaces-in-sidebar' into follow-and-unfoll…
wa0x6e May 6, 2024
474d1b7
fix: finish merge conflict
wa0x6e May 6, 2024
10b1dc9
Merge branch 'follow-and-unfollow-offchain-spaces' into add-session-keys
wa0x6e May 6, 2024
5c231a0
Merge branch 'master' into add-session-keys
wa0x6e May 25, 2024
ace84d2
fix: fix wrong network for follow/unfollow actions
wa0x6e May 25, 2024
d5b3da7
chore: revert unrelated changes
wa0x6e May 25, 2024
8854ce0
chore: revert unrelated changes
wa0x6e May 25, 2024
6583931
chore: keep same properties order
wa0x6e May 25, 2024
2375407
fix: make `from` arg optional
wa0x6e May 25, 2024
969731e
fix: remove leftover file from conflict merge
wa0x6e May 25, 2024
2020190
refactor: improve naming
wa0x6e May 25, 2024
b7530e5
refactor: hard code alias to offchain network
wa0x6e May 25, 2024
1c099aa
fix: use only recently created alias
wa0x6e May 25, 2024
e3be6b2
Update apps/ui/src/networks/offchain/api/index.ts
wa0x6e May 27, 2024
975c755
refactor: remove redundant check
wa0x6e May 27, 2024
b0d11fa
Merge branch 'add-session-keys' of https://github.com/snapshot-labs/s…
wa0x6e May 27, 2024
f0349eb
refactor: use single public function to handle handling alias
wa0x6e May 27, 2024
9da1199
refactor: add a buffer to alias expiration time
wa0x6e May 27, 2024
ca2c6db
fix: fix function signature
wa0x6e May 27, 2024
9668fb3
fix: fix buffer computation
wa0x6e May 27, 2024
882bfd5
refactor: variable renaming
wa0x6e May 28, 2024
23f2d00
Merge branch 'master' into add-session-keys
wa0x6e May 29, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/thick-carrots-brush.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@snapshot-labs/sx": patch
---

add setAlias to OffchainEthereumSig
1 change: 1 addition & 0 deletions apps/ui/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
"@ethersproject/abstract-signer": "^5.7.0",
"@ethersproject/address": "^5.7.0",
"@ethersproject/bignumber": "^5.7.0",
"@ethersproject/bytes": "^5.7.0",
"@ethersproject/constants": "^5.7.0",
"@ethersproject/contracts": "^5.7.0",
"@ethersproject/hash": "^5.7.0",
Expand Down
14 changes: 11 additions & 3 deletions apps/ui/src/composables/useActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ const offchainNetworkId = offchainNetworks.filter(network => enabledNetworks.inc
export function useActions() {
const { mixpanel } = useMixpanel();
const uiStore = useUiStore();
const alias = useAlias();
const { web3 } = useWeb3();
const { getCurrentFromDuration } = useMetaStore();
const { modalAccountOpen } = useModal();
Expand Down Expand Up @@ -105,6 +106,14 @@ export function useActions() {
modalAccountOpen.value = true;
}

async function aliasSigner() {
wa0x6e marked this conversation as resolved.
Show resolved Hide resolved
const network = getNetwork(offchainNetworkId);

return alias.getAliasWallet(address =>
wrapPromise(offchainNetworkId, network.actions.setAlias(auth.web3, address))
);
}

async function predictSpaceAddress(networkId: NetworkID, salt: string): Promise<string | null> {
if (!web3.value.account) {
forceLogin();
Expand Down Expand Up @@ -505,10 +514,9 @@ export function useActions() {
try {
await wrapPromise(
offchainNetworkId,
network.actions.followSpace(auth.web3, networkId, spaceId)
network.actions.followSpace(await aliasSigner(), networkId, spaceId, web3.value.account)
);
} catch (e) {
console.log(e);
uiStore.addNotification('error', e.message);
return false;
}
Expand All @@ -527,7 +535,7 @@ export function useActions() {
try {
await wrapPromise(
offchainNetworkId,
network.actions.unfollowSpace(auth.web3, networkId, spaceId)
network.actions.unfollowSpace(await aliasSigner(), networkId, spaceId, web3.value.account)
);
} catch (e) {
uiStore.addNotification('error', e.message);
Expand Down
54 changes: 54 additions & 0 deletions apps/ui/src/composables/useAlias.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { Wallet } from '@ethersproject/wallet';
import { getDefaultProvider } from '@ethersproject/providers';
import { isHexString } from '@ethersproject/bytes';
import { enabledNetworks, getNetwork, offchainNetworks } from '@/networks';
import pkg from '../../package.json';

const ALIAS_AVAILABILITY_PERIOD = 60 * 60 * 24 * 30; // 30 days
const ALIAS_AVAILABILITY_BUFFER = 60 * 5; // 5 minutes

const aliases = useStorage(`${pkg.name}.aliases`, {} as Record<string, string>);

const networkId = offchainNetworks.filter(network => enabledNetworks.includes(network))[0];
const network = getNetwork(networkId);

export function useAlias() {
const provider = getDefaultProvider();
const { web3 } = useWeb3();

async function create(networkCreateActionFn: (address: string) => Promise<unknown>) {
const newAliasWallet = Wallet.createRandom();

await networkCreateActionFn(newAliasWallet.address);

aliases.value = {
...aliases.value,
...{
[web3.value.account]: newAliasWallet.privateKey
}
};

return new Wallet(newAliasWallet.privateKey, provider);
}

async function existingAliasWallet(privateKey: string) {
wa0x6e marked this conversation as resolved.
Show resolved Hide resolved
if (!isHexString(privateKey)) return null;

const registeredAlias = await network.api.loadAlias(
web3.value.account,
new Wallet(privateKey, provider).address,
Math.floor(Date.now() / 1000) - ALIAS_AVAILABILITY_PERIOD + ALIAS_AVAILABILITY_BUFFER
);

return registeredAlias ? new Wallet(privateKey, provider) : null;
}

async function getAliasWallet(networkCreateActionFn: (address: string) => Promise<unknown>) {
return (
(await existingAliasWallet(aliases.value[web3.value.account])) ||
(await create(networkCreateActionFn))
);
}

return { getAliasWallet };
}
3 changes: 3 additions & 0 deletions apps/ui/src/networks/common/graphqlApi/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,9 @@ export function createApi(uri: string, networkId: NetworkID, opts: ApiOptions =
},
loadFollows: async () => {
return [] as Follow[];
},
loadAlias: async () => {
return null;
}
};
}
3 changes: 2 additions & 1 deletion apps/ui/src/networks/evm/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,7 @@ export function createActions(
);
},
followSpace: () => {},
unfollowSpace: () => {}
unfollowSpace: () => {},
setAlias: () => {}
};
}
24 changes: 18 additions & 6 deletions apps/ui/src/networks/offchain/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ import { EDITOR_APP_NAME, EDITOR_SNAPSHOT_OFFSET } from './constants';
import { getUrl } from '@/helpers/utils';
import { getProvider } from '@/helpers/provider';
import { getSwapLink } from '@/helpers/link';
import type { Web3Provider } from '@ethersproject/providers';
import { Web3Provider } from '@ethersproject/providers';
import type { Wallet } from '@ethersproject/wallet';
import type { StrategyParsedMetadata, Choice, Proposal, Space, VoteType, NetworkID } from '@/types';
import type {
ReadOnlyNetworkActions,
Expand Down Expand Up @@ -202,16 +203,27 @@ export function createActions(
};
});
},
followSpace(web3: Web3Provider, networkId: NetworkID, spaceId: string) {
followSpace(web3: Web3Provider | Wallet, networkId: NetworkID, spaceId: string, from?: string) {
return client.followSpace({
signer: web3.getSigner(),
data: { network: networkId, space: spaceId }
signer: web3 instanceof Web3Provider ? web3.getSigner() : web3,
data: { network: networkId, space: spaceId, ...(from ? { from } : {}) }
});
},
unfollowSpace(web3: Web3Provider, networkId: NetworkID, spaceId: string) {
unfollowSpace(
web3: Web3Provider | Wallet,
networkId: NetworkID,
spaceId: string,
from?: string
) {
return client.unfollowSpace({
signer: web3 instanceof Web3Provider ? web3.getSigner() : web3,
data: { network: networkId, space: spaceId, ...(from ? { from } : {}) }
});
},
setAlias(web3: Web3Provider, alias: string) {
return client.setAlias({
signer: web3.getSigner(),
data: { network: networkId, space: spaceId }
data: { alias }
});
}
};
Expand Down
24 changes: 22 additions & 2 deletions apps/ui/src/networks/offchain/api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import {
PROPOSAL_QUERY,
USER_VOTES_QUERY,
USER_FOLLOWS_QUERY,
VOTES_QUERY
VOTES_QUERY,
ALIASES_QUERY
} from './queries';
import { PaginationOpts, SpacesFilter, NetworkApi, ProposalsFilter } from '@/networks/types';
import { getNames } from '@/helpers/stamp';
Expand All @@ -19,7 +20,8 @@ import {
NetworkID,
ProposalState,
SpaceMetadataTreasury,
Follow
Follow,
Alias
} from '@/types';
import { ApiSpace, ApiProposal, ApiVote } from './types';
import { DEFAULT_VOTING_DELAY } from '../constants';
Expand Down Expand Up @@ -370,6 +372,24 @@ export function createApi(uri: string, networkId: NetworkID): NetworkApi {
});

return follows.map(follow => ({ ...follow, space: { ...follow.space, network: networkId } }));
},
loadAlias: async (
address: string,
aliasAddress: string,
created_gt: number
): Promise<Alias | null> => {
const {
data: { aliases }
}: { data: { aliases: Alias[] } } = await apollo.query({
query: ALIASES_QUERY,
variables: {
address,
alias: aliasAddress,
created_gt
}
});

return aliases?.[0] ?? null;
}
};
}
9 changes: 9 additions & 0 deletions apps/ui/src/networks/offchain/api/queries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -183,3 +183,12 @@ export const VOTES_QUERY = gql`
}
}
`;

export const ALIASES_QUERY = gql`
query Aliases($address: String!, $alias: String!, $created_gt: Int) {
aliases(where: { address: $address, alias: $alias, created_gt: $created_gt }) {
address
alias
}
}
`;
1 change: 1 addition & 0 deletions apps/ui/src/networks/starknet/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -582,6 +582,7 @@ export function createActions(
},
followSpace: () => {},
unfollowSpace: () => {},
setAlias: () => {},
send: (envelope: any) => starkSigClient.send(envelope) // TODO: extract it out of client to common helper
};
}
10 changes: 7 additions & 3 deletions apps/ui/src/networks/types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { FunctionalComponent } from 'vue';
import type { Web3Provider } from '@ethersproject/providers';
import type { Wallet } from '@ethersproject/wallet';
import type { MetaTransaction } from '@snapshot-labs/sx/dist/utils/encoding';
import type {
Space,
Expand All @@ -10,7 +11,8 @@ import type {
Choice,
NetworkID,
StrategyParsedMetadata,
Follow
Follow,
Alias
} from '@/types';

export type PaginationOpts = { limit: number; skip?: number };
Expand Down Expand Up @@ -125,8 +127,9 @@ export type ReadOnlyNetworkActions = {
proposal: Proposal,
choice: Choice
): Promise<any>;
followSpace(web3: Web3Provider, networkId: NetworkID, spaceId: string);
unfollowSpace(web3: Web3Provider, networkId: NetworkID, spaceId: string);
followSpace(web3: Web3Provider | Wallet, networkId: NetworkID, spaceId: string, from?: string);
unfollowSpace(web3: Web3Provider | Wallet, networkId: NetworkID, spaceId: string, from?: string);
setAlias(web3: Web3Provider, alias: string);
send(envelope: any): Promise<any>;
};

Expand Down Expand Up @@ -212,6 +215,7 @@ export type NetworkApi = {
sortBy?: 'vote_count-desc' | 'vote_count-asc' | 'proposal_count-desc' | 'proposal_count-asc'
): Promise<User[]>;
loadFollows(userId?: string, spaceId?: string): Promise<Follow[]>;
loadAlias(address: string, alias: string, created_gt: number): Promise<Alias | null>;
};

export type NetworkConstants = {
Expand Down
5 changes: 5 additions & 0 deletions apps/ui/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,11 @@ export type Follow = {
created: number;
};

export type Alias = {
address: string;
alias: string;
};

export type Contact = {
address: string;
name: string;
Expand Down
55 changes: 37 additions & 18 deletions packages/sx.js/src/clients/offchain/ethereum-sig/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,28 @@ import {
updateProposalTypes,
cancelProposalTypes,
followSpaceTypes,
unfollowSpaceTypes
unfollowSpaceTypes,
aliasTypes
} from './types';
import type { Signer, TypedDataSigner, TypedDataField } from '@ethersproject/abstract-signer';
import type {
SignatureData,
Envelope,
Vote,
Propose,
UpdateProposal,
CancelProposal,
FollowSpace,
UnfollowSpace,
EIP712Message,
EIP712VoteMessage,
EIP712ProposeMessage,
EIP712UpdateProposal,
EIP712CancelProposalMessage,
EIP712FollowSpaceMessage,
EIP712UnfollowSpaceMessage
import {
type SignatureData,
type Envelope,
type Vote,
type Propose,
type UpdateProposal,
type CancelProposal,
type FollowSpace,
type UnfollowSpace,
type SetAlias,
type EIP712Message,
type EIP712VoteMessage,
type EIP712ProposeMessage,
type EIP712UpdateProposal,
type EIP712CancelProposalMessage,
type EIP712FollowSpaceMessage,
type EIP712UnfollowSpaceMessage,
type EIP712SetAliasMessage
} from '../types';
import type { OffchainNetworkConfig } from '../../../types';

Expand Down Expand Up @@ -61,6 +64,7 @@ export class EthereumSig {
| EIP712CancelProposalMessage
| EIP712FollowSpaceMessage
| EIP712UnfollowSpaceMessage
| EIP712SetAliasMessage
>(
signer: Signer & TypedDataSigner,
message: T,
Expand All @@ -86,7 +90,7 @@ export class EthereumSig {

public async send(
envelope: Envelope<
Vote | Propose | UpdateProposal | CancelProposal | FollowSpace | UnfollowSpace
Vote | Propose | UpdateProposal | CancelProposal | FollowSpace | UnfollowSpace | SetAlias
>
) {
const { address, signature: sig, domain, types, message } = envelope.signatureData!;
Expand Down Expand Up @@ -254,4 +258,19 @@ export class EthereumSig {
data
};
}

public async setAlias({
signer,
data
}: {
signer: Signer & TypedDataSigner;
data: SetAlias;
}): Promise<Envelope<SetAlias>> {
const signatureData = await this.sign(signer, data, aliasTypes);

return {
signatureData,
data
};
}
}
8 changes: 8 additions & 0 deletions packages/sx.js/src/clients/offchain/ethereum-sig/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -118,3 +118,11 @@ export const unfollowSpaceTypes = {
{ name: 'timestamp', type: 'uint64' }
]
};

export const aliasTypes = {
Alias: [
{ name: 'from', type: 'address' },
{ name: 'alias', type: 'address' },
{ name: 'timestamp', type: 'uint64' }
]
};
Loading
Loading