diff --git a/package.json b/package.json index 5cf4b6f..4ee67d1 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "typescript": "^4.4.2" }, "dependencies": { - "@fluencelabs/fluence": "0.13.0", + "@fluencelabs/fluence": "0.10.4-async-454.0", "@fluencelabs/fluence-network-environment": "1.0.10", "@types/sqlite3": "^3.1.7", "ethers": "^5.4.7", diff --git a/src/_aqua/snapshot.ts b/src/_aqua/snapshot.ts new file mode 100644 index 0000000..4940083 --- /dev/null +++ b/src/_aqua/snapshot.ts @@ -0,0 +1,713 @@ +/** + * + * This file is auto-generated. Do not edit manually: changes may be erased. + * Generated by Aqua compiler: https://github.com/fluencelabs/aqua/. + * If you find any bugs, please write an issue on GitHub: https://github.com/fluencelabs/aqua/issues + * Aqua version: 0.3.1-231 + * + */ +import { Fluence, FluencePeer } from "@fluencelabs/fluence"; +import { + ResultCodes, + RequestFlow, + RequestFlowBuilder, + CallParams, +} from "@fluencelabs/fluence/dist/internal/compilerSupport/v1"; + +function missingFields(obj: any, fields: string[]): string[] { + return fields.filter((f) => !(f in obj)); +} + +// Services + +export interface ProVoValidationDef { + eip712_validation_string: ( + eip_str: string, + peer_id: string, + callParams: CallParams<"eip_str" | "peer_id"> + ) => string | Promise; + eip712_validation_url: ( + eip_str: string, + peer_id: string, + callParams: CallParams<"eip_str" | "peer_id"> + ) => string | Promise; +} + +export function registerProVoValidation(service: ProVoValidationDef): void; +export function registerProVoValidation( + serviceId: string, + service: ProVoValidationDef +): void; +export function registerProVoValidation( + peer: FluencePeer, + service: ProVoValidationDef +): void; +export function registerProVoValidation( + peer: FluencePeer, + serviceId: string, + service: ProVoValidationDef +): void; +export function registerProVoValidation(...args: any) { + let peer: FluencePeer; + let serviceId: any; + let service: any; + if (FluencePeer.isInstance(args[0])) { + peer = args[0]; + } else { + peer = Fluence.getPeer(); + } + + if (typeof args[0] === "string") { + serviceId = args[0]; + } else if (typeof args[1] === "string") { + serviceId = args[1]; + } else { + serviceId = "eip_validation"; + } + + // Figuring out which overload is the await service. + // If the first argument is not Fluence Peer and it is an object, then it can only be the service def + // If the first argument is peer, we are checking further. The second argument might either be + // an object, that it must be the service object + // or a string, which is the service id. In that case the service is the third argument + if (!FluencePeer.isInstance(args[0]) && typeof args[0] === "object") { + service = args[0]; + } else if (typeof args[1] === "object") { + service = args[1]; + } else { + service = args[2]; + } + + const incorrectServiceDefinitions = missingFields(service, [ + "eip712_validation_string", + "eip712_validation_url", + ]); + if (!!incorrectServiceDefinitions.length) { + throw new Error( + "Error registering service ProVoValidation: missing functions: " + + incorrectServiceDefinitions.map((d) => "'" + d + "'").join(", ") + ); + } + + peer.internals.callServiceHandler.use(async (req, resp, next) => { + if (req.serviceId !== serviceId) { + await next(); + return; + } + + if (req.fnName === "eip712_validation_string") { + const callParams = { + ...req.particleContext, + tetraplets: { + eip_str: req.tetraplets[0], + peer_id: req.tetraplets[1], + }, + }; + resp.retCode = ResultCodes.success; + resp.result = await service.eip712_validation_string( + req.args[0], + req.args[1], + callParams + ); + } + + if (req.fnName === "eip712_validation_url") { + const callParams = { + ...req.particleContext, + tetraplets: { + eip_str: req.tetraplets[0], + peer_id: req.tetraplets[1], + }, + }; + resp.retCode = ResultCodes.success; + resp.result = await service.eip712_validation_url( + req.args[0], + req.args[1], + callParams + ); + } + + await next(); + }); +} + +export interface DataProviderDef { + get_record: ( + snapshot_id: number, + callParams: CallParams<"snapshot_id"> + ) => { snapshot_id: number }; + get_records: (callParams: CallParams) => { snapshot_id: number }[]; +} + +export function registerDataProvider(service: DataProviderDef): void; +export function registerDataProvider( + serviceId: string, + service: DataProviderDef +): void; +export function registerDataProvider( + peer: FluencePeer, + service: DataProviderDef +): void; +export function registerDataProvider( + peer: FluencePeer, + serviceId: string, + service: DataProviderDef +): void; +export function registerDataProvider(...args: any) { + let peer: FluencePeer; + let serviceId: any; + let service: any; + if (FluencePeer.isInstance(args[0])) { + peer = args[0]; + } else { + peer = Fluence.getPeer(); + } + + if (typeof args[0] === "string") { + serviceId = args[0]; + } else if (typeof args[1] === "string") { + serviceId = args[1]; + } else { + serviceId = ""; + } + + // Figuring out which overload is the await service. + // If the first argument is not Fluence Peer and it is an object, then it can only be the service def + // If the first argument is peer, we are checking further. The second argument might either be + // an object, that it must be the service object + // or a string, which is the service id. In that case the service is the third argument + if (!FluencePeer.isInstance(args[0]) && typeof args[0] === "object") { + service = args[0]; + } else if (typeof args[1] === "object") { + service = args[1]; + } else { + service = args[2]; + } + + const incorrectServiceDefinitions = missingFields(service, [ + "get_record", + "get_records", + ]); + if (!!incorrectServiceDefinitions.length) { + throw new Error( + "Error registering service DataProvider: missing functions: " + + incorrectServiceDefinitions.map((d) => "'" + d + "'").join(", ") + ); + } + + peer.internals.callServiceHandler.use(async (req, resp, next) => { + if (req.serviceId !== serviceId) { + await next(); + return; + } + + if (req.fnName === "get_record") { + const callParams = { + ...req.particleContext, + tetraplets: { + snapshot_id: req.tetraplets[0], + }, + }; + resp.retCode = ResultCodes.success; + resp.result = await service.get_record(req.args[0], callParams); + } + + if (req.fnName === "get_records") { + const callParams = { + ...req.particleContext, + tetraplets: {}, + }; + resp.retCode = ResultCodes.success; + resp.result = await service.get_records(callParams); + } + + await next(); + }); +} + +// Functions + +export function validate( + relay: string, + peer_: string, + eip712_json: string, + config?: { ttl?: number } +): Promise; +export function validate( + peer: FluencePeer, + relay: string, + peer_: string, + eip712_json: string, + config?: { ttl?: number } +): Promise; +export function validate(...args: any) { + let peer: FluencePeer; + let relay: any; + let peer_: any; + let eip712_json: any; + let config: any; + if (FluencePeer.isInstance(args[0])) { + peer = args[0]; + relay = args[1]; + peer_ = args[2]; + eip712_json = args[3]; + config = args[4]; + } else { + peer = Fluence.getPeer(); + relay = args[0]; + peer_ = args[1]; + eip712_json = args[2]; + config = args[3]; + } + + let request: RequestFlow; + const promise = new Promise((resolve, reject) => { + const r = new RequestFlowBuilder() + .disableInjections() + .withRawScript( + ` + (xor + (seq + (seq + (seq + (seq + (seq + (seq + (seq + (seq + (seq + (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) + (call %init_peer_id% ("getDataSrv" "relay") [] relay) + ) + (call %init_peer_id% ("getDataSrv" "peer") [] peer) + ) + (call %init_peer_id% ("getDataSrv" "eip712_json") [] eip712_json) + ) + (call -relay- ("op" "noop") []) + ) + (call relay ("op" "noop") []) + ) + (xor + (call peer ("eip_validation" "eip712_validation_string") [eip712_json peer] result) + (seq + (seq + (seq + (call relay ("op" "noop") []) + (call -relay- ("op" "noop") []) + ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) + ) + (call -relay- ("op" "noop") []) + ) + ) + ) + (call relay ("op" "noop") []) + ) + (call -relay- ("op" "noop") []) + ) + (xor + (call %init_peer_id% ("callbackSrv" "response") [result]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) + ) + ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) + ) + ` + ) + .configHandler((h) => { + h.on("getDataSrv", "-relay-", () => { + return peer.getStatus().relayPeerId; + }); + h.on("getDataSrv", "relay", () => { + return relay; + }); + h.on("getDataSrv", "peer", () => { + return peer_; + }); + h.on("getDataSrv", "eip712_json", () => { + return eip712_json; + }); + h.onEvent("callbackSrv", "response", (args) => { + const [res] = args; + resolve(res); + }); + h.onEvent("errorHandlingSrv", "error", (args) => { + const [err] = args; + reject(err); + }); + }) + .handleScriptError(reject) + .handleTimeout(() => { + reject("Request timed out for validate"); + }); + + if (config && config.ttl) { + r.withTTL(config.ttl); + } + + request = r.build(); + }); + peer.internals.initiateFlow(request!); + return promise; +} + +export function validate_from_url( + relay: string, + peer_: string, + eip712_url: string, + config?: { ttl?: number } +): Promise; +export function validate_from_url( + peer: FluencePeer, + relay: string, + peer_: string, + eip712_url: string, + config?: { ttl?: number } +): Promise; +export function validate_from_url(...args: any) { + let peer: FluencePeer; + let relay: any; + let peer_: any; + let eip712_url: any; + let config: any; + if (FluencePeer.isInstance(args[0])) { + peer = args[0]; + relay = args[1]; + peer_ = args[2]; + eip712_url = args[3]; + config = args[4]; + } else { + peer = Fluence.getPeer(); + relay = args[0]; + peer_ = args[1]; + eip712_url = args[2]; + config = args[3]; + } + + let request: RequestFlow; + const promise = new Promise((resolve, reject) => { + const r = new RequestFlowBuilder() + .disableInjections() + .withRawScript( + ` + (xor + (seq + (seq + (seq + (seq + (seq + (seq + (seq + (seq + (seq + (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) + (call %init_peer_id% ("getDataSrv" "relay") [] relay) + ) + (call %init_peer_id% ("getDataSrv" "peer") [] peer) + ) + (call %init_peer_id% ("getDataSrv" "eip712_url") [] eip712_url) + ) + (call -relay- ("op" "noop") []) + ) + (call relay ("op" "noop") []) + ) + (xor + (call peer ("eip_validation" "eip712_validation_url") [eip712_url peer] result) + (seq + (seq + (seq + (call relay ("op" "noop") []) + (call -relay- ("op" "noop") []) + ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) + ) + (call -relay- ("op" "noop") []) + ) + ) + ) + (call relay ("op" "noop") []) + ) + (call -relay- ("op" "noop") []) + ) + (xor + (call %init_peer_id% ("callbackSrv" "response") [result]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) + ) + ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) + ) + ` + ) + .configHandler((h) => { + h.on("getDataSrv", "-relay-", () => { + return peer.getStatus().relayPeerId; + }); + h.on("getDataSrv", "relay", () => { + return relay; + }); + h.on("getDataSrv", "peer", () => { + return peer_; + }); + h.on("getDataSrv", "eip712_url", () => { + return eip712_url; + }); + h.onEvent("callbackSrv", "response", (args) => { + const [res] = args; + resolve(res); + }); + h.onEvent("errorHandlingSrv", "error", (args) => { + const [err] = args; + reject(err); + }); + }) + .handleScriptError(reject) + .handleTimeout(() => { + reject("Request timed out for validate_from_url"); + }); + + if (config && config.ttl) { + r.withTTL(config.ttl); + } + + request = r.build(); + }); + peer.internals.initiateFlow(request!); + return promise; +} + +export function get_record( + relay: string, + peer_: string, + snapshot_id: number, + config?: { ttl?: number } +): Promise<{ snapshot_id: number }>; +export function get_record( + peer: FluencePeer, + relay: string, + peer_: string, + snapshot_id: number, + config?: { ttl?: number } +): Promise<{ snapshot_id: number }>; +export function get_record(...args: any) { + let peer: FluencePeer; + let relay: any; + let peer_: any; + let snapshot_id: any; + let config: any; + if (FluencePeer.isInstance(args[0])) { + peer = args[0]; + relay = args[1]; + peer_ = args[2]; + snapshot_id = args[3]; + config = args[4]; + } else { + peer = Fluence.getPeer(); + relay = args[0]; + peer_ = args[1]; + snapshot_id = args[2]; + config = args[3]; + } + + let request: RequestFlow; + const promise = new Promise<{ snapshot_id: number }>((resolve, reject) => { + const r = new RequestFlowBuilder() + .disableInjections() + .withRawScript( + ` + (xor + (seq + (seq + (seq + (seq + (seq + (seq + (seq + (seq + (seq + (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) + (call %init_peer_id% ("getDataSrv" "relay") [] relay) + ) + (call %init_peer_id% ("getDataSrv" "peer") [] peer) + ) + (call %init_peer_id% ("getDataSrv" "snapshot_id") [] snapshot_id) + ) + (call -relay- ("op" "noop") []) + ) + (call relay ("op" "noop") []) + ) + (xor + (call peer ("" "get_record") [snapshot_id] result) + (seq + (seq + (seq + (call relay ("op" "noop") []) + (call -relay- ("op" "noop") []) + ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) + ) + (call -relay- ("op" "noop") []) + ) + ) + ) + (call relay ("op" "noop") []) + ) + (call -relay- ("op" "noop") []) + ) + (xor + (call %init_peer_id% ("callbackSrv" "response") [result]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) + ) + ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) + ) + ` + ) + .configHandler((h) => { + h.on("getDataSrv", "-relay-", () => { + return peer.getStatus().relayPeerId; + }); + h.on("getDataSrv", "relay", () => { + return relay; + }); + h.on("getDataSrv", "peer", () => { + return peer_; + }); + h.on("getDataSrv", "snapshot_id", () => { + return snapshot_id; + }); + h.onEvent("callbackSrv", "response", (args) => { + const [res] = args; + resolve(res); + }); + h.onEvent("errorHandlingSrv", "error", (args) => { + const [err] = args; + reject(err); + }); + }) + .handleScriptError(reject) + .handleTimeout(() => { + reject("Request timed out for get_record"); + }); + + if (config && config.ttl) { + r.withTTL(config.ttl); + } + + request = r.build(); + }); + peer.internals.initiateFlow(request!); + return promise; +} + +export function get_records( + relay: string, + peer_: string, + config?: { ttl?: number } +): Promise<{ snapshot_id: number }[]>; +export function get_records( + peer: FluencePeer, + relay: string, + peer_: string, + config?: { ttl?: number } +): Promise<{ snapshot_id: number }[]>; +export function get_records(...args: any) { + let peer: FluencePeer; + let relay: any; + let peer_: any; + let config: any; + if (FluencePeer.isInstance(args[0])) { + peer = args[0]; + relay = args[1]; + peer_ = args[2]; + config = args[3]; + } else { + peer = Fluence.getPeer(); + relay = args[0]; + peer_ = args[1]; + config = args[2]; + } + + let request: RequestFlow; + const promise = new Promise<{ snapshot_id: number }[]>((resolve, reject) => { + const r = new RequestFlowBuilder() + .disableInjections() + .withRawScript( + ` + (xor + (seq + (seq + (seq + (seq + (seq + (seq + (seq + (seq + (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) + (call %init_peer_id% ("getDataSrv" "relay") [] relay) + ) + (call %init_peer_id% ("getDataSrv" "peer") [] peer) + ) + (call -relay- ("op" "noop") []) + ) + (call relay ("op" "noop") []) + ) + (xor + (call peer ("" "get_records") [] result) + (seq + (seq + (seq + (call relay ("op" "noop") []) + (call -relay- ("op" "noop") []) + ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) + ) + (call -relay- ("op" "noop") []) + ) + ) + ) + (call relay ("op" "noop") []) + ) + (call -relay- ("op" "noop") []) + ) + (xor + (call %init_peer_id% ("callbackSrv" "response") [result]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) + ) + ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) + ) + ` + ) + .configHandler((h) => { + h.on("getDataSrv", "-relay-", () => { + return peer.getStatus().relayPeerId; + }); + h.on("getDataSrv", "relay", () => { + return relay; + }); + h.on("getDataSrv", "peer", () => { + return peer_; + }); + h.onEvent("callbackSrv", "response", (args) => { + const [res] = args; + resolve(res); + }); + h.onEvent("errorHandlingSrv", "error", (args) => { + const [err] = args; + reject(err); + }); + }) + .handleScriptError(reject) + .handleTimeout(() => { + reject("Request timed out for get_records"); + }); + + if (config && config.ttl) { + r.withTTL(config.ttl); + } + + request = r.build(); + }); + peer.internals.initiateFlow(request!); + return promise; +} diff --git a/src/eip_processor.ts b/src/eip_processor.ts index 1ecfffb..ffd4bb7 100644 --- a/src/eip_processor.ts +++ b/src/eip_processor.ts @@ -38,6 +38,7 @@ function check_signature(eip_obj: any): boolean { // export async function eip_validation(eip_str: string, peer_id: string): Promise { export function eip_validation(eip_str: string, peer_id: string): Response { + console.log("eip_str", eip_str) const eip_obj = JSON.parse(eip_str); console.log("eip doc parsed: ", eip_obj); diff --git a/src/index.ts b/src/index.ts index 4b86d7b..66e8806 100644 --- a/src/index.ts +++ b/src/index.ts @@ -19,7 +19,7 @@ function sign_response(wallet: ethers.Wallet, response: Response): Promise { // todo: need to fix this to use local peer key const wallet = create_wallet(); let response = eip_validation(eip712_json, wallet.address); @@ -27,7 +27,7 @@ class EIPValidator implements ProVoValidationDef { const resp_str = JSON.stringify(response); console.log("eip validation response: ", resp_str); - const signed_response = wallet.signMessage(resp_str); + const signed_response = await wallet.signMessage(resp_str); console.log("signed response: ", signed_response); // verify test @@ -39,16 +39,17 @@ class EIPValidator implements ProVoValidationDef { return JSON.stringify(obj); } - eip712_validation_url(eip712_url: string): string { + async eip712_validation_url(eip712_url: string): Promise { - const eip_json: any = got('https://ipfs.fleek.co/ipfs/QmWGzSQFm57ohEq2ATw4UNHWmYU2HkMjtedcNLodYywpmS').json(); + const eip = await got.get('https://ipfs.fleek.co/ipfs/QmWGzSQFm57ohEq2ATw4UNHWmYU2HkMjtedcNLodYywpmS'); + const eip_json = eip.body; // todo: need to fix this to use local peer key const wallet = create_wallet(); let response = eip_validation(eip_json, wallet.address); const resp_str = JSON.stringify(response); - const signed_response = wallet.signMessage(resp_str); + const signed_response = await wallet.signMessage(resp_str); // verify test