diff --git a/package-lock.json b/package-lock.json index c78ec8664..46a822c3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "ethereum-blockies": "^0.1.1", "ethers": "^5.0.31", "multibase": "^4.0.4", + "multihashes": "^4.0.2", "svelte": "^3.32.3", "svelte-routing": "^1.6.0" }, @@ -2317,6 +2318,20 @@ "npm": ">=6.0.0" } }, + "node_modules/multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dependencies": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=6.0.0" + } + }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -3364,6 +3379,14 @@ "node": ">=4.2.0" } }, + "node_modules/uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dependencies": { + "multibase": "^4.0.1" + } + }, "node_modules/unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -3427,6 +3450,11 @@ "builtins": "^1.0.3" } }, + "node_modules/varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" + }, "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -5175,6 +5203,16 @@ "@multiformats/base-x": "^4.0.1" } }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, "no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -5933,6 +5971,14 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==" }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "requires": { + "multibase": "^4.0.1" + } + }, "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -5990,6 +6036,11 @@ "builtins": "^1.0.3" } }, + "varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", diff --git a/package.json b/package.json index 4698dd466..3b90d3939 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "ethereum-blockies": "^0.1.1", "ethers": "^5.0.31", "multibase": "^4.0.4", + "multihashes": "^4.0.2", "svelte": "^3.32.3", "svelte-routing": "^1.6.0" } diff --git a/src/base/orgs/Org.ts b/src/base/orgs/Org.ts index 76c022130..383ca815a 100644 --- a/src/base/orgs/Org.ts +++ b/src/base/orgs/Org.ts @@ -11,8 +11,7 @@ const GetProjects = ` projects(where: { org: $org }) { id anchor { - stateHash - stateHashFormat + stateMultihash timestamp } } @@ -81,12 +80,15 @@ export class Org { for (const p of result.projects) { try { - p.id = utils.formatRadicleId(ethers.utils.arrayify(p.id)); - p.anchor.stateHash = utils.formatProjectHash( - ethers.utils.arrayify(p.anchor.stateHash), - p.anchor.stateHashFormat - ); - projects.push(p); + const proj: Project = { + id: utils.formatRadicleId(ethers.utils.arrayify(p.id)), + anchor: { + stateHash: utils.formatProjectHash( + ethers.utils.arrayify(p.anchor.stateMultihash), + ) + }, + }; + projects.push(proj); } catch (e) { console.error(e); } diff --git a/src/config.json b/src/config.json index 45fe5e0b9..163aaafe6 100644 --- a/src/config.json +++ b/src/config.json @@ -25,7 +25,7 @@ "address": "0x59b5eee36f5fa52400A136Fd4630Ee2bF126a4C0" }, "orgFactory": { - "address": "0xe1814B14430CF14f0950A29FF26217115B815676" + "address": "0xc074cDd9541960B0AA72D90c8bC642F6ae9C4032" }, "orgs": { "subgraph": "https://api.thegraph.com/subgraphs/name/radicle-dev/radicle-orgs-ropsten", @@ -46,7 +46,7 @@ "address": "0x5592ec0cfb4dbc12d3ab100b257153436a1f0fea" }, "orgFactory": { - "address": "0xe30aA5594FFB52B6bF5bbB21eB7e71Ac525bB028" + "address": "0x57962Eb188146A4942c44545a97478d64dc9e4A5" }, "orgs": { "subgraph": "https://api.thegraph.com/subgraphs/name/radicle-dev/radicle-orgs-rinkeby", diff --git a/src/project.ts b/src/project.ts index a0d7b47d7..669bc5236 100644 --- a/src/project.ts +++ b/src/project.ts @@ -4,7 +4,6 @@ export interface Project { id: string; anchor: { stateHash: string; - stateHashFormat: string; }; } diff --git a/src/utils.ts b/src/utils.ts index 6bed3e6d6..26d090687 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,6 +1,7 @@ import { ethers } from "ethers"; import type { BigNumber } from "ethers"; import multibase from 'multibase'; +import multihashes from 'multihashes'; import type { Config } from '@app/config'; import { assert } from '@app/error'; @@ -131,13 +132,9 @@ export function formatRadicleId(hash: Uint8Array): string { } // Create a project hash from a hash and format. -export function formatProjectHash(hash: Uint8Array, format: number): string { - assert(format === 0x0, "Only SHA1 commit hashes are supported"); - - // Remove any zero-padding from the byte array. SHA1 is 20 bytes long. - const sha1Bytes = 20; - const suffix = hash.slice(hash.length - sha1Bytes); - return ethers.utils.hexlify(suffix).replace(/^0x/, ''); +export function formatProjectHash(multihash: Uint8Array): string { + const decoded = multihashes.decode(multihash); + return ethers.utils.hexlify(decoded.digest).replace(/^0x/, ''); } // Identify an address by checking whether it's a contract or an externally-owned address.