From fe58377e7bfeacef3373c4c5e4c6c857b057eb43 Mon Sep 17 00:00:00 2001 From: ninokeldishvili Date: Thu, 21 Mar 2024 15:02:29 +0400 Subject: [PATCH 01/34] Add track addresses page into navigation --- src/components/Navigation.svelte | 6 +++++- src/lib/Default.svelte | 4 +++- src/routes/TrackAddresses.svelte | 1 + src/scripts/consts.js | 4 +++- 4 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 src/routes/TrackAddresses.svelte diff --git a/src/components/Navigation.svelte b/src/components/Navigation.svelte index 500292eb..d5b57345 100644 --- a/src/components/Navigation.svelte +++ b/src/components/Navigation.svelte @@ -91,7 +91,8 @@ class="flex jusitfy-start items-center space-x-6 w-full focus:outline-none focus:text-indigo-400 rounded py-2 text-nav font-semibold pl-5"> Web 3 - + +
+ + +
diff --git a/src/lib/Default.svelte b/src/lib/Default.svelte index 655b7cd6..3a6cb1a3 100644 --- a/src/lib/Default.svelte +++ b/src/lib/Default.svelte @@ -78,6 +78,7 @@ import Issuers from '../routes/Issuers.svelte'; import Curators from '../routes/Curators.svelte'; import Auditors from '../routes/Auditors.svelte'; + import TrackAddresses from '../routes/TrackAddresses.svelte'; let connectedAccount; export let url = ""; @@ -487,7 +488,8 @@ - + +
diff --git a/src/routes/TrackAddresses.svelte b/src/routes/TrackAddresses.svelte new file mode 100644 index 00000000..08dbeb89 --- /dev/null +++ b/src/routes/TrackAddresses.svelte @@ -0,0 +1 @@ +Track addresses \ No newline at end of file diff --git a/src/scripts/consts.js b/src/scripts/consts.js index 3d67a70e..5c8f7d46 100644 --- a/src/scripts/consts.js +++ b/src/scripts/consts.js @@ -82,7 +82,9 @@ export const ROUTE_LABEL_MAP = new Map([ ["#asset-history", "Asset history"], ["#change-comparison", "Change comparison"], ["#address-overview", "Address overview"], - ["#knowledgebase", "Knowledgebase"] + ["#knowledgebase", "Knowledgebase"], + ["#ipfs-login","IPFS login"], + ["#track-addresses","Track addresses"] ]); export const landingPages = ['', '/', '#', '#transparency', '#investors', '#issuers', '#curators','#auditors'] \ No newline at end of file From 1e08b9678a17b0f2c82cc700d9ebc0795db8d26e Mon Sep 17 00:00:00 2001 From: ninokeldishvili Date: Thu, 21 Mar 2024 15:07:55 +0400 Subject: [PATCH 02/34] Fix token overview width problem --- src/routes/TokenOverview.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/TokenOverview.svelte b/src/routes/TokenOverview.svelte index 07defc73..337796fc 100644 --- a/src/routes/TokenOverview.svelte +++ b/src/routes/TokenOverview.svelte @@ -242,7 +242,7 @@ {#if !isEditorOpen} -
+
@@ -489,7 +490,6 @@ -
diff --git a/src/routes/TrackAddresses.svelte b/src/routes/TrackAddresses.svelte index 08dbeb89..005b8c39 100644 --- a/src/routes/TrackAddresses.svelte +++ b/src/routes/TrackAddresses.svelte @@ -1 +1,73 @@ -Track addresses \ No newline at end of file + + +
+ {#if loading} + + {/if} + {#if !loading } +
+ + + + + + + + + + {#if addresses.length} + + {#each addresses as ad} + + + + + + + {/each} + {/if} + + + + +
Current addressesDate added
copy{ad.address.toLowerCase()}{timeStampToDate(ad?.timestamp, "yy-mm-dd/tt:tt")}
+
+ {/if} +
+ + \ No newline at end of file diff --git a/src/scripts/assets.js b/src/scripts/assets.js index e2c03ed9..4e33352f 100644 --- a/src/scripts/assets.js +++ b/src/scripts/assets.js @@ -15,6 +15,7 @@ import gild_lab from '../assets/icons/gild_lab.svg' import rain from '../assets/icons/rain.svg' import camera from '../assets/icons/camera.svg' import copy from '../assets/icons/copy.svg' +import copy_brown from '../assets/icons/copy_brown.svg' import discord from '../assets/icons/discord.svg' import etherscan from '../assets/icons/etherscan.svg' import polygonscan from '../assets/icons/polygonscan.svg' @@ -103,5 +104,6 @@ export const icons = { auditors_hero, wave_resp, investor_hero_tile, - arbitrum + arbitrum, + copy_brown } From 19b64a91a79c616b74e7b30683ef05327b690b03 Mon Sep 17 00:00:00 2001 From: ninokeldishvili Date: Thu, 21 Mar 2024 17:37:38 +0400 Subject: [PATCH 04/34] Add input, button and copy address functionality --- src/routes/TrackAddresses.svelte | 33 +++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/src/routes/TrackAddresses.svelte b/src/routes/TrackAddresses.svelte index 005b8c39..c2c41d71 100644 --- a/src/routes/TrackAddresses.svelte +++ b/src/routes/TrackAddresses.svelte @@ -16,15 +16,34 @@ {address: "0xbaa3e3dd6eeebf87af39fc35eeccdf12537db515", timestamp: "1710922144"}, ] let loading = false; + let address = ''; + function addAddress() { + console.log(address) + } + + function copyAddress(address) { + if (navigator && navigator.clipboard && navigator.clipboard.writeText) { + return navigator.clipboard.writeText(address.toLowerCase()); + } + return Promise.reject("The Clipboard API is not available."); + } -
+
{#if loading} {/if} {#if !loading } -
+
+
+ Add an address to track IPFS pins from +
+ + +
+
+ Current Addresses to track IPFS pins from @@ -38,7 +57,9 @@ {#each addresses as ad} - + @@ -59,12 +80,6 @@ margin-left: 223px; } - .receipts { - /*width: 100%;*/ - margin-right: 20px; - /*margin-top: 117px;*/ - } - .address { color: #9D7334; } From a4fed126e69f602ab1549bc28b282c58e90734ef Mon Sep 17 00:00:00 2001 From: ninokeldishvili Date: Thu, 21 Mar 2024 18:07:01 +0400 Subject: [PATCH 05/34] Add remove button --- src/assets/icons/bin.svg | 5 +++++ src/routes/TrackAddresses.svelte | 18 +++++++++++++----- src/scripts/assets.js | 4 +++- 3 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 src/assets/icons/bin.svg diff --git a/src/assets/icons/bin.svg b/src/assets/icons/bin.svg new file mode 100644 index 00000000..a41c2d7b --- /dev/null +++ b/src/assets/icons/bin.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/routes/TrackAddresses.svelte b/src/routes/TrackAddresses.svelte index c2c41d71..44b94888 100644 --- a/src/routes/TrackAddresses.svelte +++ b/src/routes/TrackAddresses.svelte @@ -28,6 +28,10 @@ } return Promise.reject("The Clipboard API is not available."); } + + function removeAddress(address) { + console.log(address) + }
@@ -44,12 +48,13 @@
Current Addresses to track IPFS pins from -
copy{copyAddress(ad.address)}}>copy {ad.address.toLowerCase()} {timeStampToDate(ad?.timestamp, "yy-mm-dd/tt:tt")}
+
- + + @@ -57,11 +62,14 @@ {#each addresses as ad} - + + {/each} diff --git a/src/scripts/assets.js b/src/scripts/assets.js index 4e33352f..695f6906 100644 --- a/src/scripts/assets.js +++ b/src/scripts/assets.js @@ -51,6 +51,7 @@ import auditors_hero from '../assets/icons/auditors_hero.webp'; import wave_resp from '../assets/icons/wave_resp.svg'; import investor_hero_tile from '../assets/icons/investor_hero_tile.webp'; import arbitrum from '../assets/icons/arbitrum.svg'; +import bin from '../assets/icons/bin.svg'; export const icons = { ethereum, @@ -105,5 +106,6 @@ export const icons = { wave_resp, investor_hero_tile, arbitrum, - copy_brown + copy_brown, + bin } From bdccf44b3bd431d6b1a30665908c6d946718e735 Mon Sep 17 00:00:00 2001 From: ninokeldishvili Date: Wed, 27 Mar 2024 13:49:54 +0400 Subject: [PATCH 06/34] Use wasm to convert addresses into binary --- public/pkg/.gitignore | 0 public/pkg/package.json | 14 ++ public/pkg/wasm_utils.d.ts | 39 +++++ public/pkg/wasm_utils.js | 251 +++++++++++++++++++++++++++++ public/pkg/wasm_utils_bg.wasm | Bin 0 -> 24699 bytes public/pkg/wasm_utils_bg.wasm.d.ts | 8 + src/routes/TrackAddresses.svelte | 12 +- src/wasm_utils.js | 16 ++ 8 files changed, 339 insertions(+), 1 deletion(-) create mode 100644 public/pkg/.gitignore create mode 100644 public/pkg/package.json create mode 100644 public/pkg/wasm_utils.d.ts create mode 100644 public/pkg/wasm_utils.js create mode 100644 public/pkg/wasm_utils_bg.wasm create mode 100644 public/pkg/wasm_utils_bg.wasm.d.ts create mode 100644 src/wasm_utils.js diff --git a/public/pkg/.gitignore b/public/pkg/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/public/pkg/package.json b/public/pkg/package.json new file mode 100644 index 00000000..6d729f9f --- /dev/null +++ b/public/pkg/package.json @@ -0,0 +1,14 @@ +{ + "name": "wasm-utils", + "version": "0.1.0", + "files": [ + "wasm_utils_bg.wasm", + "wasm_utils.js", + "wasm_utils.d.ts" + ], + "module": "wasm_utils.js", + "types": "wasm_utils.d.ts", + "sideEffects": [ + "./snippets/*" + ] +} \ No newline at end of file diff --git a/public/pkg/wasm_utils.d.ts b/public/pkg/wasm_utils.d.ts new file mode 100644 index 00000000..e3355294 --- /dev/null +++ b/public/pkg/wasm_utils.d.ts @@ -0,0 +1,39 @@ +/* tslint:disable */ +/* eslint-disable */ +/** +* @param {Array} addresses +* @returns {Uint8Array} +*/ +export function concat_hex_addresses(addresses: Array): Uint8Array; + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly concat_hex_addresses: (a: number, b: number) => void; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {SyncInitInput} module +* +* @returns {InitOutput} +*/ +export function initSync(module: SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {InitInput | Promise} module_or_path +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: InitInput | Promise): Promise; diff --git a/public/pkg/wasm_utils.js b/public/pkg/wasm_utils.js new file mode 100644 index 00000000..430cdb84 --- /dev/null +++ b/public/pkg/wasm_utils.js @@ -0,0 +1,251 @@ +let wasm; + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +function getObject(idx) { return heap[idx]; } + +let WASM_VECTOR_LEN = 0; + +let cachedUint8Memory0 = null; + +function getUint8Memory0() { + if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { + cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8Memory0; +} + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8Memory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +let cachedInt32Memory0 = null; + +function getInt32Memory0() { + if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { + cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); + } + return cachedInt32Memory0; +} + +let heap_next = heap.length; + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); +} + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function getArrayU8FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); +} +/** +* @param {Array} addresses +* @returns {Uint8Array} +*/ +export function concat_hex_addresses(addresses) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.concat_hex_addresses(retptr, addHeapObject(addresses)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbindgen_string_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'string' ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; + }; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + imports.wbg.__wbg_get_bd8e338fbd5f5cc8 = function(arg0, arg1) { + const ret = getObject(arg0)[arg1 >>> 0]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_length_cd7af8117672b8b8 = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + + return imports; +} + +function __wbg_init_memory(imports, maybe_memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedInt32Memory0 = null; + cachedUint8Memory0 = null; + + + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(input) { + if (wasm !== undefined) return wasm; + + if (typeof input === 'undefined') { + input = new URL('wasm_utils_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { + input = fetch(input); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await input, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync } +export default __wbg_init; diff --git a/public/pkg/wasm_utils_bg.wasm b/public/pkg/wasm_utils_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..a5f8298c3de971b05a684122f5baf73e70263fdd GIT binary patch literal 24699 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 literal 0 HcmV?d00001 diff --git a/public/pkg/wasm_utils_bg.wasm.d.ts b/public/pkg/wasm_utils_bg.wasm.d.ts new file mode 100644 index 00000000..db6a7573 --- /dev/null +++ b/public/pkg/wasm_utils_bg.wasm.d.ts @@ -0,0 +1,8 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export function concat_hex_addresses(a: number, b: number): void; +export function __wbindgen_malloc(a: number, b: number): number; +export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; +export function __wbindgen_add_to_stack_pointer(a: number): number; +export function __wbindgen_free(a: number, b: number, c: number): void; diff --git a/src/routes/TrackAddresses.svelte b/src/routes/TrackAddresses.svelte index 44b94888..0cf5d50a 100644 --- a/src/routes/TrackAddresses.svelte +++ b/src/routes/TrackAddresses.svelte @@ -3,6 +3,14 @@ import {timeStampToDate} from "../scripts/helpers.js"; import SftLoader from '../components/SftLoader.svelte'; import {icons} from '../scripts/assets.js'; + import { convertAddress, initWasm } from "../wasm_utils.js"; + + let convertedAddress = ""; + + async function convert(addresses) { + await initWasm(); + convertedAddress = await convertAddress(addresses); + } let error = '' let addresses = [ @@ -18,8 +26,10 @@ let loading = false; let address = ''; - function addAddress() { + async function addAddress() { console.log(address) + await convert(addresses.map(a=>a.address)) + console.log(convertedAddress) } function copyAddress(address) { diff --git a/src/wasm_utils.js b/src/wasm_utils.js new file mode 100644 index 00000000..4c4d4914 --- /dev/null +++ b/src/wasm_utils.js @@ -0,0 +1,16 @@ +// src/wasmModule.js + +import init, { concat_hex_addresses } from "../public/pkg/wasm_utils.js"; + +let wasm; + +async function initWasm() { + wasm = await init(); +} + +export async function convertAddress(hexAddress) { + if (!wasm) await initWasm(); + return concat_hex_addresses(hexAddress); +} + +export { initWasm }; From 618b1b409d6a1809d9a084fb457f22a4719bff2d Mon Sep 17 00:00:00 2001 From: ninokeldishvili Date: Thu, 28 Mar 2024 14:18:01 +0400 Subject: [PATCH 07/34] Update wasm for cbor encoded addresses --- public/pkg/package.json | 12 +- public/pkg/wasm_utils.d.ts | 39 ----- public/pkg/wasm_utils.js | 251 ----------------------------- public/pkg/wasm_utils_bg.wasm | Bin 24699 -> 0 bytes public/pkg/wasm_utils_bg.wasm.d.ts | 8 - src/routes/TrackAddresses.svelte | 14 +- src/wasm_utils.js | 6 +- 7 files changed, 20 insertions(+), 310 deletions(-) delete mode 100644 public/pkg/wasm_utils.d.ts delete mode 100644 public/pkg/wasm_utils.js delete mode 100644 public/pkg/wasm_utils_bg.wasm delete mode 100644 public/pkg/wasm_utils_bg.wasm.d.ts diff --git a/public/pkg/package.json b/public/pkg/package.json index 6d729f9f..48c143ee 100644 --- a/public/pkg/package.json +++ b/public/pkg/package.json @@ -1,13 +1,13 @@ { - "name": "wasm-utils", + "name": "encoding-addresses", "version": "0.1.0", "files": [ - "wasm_utils_bg.wasm", - "wasm_utils.js", - "wasm_utils.d.ts" + "encoding_addresses_bg.wasm", + "encoding_addresses.js", + "encoding_addresses.d.ts" ], - "module": "wasm_utils.js", - "types": "wasm_utils.d.ts", + "module": "encoding_addresses.js", + "types": "encoding_addresses.d.ts", "sideEffects": [ "./snippets/*" ] diff --git a/public/pkg/wasm_utils.d.ts b/public/pkg/wasm_utils.d.ts deleted file mode 100644 index e3355294..00000000 --- a/public/pkg/wasm_utils.d.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** -* @param {Array} addresses -* @returns {Uint8Array} -*/ -export function concat_hex_addresses(addresses: Array): Uint8Array; - -export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; - -export interface InitOutput { - readonly memory: WebAssembly.Memory; - readonly concat_hex_addresses: (a: number, b: number) => void; - readonly __wbindgen_malloc: (a: number, b: number) => number; - readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; - readonly __wbindgen_add_to_stack_pointer: (a: number) => number; - readonly __wbindgen_free: (a: number, b: number, c: number) => void; -} - -export type SyncInitInput = BufferSource | WebAssembly.Module; -/** -* Instantiates the given `module`, which can either be bytes or -* a precompiled `WebAssembly.Module`. -* -* @param {SyncInitInput} module -* -* @returns {InitOutput} -*/ -export function initSync(module: SyncInitInput): InitOutput; - -/** -* If `module_or_path` is {RequestInfo} or {URL}, makes a request and -* for everything else, calls `WebAssembly.instantiate` directly. -* -* @param {InitInput | Promise} module_or_path -* -* @returns {Promise} -*/ -export default function __wbg_init (module_or_path?: InitInput | Promise): Promise; diff --git a/public/pkg/wasm_utils.js b/public/pkg/wasm_utils.js deleted file mode 100644 index 430cdb84..00000000 --- a/public/pkg/wasm_utils.js +++ /dev/null @@ -1,251 +0,0 @@ -let wasm; - -const heap = new Array(128).fill(undefined); - -heap.push(undefined, null, true, false); - -function getObject(idx) { return heap[idx]; } - -let WASM_VECTOR_LEN = 0; - -let cachedUint8Memory0 = null; - -function getUint8Memory0() { - if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { - cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); - } - return cachedUint8Memory0; -} - -const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); - -const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' - ? function (arg, view) { - return cachedTextEncoder.encodeInto(arg, view); -} - : function (arg, view) { - const buf = cachedTextEncoder.encode(arg); - view.set(buf); - return { - read: arg.length, - written: buf.length - }; -}); - -function passStringToWasm0(arg, malloc, realloc) { - - if (realloc === undefined) { - const buf = cachedTextEncoder.encode(arg); - const ptr = malloc(buf.length, 1) >>> 0; - getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); - WASM_VECTOR_LEN = buf.length; - return ptr; - } - - let len = arg.length; - let ptr = malloc(len, 1) >>> 0; - - const mem = getUint8Memory0(); - - let offset = 0; - - for (; offset < len; offset++) { - const code = arg.charCodeAt(offset); - if (code > 0x7F) break; - mem[ptr + offset] = code; - } - - if (offset !== len) { - if (offset !== 0) { - arg = arg.slice(offset); - } - ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; - const view = getUint8Memory0().subarray(ptr + offset, ptr + len); - const ret = encodeString(arg, view); - - offset += ret.written; - ptr = realloc(ptr, len, offset, 1) >>> 0; - } - - WASM_VECTOR_LEN = offset; - return ptr; -} - -function isLikeNone(x) { - return x === undefined || x === null; -} - -let cachedInt32Memory0 = null; - -function getInt32Memory0() { - if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { - cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); - } - return cachedInt32Memory0; -} - -let heap_next = heap.length; - -function dropObject(idx) { - if (idx < 132) return; - heap[idx] = heap_next; - heap_next = idx; -} - -function takeObject(idx) { - const ret = getObject(idx); - dropObject(idx); - return ret; -} - -const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); - -if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; - -function getStringFromWasm0(ptr, len) { - ptr = ptr >>> 0; - return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); -} - -function addHeapObject(obj) { - if (heap_next === heap.length) heap.push(heap.length + 1); - const idx = heap_next; - heap_next = heap[idx]; - - heap[idx] = obj; - return idx; -} - -function getArrayU8FromWasm0(ptr, len) { - ptr = ptr >>> 0; - return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); -} -/** -* @param {Array} addresses -* @returns {Uint8Array} -*/ -export function concat_hex_addresses(addresses) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.concat_hex_addresses(retptr, addHeapObject(addresses)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var v1 = getArrayU8FromWasm0(r0, r1).slice(); - wasm.__wbindgen_free(r0, r1 * 1, 1); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } -} - -async function __wbg_load(module, imports) { - if (typeof Response === 'function' && module instanceof Response) { - if (typeof WebAssembly.instantiateStreaming === 'function') { - try { - return await WebAssembly.instantiateStreaming(module, imports); - - } catch (e) { - if (module.headers.get('Content-Type') != 'application/wasm') { - console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); - - } else { - throw e; - } - } - } - - const bytes = await module.arrayBuffer(); - return await WebAssembly.instantiate(bytes, imports); - - } else { - const instance = await WebAssembly.instantiate(module, imports); - - if (instance instanceof WebAssembly.Instance) { - return { instance, module }; - - } else { - return instance; - } - } -} - -function __wbg_get_imports() { - const imports = {}; - imports.wbg = {}; - imports.wbg.__wbindgen_string_get = function(arg0, arg1) { - const obj = getObject(arg1); - const ret = typeof(obj) === 'string' ? obj : undefined; - var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - var len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; - }; - imports.wbg.__wbindgen_object_drop_ref = function(arg0) { - takeObject(arg0); - }; - imports.wbg.__wbg_get_bd8e338fbd5f5cc8 = function(arg0, arg1) { - const ret = getObject(arg0)[arg1 >>> 0]; - return addHeapObject(ret); - }; - imports.wbg.__wbg_length_cd7af8117672b8b8 = function(arg0) { - const ret = getObject(arg0).length; - return ret; - }; - imports.wbg.__wbindgen_throw = function(arg0, arg1) { - throw new Error(getStringFromWasm0(arg0, arg1)); - }; - - return imports; -} - -function __wbg_init_memory(imports, maybe_memory) { - -} - -function __wbg_finalize_init(instance, module) { - wasm = instance.exports; - __wbg_init.__wbindgen_wasm_module = module; - cachedInt32Memory0 = null; - cachedUint8Memory0 = null; - - - return wasm; -} - -function initSync(module) { - if (wasm !== undefined) return wasm; - - const imports = __wbg_get_imports(); - - __wbg_init_memory(imports); - - if (!(module instanceof WebAssembly.Module)) { - module = new WebAssembly.Module(module); - } - - const instance = new WebAssembly.Instance(module, imports); - - return __wbg_finalize_init(instance, module); -} - -async function __wbg_init(input) { - if (wasm !== undefined) return wasm; - - if (typeof input === 'undefined') { - input = new URL('wasm_utils_bg.wasm', import.meta.url); - } - const imports = __wbg_get_imports(); - - if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { - input = fetch(input); - } - - __wbg_init_memory(imports); - - const { instance, module } = await __wbg_load(await input, imports); - - return __wbg_finalize_init(instance, module); -} - -export { initSync } -export default __wbg_init; diff --git a/public/pkg/wasm_utils_bg.wasm b/public/pkg/wasm_utils_bg.wasm deleted file mode 100644 index a5f8298c3de971b05a684122f5baf73e70263fdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24699 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 diff --git a/public/pkg/wasm_utils_bg.wasm.d.ts b/public/pkg/wasm_utils_bg.wasm.d.ts deleted file mode 100644 index db6a7573..00000000 --- a/public/pkg/wasm_utils_bg.wasm.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -export const memory: WebAssembly.Memory; -export function concat_hex_addresses(a: number, b: number): void; -export function __wbindgen_malloc(a: number, b: number): number; -export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; -export function __wbindgen_add_to_stack_pointer(a: number): number; -export function __wbindgen_free(a: number, b: number, c: number): void; diff --git a/src/routes/TrackAddresses.svelte b/src/routes/TrackAddresses.svelte index 0cf5d50a..757e50d6 100644 --- a/src/routes/TrackAddresses.svelte +++ b/src/routes/TrackAddresses.svelte @@ -3,13 +3,15 @@ import {timeStampToDate} from "../scripts/helpers.js"; import SftLoader from '../components/SftLoader.svelte'; import {icons} from '../scripts/assets.js'; - import { convertAddress, initWasm } from "../wasm_utils.js"; + import { encodeAddresses, initWasm } from "../wasm_utils.js"; + import {arrayify} from 'ethers/lib/utils.js'; let convertedAddress = ""; async function convert(addresses) { await initWasm(); - convertedAddress = await convertAddress(addresses); + convertedAddress = await encodeAddresses(addresses); + console.log(convertedAddress) } let error = '' @@ -27,9 +29,11 @@ let address = ''; async function addAddress() { - console.log(address) - await convert(addresses.map(a=>a.address)) - console.log(convertedAddress) + console.log(111, arrayify("0xff0a89c674ee7874")) + await convert(["0xff0a89c674ee7874",...addresses.map(a=>a.address)]) + console.log(222, convertedAddress) + console.log([...arrayify("0xff0a89c674ee7874"),...convertedAddress]) + } function copyAddress(address) { diff --git a/src/wasm_utils.js b/src/wasm_utils.js index 4c4d4914..c2e67a7d 100644 --- a/src/wasm_utils.js +++ b/src/wasm_utils.js @@ -1,6 +1,6 @@ // src/wasmModule.js -import init, { concat_hex_addresses } from "../public/pkg/wasm_utils.js"; +import init, { concat_hex_addresses, cbor_encode_addresses} from "../public/pkg/encoding_addresses.js"; let wasm; @@ -12,5 +12,9 @@ export async function convertAddress(hexAddress) { if (!wasm) await initWasm(); return concat_hex_addresses(hexAddress); } +export async function encodeAddresses(hexAddress) { + if (!wasm) await initWasm(); + return cbor_encode_addresses(hexAddress); +} export { initWasm }; From d05be4325704b9721f4dadbc554d3bb45747f772 Mon Sep 17 00:00:00 2001 From: ninokeldishvili Date: Mon, 1 Apr 2024 12:57:56 +0400 Subject: [PATCH 08/34] Commit uncommeted wasm files --- public/pkg/encoding_addresses.d.ts | 49 +++ public/pkg/encoding_addresses.js | 406 +++++++++++++++++++++ public/pkg/encoding_addresses_bg.wasm | Bin 0 -> 82989 bytes public/pkg/encoding_addresses_bg.wasm.d.ts | 13 + 4 files changed, 468 insertions(+) create mode 100644 public/pkg/encoding_addresses.d.ts create mode 100644 public/pkg/encoding_addresses.js create mode 100644 public/pkg/encoding_addresses_bg.wasm create mode 100644 public/pkg/encoding_addresses_bg.wasm.d.ts diff --git a/public/pkg/encoding_addresses.d.ts b/public/pkg/encoding_addresses.d.ts new file mode 100644 index 00000000..6aa857c6 --- /dev/null +++ b/public/pkg/encoding_addresses.d.ts @@ -0,0 +1,49 @@ +/* tslint:disable */ +/* eslint-disable */ +/** +* @param {Array} addresses +* @returns {Uint8Array} +*/ +export function concat_hex_addresses(addresses: Array): Uint8Array; +/** +* @param {Array} addresses +* @returns {Promise} +*/ +export function cbor_encode_addresses(addresses: Array): Promise; + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly concat_hex_addresses: (a: number, b: number) => void; + readonly cbor_encode_addresses: (a: number) => number; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_export_2: WebAssembly.Table; + readonly _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hcde5a7880f359960: (a: number, b: number, c: number) => void; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; + readonly __wbindgen_exn_store: (a: number) => void; + readonly wasm_bindgen__convert__closures__invoke2_mut__h0ee3583ded983582: (a: number, b: number, c: number, d: number) => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {SyncInitInput} module +* +* @returns {InitOutput} +*/ +export function initSync(module: SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {InitInput | Promise} module_or_path +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: InitInput | Promise): Promise; diff --git a/public/pkg/encoding_addresses.js b/public/pkg/encoding_addresses.js new file mode 100644 index 00000000..baee3d6f --- /dev/null +++ b/public/pkg/encoding_addresses.js @@ -0,0 +1,406 @@ +let wasm; + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +function getObject(idx) { return heap[idx]; } + +let heap_next = heap.length; + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +let cachedUint8Memory0 = null; + +function getUint8Memory0() { + if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { + cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8Memory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); +} + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +let WASM_VECTOR_LEN = 0; + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8Memory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +let cachedInt32Memory0 = null; + +function getInt32Memory0() { + if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { + cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); + } + return cachedInt32Memory0; +} + +const CLOSURE_DTORS = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(state => { + wasm.__wbindgen_export_2.get(state.dtor)(state.a, state.b) +}); + +function makeMutClosure(arg0, arg1, dtor, f) { + const state = { a: arg0, b: arg1, cnt: 1, dtor }; + const real = (...args) => { + // First up with a closure we increment the internal reference + // count. This ensures that the Rust closure environment won't + // be deallocated while we're invoking it. + state.cnt++; + const a = state.a; + state.a = 0; + try { + return f(a, state.b, ...args); + } finally { + if (--state.cnt === 0) { + wasm.__wbindgen_export_2.get(state.dtor)(a, state.b); + CLOSURE_DTORS.unregister(state); + } else { + state.a = a; + } + } + }; + real.original = state; + CLOSURE_DTORS.register(real, state, state); + return real; +} +function __wbg_adapter_20(arg0, arg1, arg2) { + wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hcde5a7880f359960(arg0, arg1, addHeapObject(arg2)); +} + +function getArrayU8FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); +} +/** +* @param {Array} addresses +* @returns {Uint8Array} +*/ +export function concat_hex_addresses(addresses) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.concat_hex_addresses(retptr, addHeapObject(addresses)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {Array} addresses +* @returns {Promise} +*/ +export function cbor_encode_addresses(addresses) { + const ret = wasm.cbor_encode_addresses(addHeapObject(addresses)); + return takeObject(ret); +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } +} +function __wbg_adapter_41(arg0, arg1, arg2, arg3) { + wasm.wasm_bindgen__convert__closures__invoke2_mut__h0ee3583ded983582(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3)); +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_string_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'string' ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; + }; + imports.wbg.__wbindgen_number_new = function(arg0) { + const ret = arg0; + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_object_clone_ref = function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_cb_drop = function(arg0) { + const obj = takeObject(arg0).original; + if (obj.cnt-- == 1) { + obj.a = 0; + return true; + } + const ret = false; + return ret; + }; + imports.wbg.__wbg_queueMicrotask_481971b0d87f3dd4 = function(arg0) { + queueMicrotask(getObject(arg0)); + }; + imports.wbg.__wbg_queueMicrotask_3cbae2ec6b6cd3d6 = function(arg0) { + const ret = getObject(arg0).queueMicrotask; + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_function = function(arg0) { + const ret = typeof(getObject(arg0)) === 'function'; + return ret; + }; + imports.wbg.__wbg_get_bd8e338fbd5f5cc8 = function(arg0, arg1) { + const ret = getObject(arg0)[arg1 >>> 0]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_length_cd7af8117672b8b8 = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_new_16b304a2cfa7ff4a = function() { + const ret = new Array(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_newnoargs_e258087cd0daa0ea = function(arg0, arg1) { + const ret = new Function(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_call_27c0f87801dedf93 = function() { return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_self_ce0dbfc45cf2f5be = function() { return handleError(function () { + const ret = self.self; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_window_c6fb939a7f436783 = function() { return handleError(function () { + const ret = window.window; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_globalThis_d1e6af4856ba331b = function() { return handleError(function () { + const ret = globalThis.globalThis; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_global_207b558942527489 = function() { return handleError(function () { + const ret = global.global; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbindgen_is_undefined = function(arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbg_set_d4638f722068f043 = function(arg0, arg1, arg2) { + getObject(arg0)[arg1 >>> 0] = takeObject(arg2); + }; + imports.wbg.__wbg_call_b3ca7c6051f9bec1 = function() { return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_new_81740750da40724f = function(arg0, arg1) { + try { + var state0 = {a: arg0, b: arg1}; + var cb0 = (arg0, arg1) => { + const a = state0.a; + state0.a = 0; + try { + return __wbg_adapter_41(a, state0.b, arg0, arg1); + } finally { + state0.a = a; + } + }; + const ret = new Promise(cb0); + return addHeapObject(ret); + } finally { + state0.a = state0.b = 0; + } + }; + imports.wbg.__wbg_resolve_b0083a7967828ec8 = function(arg0) { + const ret = Promise.resolve(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_then_0c86a60e8fcfe9f6 = function(arg0, arg1) { + const ret = getObject(arg0).then(getObject(arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbindgen_closure_wrapper142 = function(arg0, arg1, arg2) { + const ret = makeMutClosure(arg0, arg1, 76, __wbg_adapter_20); + return addHeapObject(ret); + }; + + return imports; +} + +function __wbg_init_memory(imports, maybe_memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedInt32Memory0 = null; + cachedUint8Memory0 = null; + + + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(input) { + if (wasm !== undefined) return wasm; + + if (typeof input === 'undefined') { + input = new URL('encoding_addresses_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { + input = fetch(input); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await input, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync } +export default __wbg_init; diff --git a/public/pkg/encoding_addresses_bg.wasm b/public/pkg/encoding_addresses_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..dfe21e6d4693943bd4dc0e0d239d4776894214a2 GIT binary patch literal 82989 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

OQqIv*aR$4=1u5U5jG- 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�gPiF#IQS8v}eN4DhO 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 literal 0 HcmV?d00001 diff --git a/public/pkg/encoding_addresses_bg.wasm.d.ts b/public/pkg/encoding_addresses_bg.wasm.d.ts new file mode 100644 index 00000000..1d7e66bf --- /dev/null +++ b/public/pkg/encoding_addresses_bg.wasm.d.ts @@ -0,0 +1,13 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export function concat_hex_addresses(a: number, b: number): void; +export function cbor_encode_addresses(a: number): number; +export function __wbindgen_malloc(a: number, b: number): number; +export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; +export const __wbindgen_export_2: WebAssembly.Table; +export function _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hcde5a7880f359960(a: number, b: number, c: number): void; +export function __wbindgen_add_to_stack_pointer(a: number): number; +export function __wbindgen_free(a: number, b: number, c: number): void; +export function __wbindgen_exn_store(a: number): void; +export function wasm_bindgen__convert__closures__invoke2_mut__h0ee3583ded983582(a: number, b: number, c: number, d: number): void; From a08380f8a5d3cc0569ba8d4a6de9d79a9db08e09 Mon Sep 17 00:00:00 2001 From: ninokeldishvili Date: Mon, 1 Apr 2024 16:57:02 +0400 Subject: [PATCH 09/34] Some refactors --- src/routes/TrackAddresses.svelte | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/routes/TrackAddresses.svelte b/src/routes/TrackAddresses.svelte index 757e50d6..0420ea02 100644 --- a/src/routes/TrackAddresses.svelte +++ b/src/routes/TrackAddresses.svelte @@ -3,15 +3,13 @@ import {timeStampToDate} from "../scripts/helpers.js"; import SftLoader from '../components/SftLoader.svelte'; import {icons} from '../scripts/assets.js'; - import { encodeAddresses, initWasm } from "../wasm_utils.js"; - import {arrayify} from 'ethers/lib/utils.js'; + import {encodeAddresses, initWasm} from "../wasm_utils.js"; let convertedAddress = ""; async function convert(addresses) { await initWasm(); - convertedAddress = await encodeAddresses(addresses); - console.log(convertedAddress) + return await encodeAddresses(addresses); } let error = '' @@ -29,10 +27,8 @@ let address = ''; async function addAddress() { - console.log(111, arrayify("0xff0a89c674ee7874")) - await convert(["0xff0a89c674ee7874",...addresses.map(a=>a.address)]) - console.log(222, convertedAddress) - console.log([...arrayify("0xff0a89c674ee7874"),...convertedAddress]) + convertedAddress = await convert(addresses.map(a=>a.address)) + console.log(convertedAddress) } From e900892013677eccab7d65292f2cda3d5e5e5170 Mon Sep 17 00:00:00 2001 From: ninokeldishvili Date: Tue, 2 Apr 2024 00:32:40 +0400 Subject: [PATCH 10/34] Create address remove/add functions with constructed data to path to a contract --- public/pkg/encoding_addresses.d.ts | 12 ++- public/pkg/encoding_addresses.js | 91 ++++++++++++++------- public/pkg/encoding_addresses_bg.wasm | Bin 82989 -> 85318 bytes public/pkg/encoding_addresses_bg.wasm.d.ts | 3 +- src/routes/TrackAddresses.svelte | 56 +++++++++++-- src/scripts/consts.js | 10 ++- src/wasm_utils.js | 7 +- 7 files changed, 135 insertions(+), 44 deletions(-) diff --git a/public/pkg/encoding_addresses.d.ts b/public/pkg/encoding_addresses.d.ts index 6aa857c6..eeaef0cb 100644 --- a/public/pkg/encoding_addresses.d.ts +++ b/public/pkg/encoding_addresses.d.ts @@ -6,17 +6,23 @@ */ export function concat_hex_addresses(addresses: Array): Uint8Array; /** -* @param {Array} addresses +* @param {string} hex_val +* @returns {Uint8Array | undefined} +*/ +export function hex_to_bytes(hex_val: string): Uint8Array | undefined; +/** +* @param {Uint8Array} address * @returns {Promise} */ -export function cbor_encode_addresses(addresses: Array): Promise; +export function cbor_encode_addresses(address: Uint8Array): Promise; export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; export interface InitOutput { readonly memory: WebAssembly.Memory; readonly concat_hex_addresses: (a: number, b: number) => void; - readonly cbor_encode_addresses: (a: number) => number; + readonly hex_to_bytes: (a: number, b: number, c: number) => void; + readonly cbor_encode_addresses: (a: number, b: number) => number; readonly __wbindgen_malloc: (a: number, b: number) => number; readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; readonly __wbindgen_export_2: WebAssembly.Table; diff --git a/public/pkg/encoding_addresses.js b/public/pkg/encoding_addresses.js index baee3d6f..172b82b6 100644 --- a/public/pkg/encoding_addresses.js +++ b/public/pkg/encoding_addresses.js @@ -20,9 +20,7 @@ function takeObject(idx) { return ret; } -const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); - -if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; +let WASM_VECTOR_LEN = 0; let cachedUint8Memory0 = null; @@ -33,22 +31,6 @@ function getUint8Memory0() { return cachedUint8Memory0; } -function getStringFromWasm0(ptr, len) { - ptr = ptr >>> 0; - return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); -} - -function addHeapObject(obj) { - if (heap_next === heap.length) heap.push(heap.length + 1); - const idx = heap_next; - heap_next = heap[idx]; - - heap[idx] = obj; - return idx; -} - -let WASM_VECTOR_LEN = 0; - const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' @@ -116,6 +98,24 @@ function getInt32Memory0() { return cachedInt32Memory0; } +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); +} + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + const CLOSURE_DTORS = (typeof FinalizationRegistry === 'undefined') ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry(state => { @@ -173,11 +173,42 @@ export function concat_hex_addresses(addresses) { } /** -* @param {Array} addresses +* @param {string} hex_val +* @returns {Uint8Array | undefined} +*/ +export function hex_to_bytes(hex_val) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passStringToWasm0(hex_val, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + wasm.hex_to_bytes(retptr, ptr0, len0); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + let v2; + if (r0 !== 0) { + v2 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + } + return v2; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +function passArray8ToWasm0(arg, malloc) { + const ptr = malloc(arg.length * 1, 1) >>> 0; + getUint8Memory0().set(arg, ptr / 1); + WASM_VECTOR_LEN = arg.length; + return ptr; +} +/** +* @param {Uint8Array} address * @returns {Promise} */ -export function cbor_encode_addresses(addresses) { - const ret = wasm.cbor_encode_addresses(addHeapObject(addresses)); +export function cbor_encode_addresses(address) { + const ptr0 = passArray8ToWasm0(address, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.cbor_encode_addresses(ptr0, len0); return takeObject(ret); } @@ -188,7 +219,7 @@ function handleError(f, args) { wasm.__wbindgen_exn_store(addHeapObject(e)); } } -function __wbg_adapter_41(arg0, arg1, arg2, arg3) { +function __wbg_adapter_42(arg0, arg1, arg2, arg3) { wasm.wasm_bindgen__convert__closures__invoke2_mut__h0ee3583ded983582(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3)); } @@ -229,10 +260,6 @@ function __wbg_get_imports() { imports.wbg.__wbindgen_object_drop_ref = function(arg0) { takeObject(arg0); }; - imports.wbg.__wbindgen_string_new = function(arg0, arg1) { - const ret = getStringFromWasm0(arg0, arg1); - return addHeapObject(ret); - }; imports.wbg.__wbindgen_string_get = function(arg0, arg1) { const obj = getObject(arg1); const ret = typeof(obj) === 'string' ? obj : undefined; @@ -241,6 +268,10 @@ function __wbg_get_imports() { getInt32Memory0()[arg0 / 4 + 1] = len1; getInt32Memory0()[arg0 / 4 + 0] = ptr1; }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; imports.wbg.__wbindgen_number_new = function(arg0) { const ret = arg0; return addHeapObject(ret); @@ -323,7 +354,7 @@ function __wbg_get_imports() { const a = state0.a; state0.a = 0; try { - return __wbg_adapter_41(a, state0.b, arg0, arg1); + return __wbg_adapter_42(a, state0.b, arg0, arg1); } finally { state0.a = a; } @@ -345,8 +376,8 @@ function __wbg_get_imports() { imports.wbg.__wbindgen_throw = function(arg0, arg1) { throw new Error(getStringFromWasm0(arg0, arg1)); }; - imports.wbg.__wbindgen_closure_wrapper142 = function(arg0, arg1, arg2) { - const ret = makeMutClosure(arg0, arg1, 76, __wbg_adapter_20); + imports.wbg.__wbindgen_closure_wrapper146 = function(arg0, arg1, arg2) { + const ret = makeMutClosure(arg0, arg1, 77, __wbg_adapter_20); return addHeapObject(ret); }; diff --git a/public/pkg/encoding_addresses_bg.wasm b/public/pkg/encoding_addresses_bg.wasm index dfe21e6d4693943bd4dc0e0d239d4776894214a2..0af62908634a86f890a6fcf7114ac510f0a1ca89 100644 GIT binary patch delta 28221 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 delta 25860 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%0DD&DijobWn&q=1!ZJVD5BdP{7_9 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 diff --git a/public/pkg/encoding_addresses_bg.wasm.d.ts b/public/pkg/encoding_addresses_bg.wasm.d.ts index 1d7e66bf..eea2801d 100644 --- a/public/pkg/encoding_addresses_bg.wasm.d.ts +++ b/public/pkg/encoding_addresses_bg.wasm.d.ts @@ -2,7 +2,8 @@ /* eslint-disable */ export const memory: WebAssembly.Memory; export function concat_hex_addresses(a: number, b: number): void; -export function cbor_encode_addresses(a: number): number; +export function hex_to_bytes(a: number, b: number, c: number): void; +export function cbor_encode_addresses(a: number, b: number): number; export function __wbindgen_malloc(a: number, b: number): number; export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; export const __wbindgen_export_2: WebAssembly.Table; diff --git a/src/routes/TrackAddresses.svelte b/src/routes/TrackAddresses.svelte index 0420ea02..f7967154 100644 --- a/src/routes/TrackAddresses.svelte +++ b/src/routes/TrackAddresses.svelte @@ -3,11 +3,12 @@ import {timeStampToDate} from "../scripts/helpers.js"; import SftLoader from '../components/SftLoader.svelte'; import {icons} from '../scripts/assets.js'; - import {encodeAddresses, initWasm} from "../wasm_utils.js"; + import {encodeAddresses, hexToBytes, initWasm} from "../wasm_utils.js"; + import {MAGIC_NUMBERS} from '../scripts/consts.js'; + import {arrayify} from 'ethers/lib/utils.js'; - let convertedAddress = ""; - async function convert(addresses) { + async function cborEncodeAddress(addresses) { await initWasm(); return await encodeAddresses(addresses); } @@ -27,9 +28,28 @@ let address = ''; async function addAddress() { - convertedAddress = await convert(addresses.map(a=>a.address)) - console.log(convertedAddress) + let byteAddress = await hexToBytes(address) + // Create a new Uint8Array with a length of 21 bytes + let newArray = new Uint8Array(21); + + // Set the first byte of the new array to 1 + newArray[0] = 1; + + // Copy the contents of the original array to the new array starting from index 1 + newArray.set(byteAddress, 1); + + //Cbor Encode the address + let cborEncoded = await cborEncodeAddress(newArray) + + let rainMagic = arrayify(MAGIC_NUMBERS.RAIN_META_DOCUMENT_HEX_STRING) + + let constructedMeta = new Uint8Array(rainMagic.length + cborEncoded.length); + + constructedMeta.set(rainMagic, 0); + constructedMeta.set(cborEncoded, rainMagic.length); + + console.log("concatenatedBytes", constructedMeta) } function copyAddress(address) { @@ -42,6 +62,32 @@ function removeAddress(address) { console.log(address) } + + async function remove(address) { + + let byteAddress = await hexToBytes(address) + // Create a new Uint8Array with a length of 21 bytes + let newArray = new Uint8Array(21); + + // Set the first byte of the new array to 0 + newArray[0] = 0; + + // Copy the contents of the original array to the new array starting from index 1 + newArray.set(byteAddress, 1); + + //Cbor Encode the address + let cborEncoded = await cborEncodeAddress(newArray) + + let rainMagic = arrayify(MAGIC_NUMBERS.RAIN_META_DOCUMENT_HEX_STRING) + + let constructedMeta = new Uint8Array(rainMagic.length + cborEncoded.length); + + constructedMeta.set(rainMagic, 0); + constructedMeta.set(cborEncoded, rainMagic.length); + + console.log("concatenatedBytes", constructedMeta) + + }

diff --git a/src/scripts/consts.js b/src/scripts/consts.js index 5c8f7d46..18721930 100644 --- a/src/scripts/consts.js +++ b/src/scripts/consts.js @@ -33,6 +33,8 @@ export const MAGIC_NUMBERS = { * Prefixes every rain meta document */ RAIN_META_DOCUMENT: BigInt(0xff0a89c674ee7874n), + + RAIN_META_DOCUMENT_HEX_STRING: "0xff0a89c674ee7874", /**S * OA Schema */ @@ -56,7 +58,7 @@ export const MAGIC_NUMBERS = { /** * OA Token authors */ - AUTHORS_LIST: BigInt(0xffb2637608c09e38) + AUTHORS_LIST: BigInt(0xffb2637608c09e38n) }; export const TRANSACTION_IN_PROGRESS_TEXT = "Transaction taking place, please wait." @@ -83,8 +85,8 @@ export const ROUTE_LABEL_MAP = new Map([ ["#change-comparison", "Change comparison"], ["#address-overview", "Address overview"], ["#knowledgebase", "Knowledgebase"], - ["#ipfs-login","IPFS login"], - ["#track-addresses","Track addresses"] + ["#ipfs-login", "IPFS login"], + ["#track-addresses", "Track addresses"] ]); -export const landingPages = ['', '/', '#', '#transparency', '#investors', '#issuers', '#curators','#auditors'] \ No newline at end of file +export const landingPages = ['', '/', '#', '#transparency', '#investors', '#issuers', '#curators', '#auditors'] \ No newline at end of file diff --git a/src/wasm_utils.js b/src/wasm_utils.js index c2e67a7d..80a0e121 100644 --- a/src/wasm_utils.js +++ b/src/wasm_utils.js @@ -1,6 +1,6 @@ // src/wasmModule.js -import init, { concat_hex_addresses, cbor_encode_addresses} from "../public/pkg/encoding_addresses.js"; +import init, { concat_hex_addresses, cbor_encode_addresses, hex_to_bytes} from "../public/pkg/encoding_addresses.js"; let wasm; @@ -17,4 +17,9 @@ export async function encodeAddresses(hexAddress) { return cbor_encode_addresses(hexAddress); } +export async function hexToBytes(hexStr) { + if (!wasm) await initWasm(); + return hex_to_bytes(hexStr); +} + export { initWasm }; From 89b5e7f8095980e607c69981b953c5b1e566e6f2 Mon Sep 17 00:00:00 2001 From: ninokeldishvili Date: Wed, 3 Apr 2024 12:24:56 +0400 Subject: [PATCH 11/34] Import rainmetadata contract abi and get contract from it --- .../rainMetadata/rainMetadataAbi.json | 56 +++++++++++++++++++ src/routes/TrackAddresses.svelte | 21 ++++++- src/scripts/consts.js | 4 +- 3 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 src/contract/rainMetadata/rainMetadataAbi.json diff --git a/src/contract/rainMetadata/rainMetadataAbi.json b/src/contract/rainMetadata/rainMetadataAbi.json new file mode 100644 index 00000000..3a2efaa0 --- /dev/null +++ b/src/contract/rainMetadata/rainMetadataAbi.json @@ -0,0 +1,56 @@ +[ + { + "inputs": [ + { + "internalType": "bytes", + "name": "unmeta", + "type": "bytes" + } + ], + "name": "NotRainMetaV1", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "subject", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "meta", + "type": "bytes" + } + ], + "name": "MetaV1", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "subject", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "meta", + "type": "bytes" + } + ], + "name": "emitMeta", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] \ No newline at end of file diff --git a/src/routes/TrackAddresses.svelte b/src/routes/TrackAddresses.svelte index f7967154..d77d43f8 100644 --- a/src/routes/TrackAddresses.svelte +++ b/src/routes/TrackAddresses.svelte @@ -1,13 +1,22 @@ diff --git a/src/scripts/consts.js b/src/scripts/consts.js index 13ab4988..9e1228e7 100644 --- a/src/scripts/consts.js +++ b/src/scripts/consts.js @@ -91,4 +91,5 @@ export const ROUTE_LABEL_MAP = new Map([ export const landingPages = ['', '/', '#', '#transparency', '#investors', '#issuers', '#curators', '#auditors'] -export const RAIN_METADATA_CONTRACT_ADDRESS = "0x441f7AF49387295638Eec40577dB67dc5776c683" \ No newline at end of file +export const RAIN_METADATA_CONTRACT_ADDRESS = "0x441f7AF49387295638Eec40577dB67dc5776c683" +export const RAIN_METADATA_CONTRACT_ADDRESS_SEPOLIA = "0x8F61d274aaB5D8CFD82dc266529EAe33020386a9" \ No newline at end of file From 399c8d9791f69cd0c4c6c5d2c0a973773448c705 Mon Sep 17 00:00:00 2001 From: ninokeldishvili Date: Wed, 16 Oct 2024 13:51:06 +0400 Subject: [PATCH 13/34] Get addresses from subgraph --- src/routes/TrackAddresses.svelte | 88 ++++++++++++++++++++++++-------- src/scripts/networksConfig.js | 3 +- 2 files changed, 70 insertions(+), 21 deletions(-) diff --git a/src/routes/TrackAddresses.svelte b/src/routes/TrackAddresses.svelte index d59d45bc..0a7a0705 100644 --- a/src/routes/TrackAddresses.svelte +++ b/src/routes/TrackAddresses.svelte @@ -1,6 +1,9 @@ From a1e535f1a7cdbb273321c361dc6dc5f9d8bdfcdb Mon Sep 17 00:00:00 2001 From: ninokeldishvili Date: Thu, 17 Oct 2024 15:35:29 +0400 Subject: [PATCH 19/34] Filter by removed addresses --- src/routes/TrackAddresses.svelte | 47 +++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/src/routes/TrackAddresses.svelte b/src/routes/TrackAddresses.svelte index cd4723ae..6863e12d 100644 --- a/src/routes/TrackAddresses.svelte +++ b/src/routes/TrackAddresses.svelte @@ -72,24 +72,45 @@ let tempData = data.data; if (tempData.metaV1S?.length > 0) { - let tempAddresses = tempData.metaV1S.map(item => { - let decoded = cborDecode(item.meta.slice(18)); - let myArray = decoded[0].get(0); - //Remove added first byte + let removedAddresses = []; + let tempAddresses = tempData.metaV1S.reduce((acc, item) => { + let decoded = cborDecode(item.meta.slice(18)); + let myArray = decoded[0].get(0); + + // Check if myArray[0] === 0; if true, skip this item + if (myArray[0] === 0) { let newArray = myArray.subarray(1); - // Convert Uint8Array to hex string - let hexString = Array.from(newArray) - .map(byte => byte.toString(16).padStart(2, '0')) - .join(''); - let ethAddress = '0x' + hexString; - return {address: ethAddress, sender: item.sender}; + // Save removed address + removedAddresses.push('0x' + Array.from(newArray) + .map(byte => byte.toString(16).padStart(2, '0')) + .join('')); + return acc; // Skip this element } - ); - addresses = tempAddresses.filter((item, index, self) => + // Remove added first byte + let newArray = myArray.subarray(1); + + // Convert Uint8Array to hex string + let hexString = Array.from(newArray) + .map(byte => byte.toString(16).padStart(2, '0')) + .join(''); + + // Construct Ethereum address + let ethAddress = '0x' + hexString; + + // Add the transformed object to the accumulator + acc.push({address: ethAddress, sender: item.sender}); + + return acc; // Return the updated accumulator + }, []); // Start with an empty array as the accumulator + + // Unique addresses + tempAddresses = tempAddresses.filter((item, index, self) => index === self.findIndex((t) => t.address === item.address) ); + addresses = tempAddresses.filter(item => !removedAddresses.includes(item.address)) + } } } catch (e) { @@ -179,7 +200,7 @@ const tx = await metadataContract.connect(signer)["emitMeta(uint256,bytes)"](1, constructedMeta); let wait = await tx.wait() if (wait.status === 1) { - addresses = addresses.filter(a=>a.address !== address); + addresses = addresses.filter(a => a.address !== address); transactionSuccess.set(true) transactionInProgress.set(false) } else { From cd675f3d3846f68bff691f6f9f2a8992c64f9af4 Mon Sep 17 00:00:00 2001 From: ninokeldishvili Date: Thu, 17 Oct 2024 15:36:33 +0400 Subject: [PATCH 20/34] Remove todo --- src/routes/TrackAddresses.svelte | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/routes/TrackAddresses.svelte b/src/routes/TrackAddresses.svelte index 6863e12d..d2c10d27 100644 --- a/src/routes/TrackAddresses.svelte +++ b/src/routes/TrackAddresses.svelte @@ -38,8 +38,6 @@ } async function getAddresses() { - - //TODO Filter addresses that were deleted const managerAddress = import.meta.env.VITE_MANAGER_ADDRESS; const addresses_subgraph_url = import.meta.env.VITE_ADDRESSES_SUBGRAPH_URL; From f3fcc151403657e400031870c3283536284b1f0f Mon Sep 17 00:00:00 2001 From: ninokeldishvili Date: Thu, 17 Oct 2024 17:08:23 +0400 Subject: [PATCH 21/34] Better solution of remove address logic --- src/routes/TrackAddresses.svelte | 80 ++++++++++++++------------------ 1 file changed, 35 insertions(+), 45 deletions(-) diff --git a/src/routes/TrackAddresses.svelte b/src/routes/TrackAddresses.svelte index d2c10d27..e8cd9a32 100644 --- a/src/routes/TrackAddresses.svelte +++ b/src/routes/TrackAddresses.svelte @@ -32,6 +32,38 @@ await getAddresses(); }) + function processAddresses(metaData) { + const addressActions = {}; + + // Traverse the meta data to process each add/remove action + metaData.forEach(item => { + const decoded = cborDecode(item.meta.slice(18)); // Decode the meta data + const myArray = decoded[0].get(0); + + const actionPrefix = myArray[0]; // 0 for remove, 1 for add + const addressHex = arrayToHex(myArray.subarray(1)); // Extract the address + + // Track the last action for each address (1 for add, 0 for remove) along with the sender + addressActions[addressHex] = {action: actionPrefix, sender: item.sender}; + }); + + // Collect addresses that were added (1) and not subsequently removed (0) + return Object.keys(addressActions) + .filter(address => addressActions[address].action === 1) + .map(address => ({ + address: address, + sender: addressActions[address].sender + })); + } + + + // Helper function to convert Uint8Array to a hex string + function arrayToHex(uint8Array) { + return '0x' + Array.from(uint8Array) + .map(byte => byte.toString(16).padStart(2, '0')) + .join(''); + } + async function cborEncodeAddress(addresses) { await initWasm(); return await encodeAddresses(addresses); @@ -70,45 +102,7 @@ let tempData = data.data; if (tempData.metaV1S?.length > 0) { - let removedAddresses = []; - let tempAddresses = tempData.metaV1S.reduce((acc, item) => { - let decoded = cborDecode(item.meta.slice(18)); - let myArray = decoded[0].get(0); - - // Check if myArray[0] === 0; if true, skip this item - if (myArray[0] === 0) { - let newArray = myArray.subarray(1); - - // Save removed address - removedAddresses.push('0x' + Array.from(newArray) - .map(byte => byte.toString(16).padStart(2, '0')) - .join('')); - return acc; // Skip this element - } - - // Remove added first byte - let newArray = myArray.subarray(1); - - // Convert Uint8Array to hex string - let hexString = Array.from(newArray) - .map(byte => byte.toString(16).padStart(2, '0')) - .join(''); - - // Construct Ethereum address - let ethAddress = '0x' + hexString; - - // Add the transformed object to the accumulator - acc.push({address: ethAddress, sender: item.sender}); - - return acc; // Return the updated accumulator - }, []); // Start with an empty array as the accumulator - - // Unique addresses - tempAddresses = tempAddresses.filter((item, index, self) => - index === self.findIndex((t) => t.address === item.address) - ); - addresses = tempAddresses.filter(item => !removedAddresses.includes(item.address)) - + addresses = processAddresses(tempData.metaV1S); } } } catch (e) { @@ -241,19 +235,15 @@
- - + + - {/each} {/if} - - -
Current addressesDate addedDate added
{copyAddress(ad.address)}}>copy{copyAddress(ad.address)}}> + copy + {ad.address.toLowerCase()} {timeStampToDate(ad?.timestamp, "yy-mm-dd/tt:tt")}{removeAddress(ad.address)}}> + copy +
{copyAddress(ad.address)}}> copy {ad.address.toLowerCase()}{ad?.sender}{ad?.address?.toLowerCase()}{ad?.sender?.toLowerCase()} {removeAddress(ad.address)}}> copy
{/if} From 6b11786c985b1fa681eebe56febf61181fb8c2f2 Mon Sep 17 00:00:00 2001 From: ninokeldishvili Date: Fri, 18 Oct 2024 17:46:36 +0400 Subject: [PATCH 22/34] Contract version change updates --- .../rainMetadata/rainMetadataAbi.json | 79 ++++++++++++------- src/routes/TrackAddresses.svelte | 4 +- src/scripts/consts.js | 2 +- 3 files changed, 52 insertions(+), 33 deletions(-) diff --git a/src/contract/rainMetadata/rainMetadataAbi.json b/src/contract/rainMetadata/rainMetadataAbi.json index 3a2efaa0..8182dd81 100644 --- a/src/contract/rainMetadata/rainMetadataAbi.json +++ b/src/contract/rainMetadata/rainMetadataAbi.json @@ -1,56 +1,75 @@ [ { + "type": "function", + "name": "emitMeta", "inputs": [ { - "internalType": "bytes", - "name": "unmeta", - "type": "bytes" + "name": "subject", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "meta", + "type": "bytes", + "internalType": "bytes" } ], - "name": "NotRainMetaV1", - "type": "error" + "outputs": [], + "stateMutability": "nonpayable" }, { - "anonymous": false, + "type": "function", + "name": "hash", + "inputs": [ + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "pure" + }, + { + "type": "event", + "name": "MetaV1_2", "inputs": [ { - "indexed": false, - "internalType": "address", "name": "sender", - "type": "address" + "type": "address", + "indexed": false, + "internalType": "address" }, { - "indexed": false, - "internalType": "uint256", "name": "subject", - "type": "uint256" + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" }, { - "indexed": false, - "internalType": "bytes", "name": "meta", - "type": "bytes" + "type": "bytes", + "indexed": false, + "internalType": "bytes" } ], - "name": "MetaV1", - "type": "event" + "anonymous": false }, { + "type": "error", + "name": "NotRainMetaV1", "inputs": [ { - "internalType": "uint256", - "name": "subject", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "meta", - "type": "bytes" + "name": "unmeta", + "type": "bytes", + "internalType": "bytes" } - ], - "name": "emitMeta", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + ] } ] \ No newline at end of file diff --git a/src/routes/TrackAddresses.svelte b/src/routes/TrackAddresses.svelte index e8cd9a32..a95b18f4 100644 --- a/src/routes/TrackAddresses.svelte +++ b/src/routes/TrackAddresses.svelte @@ -147,8 +147,8 @@ constructedMeta.set(rainMagic, 0); constructedMeta.set(cborEncoded, rainMagic.length); - - let tx = await metadataContract.connect(signer)["emitMeta(uint256,bytes)"](1, constructedMeta); + let subject = "0x0000000000000000000000000000000000000000000000000000000000000001" + let tx = await metadataContract.connect(signer)["emitMeta(bytes32,bytes)"](subject, constructedMeta); await showPrompt(tx) let wait = await tx.wait() diff --git a/src/scripts/consts.js b/src/scripts/consts.js index 9e1228e7..93f2dfe7 100644 --- a/src/scripts/consts.js +++ b/src/scripts/consts.js @@ -92,4 +92,4 @@ export const ROUTE_LABEL_MAP = new Map([ export const landingPages = ['', '/', '#', '#transparency', '#investors', '#issuers', '#curators', '#auditors'] export const RAIN_METADATA_CONTRACT_ADDRESS = "0x441f7AF49387295638Eec40577dB67dc5776c683" -export const RAIN_METADATA_CONTRACT_ADDRESS_SEPOLIA = "0x8F61d274aaB5D8CFD82dc266529EAe33020386a9" \ No newline at end of file +export const RAIN_METADATA_CONTRACT_ADDRESS_SEPOLIA = "0xb1d6D10561D4e1792A7c6B336b0529e4bFb5Ea8F" \ No newline at end of file From fe04a1f6b40cc4d31384bf8d9982a554cebc6548 Mon Sep 17 00:00:00 2001 From: ninokeldishvili Date: Fri, 25 Oct 2024 11:17:00 +0400 Subject: [PATCH 23/34] Check manager address to show/hide 'Track Addresses page' --- src/components/Navigation.svelte | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/components/Navigation.svelte b/src/components/Navigation.svelte index d5b57345..88aeeecd 100644 --- a/src/components/Navigation.svelte +++ b/src/components/Navigation.svelte @@ -1,10 +1,13 @@