Skip to content

Commit

Permalink
feat: add dataHash field (#13)
Browse files Browse the repository at this point in the history
Co-authored-by: MantisClone <[email protected]>
  • Loading branch information
benjlevesque and MantisClone authored Dec 13, 2023
1 parent d976208 commit a4910a1
Show file tree
Hide file tree
Showing 13 changed files with 268 additions and 21 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ yarn codegen ./subgraph-private.yaml

```
yarn test
# or, run in Docker
yarn test -d
```

- Build the subgraph. Do this again if you modify the [indexer's code](./src/mapping.ts) or the [graphql schema](./schema.graphql),
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"codegen": "graph codegen",
"build": "graph build",
"test": "graph test",
"test:docker": "graph test -d",
"deploy": "graph deploy --node https://api.thegraph.com/deploy/ --ipfs https://api.thegraph.com/ipfs/ RequestNetwork/request-storage",
"create-local": "graph create --node http://localhost:8020/ RequestNetwork/request-storage",
"remove-local": "graph remove --node http://localhost:8020/ RequestNetwork/request-storage",
Expand Down
4 changes: 3 additions & 1 deletion schema.graphql
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
type Transaction @entity {
"a unique ID based on IPFS hash & position of the transaction in the document"
id: ID!
"IPFS hash"
"IPFS hash (CID) of the block containing this transaction"
hash: String!
"the keccak256 hash of the transaction's contents"
dataHash: String!
channelId: String!
data: String

Expand Down
64 changes: 64 additions & 0 deletions src/hash-utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import { ByteArray, crypto } from "@graphprotocol/graph-ts";
import { Transaction } from "../generated/schema";

// Returns the keccak256 hash of a strings
export function computeHash(data: string): string {
return crypto.keccak256(ByteArray.fromUTF8(data)).toHexString();
}

// Returns a stringified conversion, as would be done by JSON.stringify in JS.
export function serializeTransaction(tx: Transaction): string {
let data = tx.data;
if (data !== null) {
return serializeClearTxData(data);
}
let encryptedData = tx.encryptedData;
if (encryptedData !== null) {
return serializeEncryptedTxData(
encryptedData,
tx.encryptionMethod,
tx.publicKeys,
tx.encryptedKeys,
);
}
return "";
}

export function serializeClearTxData(data: string): string {
const cleanData = data.replaceAll('"', '\\"');
return `{"data":${addQuotes(cleanData)}}`.toLowerCase();
}

export function serializeEncryptedTxData(
data: string,
encryptionMethod: string | null,
publicKeys: string[] | null,
encryptedKeys: string[] | null,
): string {
let str = `{"encryptedData":${addQuotes(data)}`;
if (encryptionMethod !== null) {
str += `,"encryptionMethod":${addQuotes(encryptionMethod)}`;
}
if (encryptedKeys && publicKeys) {
str += ',"keys":';
str += objectToJsonString(publicKeys, encryptedKeys);
}

str += "}";
return str.toLowerCase();
}

// given two arrays keys and values representing the object, returns a stringified JSON object, with sorted keys.
export function objectToJsonString(keys: string[], values: string[]): string {
let result = new Array<string>(keys.length);

for (let i = 0; i < keys.length; ++i) {
result[i] = `${addQuotes(keys[i])}:${addQuotes(values[i])}`;
}

return "{" + result.sort().join(",") + "}";
}

function addQuotes(str: string): string {
return `"${str}"`;
}
3 changes: 2 additions & 1 deletion src/mapping.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Bytes, ipfs, json, JSONValueKind, log } from "@graphprotocol/graph-ts";
import { NewHash } from "../generated/Contract/Contract";
import { Transaction } from "../generated/schema";

import { computeHash, serializeTransaction } from "./hash-utils";
/**
* Handle a NewHash event
*/
Expand Down Expand Up @@ -112,6 +112,7 @@ export function handleNewHash(event: NewHash): void {
[ipfsHash],
);
}
entity.dataHash = computeHash(serializeTransaction(entity));
entity.save();
}
}
22 changes: 22 additions & 0 deletions tests/.docker/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
FROM --platform=linux/x86_64 ubuntu:22.04

ARG DEBIAN_FRONTEND=noninteractive

ENV ARGS=""

RUN apt update \
&& apt install -y sudo curl postgresql postgresql-contrib

RUN curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - \
&& sudo apt-get install -y nodejs

RUN curl -OL https://github.com/LimeChain/matchstick/releases/download/0.6.0/binary-linux-22 \
&& chmod a+x binary-linux-22

RUN mkdir matchstick
WORKDIR /matchstick

# Commenting out for now as it seems there's no need to copy when using bind mount
# COPY ./ .

CMD ../binary-linux-22 ${ARGS}
110 changes: 110 additions & 0 deletions tests/hash-utils.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
import { assert, describe, test } from "matchstick-as";
import {
serializeClearTxData,
computeHash,
serializeEncryptedTxData,
objectToJsonString,
} from "../src/hash-utils";

describe("objectToJsonString", () => {
test("keeps sorted array", () => {
assert.stringEquals(
'{"a":"3","b":"2","c":"1"}',
objectToJsonString(["a", "b", "c"], ["3", "2", "1"]),
);
});
test("sorts reversed array", () => {
assert.stringEquals(
'{"a":"3","b":"2","c":"1"}',
objectToJsonString(["c", "b", "a"], ["1", "2", "3"]),
);
});
test("sorts array 1", () => {
assert.stringEquals(
'{"a":"3","b":"2","c":"1"}',
objectToJsonString(["a", "c", "b"], ["3", "1", "2"]),
);
});
test("sorts array 2", () => {
assert.stringEquals(
'{"a":"3","b":"2","c":"1"}',
objectToJsonString(["b", "c", "a"], ["2", "1", "3"]),
);
});
});

describe("clearTxDataToString", () => {
test("serialize clear data", () => {
assert.stringEquals(
'{"data":"{\\"data\\":{\\"name\\":\\"create\\",\\"parameters\\":{\\"currency\\":{\\"type\\":\\"iso4217\\",\\"value\\":\\"usd\\"},\\"expectedamount\\":\\"1000\\",\\"payee\\":{\\"type\\":\\"ethereumaddress\\",\\"value\\":\\"0x627306090abab3a6e1400e9345bc60c78a8bef57\\"},\\"payer\\":{\\"type\\":\\"ethereumaddress\\",\\"value\\":\\"0xf17f52151ebef6c7334fad080c5704d77216b732\\"},\\"extensionsdata\\":[],\\"timestamp\\":1701173554},\\"version\\":\\"2.0.3\\"},\\"signature\\":{\\"method\\":\\"ecdsa\\",\\"value\\":\\"0x0406ef3942dd1a3ffcc8cd5134d35f46417942b77d068e37b719dd419b063bc4278501e1141172d29e6a2e910e15b00b521d7615d33e022b437accf10fb599091b\\"}}"}',
serializeClearTxData(
'{"data":{"name":"create","parameters":{"currency":{"type":"ISO4217","value":"USD"},"expectedAmount":"1000","payee":{"type":"ethereumAddress","value":"0x627306090abab3a6e1400e9345bc60c78a8bef57"},"payer":{"type":"ethereumAddress","value":"0xf17f52151ebef6c7334fad080c5704d77216b732"},"extensionsData":[],"timestamp":1701173554},"version":"2.0.3"},"signature":{"method":"ecdsa","value":"0x0406ef3942dd1a3ffcc8cd5134d35f46417942b77d068e37b719dd419b063bc4278501e1141172d29e6a2e910e15b00b521d7615d33e022b437accf10fb599091b"}}',
),
);
});
});

describe("encryptedTxDataToString", () => {
test("serialize the first tx of a channel", () => {
// {
// encryptedData: '04ijCiPLRZW+EAE9NENV8WOCjVhOMn4wtIkS+IDLlZaLNqm7NED0sV9LZuQbmubJLJduRCZ9wYvOjPwu4kFaqD7rOFKqN2tFi++iEgPLADGnIoeNXBFo5eS0ekTFqVuV0M3iHFlxmfvWLYOnDwbyheFcrk/nqF1M0quqQdtt1S839wZL9n6Torz6zHhDto52whIX9Y3PNt4uKO+bGHaixKTn8DylHDUuwrCDjSQHDWmZndNwe+EEk+6NefAfD19NJX74pMEcrZw7d2bQKl0eGyFYkG1g6ISZiZxDCodUSjV5kCJJwm3ha7eTr9J/g97EePJSc+e5dXt8aVCtm17BpHBGOTPqHKiLGL79LS3wZyk6JXUD92j13aaGSR9j/xUjErxp1v3o3SR098CmTSfRO4khLykcV51FY8wsz3GhBHoCvN00aNl95YN+KpmuwyRVYbtLnYqPMk2hVRAgxq1zaZK3mLb/tjAGl5i3A1lcY504JRUAvb2Ye/Rg6XW/GAwN7gVw1+0Q3afdBrKJbaiKnnUD7cPFIb+3Na/D+0s3dd003TzY/ESJOn+J44ItsOL8deKnlKaNVmnEbJN/dvovYFQ+zFU6paO5oqsM3Ea/6hPUBQwyzr/YGnWPSC+y3awQBtbAq8XsUHWOWm94KVhDR64OjWaYjvoXCmtFWDzvG1ACMvKv3f2CcNTz4JcDFCB3cjmJOXbp99ywHyAM6EtkMfNS4w01ZfA+X9UgjY',
// keys: {
// '20af083f77f1ffd54218d91491afd06c9296eac3ce': '02d23775d7cabbc6a3895e1f4be4d522f00237c9c4f8b3623f57e76e6608ab6f0d0f683b878d7e755fcb95fdd56b9f69c0ca8edc6f8a6350dbae9f4698046470b6784a208e4c6039f93dda00f33b4eec6bdbfa1ffb4bd6b4dff145149564336bd6768dfb22986cfb883959c529205b4192def31c40324fc06aad462c3585f4409cd6'
// },
// encryptionMethod: 'ecies-aes256-gcm'
// }
assert.stringEquals(
'{"encrypteddata":"04ijciplrzw+eae9nenv8wocjvhomn4wtiks+idllzalnqm7ned0sv9lzuqbmubjljdurcz9wyvojpwu4kfaqd7rofkqn2tfi++iegpladgnioenxbfo5es0ektfqvuv0m3ihflxmfvwlyondwbyhefcrk/nqf1m0quqqdtt1s839wzl9n6torz6zhhdto52whix9y3pnt4uko+bghaixktn8dylhduuwrcdjsqhdwmzndnwe+eek+6nefafd19njx74pmecrzw7d2bqkl0egyfykg1g6iszizxdcodusjv5kcjjwm3ha7etr9j/g97eepjsc+e5dxt8avctm17bphbgotpqhkilgl79ls3wzyk6jxud92j13aagsr9j/xujerxp1v3o3sr098cmtsfro4khlykcv51fy8wsz3ghbhocvn00anl95yn+kpmuwyrvybtlnyqpmk2hvragxq1zazk3mlb/tjagl5i3a1lcy504jruavb2ye/rg6xw/gawn7gvw1+0q3afdbrkjbaiknnud7cpfib+3na/d+0s3dd003tzy/esjon+j44itsol8deknlkanvmnebjn/dvovyfq+zfu6pao5oqsm3ea/6hpubqwyzr/ygnwpsc+y3awqbtbaq8xsuhwowm94kvhdr64ojwayjvoxcmtfwdzvg1acmvkv3f2ccntz4jcdfcb3cjmjoxbp99ywhyam6etkmfns4w01zfa+x9ugjy","encryptionmethod":"ecies-aes256-gcm","keys":{"20af083f77f1ffd54218d91491afd06c9296eac3ce":"02d23775d7cabbc6a3895e1f4be4d522f00237c9c4f8b3623f57e76e6608ab6f0d0f683b878d7e755fcb95fdd56b9f69c0ca8edc6f8a6350dbae9f4698046470b6784a208e4c6039f93dda00f33b4eec6bdbfa1ffb4bd6b4dff145149564336bd6768dfb22986cfb883959c529205b4192def31c40324fc06aad462c3585f4409cd6"}}',
serializeEncryptedTxData(
"04ijCiPLRZW+EAE9NENV8WOCjVhOMn4wtIkS+IDLlZaLNqm7NED0sV9LZuQbmubJLJduRCZ9wYvOjPwu4kFaqD7rOFKqN2tFi++iEgPLADGnIoeNXBFo5eS0ekTFqVuV0M3iHFlxmfvWLYOnDwbyheFcrk/nqF1M0quqQdtt1S839wZL9n6Torz6zHhDto52whIX9Y3PNt4uKO+bGHaixKTn8DylHDUuwrCDjSQHDWmZndNwe+EEk+6NefAfD19NJX74pMEcrZw7d2bQKl0eGyFYkG1g6ISZiZxDCodUSjV5kCJJwm3ha7eTr9J/g97EePJSc+e5dXt8aVCtm17BpHBGOTPqHKiLGL79LS3wZyk6JXUD92j13aaGSR9j/xUjErxp1v3o3SR098CmTSfRO4khLykcV51FY8wsz3GhBHoCvN00aNl95YN+KpmuwyRVYbtLnYqPMk2hVRAgxq1zaZK3mLb/tjAGl5i3A1lcY504JRUAvb2Ye/Rg6XW/GAwN7gVw1+0Q3afdBrKJbaiKnnUD7cPFIb+3Na/D+0s3dd003TzY/ESJOn+J44ItsOL8deKnlKaNVmnEbJN/dvovYFQ+zFU6paO5oqsM3Ea/6hPUBQwyzr/YGnWPSC+y3awQBtbAq8XsUHWOWm94KVhDR64OjWaYjvoXCmtFWDzvG1ACMvKv3f2CcNTz4JcDFCB3cjmJOXbp99ywHyAM6EtkMfNS4w01ZfA+X9UgjY",
"ecies-aes256-gcm",
["20af083f77f1ffd54218d91491afd06c9296eac3ce"],
[
"02d23775d7cabbc6a3895e1f4be4d522f00237c9c4f8b3623f57e76e6608ab6f0d0f683b878d7e755fcb95fdd56b9f69c0ca8edc6f8a6350dbae9f4698046470b6784a208e4c6039f93dda00f33b4eec6bdbfa1ffb4bd6b4dff145149564336bd6768dfb22986cfb883959c529205b4192def31c40324fc06aad462c3585f4409cd6",
],
),
);
});

test("serialize a subsequent tx in a channel", () => {
// {
// encryptedData: '046n4mpAtKtnmPVNRsui3XWFhifV0Rp4Bw+o0ydt7JVVIj81s9eDuSqZD4ALFvoHFHikKXKO0QZKieoLA3izvIGRvQbWboFwkpYDtlIw6FOQEbBl53l5R5WsdNpDsA1lzX2ipYbXnjva+YEXbddDMObAMdP7+8Xv4lsfukEHsUx556qxXEzAxCrl0DiWxpNFFc/SFkatyWvqdZ9H6blqkozaMYe+xMsiKf5h2PLD5WC23f8R+xJk5e11oEw1921gwO7vDix631Lsbf8KOAvdm04qCbk/I/EG/nLSKTdAUoUv+RcvqU9ybTc8VfHtrW3Fy2IOWbtFT8HGc+XTJIs2+oaygBUQ6DqqKjgXPhXDC1kIejQoWvqCD1TJ5BNRsUU5pV5EtxhYppe6JfDJ984iDYOwiAax+l05HkTxx8vHe84x3aOT875E32M1RtLB/8G6WniHA5abQ1LCyqN0ok/kiZoz6wxdaqmltCFRyIpyc9w89+CiFcgO5dLKp7zfngDfdnXlcdz1+z3Hh04+o6JMm7'
// }
assert.stringEquals(
'{"encrypteddata":"046n4mpatktnmpvnrsui3xwfhifv0rp4bw+o0ydt7jvvij81s9edusqzd4alfvohfhikkxko0qzkieola3izvigrvqbwbofwkpydtliw6foqebbl53l5r5wsdnpdsa1lzx2ipybxnjva+yexbdddmobamdp7+8xv4lsfukehsux556qxxezaxcrl0diwxpnffc/sfkatywvqdz9h6blqkozamye+xmsikf5h2pld5wc23f8r+xjk5e11oew1921gwo7vdix631lsbf8koavdm04qcbk/i/eg/nlsktdauouv+rcvqu9ybtc8vfhtrw3fy2iowbtft8hgc+xtjis2+oaygbuq6dqqkjgxphxdc1kiejqowvqcd1tj5bnrsuu5pv5etxhyppe6jfdj984idyowiaax+l05hktxx8vhe84x3aot875e32m1rtlb/8g6wniha5abq1lcyqn0ok/kizoz6wxdaqmltcfryipyc9w89+cifcgo5dlkp7zfngdfdnxlcdz1+z3hh04+o6jmm7"}',
serializeEncryptedTxData(
"046n4mpAtKtnmPVNRsui3XWFhifV0Rp4Bw+o0ydt7JVVIj81s9eDuSqZD4ALFvoHFHikKXKO0QZKieoLA3izvIGRvQbWboFwkpYDtlIw6FOQEbBl53l5R5WsdNpDsA1lzX2ipYbXnjva+YEXbddDMObAMdP7+8Xv4lsfukEHsUx556qxXEzAxCrl0DiWxpNFFc/SFkatyWvqdZ9H6blqkozaMYe+xMsiKf5h2PLD5WC23f8R+xJk5e11oEw1921gwO7vDix631Lsbf8KOAvdm04qCbk/I/EG/nLSKTdAUoUv+RcvqU9ybTc8VfHtrW3Fy2IOWbtFT8HGc+XTJIs2+oaygBUQ6DqqKjgXPhXDC1kIejQoWvqCD1TJ5BNRsUU5pV5EtxhYppe6JfDJ984iDYOwiAax+l05HkTxx8vHe84x3aOT875E32M1RtLB/8G6WniHA5abQ1LCyqN0ok/kiZoz6wxdaqmltCFRyIpyc9w89+CiFcgO5dLKp7zfngDfdnXlcdz1+z3Hh04+o6JMm7",
null,
null,
null,
),
);
});

test("serialize multiple keys in non-alphabetical order", () => {
assert.stringEquals(
'{"encrypteddata":"abcd","encryptionmethod":"xx","keys":{"aa":"zz","bb":"xx"}}',
serializeEncryptedTxData("abcd", "xx", ["bb", "aa"], ["xx", "zz"]),
);
});
});

describe("computeHash", () => {
test("clear transaction", () => {
assert.stringEquals(
"0x09c043a7cb846a048c2e665b832add72046fd9913e05f0c20e7f4f360ce62a8d",
computeHash(
'{"data":"{\\"data\\":{\\"name\\":\\"create\\",\\"parameters\\":{\\"currency\\":{\\"type\\":\\"iso4217\\",\\"value\\":\\"usd\\"},\\"expectedamount\\":\\"1000\\",\\"payee\\":{\\"type\\":\\"ethereumaddress\\",\\"value\\":\\"0x627306090abab3a6e1400e9345bc60c78a8bef57\\"},\\"payer\\":{\\"type\\":\\"ethereumaddress\\",\\"value\\":\\"0xf17f52151ebef6c7334fad080c5704d77216b732\\"},\\"extensionsdata\\":[],\\"timestamp\\":1701173554},\\"version\\":\\"2.0.3\\"},\\"signature\\":{\\"method\\":\\"ecdsa\\",\\"value\\":\\"0x0406ef3942dd1a3ffcc8cd5134d35f46417942b77d068e37b719dd419b063bc4278501e1141172d29e6a2e910e15b00b521d7615d33e022b437accf10fb599091b\\"}}"}',
),
);
});

test("encrypted transaction", () => {
assert.stringEquals(
"0x3e4bc69070baf9ed30ef58b87b454fd19841f18dd83f7dbe8b311bb32befc483",
computeHash(
'{"encrypteddata":"04ijciplrzw+eae9nenv8wocjvhomn4wtiks+idllzalnqm7ned0sv9lzuqbmubjljdurcz9wyvojpwu4kfaqd7rofkqn2tfi++iegpladgnioenxbfo5es0ektfqvuv0m3ihflxmfvwlyondwbyhefcrk/nqf1m0quqqdtt1s839wzl9n6torz6zhhdto52whix9y3pnt4uko+bghaixktn8dylhduuwrcdjsqhdwmzndnwe+eek+6nefafd19njx74pmecrzw7d2bqkl0egyfykg1g6iszizxdcodusjv5kcjjwm3ha7etr9j/g97eepjsc+e5dxt8avctm17bphbgotpqhkilgl79ls3wzyk6jxud92j13aagsr9j/xujerxp1v3o3sr098cmtsfro4khlykcv51fy8wsz3ghbhocvn00anl95yn+kpmuwyrvybtlnyqpmk2hvragxq1zazk3mlb/tjagl5i3a1lcy504jruavb2ye/rg6xw/gawn7gvw1+0q3afdbrkjbaiknnud7cpfib+3na/d+0s3dd003tzy/esjon+j44itsol8deknlkanvmnebjn/dvovyfq+zfu6pao5oqsm3ea/6hpubqwyzr/ygnwpsc+y3awqbtbaq8xsuhwowm94kvhdr64ojwayjvoxcmtfwdzvg1acmvkv3f2ccntz4jcdfcb3cjmjoxbp99ywhyam6etkmfns4w01zfa+x9ugjy","encryptionmethod":"ecies-aes256-gcm","keys":{"20af083f77f1ffd54218d91491afd06c9296eac3ce":"02d23775d7cabbc6a3895e1f4be4d522f00237c9c4f8b3623f57e76e6608ab6f0d0f683b878d7e755fcb95fdd56b9f69c0ca8edc6f8a6350dbae9f4698046470b6784a208e4c6039f93dda00f33b4eec6bdbfa1ffb4bd6b4dff145149564336bd6768dfb22986cfb883959c529205b4192def31c40324fc06aad462c3585f4409cd6"}}',
),
);
});
});
16 changes: 16 additions & 0 deletions tests/ipfs/transaction-clear.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"header": {
"channelIds": {
"channel1": [0]
},
"topics": {
"channel1": ["topic1"]
},
"version": "0.1.0"
},
"transactions": [
{
"data": "{\"data\":{\"name\":\"create\",\"parameters\":{\"currency\":{\"type\":\"ISO4217\",\"value\":\"USD\"},\"expectedAmount\":\"1000\",\"payee\":{\"type\":\"ethereumAddress\",\"value\":\"0x627306090abab3a6e1400e9345bc60c78a8bef57\"},\"payer\":{\"type\":\"ethereumAddress\",\"value\":\"0xf17f52151ebef6c7334fad080c5704d77216b732\"},\"extensionsData\":[],\"timestamp\":1701173554},\"version\":\"2.0.3\"},\"signature\":{\"method\":\"ecdsa\",\"value\":\"0x0406ef3942dd1a3ffcc8cd5134d35f46417942b77d068e37b719dd419b063bc4278501e1141172d29e6a2e910e15b00b521d7615d33e022b437accf10fb599091b\"}}"
}
]
}
File renamed without changes.
16 changes: 0 additions & 16 deletions tests/ipfs/transaction-data-string.json

This file was deleted.

20 changes: 20 additions & 0 deletions tests/ipfs/transaction-encrypted.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"header": {
"channelIds": {
"channel1": [0]
},
"topics": {
"channel1": ["topic1"]
},
"version": "0.1.0"
},
"transactions": [
{
"encryptedData": "04ijCiPLRZW+EAE9NENV8WOCjVhOMn4wtIkS+IDLlZaLNqm7NED0sV9LZuQbmubJLJduRCZ9wYvOjPwu4kFaqD7rOFKqN2tFi++iEgPLADGnIoeNXBFo5eS0ekTFqVuV0M3iHFlxmfvWLYOnDwbyheFcrk/nqF1M0quqQdtt1S839wZL9n6Torz6zHhDto52whIX9Y3PNt4uKO+bGHaixKTn8DylHDUuwrCDjSQHDWmZndNwe+EEk+6NefAfD19NJX74pMEcrZw7d2bQKl0eGyFYkG1g6ISZiZxDCodUSjV5kCJJwm3ha7eTr9J/g97EePJSc+e5dXt8aVCtm17BpHBGOTPqHKiLGL79LS3wZyk6JXUD92j13aaGSR9j/xUjErxp1v3o3SR098CmTSfRO4khLykcV51FY8wsz3GhBHoCvN00aNl95YN+KpmuwyRVYbtLnYqPMk2hVRAgxq1zaZK3mLb/tjAGl5i3A1lcY504JRUAvb2Ye/Rg6XW/GAwN7gVw1+0Q3afdBrKJbaiKnnUD7cPFIb+3Na/D+0s3dd003TzY/ESJOn+J44ItsOL8deKnlKaNVmnEbJN/dvovYFQ+zFU6paO5oqsM3Ea/6hPUBQwyzr/YGnWPSC+y3awQBtbAq8XsUHWOWm94KVhDR64OjWaYjvoXCmtFWDzvG1ACMvKv3f2CcNTz4JcDFCB3cjmJOXbp99ywHyAM6EtkMfNS4w01ZfA+X9UgjY",
"keys": {
"20af083f77f1ffd54218d91491afd06c9296eac3ce": "02d23775d7cabbc6a3895e1f4be4d522f00237c9c4f8b3623f57e76e6608ab6f0d0f683b878d7e755fcb95fdd56b9f69c0ca8edc6f8a6350dbae9f4698046470b6784a208e4c6039f93dda00f33b4eec6bdbfa1ffb4bd6b4dff145149564336bd6768dfb22986cfb883959c529205b4192def31c40324fc06aad462c3585f4409cd6"
},
"encryptionMethod": "ecies-aes256-gcm"
}
]
}
25 changes: 22 additions & 3 deletions tests/transaction-data.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,32 @@ describe("Transaction Data", () => {
clearStore();
});

test("should process transactions", () => {
processIpfs("transaction-data-string.json");
test("should process clear transactions", () => {
processIpfs("transaction-clear.json");
assert.entityCount("Transaction", 1);
assert.fieldEquals("Transaction", "testIpfsHash-0", "hash", "testIpfsHash");
assert.fieldEquals(
"Transaction",
"testIpfsHash-0",
"dataHash",
"0x09c043a7cb846a048c2e665b832add72046fd9913e05f0c20e7f4f360ce62a8d",
);
});

test("should process encrypted transactions", () => {
processIpfs("transaction-encrypted.json");
assert.entityCount("Transaction", 1);
assert.fieldEquals("Transaction", "testIpfsHash-0", "hash", "testIpfsHash");
assert.fieldEquals(
"Transaction",
"testIpfsHash-0",
"dataHash",
"0x3e4bc69070baf9ed30ef58b87b454fd19841f18dd83f7dbe8b311bb32befc483",
);
});

test("should ignore wrong transaction data", () => {
processIpfs("transaction-data-object.json");
processIpfs("transaction-data-invalid-object.json");
assert.entityCount("Transaction", 0);
});
});
6 changes: 6 additions & 0 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"compilerOptions": {
"target": "es2021",
"moduleResolution": "node"
}
}

0 comments on commit a4910a1

Please sign in to comment.