Skip to content

Commit

Permalink
feat(app): enabling push to verax+eas on linea (passportxyz#1768)
Browse files Browse the repository at this point in the history
  • Loading branch information
lucianHymer authored Oct 11, 2023
1 parent 2c37423 commit 7b9d758
Show file tree
Hide file tree
Showing 10 changed files with 274 additions and 45 deletions.
1 change: 0 additions & 1 deletion app/.env-example.env
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ NEXT_PUBLIC_SCORER_ENDPOINT=http://localhost:8002

NEXT_PUBLIC_FF_CHAIN_SYNC=on
NEXT_PUBLIC_FF_LINEA_ATTESTATIONS=on
NEXT_PUBLIC_LINEA_VERIFIER_ADDRESS_OVERRIDE=

NEXT_PUBLIC_ENABLE_TESTNET=on

Expand Down
2 changes: 1 addition & 1 deletion app/components/NetworkCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ export function NetworkCard({ chain }: { chain: Chain }) {
<div>
<div className="flex w-full flex-col">
<h1 className="text-lg text-color-1">{chain.label}</h1>
{FeatureFlags.FF_LINEA_ATTESTATIONS && <h2 className="text-sm">{chain.attestationProvider?.name}</h2>}
<h2 className="text-sm">{chain.attestationProvider?.name}</h2>
<p className="mt-2 md:inline-block">
{onChainLastUpdates[chain.id] ? onChainLastUpdates[chain.id].toLocaleString() : "Not moved yet"}
</p>
Expand Down
5 changes: 4 additions & 1 deletion app/components/SyncToChainButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,10 @@ export function SyncToChainButton({ onChainStatus, chain, className }: SyncToCha
"An unexpected error occurred while trying to bring the data onchain.";
if (isError(e, "ACTION_REJECTED")) {
toastDescription = "Transaction rejected by user";
} else if (isError(e, "INSUFFICIENT_FUNDS") || e?.info?.error?.data?.message.includes("insufficient funds")) {
} else if (
isError(e, "INSUFFICIENT_FUNDS") ||
e?.info?.error?.data?.message?.includes("insufficient funds")
) {
toastDescription =
"You don't have sufficient funds to bring your Stamps onchain. Consider funding your wallet first.";
} else if (isError(e, "CALL_EXCEPTION")) {
Expand Down
31 changes: 9 additions & 22 deletions app/utils/AttestationProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,19 @@ type AttestationProviderStatus = "enabled" | "comingSoon" | "disabled";
type BaseProviderConfig = {
name: string;
status: AttestationProviderStatus;
// Only for testing/rollout
overrideVerifierAddress?: string;
};

type EASConfig = BaseProviderConfig & {
name: "Ethereum Attestation Service";
easScanUrl: string;
};

type VeraxConfig = BaseProviderConfig & {
name: "Verax";
type VeraxAndEASConfig = BaseProviderConfig & {
name: "Verax + EAS";
easScanUrl: string;
};

export type AttestationProviderConfig = EASConfig | VeraxConfig;
export type AttestationProviderConfig = EASConfig | VeraxAndEASConfig;

export interface AttestationProvider {
name: string;
Expand All @@ -34,21 +33,11 @@ class BaseAttestationProvider implements AttestationProvider {
name = "Override this class";
status: AttestationProviderStatus;
hasWebViewer = false;
overrideVerifierAddress?: string;
chainId: string;

constructor({
chainId,
status,
overrideVerifierAddress,
}: {
chainId: string;
status: AttestationProviderStatus;
overrideVerifierAddress?: string;
}) {
constructor({ chainId, status }: { chainId: string; status: AttestationProviderStatus }) {
this.chainId = chainId;
this.status = status;
this.overrideVerifierAddress = overrideVerifierAddress;
}

viewerUrl(_address: string): string {
Expand All @@ -63,7 +52,7 @@ class BaseAttestationProvider implements AttestationProvider {
}

verifierAddress(): string {
return this.overrideVerifierAddress || this.onchainInfo().GitcoinVerifier.address;
return this.onchainInfo().GitcoinVerifier.address;
}

verifierAbi(): any {
Expand All @@ -80,14 +69,12 @@ export class EASAttestationProvider extends BaseAttestationProvider {
chainId,
status,
easScanUrl,
overrideVerifierAddress,
}: {
chainId: string;
status: AttestationProviderStatus;
overrideVerifierAddress?: string;
easScanUrl: string;
}) {
super({ status, overrideVerifierAddress, chainId });
super({ status, chainId });
this.easScanUrl = easScanUrl;
}

Expand All @@ -96,6 +83,6 @@ export class EASAttestationProvider extends BaseAttestationProvider {
}
}

export class VeraxAttestationProvider extends BaseAttestationProvider {
name = "Verax";
export class VeraxAndEASAttestationProvider extends EASAttestationProvider {
name = "Verax + EAS";
}
19 changes: 9 additions & 10 deletions app/utils/chains.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {
AttestationProvider,
AttestationProviderConfig,
EASAttestationProvider,
VeraxAttestationProvider,
VeraxAndEASAttestationProvider,
} from "./AttestationProvider";

// RPC urls
Expand Down Expand Up @@ -47,8 +47,8 @@ export class Chain {
case "Ethereum Attestation Service":
this.attestationProvider = new EASAttestationProvider(attestationConfig);
break;
case "Verax":
this.attestationProvider = new VeraxAttestationProvider(attestationConfig);
case "Verax + EAS":
this.attestationProvider = new VeraxAndEASAttestationProvider(attestationConfig);
break;
default:
break;
Expand Down Expand Up @@ -96,19 +96,17 @@ if (usingTestEnvironment) {
easScanUrl: "https://base-goerli.easscan.org",
},
});
}

if (FeatureFlags.FF_LINEA_ATTESTATIONS || usingTestEnvironment) {
chainConfigs.push({
id: lineaGoerliChainId,
token: "ETH",
label: "Linea Goerli",
rpcUrl: "https://rpc.goerli.linea.build",
icon: "./assets/linea-logo.png",
attestationProviderConfig: {
name: "Verax",
status: FeatureFlags.FF_LINEA_ATTESTATIONS ? "enabled" : "disabled",
overrideVerifierAddress: process.env.NEXT_PUBLIC_LINEA_VERIFIER_ADDRESS_OVERRIDE,
name: "Verax + EAS",
status: "enabled",
easScanUrl: "https://linea-goerli.easscan.org",
},
});
}
Expand Down Expand Up @@ -150,8 +148,9 @@ chainConfigs.push({
rpcUrl: "https://rpc.linea.build",
icon: "./assets/linea-logo.png",
attestationProviderConfig: {
name: "Verax",
status: "comingSoon",
name: "Verax + EAS",
status: FeatureFlags.FF_LINEA_ATTESTATIONS ? "enabled" : "comingSoon",
easScanUrl: "https://linea.easscan.org",
},
});

Expand Down
27 changes: 27 additions & 0 deletions deployments/abi/GitcoinAttester.json
Original file line number Diff line number Diff line change
Expand Up @@ -79,5 +79,32 @@
"function upgradeTo(address newImplementation)",
"function upgradeToAndCall(address newImplementation, bytes data) payable",
"function verifiers(address) view returns (bool)"
],
"0x7a69": [
"event AdminChanged(address previousAdmin, address newAdmin)",
"event BeaconUpgraded(address indexed beacon)",
"event Initialized(uint8 version)",
"event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)",
"event Paused(address account)",
"event Unpaused(address account)",
"event Upgraded(address indexed implementation)",
"event VerifierAdded(address verifier)",
"event VerifierRemoved(address verifier)",
"function addVerifier(address _verifier)",
"function initialize()",
"function owner() view returns (address)",
"function pause()",
"function paused() view returns (bool)",
"function proxiableUUID() view returns (bytes32)",
"function removeVerifier(address _verifier)",
"function renounceOwnership()",
"function revokeAttestations(tuple(bytes32 schema, tuple(bytes32 uid, uint256 value)[] data)[] multiRevocationRequest) payable",
"function setEASAddress(address _easContractAddress)",
"function submitAttestations(tuple(bytes32 schema, tuple(address recipient, uint64 expirationTime, bool revocable, bytes32 refUID, bytes data, uint256 value)[] data)[] multiAttestationRequest) payable returns (bytes32[])",
"function transferOwnership(address newOwner)",
"function unpause()",
"function upgradeTo(address newImplementation)",
"function upgradeToAndCall(address newImplementation, bytes data) payable",
"function verifiers(address) view returns (bool)"
]
}
72 changes: 70 additions & 2 deletions deployments/abi/GitcoinResolver.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,75 @@
"function userAttestations(address, bytes32) view returns (bytes32)"
],
"0xe704": [
"error AccessDenied()",
"error InsufficientValue()",
"error InvalidAttester()",
"error InvalidEAS()",
"error NotAllowlisted()",
"error NotPayable()",
"event AdminChanged(address previousAdmin, address newAdmin)",
"event BeaconUpgraded(address indexed beacon)",
"event Initialized(uint8 version)",
"event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)",
"event Paused(address account)",
"event Unpaused(address account)",
"event Upgraded(address indexed implementation)",
"function _eas() view returns (address)",
"function _gitcoinAttester() view returns (address)",
"function addToAllowlist(address addr)",
"function allowlist(address) view returns (bool)",
"function attest(tuple(bytes32 uid, bytes32 schema, uint64 time, uint64 expirationTime, uint64 revocationTime, bytes32 refUID, address recipient, address attester, bool revocable, bytes data) attestation) payable returns (bool)",
"function getUserAttestation(address user, bytes32 schema) view returns (bytes32)",
"function initialize(address eas, address gitcoinAttester)",
"function isPayable() pure returns (bool)",
"function multiAttest(tuple(bytes32 uid, bytes32 schema, uint64 time, uint64 expirationTime, uint64 revocationTime, bytes32 refUID, address recipient, address attester, bool revocable, bytes data)[] attestations, uint256[]) payable returns (bool)",
"function multiRevoke(tuple(bytes32 uid, bytes32 schema, uint64 time, uint64 expirationTime, uint64 revocationTime, bytes32 refUID, address recipient, address attester, bool revocable, bytes data)[] attestations, uint256[]) payable returns (bool)",
"function owner() view returns (address)",
"function pause()",
"function paused() view returns (bool)",
"function proxiableUUID() view returns (bytes32)",
"function removeFromAllowlist(address addr)",
"function renounceOwnership()",
"function revoke(tuple(bytes32 uid, bytes32 schema, uint64 time, uint64 expirationTime, uint64 revocationTime, bytes32 refUID, address recipient, address attester, bool revocable, bytes data) attestation) payable returns (bool)",
"function transferOwnership(address newOwner)",
"function unpause()",
"function upgradeTo(address newImplementation)",
"function upgradeToAndCall(address newImplementation, bytes data) payable",
"function userAttestations(address, bytes32) view returns (bytes32)"
],
"0x7a69": [
"error AccessDenied()",
"error InsufficientValue()",
"error InvalidEAS()",
"error NotPayable()",
"event AdminChanged(address previousAdmin, address newAdmin)",
"event BeaconUpgraded(address indexed beacon)",
"event Initialized(uint8 version)",
"event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)",
"event Paused(address account)",
"event Unpaused(address account)",
"event Upgraded(address indexed implementation)",
"function _eas() view returns (address)",
"function _gitcoinAttester() view returns (address)",
"function addToAllowlist(address addr)",
"function allowlist(address) view returns (bool)",
"function attest(tuple(bytes32 uid, bytes32 schema, uint64 time, uint64 expirationTime, uint64 revocationTime, bytes32 refUID, address recipient, address attester, bool revocable, bytes data) attestation) payable returns (bool)",
"function getUserAttestation(address user, bytes32 schema) view returns (bytes32)",
"function initialize(address eas, address gitcoinAttester)",
"function isPayable() pure returns (bool)",
"function multiAttest(tuple(bytes32 uid, bytes32 schema, uint64 time, uint64 expirationTime, uint64 revocationTime, bytes32 refUID, address recipient, address attester, bool revocable, bytes data)[] attestations, uint256[]) payable returns (bool)",
"function multiRevoke(tuple(bytes32 uid, bytes32 schema, uint64 time, uint64 expirationTime, uint64 revocationTime, bytes32 refUID, address recipient, address attester, bool revocable, bytes data)[] attestations, uint256[]) payable returns (bool)",
"function owner() view returns (address)",
"function pause()",
"function paused() view returns (bool)",
"function proxiableUUID() view returns (bytes32)",
"function removeFromAllowlist(address addr)",
"function renounceOwnership()",
"function revoke(tuple(bytes32 uid, bytes32 schema, uint64 time, uint64 expirationTime, uint64 revocationTime, bytes32 refUID, address recipient, address attester, bool revocable, bytes data) attestation) payable returns (bool)",
"function transferOwnership(address newOwner)",
"function unpause()",
"function upgradeTo(address newImplementation)",
"function upgradeToAndCall(address newImplementation, bytes data) payable",
"function userAttestations(address, bytes32) view returns (bytes32)"
]
}

}
94 changes: 94 additions & 0 deletions deployments/abi/GitcoinVeraxPortal.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
{
"0xe704": [
"error NotAllowlisted()",
"error SchemaNotMapped()",
"event AdminChanged(address previousAdmin, address newAdmin)",
"event BeaconUpgraded(address indexed beacon)",
"event Initialized(uint8 version)",
"event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)",
"event Paused(address account)",
"event Unpaused(address account)",
"event Upgraded(address indexed implementation)",
"function addSchemaMapping(bytes32 schema, bytes32 veraxSchema)",
"function addToAllowlist(address _address)",
"function allowlist(address) view returns (bool)",
"function attest(tuple(bytes32 schemaId, uint64 expirationDate, bytes subject, bytes attestationData), bytes[]) payable",
"function attestationRegistry() view returns (address)",
"function attester() view returns (address)",
"function bulkAttest(tuple(bytes32 schemaId, uint64 expirationDate, bytes subject, bytes attestationData)[], bytes[][]) payable",
"function bulkReplace(bytes32[], tuple(bytes32 schemaId, uint64 expirationDate, bytes subject, bytes attestationData)[], bytes[][]) payable",
"function bulkRevoke(bytes32[]) pure",
"function getAttestation(bytes32 uid) view returns (tuple(bytes32 uid, bytes32 schema, uint64 time, uint64 expirationTime, uint64 revocationTime, bytes32 refUID, address recipient, address attester, bool revocable, bytes data))",
"function getAttester() view returns (address)",
"function getModules() pure returns (address[])",
"function initialize(address _attester, address _resolver, address _veraxAttestationRegistry)",
"function moduleRegistry() pure returns (address)",
"function modules(uint256) pure returns (address)",
"function owner() view returns (address)",
"function pause()",
"function paused() view returns (bool)",
"function portalRegistry() pure returns (address)",
"function proxiableUUID() view returns (bytes32)",
"function removeFromAllowlist(address _address)",
"function renounceOwnership()",
"function replace(bytes32, tuple(bytes32 schemaId, uint64 expirationDate, bytes subject, bytes attestationData), bytes[]) payable",
"function resolver() view returns (address)",
"function revoke(bytes32) pure",
"function router() pure returns (address)",
"function schemaMapping(bytes32) view returns (bytes32)",
"function submitAttestations(tuple(bytes32 schema, tuple(address recipient, uint64 expirationTime, bool revocable, bytes32 refUID, bytes data, uint256 value)[] data)[] multiAttestationRequests)",
"function supportsInterface(bytes4 interfaceID) pure returns (bool)",
"function transferOwnership(address newOwner)",
"function unpause()",
"function upgradeTo(address newImplementation)",
"function upgradeToAndCall(address newImplementation, bytes data) payable",
"function veraxAttestationRegistry() view returns (address)",
"function withdraw(address, uint256) pure"
],
"0x7a69": [
"error NotAllowlisted()",
"error SchemaNotMapped()",
"event AdminChanged(address previousAdmin, address newAdmin)",
"event BeaconUpgraded(address indexed beacon)",
"event Initialized(uint8 version)",
"event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)",
"event Paused(address account)",
"event Unpaused(address account)",
"event Upgraded(address indexed implementation)",
"function addSchemaMapping(bytes32 schema, bytes32 veraxSchema)",
"function addToAllowlist(address _address)",
"function allowlist(address) view returns (bool)",
"function attest(tuple(bytes32 schemaId, uint64 expirationDate, bytes subject, bytes attestationData), bytes[]) payable",
"function attestationRegistry() view returns (address)",
"function attester() view returns (address)",
"function bulkAttest(tuple(bytes32 schemaId, uint64 expirationDate, bytes subject, bytes attestationData)[], bytes[][]) payable",
"function bulkReplace(bytes32[], tuple(bytes32 schemaId, uint64 expirationDate, bytes subject, bytes attestationData)[], bytes[][]) payable",
"function bulkRevoke(bytes32[]) pure",
"function getAttestation(bytes32 uid) view returns (tuple(bytes32 uid, bytes32 schema, uint64 time, uint64 expirationTime, uint64 revocationTime, bytes32 refUID, address recipient, address attester, bool revocable, bytes data))",
"function getAttester() view returns (address)",
"function getModules() pure returns (address[])",
"function initialize(address _attester, address _resolver, address _veraxAttestationRegistry)",
"function moduleRegistry() pure returns (address)",
"function modules(uint256) pure returns (address)",
"function owner() view returns (address)",
"function pause()",
"function paused() view returns (bool)",
"function portalRegistry() pure returns (address)",
"function proxiableUUID() view returns (bytes32)",
"function removeFromAllowlist(address _address)",
"function renounceOwnership()",
"function replace(bytes32, tuple(bytes32 schemaId, uint64 expirationDate, bytes subject, bytes attestationData), bytes[]) payable",
"function resolver() view returns (address)",
"function revoke(bytes32) pure",
"function router() pure returns (address)",
"function schemaMapping(bytes32) view returns (bytes32)",
"function submitAttestations(tuple(bytes32 schema, tuple(address recipient, uint64 expirationTime, bool revocable, bytes32 refUID, bytes data, uint256 value)[] data)[] multiAttestationRequests)",
"function supportsInterface(bytes4 interfaceID) pure returns (bool)",
"function transferOwnership(address newOwner)",
"function unpause()",
"function upgradeTo(address newImplementation)",
"function upgradeToAndCall(address newImplementation, bytes data) payable",
"function veraxAttestationRegistry() view returns (address)",
"function withdraw(address, uint256) pure"
]
}
Loading

0 comments on commit 7b9d758

Please sign in to comment.