From 32899a9319f3f7d68d648db8c38357c806917066 Mon Sep 17 00:00:00 2001 From: p Date: Fri, 15 Nov 2019 13:24:33 +0100 Subject: [PATCH 01/32] first test adding metadata to GenericschemeProposal --- src/mappings/UGenericScheme/schema.graphql | 1 + test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts | 200 ++++++++++++++++++ 2 files changed, 201 insertions(+) create mode 100644 test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts diff --git a/src/mappings/UGenericScheme/schema.graphql b/src/mappings/UGenericScheme/schema.graphql index 9cf0d261..6bdbb3f9 100644 --- a/src/mappings/UGenericScheme/schema.graphql +++ b/src/mappings/UGenericScheme/schema.graphql @@ -1,5 +1,6 @@ type GenericSchemeProposal @entity { id: ID! + meta: String dao: DAO! contractToCall: Bytes! callData: Bytes! diff --git a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts new file mode 100644 index 00000000..99c13173 --- /dev/null +++ b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts @@ -0,0 +1,200 @@ +import { + getContractAddresses, + getOptions, + getWeb3, + sendQuery, + waitUntilTrue, + writeProposalIPFS, +} from './util'; + +const ActionMock = require('@daostack/arc/build/contracts/ActionMock.json'); +const GenericScheme = require('@daostack/arc/build/contracts/UGenericScheme.json'); +const GenesisProtocol = require('@daostack/arc/build/contracts/GenesisProtocol.json'); + +describe('UGeneric Signal Scheme', () => { + let web3; + let addresses; + let opts; + + beforeAll(async () => { + web3 = await getWeb3(); + addresses = getContractAddresses(); + opts = await getOptions(web3); + }); + + it('generic scheme proposal', async () => { + const accounts = web3.eth.accounts.wallet; + + const genericScheme = new web3.eth.Contract( + GenericScheme.abi, + addresses.GenericScheme, + opts, + ); + const genesisProtocol = new web3.eth.Contract( + GenesisProtocol.abi, + addresses.GenesisProtocol, + opts, + ); + + const actionMock = new web3.eth.Contract( + ActionMock.abi, + addresses.ActionMock, + opts, + ); + + let proposalIPFSData = { + description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\nWhat is Lorem Ipsum?\nFrom its medieval origins to the digital era, learn everything there is to know about the ubiquitous lorem ipsum passage.\n\nLorem ipsum used in a magazine layout\nMAGAZINE LAYOUT WITH LOREM IPSUM\nHISTORY, PURPOSE AND USAGE\nLorem ipsum, or lipsum as it is sometimes known, is dummy text used in laying out print, graphic or web designs. The passage is attributed to an unknown typesetter in the 15th century who is thought to have scrambled parts of Cicero\'s De Finibus Bonorum et Malorum for use in a type specimen book. It usually begins with:', + title: 'My Title!', + url: 'http://swift.org/modest', + }; + + let proposalDescription = proposalIPFSData.description; + let proposalTitle = proposalIPFSData.title; + let proposalUrl = proposalIPFSData.url; + + let descHash = await writeProposalIPFS(proposalIPFSData); + let callData = await actionMock.methods.test2(addresses.TestAvatar).encodeABI(); + + async function propose() { + const prop = genericScheme.methods.proposeCall(addresses.TestAvatar, callData, 0, descHash); + const proposalId = await prop.call(); + const { blockNumber } = await prop.send(); + const { timestamp } = await web3.eth.getBlock(blockNumber); + return { proposalId, timestamp }; + } + + const [PASS, FAIL] = [1, 2]; + async function vote({ proposalId, outcome, voter, amount = 0 }) { + const { blockNumber } = await genesisProtocol.methods + .vote(proposalId, outcome, amount, voter) + .send({ from: voter }); + const { timestamp } = await web3.eth.getBlock(blockNumber); + return timestamp; + } + + const { proposalId: p1, timestamp: p1Creation } = await propose(); + + const getProposal = `{ + proposal(id: "${p1}") { + id + descriptionHash + stage + createdAt + executedAt + proposer + votingMachine + + genericScheme { + id + meta + dao { + id + } + contractToCall + callData + value + executed + returnValue + } + scheme { + uGenericSchemeParams { + contractToCall + } + } + } + }`; + + // const metadata = `{ + // Metadata(where: {address: "${addresses.GenesisProtocol.toLowerCase()}"}) { + // data + // } + // }`; + + // let resmetadata = await sendQuery(metadata) + let proposalprint = await sendQuery(getProposal); + console.log(proposalprint); + + + // let proposal = (await sendQuery(getProposal)).proposal; + // expect(proposal).toMatchObject({ + // id: p1, + // descriptionHash: descHash, + // stage: 'Queued', + // createdAt: p1Creation.toString(), + // executedAt: null, + // proposer: web3.eth.defaultAccount.toLowerCase(), + // votingMachine: genesisProtocol.options.address.toLowerCase(), + // + // genericScheme: { + // id: p1, + // dao: { + // id: addresses.TestAvatar.toLowerCase(), + // }, + // contractToCall: actionMock.options.address.toLowerCase(), + // callData, + // value: '0', + // executed: false, + // returnValue: null, + // }, + // scheme: { + // uGenericSchemeParams: { + // contractToCall: actionMock.options.address.toLowerCase(), + // }, + // }, + // }); + // + // await vote({ + // proposalId: p1, + // outcome: PASS, + // voter: accounts[0].address, + // }); + // + // await vote({ + // proposalId: p1, + // outcome: PASS, + // voter: accounts[1].address, + // }); + // + // await vote({ + // proposalId: p1, + // outcome: PASS, + // voter: accounts[2].address, + // }); + // + // let executedAt = await vote({ + // proposalId: p1, + // outcome: PASS, + // voter: accounts[3].address, + // }); + // + // const executedIsIndexed = async () => { + // return (await sendQuery(getProposal)).proposal.executedAt != null; + // }; + // + // await waitUntilTrue(executedIsIndexed); + // + // proposal = (await sendQuery(getProposal)).proposal; + // expect(proposal).toMatchObject({ + // id: p1, + // descriptionHash: descHash, + // stage: 'Executed', + // createdAt: p1Creation.toString(), + // executedAt: executedAt + '', + // proposer: web3.eth.defaultAccount.toLowerCase(), + // votingMachine: genesisProtocol.options.address.toLowerCase(), + // + // genericScheme: { + // id: p1, + // dao: { + // id: addresses.TestAvatar.toLowerCase(), + // }, + // contractToCall: actionMock.options.address.toLowerCase(), + // callData, + // value: '0', + // executed: true, + // returnValue: '0x0000000000000000000000000000000000000000000000000000000000000001', + // }, + // }); + + }, 100000); +}); From b688aca9c95a58731bd6b183a8d7a643ae485c1e Mon Sep 17 00:00:00 2001 From: p Date: Sat, 16 Nov 2019 17:59:22 +0100 Subject: [PATCH 02/32] Add Meta Field (string) to Generic Scheme Proposal. When Proposal is Procesed (after Voting) write "Hello World" into Meta. Run npm run test -- test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts --- src/mappings/UGenericScheme/mapping.ts | 2 +- test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts | 173 +++++++++--------- 2 files changed, 91 insertions(+), 84 deletions(-) diff --git a/src/mappings/UGenericScheme/mapping.ts b/src/mappings/UGenericScheme/mapping.ts index b057263a..50d26c73 100644 --- a/src/mappings/UGenericScheme/mapping.ts +++ b/src/mappings/UGenericScheme/mapping.ts @@ -48,6 +48,6 @@ export function handleProposalExecuted( ent.executed = true; ent.returnValue = event.params._genericCallReturnValue; } - + ent.meta = 'Hello world' store.set('GenericSchemeProposal', event.params._proposalId.toHex(), ent); } diff --git a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts index 99c13173..86879859 100644 --- a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts +++ b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts @@ -11,7 +11,7 @@ const ActionMock = require('@daostack/arc/build/contracts/ActionMock.json'); const GenericScheme = require('@daostack/arc/build/contracts/UGenericScheme.json'); const GenesisProtocol = require('@daostack/arc/build/contracts/GenesisProtocol.json'); -describe('UGeneric Signal Scheme', () => { +describe('Generic Signal Scheme', () => { let web3; let addresses; let opts; @@ -43,7 +43,7 @@ describe('UGeneric Signal Scheme', () => { ); let proposalIPFSData = { - description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\nWhat is Lorem Ipsum?\nFrom its medieval origins to the digital era, learn everything there is to know about the ubiquitous lorem ipsum passage.\n\nLorem ipsum used in a magazine layout\nMAGAZINE LAYOUT WITH LOREM IPSUM\nHISTORY, PURPOSE AND USAGE\nLorem ipsum, or lipsum as it is sometimes known, is dummy text used in laying out print, graphic or web designs. The passage is attributed to an unknown typesetter in the 15th century who is thought to have scrambled parts of Cicero\'s De Finibus Bonorum et Malorum for use in a type specimen book. It usually begins with:', + description: 'Key Values Here', title: 'My Title!', url: 'http://swift.org/modest', }; @@ -104,6 +104,10 @@ describe('UGeneric Signal Scheme', () => { } }`; + // const getproposalmeta = `{ + // GenericSignal + // }`; + // const metadata = `{ // Metadata(where: {address: "${addresses.GenesisProtocol.toLowerCase()}"}) { // data @@ -113,88 +117,91 @@ describe('UGeneric Signal Scheme', () => { // let resmetadata = await sendQuery(metadata) let proposalprint = await sendQuery(getProposal); console.log(proposalprint); + // let proposalprintsignal = await sendQuery(getproposalmeta); + // console.log(proposalprintsignal); + + let proposal = (await sendQuery(getProposal)).proposal; + expect(proposal).toMatchObject({ + id: p1, + descriptionHash: descHash, + stage: 'Queued', + createdAt: p1Creation.toString(), + executedAt: null, + proposer: web3.eth.defaultAccount.toLowerCase(), + votingMachine: genesisProtocol.options.address.toLowerCase(), + + genericScheme: { + id: p1, + meta: null, + dao: { + id: addresses.TestAvatar.toLowerCase(), + }, + contractToCall: actionMock.options.address.toLowerCase(), + callData, + value: '0', + executed: false, + returnValue: null, + }, + scheme: { + uGenericSchemeParams: { + contractToCall: actionMock.options.address.toLowerCase(), + }, + }, + }); + + await vote({ + proposalId: p1, + outcome: PASS, + voter: accounts[0].address, + }); + + await vote({ + proposalId: p1, + outcome: PASS, + voter: accounts[1].address, + }); + + await vote({ + proposalId: p1, + outcome: PASS, + voter: accounts[2].address, + }); + + let executedAt = await vote({ + proposalId: p1, + outcome: PASS, + voter: accounts[3].address, + }); + + const executedIsIndexed = async () => { + return (await sendQuery(getProposal)).proposal.executedAt != null; + }; - - // let proposal = (await sendQuery(getProposal)).proposal; - // expect(proposal).toMatchObject({ - // id: p1, - // descriptionHash: descHash, - // stage: 'Queued', - // createdAt: p1Creation.toString(), - // executedAt: null, - // proposer: web3.eth.defaultAccount.toLowerCase(), - // votingMachine: genesisProtocol.options.address.toLowerCase(), - // - // genericScheme: { - // id: p1, - // dao: { - // id: addresses.TestAvatar.toLowerCase(), - // }, - // contractToCall: actionMock.options.address.toLowerCase(), - // callData, - // value: '0', - // executed: false, - // returnValue: null, - // }, - // scheme: { - // uGenericSchemeParams: { - // contractToCall: actionMock.options.address.toLowerCase(), - // }, - // }, - // }); - // - // await vote({ - // proposalId: p1, - // outcome: PASS, - // voter: accounts[0].address, - // }); - // - // await vote({ - // proposalId: p1, - // outcome: PASS, - // voter: accounts[1].address, - // }); - // - // await vote({ - // proposalId: p1, - // outcome: PASS, - // voter: accounts[2].address, - // }); - // - // let executedAt = await vote({ - // proposalId: p1, - // outcome: PASS, - // voter: accounts[3].address, - // }); - // - // const executedIsIndexed = async () => { - // return (await sendQuery(getProposal)).proposal.executedAt != null; - // }; - // - // await waitUntilTrue(executedIsIndexed); - // - // proposal = (await sendQuery(getProposal)).proposal; - // expect(proposal).toMatchObject({ - // id: p1, - // descriptionHash: descHash, - // stage: 'Executed', - // createdAt: p1Creation.toString(), - // executedAt: executedAt + '', - // proposer: web3.eth.defaultAccount.toLowerCase(), - // votingMachine: genesisProtocol.options.address.toLowerCase(), - // - // genericScheme: { - // id: p1, - // dao: { - // id: addresses.TestAvatar.toLowerCase(), - // }, - // contractToCall: actionMock.options.address.toLowerCase(), - // callData, - // value: '0', - // executed: true, - // returnValue: '0x0000000000000000000000000000000000000000000000000000000000000001', - // }, - // }); + await waitUntilTrue(executedIsIndexed); + + proposal = (await sendQuery(getProposal)).proposal; + expect(proposal).toMatchObject({ + id: p1, + descriptionHash: descHash, + stage: 'Executed', + createdAt: p1Creation.toString(), + executedAt: executedAt + '', + proposer: web3.eth.defaultAccount.toLowerCase(), + votingMachine: genesisProtocol.options.address.toLowerCase(), + + genericScheme: { + id: p1, + meta: 'Hello world', + dao: { + id: addresses.TestAvatar.toLowerCase(), + }, + contractToCall: actionMock.options.address.toLowerCase(), + callData, + value: '0', + executed: true, + returnValue: '0x0000000000000000000000000000000000000000000000000000000000000001', + }, + }); }, 100000); }); From a5ea7c51deeb0eef0a537879385a91c96d36c8a8 Mon Sep 17 00:00:00 2001 From: p Date: Sun, 17 Nov 2019 23:19:21 +0100 Subject: [PATCH 03/32] Add new type GenericSignal in schema for UGenericScheme. Generic Scheme is not integrated in /types/schema and therefore not working. --- src/mappings/UGenericScheme/datasource.yaml | 1 + src/mappings/UGenericScheme/mapping.ts | 7 +++++++ src/mappings/UGenericScheme/schema.graphql | 5 +++++ test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts | 18 ++++++++++++------ 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/mappings/UGenericScheme/datasource.yaml b/src/mappings/UGenericScheme/datasource.yaml index 7ffef7a2..cf423968 100644 --- a/src/mappings/UGenericScheme/datasource.yaml +++ b/src/mappings/UGenericScheme/datasource.yaml @@ -3,6 +3,7 @@ abis: - GenesisProtocol entities: - GenericSchemeProposal + - GenericSignal eventHandlers: - event: ProposalExecuted(indexed address,indexed bytes32,bytes) handler: handleProposalExecuted diff --git a/src/mappings/UGenericScheme/mapping.ts b/src/mappings/UGenericScheme/mapping.ts index 50d26c73..463d45ff 100644 --- a/src/mappings/UGenericScheme/mapping.ts +++ b/src/mappings/UGenericScheme/mapping.ts @@ -12,6 +12,7 @@ import * as domain from '../../domain'; // Import entity types generated from the GraphQL schema import { GenericSchemeProposal, + GenericSignal, } from '../../types/schema'; function insertNewProposal(event: NewCallProposal): void { @@ -49,5 +50,11 @@ export function handleProposalExecuted( ent.returnValue = event.params._genericCallReturnValue; } ent.meta = 'Hello world' + + //let id = event.params._proposalId.toHex(); + var id:string = "1" + let entsignal = new GenericSignal(id); + entsignal.meta = 'meta testprint'; + store.set('GenericSignal', id, entsignal); store.set('GenericSchemeProposal', event.params._proposalId.toHex(), ent); } diff --git a/src/mappings/UGenericScheme/schema.graphql b/src/mappings/UGenericScheme/schema.graphql index 6bdbb3f9..ad3c9d20 100644 --- a/src/mappings/UGenericScheme/schema.graphql +++ b/src/mappings/UGenericScheme/schema.graphql @@ -8,3 +8,8 @@ type GenericSchemeProposal @entity { executed: Boolean! returnValue: Bytes } + +type GenericSignal @entity { + id: ID! + meta: String +} diff --git a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts index 86879859..1d37ea1c 100644 --- a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts +++ b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts @@ -114,12 +114,10 @@ describe('Generic Signal Scheme', () => { // } // }`; - // let resmetadata = await sendQuery(metadata) - let proposalprint = await sendQuery(getProposal); - console.log(proposalprint); - // let proposalprintsignal = await sendQuery(getproposalmeta); - // console.log(proposalprintsignal); - + // let proposalprint = await sendQuery(getProposal); + // console.log(proposalprint); + // + // let proposal = (await sendQuery(getProposal)).proposal; expect(proposal).toMatchObject({ id: p1, @@ -203,5 +201,13 @@ describe('Generic Signal Scheme', () => { }, }); + const metadata = await sendQuery(`{ + GenericSignal(id: 1){ + id + meta + } + }`, 5000); + console.log(metadata); + }, 100000); }); From 94dc03c3751e462a93266ca45962ee156faa90a6 Mon Sep 17 00:00:00 2001 From: p Date: Sun, 24 Nov 2019 19:38:08 +0100 Subject: [PATCH 04/32] add entitiy in domain/schema.grapql, add mappings as signal.ts, add wrapper in index.ts, using debug entity in test --- src/domain/index.ts | 7 ++ src/domain/schema.graphql | 5 ++ src/domain/signal.ts | 27 ++++++ src/mappings/UGenericScheme/datasource.yaml | 1 - src/mappings/UGenericScheme/mapping.ts | 12 +-- src/mappings/UGenericScheme/schema.graphql | 5 -- test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts | 83 +++++++++++++++---- 7 files changed, 111 insertions(+), 29 deletions(-) create mode 100644 src/domain/signal.ts diff --git a/src/domain/index.ts b/src/domain/index.ts index b7b76bb2..8be47488 100644 --- a/src/domain/index.ts +++ b/src/domain/index.ts @@ -47,6 +47,7 @@ import { import { insertStake } from './stake'; import { getToken, insertToken, updateTokenTotalSupply } from './token'; import { insertVote } from './vote'; +import { getSignal, addMeta, testwritesignal } from './signal' function isProposalValid(proposalId: string ): boolean { let p = Proposal.load(proposalId); @@ -326,3 +327,9 @@ export function removeDaoMember(reputationHolder: ReputationHolder): void { } daoModule.decreaseDAOmembersCount(dao); } + +export function addSignal(id: number, metadata: string): void{ + // let signal = getSignal(id); + // addMeta(signal,metadata); + testwritesignal(id,metadata); +} diff --git a/src/domain/schema.graphql b/src/domain/schema.graphql index 21b0cf25..fc70bf22 100644 --- a/src/domain/schema.graphql +++ b/src/domain/schema.graphql @@ -208,3 +208,8 @@ type Event @entity { dao: DAO timestamp: BigInt! } + +type Signal @entity{ + id: ID! + data: String +} diff --git a/src/domain/signal.ts b/src/domain/signal.ts new file mode 100644 index 00000000..5b75c94c --- /dev/null +++ b/src/domain/signal.ts @@ -0,0 +1,27 @@ +import { Address, store, BigInt } from '@graphprotocol/graph-ts'; +import { Signal } from '../types/schema'; + +export function getSignal(id: string): Signal { + let sig = store.get('Signal', id) as Signal; + if (sig == null) { + sig = new Signal(id); + } + return sig; +} + +export function saveSignal(signal: Signal): void { + signal.save() +} + +export function addMeta(signal: Signal, metadata: string): void { + signal.data = metadata; + saveSignal(signal); +} + +export function testwritesignal(id: number, metadata: string): void { + let testId = 0; + let idstring = BigInt.fromI32(testId).toHex(); + let sig = new Signal(idstring); + sig.data = metadata; + saveSignal(sig); +} diff --git a/src/mappings/UGenericScheme/datasource.yaml b/src/mappings/UGenericScheme/datasource.yaml index cf423968..7ffef7a2 100644 --- a/src/mappings/UGenericScheme/datasource.yaml +++ b/src/mappings/UGenericScheme/datasource.yaml @@ -3,7 +3,6 @@ abis: - GenesisProtocol entities: - GenericSchemeProposal - - GenericSignal eventHandlers: - event: ProposalExecuted(indexed address,indexed bytes32,bytes) handler: handleProposalExecuted diff --git a/src/mappings/UGenericScheme/mapping.ts b/src/mappings/UGenericScheme/mapping.ts index 463d45ff..f54632c8 100644 --- a/src/mappings/UGenericScheme/mapping.ts +++ b/src/mappings/UGenericScheme/mapping.ts @@ -1,4 +1,5 @@ import { store } from '@graphprotocol/graph-ts'; +import { debug } from '../../utils'; // Import event types from the Reputation contract ABI import { @@ -12,7 +13,6 @@ import * as domain from '../../domain'; // Import entity types generated from the GraphQL schema import { GenericSchemeProposal, - GenericSignal, } from '../../types/schema'; function insertNewProposal(event: NewCallProposal): void { @@ -51,10 +51,10 @@ export function handleProposalExecuted( } ent.meta = 'Hello world' - //let id = event.params._proposalId.toHex(); - var id:string = "1" - let entsignal = new GenericSignal(id); - entsignal.meta = 'meta testprint'; - store.set('GenericSignal', id, entsignal); + //var testid:number = 0 + var testmetastring = 'Hello world'; + debug(testmetastring); + + //domain.addSignal(testid, testmetastring); store.set('GenericSchemeProposal', event.params._proposalId.toHex(), ent); } diff --git a/src/mappings/UGenericScheme/schema.graphql b/src/mappings/UGenericScheme/schema.graphql index ad3c9d20..6bdbb3f9 100644 --- a/src/mappings/UGenericScheme/schema.graphql +++ b/src/mappings/UGenericScheme/schema.graphql @@ -8,8 +8,3 @@ type GenericSchemeProposal @entity { executed: Boolean! returnValue: Bytes } - -type GenericSignal @entity { - id: ID! - meta: String -} diff --git a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts index 1d37ea1c..c1d49f38 100644 --- a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts +++ b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts @@ -73,7 +73,7 @@ describe('Generic Signal Scheme', () => { } const { proposalId: p1, timestamp: p1Creation } = await propose(); - + //console.log(p1) const getProposal = `{ proposal(id: "${p1}") { id @@ -104,20 +104,24 @@ describe('Generic Signal Scheme', () => { } }`; - // const getproposalmeta = `{ - // GenericSignal - // }`; - - // const metadata = `{ - // Metadata(where: {address: "${addresses.GenesisProtocol.toLowerCase()}"}) { - // data - // } + // const gettestgeneric = `{ + // genericScheme(id: "${p1}") { + // id + // meta + // dao { + // id + // } + // contractToCall + // callData + // value + // executed + // returnValue + // } // }`; + // + // let proposalprint = await sendQuery(gettestgeneric); + // console.log(proposalprint); - // let proposalprint = await sendQuery(getProposal); - // console.log(proposalprint); - // - // let proposal = (await sendQuery(getProposal)).proposal; expect(proposal).toMatchObject({ id: p1, @@ -201,13 +205,58 @@ describe('Generic Signal Scheme', () => { }, }); - const metadata = await sendQuery(`{ - GenericSignal(id: 1){ + // const daodata = await sendQuery(`{ + // Metadata(id: test) { + // id + // meta + // } + // }`); + // console.log(daodata) + // const metaq = `{ + // Signal(id: 0){ + // id + // data + // } + // }` + // const metaq = `{ + // debug(id: "0"){ + // id + // message + // } + // }` + const metaq = `{ + debugs{ id - meta + message } - }`, 5000); + }` + + const metadata = await sendQuery(metaq, 5000); console.log(metadata); + + + // const metadata1 = await sendQuery(`{ + // genericSchemes { + // id + // meta + // dao { + // id + // } + // contractToCall + // callData + // value + // executed + // returnValue + // } + // scheme { + // uGenericSchemeParams { + // contractToCall + // } + // } + // }`, 5000); + // let metaproposal = (await sendQuery(getProposal)) + // console.log(metaproposal); + }, 100000); }); From 8bc854b75dca4fb336c8d7a685af04f97231b313 Mon Sep 17 00:00:00 2001 From: p Date: Tue, 26 Nov 2019 15:35:55 +0100 Subject: [PATCH 05/32] deleted meta from UGeneric scheme --- src/mappings/UGenericScheme/mapping.ts | 1 - src/mappings/UGenericScheme/schema.graphql | 1 - test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts | 3 --- 3 files changed, 5 deletions(-) diff --git a/src/mappings/UGenericScheme/mapping.ts b/src/mappings/UGenericScheme/mapping.ts index f54632c8..156c6187 100644 --- a/src/mappings/UGenericScheme/mapping.ts +++ b/src/mappings/UGenericScheme/mapping.ts @@ -49,7 +49,6 @@ export function handleProposalExecuted( ent.executed = true; ent.returnValue = event.params._genericCallReturnValue; } - ent.meta = 'Hello world' //var testid:number = 0 var testmetastring = 'Hello world'; diff --git a/src/mappings/UGenericScheme/schema.graphql b/src/mappings/UGenericScheme/schema.graphql index 6bdbb3f9..9cf0d261 100644 --- a/src/mappings/UGenericScheme/schema.graphql +++ b/src/mappings/UGenericScheme/schema.graphql @@ -1,6 +1,5 @@ type GenericSchemeProposal @entity { id: ID! - meta: String dao: DAO! contractToCall: Bytes! callData: Bytes! diff --git a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts index c1d49f38..7dbbdcd5 100644 --- a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts +++ b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts @@ -86,7 +86,6 @@ describe('Generic Signal Scheme', () => { genericScheme { id - meta dao { id } @@ -134,7 +133,6 @@ describe('Generic Signal Scheme', () => { genericScheme: { id: p1, - meta: null, dao: { id: addresses.TestAvatar.toLowerCase(), }, @@ -193,7 +191,6 @@ describe('Generic Signal Scheme', () => { genericScheme: { id: p1, - meta: 'Hello world', dao: { id: addresses.TestAvatar.toLowerCase(), }, From 12a656c71faa99cef071999f2cb868a26534c6ab Mon Sep 17 00:00:00 2001 From: p Date: Tue, 26 Nov 2019 15:54:39 +0100 Subject: [PATCH 06/32] testwrite into entity @signal / testread entity --- src/domain/index.ts | 2 +- src/domain/signal.ts | 2 +- src/mappings/UGenericScheme/mapping.ts | 2 +- test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts | 20 +++++++++---------- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/domain/index.ts b/src/domain/index.ts index 8be47488..759c1f3f 100644 --- a/src/domain/index.ts +++ b/src/domain/index.ts @@ -328,7 +328,7 @@ export function removeDaoMember(reputationHolder: ReputationHolder): void { daoModule.decreaseDAOmembersCount(dao); } -export function addSignal(id: number, metadata: string): void{ +export function addSignal(id: string, metadata: string): void{ // let signal = getSignal(id); // addMeta(signal,metadata); testwritesignal(id,metadata); diff --git a/src/domain/signal.ts b/src/domain/signal.ts index 5b75c94c..a28c7db7 100644 --- a/src/domain/signal.ts +++ b/src/domain/signal.ts @@ -18,7 +18,7 @@ export function addMeta(signal: Signal, metadata: string): void { saveSignal(signal); } -export function testwritesignal(id: number, metadata: string): void { +export function testwritesignal(id: string, metadata: string): void { let testId = 0; let idstring = BigInt.fromI32(testId).toHex(); let sig = new Signal(idstring); diff --git a/src/mappings/UGenericScheme/mapping.ts b/src/mappings/UGenericScheme/mapping.ts index 156c6187..3b9ebc40 100644 --- a/src/mappings/UGenericScheme/mapping.ts +++ b/src/mappings/UGenericScheme/mapping.ts @@ -54,6 +54,6 @@ export function handleProposalExecuted( var testmetastring = 'Hello world'; debug(testmetastring); - //domain.addSignal(testid, testmetastring); + domain.addSignal("testid", testmetastring); store.set('GenericSchemeProposal', event.params._proposalId.toHex(), ent); } diff --git a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts index 7dbbdcd5..8ffa40e5 100644 --- a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts +++ b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts @@ -208,25 +208,25 @@ describe('Generic Signal Scheme', () => { // meta // } // }`); - // console.log(daodata) + //console.log(daodata) + const metaq = `{ + signals{ + id + data + } + }` // const metaq = `{ - // Signal(id: 0){ + // debug(id: "0"){ // id - // data + // message // } // }` // const metaq = `{ - // debug(id: "0"){ + // debugs{ // id // message // } // }` - const metaq = `{ - debugs{ - id - message - } - }` const metadata = await sendQuery(metaq, 5000); console.log(metadata); From d321cf6546e2bff83780af8e9c7f3b3626b809d6 Mon Sep 17 00:00:00 2001 From: p Date: Tue, 26 Nov 2019 16:17:36 +0100 Subject: [PATCH 07/32] Add Address from DAO as ID of Signal --- src/domain/signal.ts | 4 +--- src/mappings/UGenericScheme/mapping.ts | 6 +++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/domain/signal.ts b/src/domain/signal.ts index a28c7db7..770a7d04 100644 --- a/src/domain/signal.ts +++ b/src/domain/signal.ts @@ -19,9 +19,7 @@ export function addMeta(signal: Signal, metadata: string): void { } export function testwritesignal(id: string, metadata: string): void { - let testId = 0; - let idstring = BigInt.fromI32(testId).toHex(); - let sig = new Signal(idstring); + let sig = new Signal(id); sig.data = metadata; saveSignal(sig); } diff --git a/src/mappings/UGenericScheme/mapping.ts b/src/mappings/UGenericScheme/mapping.ts index 3b9ebc40..1a5e32af 100644 --- a/src/mappings/UGenericScheme/mapping.ts +++ b/src/mappings/UGenericScheme/mapping.ts @@ -50,10 +50,10 @@ export function handleProposalExecuted( ent.returnValue = event.params._genericCallReturnValue; } - //var testid:number = 0 - var testmetastring = 'Hello world'; + var signalId = event.params._avatar.toHex(); + var testmetastring = '{"signal": {"Header":"https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg"}}'; debug(testmetastring); - domain.addSignal("testid", testmetastring); + domain.addSignal(signalId, testmetastring); store.set('GenericSchemeProposal', event.params._proposalId.toHex(), ent); } From 42867e81241d33f5965849551a1d637f0790969f Mon Sep 17 00:00:00 2001 From: p Date: Sun, 1 Dec 2019 16:41:33 +0100 Subject: [PATCH 08/32] finished test - to get data from the graph run: npm run test -- test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts open http://localhost:8000/ and put the query in --- test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts | 70 +++---------------- 1 file changed, 11 insertions(+), 59 deletions(-) diff --git a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts index 8ffa40e5..89ea0d43 100644 --- a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts +++ b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts @@ -103,23 +103,6 @@ describe('Generic Signal Scheme', () => { } }`; - // const gettestgeneric = `{ - // genericScheme(id: "${p1}") { - // id - // meta - // dao { - // id - // } - // contractToCall - // callData - // value - // executed - // returnValue - // } - // }`; - // - // let proposalprint = await sendQuery(gettestgeneric); - // console.log(proposalprint); let proposal = (await sendQuery(getProposal)).proposal; expect(proposal).toMatchObject({ @@ -202,58 +185,27 @@ describe('Generic Signal Scheme', () => { }, }); - // const daodata = await sendQuery(`{ - // Metadata(id: test) { - // id - // meta - // } - // }`); - //console.log(daodata) const metaq = `{ signals{ id data } }` - // const metaq = `{ - // debug(id: "0"){ - // id - // message - // } - // }` - // const metaq = `{ - // debugs{ - // id - // message - // } - // }` + const metadata = await sendQuery(metaq, 5000); console.log(metadata); - - - // const metadata1 = await sendQuery(`{ - // genericSchemes { - // id - // meta - // dao { - // id - // } - // contractToCall - // callData - // value - // executed - // returnValue - // } - // scheme { - // uGenericSchemeParams { - // contractToCall - // } - // } - // }`, 5000); - // let metaproposal = (await sendQuery(getProposal)) - // console.log(metaproposal); + expect(metadata).toMatchObject({ + signals:[ + { + data: + '{"signal": {"Header":"https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg"}}', + id: + '0xe7a2c59e134ee81d4035ae6db2254f79308e334f' + } + ] + }); }, 100000); }); From 8bcbfa7fec24c76c166693b56d6d683f6c4146be Mon Sep 17 00:00:00 2001 From: p Date: Thu, 5 Dec 2019 13:12:45 +0100 Subject: [PATCH 09/32] cleaned code up , add writesignal --- src/domain/index.ts | 8 ++++---- src/domain/signal.ts | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/domain/index.ts b/src/domain/index.ts index 759c1f3f..259b384f 100644 --- a/src/domain/index.ts +++ b/src/domain/index.ts @@ -47,7 +47,7 @@ import { import { insertStake } from './stake'; import { getToken, insertToken, updateTokenTotalSupply } from './token'; import { insertVote } from './vote'; -import { getSignal, addMeta, testwritesignal } from './signal' +import { writesignal } from './signal' function isProposalValid(proposalId: string ): boolean { let p = Proposal.load(proposalId); @@ -329,7 +329,7 @@ export function removeDaoMember(reputationHolder: ReputationHolder): void { } export function addSignal(id: string, metadata: string): void{ - // let signal = getSignal(id); - // addMeta(signal,metadata); - testwritesignal(id,metadata); + //let signal = getSignal(id); + //addMeta(signal,metadata); + writesignal(id,metadata); } diff --git a/src/domain/signal.ts b/src/domain/signal.ts index 770a7d04..26056aff 100644 --- a/src/domain/signal.ts +++ b/src/domain/signal.ts @@ -9,17 +9,17 @@ export function getSignal(id: string): Signal { return sig; } -export function saveSignal(signal: Signal): void { +function saveSignal(signal: Signal): void { signal.save() } -export function addMeta(signal: Signal, metadata: string): void { +function addMeta(signal: Signal, metadata: string): void { signal.data = metadata; saveSignal(signal); } -export function testwritesignal(id: string, metadata: string): void { - let sig = new Signal(id); - sig.data = metadata; - saveSignal(sig); +export function writesignal(id: string, metadata: string): void { + let signal = getSignal(id) + addMeta(signal,metadata); + } From 6e1fee2d0b8d34c3666c1791bcde0fedee66bd73 Mon Sep 17 00:00:00 2001 From: p Date: Thu, 5 Dec 2019 16:18:00 +0100 Subject: [PATCH 10/32] added reading of ipfs files --- src/domain/signal.ts | 5 +++- src/mappings/UGenericScheme/mapping.ts | 6 ++-- test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts | 30 ++++++++++++------- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/domain/signal.ts b/src/domain/signal.ts index 26056aff..f2ba39ac 100644 --- a/src/domain/signal.ts +++ b/src/domain/signal.ts @@ -1,5 +1,6 @@ import { Address, store, BigInt } from '@graphprotocol/graph-ts'; import { Signal } from '../types/schema'; +import { getProposal } from './proposal' export function getSignal(id: string): Signal { let sig = store.get('Signal', id) as Signal; @@ -14,7 +15,9 @@ function saveSignal(signal: Signal): void { } function addMeta(signal: Signal, metadata: string): void { - signal.data = metadata; + let proposal = getProposal(metadata); + let metadatatitle = proposal.title; + signal.data = metadatatitle; saveSignal(signal); } diff --git a/src/mappings/UGenericScheme/mapping.ts b/src/mappings/UGenericScheme/mapping.ts index 1a5e32af..fbf166e6 100644 --- a/src/mappings/UGenericScheme/mapping.ts +++ b/src/mappings/UGenericScheme/mapping.ts @@ -51,9 +51,9 @@ export function handleProposalExecuted( } var signalId = event.params._avatar.toHex(); - var testmetastring = '{"signal": {"Header":"https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg"}}'; - debug(testmetastring); - + var testmetastring = event.params._proposalId.toHex(); domain.addSignal(signalId, testmetastring); + + store.set('GenericSchemeProposal', event.params._proposalId.toHex(), ent); } diff --git a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts index 89ea0d43..eed68cbb 100644 --- a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts +++ b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts @@ -193,19 +193,29 @@ describe('Generic Signal Scheme', () => { }` + // const metaq = `{ + // debugs{ + // id + // message + // } + // }` + + const metadata = await sendQuery(metaq, 5000); console.log(metadata); + // + // expect(metadata).toMatchObject({ + // signals:[ + // { + // data: + // '{"signal": {"Header":"https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg"}}', + // id: + // '0xe7a2c59e134ee81d4035ae6db2254f79308e334f' + // } + // ] + // }); + - expect(metadata).toMatchObject({ - signals:[ - { - data: - '{"signal": {"Header":"https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg"}}', - id: - '0xe7a2c59e134ee81d4035ae6db2254f79308e334f' - } - ] - }); }, 100000); }); From dadbbd0303a4d7c14a9061147eb313be98ab6745 Mon Sep 17 00:00:00 2001 From: p Date: Thu, 5 Dec 2019 17:25:13 +0100 Subject: [PATCH 11/32] add instruction and datavalues for test --- src/domain/signal.ts | 5 +++-- test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/domain/signal.ts b/src/domain/signal.ts index f2ba39ac..dc43aa00 100644 --- a/src/domain/signal.ts +++ b/src/domain/signal.ts @@ -16,8 +16,9 @@ function saveSignal(signal: Signal): void { function addMeta(signal: Signal, metadata: string): void { let proposal = getProposal(metadata); - let metadatatitle = proposal.title; - signal.data = metadatatitle; + let instruction = proposal.title; + let metadatavalues = proposal.description; + signal.data = metadatavalues; saveSignal(signal); } diff --git a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts index eed68cbb..cdeb8ed4 100644 --- a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts +++ b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts @@ -43,8 +43,8 @@ describe('Generic Signal Scheme', () => { ); let proposalIPFSData = { - description: 'Key Values Here', - title: 'My Title!', + description: '{"Header":"https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg"}', + title: 'SET', url: 'http://swift.org/modest', }; From 8e949881f9fa407ae308fdb28c659cc24ef3a009 Mon Sep 17 00:00:00 2001 From: p Date: Thu, 2 Jan 2020 13:10:22 +0100 Subject: [PATCH 12/32] add read Proposal Handler in signal.ts --- src/domain/index.ts | 6 ++-- src/domain/signal.ts | 31 +++++++++++++------ src/mappings/UGenericScheme/mapping.ts | 4 +-- test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts | 6 ++-- 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/domain/index.ts b/src/domain/index.ts index 259b384f..da78f052 100644 --- a/src/domain/index.ts +++ b/src/domain/index.ts @@ -328,8 +328,6 @@ export function removeDaoMember(reputationHolder: ReputationHolder): void { daoModule.decreaseDAOmembersCount(dao); } -export function addSignal(id: string, metadata: string): void{ - //let signal = getSignal(id); - //addMeta(signal,metadata); - writesignal(id,metadata); +export function addSignal(signalId: string, proposalId: string): void{ + writesignal(signalId,proposalId); } diff --git a/src/domain/signal.ts b/src/domain/signal.ts index dc43aa00..9317b38b 100644 --- a/src/domain/signal.ts +++ b/src/domain/signal.ts @@ -1,5 +1,5 @@ -import { Address, store, BigInt } from '@graphprotocol/graph-ts'; -import { Signal } from '../types/schema'; +import { Address, BigDecimal, BigInt, ByteArray, Bytes, crypto, ipfs, json, JSONValueKind, store } from '@graphprotocol/graph-ts'; +import { Signal, Proposal } from '../types/schema'; import { getProposal } from './proposal' export function getSignal(id: string): Signal { @@ -14,16 +14,27 @@ function saveSignal(signal: Signal): void { signal.save() } -function addMeta(signal: Signal, metadata: string): void { - let proposal = getProposal(metadata); - let instruction = proposal.title; - let metadatavalues = proposal.description; - signal.data = metadatavalues; - saveSignal(signal); + +export function writesignal(signalId: string, proposalId: string): void { + let newsignal = readProposal(signalId, proposalId) + saveSignal(newsignal); } -export function writesignal(id: string, metadata: string): void { + +export function readProposal(id: string, proposalId: string): Signal { let signal = getSignal(id) - addMeta(signal,metadata); + let proposal = store.get('Proposal', proposalId) as Proposal; + let ipfsData = ipfs.cat('/ipfs/' + proposal.descriptionHash); + if (ipfsData != null && ipfsData.toString() !== '{}') { + + let descJson = json.fromBytes(ipfsData as Bytes); + if (descJson.kind !== JSONValueKind.OBJECT) { + return signal; + } + if (descJson.toObject().get('key') != null) { + signal.data = descJson.toObject().get('key').toString(); + } + } + return signal; } diff --git a/src/mappings/UGenericScheme/mapping.ts b/src/mappings/UGenericScheme/mapping.ts index fbf166e6..79731f24 100644 --- a/src/mappings/UGenericScheme/mapping.ts +++ b/src/mappings/UGenericScheme/mapping.ts @@ -51,8 +51,8 @@ export function handleProposalExecuted( } var signalId = event.params._avatar.toHex(); - var testmetastring = event.params._proposalId.toHex(); - domain.addSignal(signalId, testmetastring); + var proposalId = event.params._proposalId.toHex(); + domain.addSignal(signalId, proposalId); store.set('GenericSchemeProposal', event.params._proposalId.toHex(), ent); diff --git a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts index cdeb8ed4..66070251 100644 --- a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts +++ b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts @@ -43,9 +43,11 @@ describe('Generic Signal Scheme', () => { ); let proposalIPFSData = { - description: '{"Header":"https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg"}', - title: 'SET', + description: 'Setting new header Image', + title: 'New Header Image', url: 'http://swift.org/modest', + key: 'Header', + value: '{"Header":"https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg"}', }; let proposalDescription = proposalIPFSData.description; From ba1b05b6089adc24663eefd864b6b8f84acf4b76 Mon Sep 17 00:00:00 2001 From: p Date: Thu, 2 Jan 2020 14:32:59 +0100 Subject: [PATCH 13/32] building json --- src/domain/signal.ts | 16 ++++++++++++++-- test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/domain/signal.ts b/src/domain/signal.ts index 9317b38b..dcdac7fe 100644 --- a/src/domain/signal.ts +++ b/src/domain/signal.ts @@ -20,9 +20,16 @@ export function writesignal(signalId: string, proposalId: string): void { saveSignal(newsignal); } +function generatestring(key: string, value: string, signal: Signal ): Signal { + signal.data = '{'+ '"' + key + '"' +':' + '"'+ value + '"' + '}' + return signal +} + export function readProposal(id: string, proposalId: string): Signal { let signal = getSignal(id) + let key = '' + let value = '' let proposal = store.get('Proposal', proposalId) as Proposal; let ipfsData = ipfs.cat('/ipfs/' + proposal.descriptionHash); @@ -33,8 +40,13 @@ export function readProposal(id: string, proposalId: string): Signal { return signal; } if (descJson.toObject().get('key') != null) { - signal.data = descJson.toObject().get('key').toString(); + key = descJson.toObject().get('key').toString(); } + if (descJson.toObject().get('value') != null) { + value = descJson.toObject().get('value').toString(); + } + } - return signal; + let signalstring = generatestring(key,value,signal) + return signalstring; } diff --git a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts index 66070251..10e7848d 100644 --- a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts +++ b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts @@ -47,7 +47,7 @@ describe('Generic Signal Scheme', () => { title: 'New Header Image', url: 'http://swift.org/modest', key: 'Header', - value: '{"Header":"https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg"}', + value: 'https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg', }; let proposalDescription = proposalIPFSData.description; From ce202652e4096584e9bdacb3160cda0b1482aece Mon Sep 17 00:00:00 2001 From: p Date: Thu, 2 Jan 2020 19:48:43 +0100 Subject: [PATCH 14/32] in progress --- src/domain/signal.ts | 20 +++++++++++++------ test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts | 20 +++++++++---------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/domain/signal.ts b/src/domain/signal.ts index dcdac7fe..49be8da9 100644 --- a/src/domain/signal.ts +++ b/src/domain/signal.ts @@ -1,6 +1,7 @@ import { Address, BigDecimal, BigInt, ByteArray, Bytes, crypto, ipfs, json, JSONValueKind, store } from '@graphprotocol/graph-ts'; import { Signal, Proposal } from '../types/schema'; import { getProposal } from './proposal' +import { concat, debug } from '../utils'; export function getSignal(id: string): Signal { let sig = store.get('Signal', id) as Signal; @@ -14,22 +15,29 @@ function saveSignal(signal: Signal): void { signal.save() } - export function writesignal(signalId: string, proposalId: string): void { let newsignal = readProposal(signalId, proposalId) saveSignal(newsignal); } -function generatestring(key: string, value: string, signal: Signal ): Signal { - signal.data = '{'+ '"' + key + '"' +':' + '"'+ value + '"' + '}' +export function generatestring(key: string, value: string, signal: Signal ): Signal { + const newvar = '{'+ '"' + key + '"' +':' + '"'+ value + '"' + '}'; + debug(newvar); + if (signal.data == null){ + const data = '[' + newvar + ']'; + signal.data = data; + debug(signal.data); + }else{ + debug("This means there was data here"); + } return signal } export function readProposal(id: string, proposalId: string): Signal { - let signal = getSignal(id) - let key = '' - let value = '' + let signal = getSignal(id); + var key = ''; + var value = ''; let proposal = store.get('Proposal', proposalId) as Proposal; let ipfsData = ipfs.cat('/ipfs/' + proposal.descriptionHash); diff --git a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts index 10e7848d..92419590 100644 --- a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts +++ b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts @@ -187,22 +187,22 @@ describe('Generic Signal Scheme', () => { }, }); - const metaq = `{ - signals{ - id - data - } - }` - - // const metaq = `{ - // debugs{ + // signals{ // id - // message + // data // } // }` + const metaq = `{ + debugs{ + id + message + } + }` + + const metadata = await sendQuery(metaq, 5000); console.log(metadata); // From c68079e7a50cb52f0ec00c7d52dd17f1cddd518d Mon Sep 17 00:00:00 2001 From: p Date: Sun, 5 Jan 2020 20:54:13 +0100 Subject: [PATCH 15/32] add generatestring, replace, generate and append - all in debug mode. To test the individual functions change the signal.data --- src/domain/signal.ts | 63 +++++++++++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 16 deletions(-) diff --git a/src/domain/signal.ts b/src/domain/signal.ts index 49be8da9..05054ab2 100644 --- a/src/domain/signal.ts +++ b/src/domain/signal.ts @@ -1,7 +1,6 @@ import { Address, BigDecimal, BigInt, ByteArray, Bytes, crypto, ipfs, json, JSONValueKind, store } from '@graphprotocol/graph-ts'; import { Signal, Proposal } from '../types/schema'; -import { getProposal } from './proposal' -import { concat, debug } from '../utils'; +import { debug } from '../utils'; export function getSignal(id: string): Signal { let sig = store.get('Signal', id) as Signal; @@ -16,25 +15,57 @@ function saveSignal(signal: Signal): void { } export function writesignal(signalId: string, proposalId: string): void { - let newsignal = readProposal(signalId, proposalId) - saveSignal(newsignal); + readProposal(signalId, proposalId) } -export function generatestring(key: string, value: string, signal: Signal ): Signal { - const newvar = '{'+ '"' + key + '"' +':' + '"'+ value + '"' + '}'; - debug(newvar); +export function generatestring(key: string, value: string, signal: Signal ): void { + const newkeypair = '"' + key + '"' +':' + '"'+ value + '"'; + signal.data = '{"text":"website.jpg","Header":"website.jpg","info":"hello friends"}' + let searchstringposition = signal.data.indexOf(key) if (signal.data == null){ - const data = '[' + newvar + ']'; - signal.data = data; + generatenewdict(newkeypair,signal) + } + else if(searchstringposition === -1){ + appenddict(newkeypair,signal) + } + else{ + replaceindict(newkeypair,key,signal) + } +} + +function replaceindict(newkeypair: string, key: string, signal: Signal):void{ + let lenght = signal.data.length; + let cutstring = signal.data.slice(1,lenght-1); + let stringarray = cutstring.split(',') + let finalstring = "" + for (let y = 0; y < stringarray.length; ++y) { + if (stringarray[y].indexOf(key) === -1){ + finalstring = finalstring + "," + stringarray[y]; + }else{ + finalstring = finalstring + "," + newkeypair; + } + } + signal.data = "{"+finalstring.slice(1)+"}" debug(signal.data); - }else{ - debug("This means there was data here"); + saveSignal(signal); } - return signal + +function generatenewdict(keypair: string, signal: Signal): void{ + const data = '{' + keypair + '}'; + debug("generate"); + signal.data = data; + debug(signal.data); + saveSignal(signal); } +function appenddict(keypair: string, signal: Signal):void{ + let signalsubstring = signal.data.substring(0,signal.data.length-1) + signal.data = signalsubstring + "," + keypair + "}" + debug(signal.data); + saveSignal(signal); +} -export function readProposal(id: string, proposalId: string): Signal { +export function readProposal(id: string, proposalId: string): void { let signal = getSignal(id); var key = ''; var value = ''; @@ -45,7 +76,7 @@ export function readProposal(id: string, proposalId: string): Signal { let descJson = json.fromBytes(ipfsData as Bytes); if (descJson.kind !== JSONValueKind.OBJECT) { - return signal; + debug(""); } if (descJson.toObject().get('key') != null) { key = descJson.toObject().get('key').toString(); @@ -55,6 +86,6 @@ export function readProposal(id: string, proposalId: string): Signal { } } - let signalstring = generatestring(key,value,signal) - return signalstring; + generatestring(key,value,signal) + } From 00d966f1983127e7160ea9c24e20ee61b35852e2 Mon Sep 17 00:00:00 2001 From: p Date: Fri, 10 Jan 2020 17:17:52 +0100 Subject: [PATCH 16/32] fixed small bug --- src/domain/signal.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/domain/signal.ts b/src/domain/signal.ts index 05054ab2..0a9c97d7 100644 --- a/src/domain/signal.ts +++ b/src/domain/signal.ts @@ -20,16 +20,17 @@ export function writesignal(signalId: string, proposalId: string): void { export function generatestring(key: string, value: string, signal: Signal ): void { const newkeypair = '"' + key + '"' +':' + '"'+ value + '"'; - signal.data = '{"text":"website.jpg","Header":"website.jpg","info":"hello friends"}' - let searchstringposition = signal.data.indexOf(key) + debug(signal.data); if (signal.data == null){ generatenewdict(newkeypair,signal) - } - else if(searchstringposition === -1){ - appenddict(newkeypair,signal) - } - else{ - replaceindict(newkeypair,key,signal) + }else{ + let searchstringposition = signal.data.indexOf(key) + if(searchstringposition === -1){ + appenddict(newkeypair,signal) + } + else{ + replaceindict(newkeypair,key,signal) + } } } @@ -76,7 +77,7 @@ export function readProposal(id: string, proposalId: string): void { let descJson = json.fromBytes(ipfsData as Bytes); if (descJson.kind !== JSONValueKind.OBJECT) { - debug(""); + debug("No JSON"); } if (descJson.toObject().get('key') != null) { key = descJson.toObject().get('key').toString(); From 8aadf08c05815122c01d2735d2a39407bd08cec6 Mon Sep 17 00:00:00 2001 From: p Date: Thu, 16 Jan 2020 15:54:08 +0100 Subject: [PATCH 17/32] WIP --- src/domain/signal.ts | 43 ++-- test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts | 232 ++++++++++++++++-- 2 files changed, 236 insertions(+), 39 deletions(-) diff --git a/src/domain/signal.ts b/src/domain/signal.ts index 0a9c97d7..3d776ddb 100644 --- a/src/domain/signal.ts +++ b/src/domain/signal.ts @@ -1,4 +1,4 @@ -import { Address, BigDecimal, BigInt, ByteArray, Bytes, crypto, ipfs, json, JSONValueKind, store } from '@graphprotocol/graph-ts'; +import { Bytes, ipfs, json, JSONValueKind, store } from '@graphprotocol/graph-ts'; import { Signal, Proposal } from '../types/schema'; import { debug } from '../utils'; @@ -19,49 +19,58 @@ export function writesignal(signalId: string, proposalId: string): void { } export function generatestring(key: string, value: string, signal: Signal ): void { - const newkeypair = '"' + key + '"' +':' + '"'+ value + '"'; - debug(signal.data); + const curlybraceopen = String.fromCharCode(123) + const curlybraceclose = String.fromCharCode(125) + const colon = String.fromCharCode(58) + const comma = String.fromCharCode(44) + const quotation = String.fromCharCode(34) + const newkeypair = quotation.concat(key).concat(quotation).concat(colon).concat(quotation).concat(value).concat(quotation) if (signal.data == null){ - generatenewdict(newkeypair,signal) + generatenewdict(newkeypair,signal,curlybraceopen, curlybraceclose) }else{ let searchstringposition = signal.data.indexOf(key) if(searchstringposition === -1){ - appenddict(newkeypair,signal) + appenddict(newkeypair,signal,curlybraceclose,comma) } else{ - replaceindict(newkeypair,key,signal) - } + replaceindict(newkeypair,key,signal,curlybraceopen,curlybraceclose,comma) } } +} -function replaceindict(newkeypair: string, key: string, signal: Signal):void{ +function replaceindict(newkeypair: string, + key: string, + signal: Signal, + curlybraceopen:string, + curlybraceclosed:string, + comma:string ):void{ let lenght = signal.data.length; let cutstring = signal.data.slice(1,lenght-1); - let stringarray = cutstring.split(',') + let stringarray = cutstring.split(comma) let finalstring = "" for (let y = 0; y < stringarray.length; ++y) { if (stringarray[y].indexOf(key) === -1){ - finalstring = finalstring + "," + stringarray[y]; + finalstring = finalstring.concat(comma).concat(stringarray[y]); }else{ - finalstring = finalstring + "," + newkeypair; + finalstring = finalstring.concat(comma).concat(newkeypair); } } - signal.data = "{"+finalstring.slice(1)+"}" + signal.data = curlybraceopen.concat(finalstring.slice(1)).concat(curlybraceclosed) debug(signal.data); + debug("replace"); saveSignal(signal); } -function generatenewdict(keypair: string, signal: Signal): void{ - const data = '{' + keypair + '}'; +function generatenewdict(keypair: string, signal: Signal, curlybraceopen:string, curlybraceclosed:string): void{ + const data = curlybraceopen.concat(keypair).concat(curlybraceclosed); debug("generate"); signal.data = data; - debug(signal.data); saveSignal(signal); } -function appenddict(keypair: string, signal: Signal):void{ +function appenddict(keypair: string, signal: Signal, curlybraceclosed:string, comma:string):void{ let signalsubstring = signal.data.substring(0,signal.data.length-1) - signal.data = signalsubstring + "," + keypair + "}" + signal.data = signalsubstring.concat(comma).concat(keypair).concat(curlybraceclosed) debug(signal.data); saveSignal(signal); } diff --git a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts index 92419590..d3b52c24 100644 --- a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts +++ b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts @@ -22,7 +22,7 @@ describe('Generic Signal Scheme', () => { opts = await getOptions(web3); }); - it('generic scheme proposal', async () => { + it('generic scheme proposal generate ', async () => { const accounts = web3.eth.accounts.wallet; const genericScheme = new web3.eth.Contract( @@ -187,37 +187,225 @@ describe('Generic Signal Scheme', () => { }, }); + const metaq = `{ + signals{ + id + data + } + }` + + // const metaq = `{ - // signals{ + // debugs{ // id - // data + // message // } // }` - const metaq = `{ - debugs{ + const metadata = await sendQuery(metaq, 5000); + + expect(metadata).toMatchObject({ + signals:[ + { + data: + '{"Header":"https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg"}', + id: + '0xe7a2c59e134ee81d4035ae6db2254f79308e334f' + } + ] + }); + + + + }, 100000); +it('generic scheme proposal append ', async () => { + const accounts = web3.eth.accounts.wallet; + + const genericScheme = new web3.eth.Contract( + GenericScheme.abi, + addresses.GenericScheme, + opts, + ); + const genesisProtocol = new web3.eth.Contract( + GenesisProtocol.abi, + addresses.GenesisProtocol, + opts, + ); + + const actionMock = new web3.eth.Contract( + ActionMock.abi, + addresses.ActionMock, + opts, + ); + + let proposalIPFSData = { + description: 'Setting new Icon', + title: 'New Icon', + url: 'http://swift.org/modest', + key: 'Icon', + value: 'https://en.wikipedia.org/wiki/River#/media/File:Melting_Toe_of_Athabasca_Glacier.jpg', + }; + + let proposalDescription = proposalIPFSData.description; + let proposalTitle = proposalIPFSData.title; + let proposalUrl = proposalIPFSData.url; + + let descHash = await writeProposalIPFS(proposalIPFSData); + let callData = await actionMock.methods.test2(addresses.TestAvatar).encodeABI(); + + async function propose() { + const prop = genericScheme.methods.proposeCall(addresses.TestAvatar, callData, 0, descHash); + const proposalId = await prop.call(); + const { blockNumber } = await prop.send(); + const { timestamp } = await web3.eth.getBlock(blockNumber); + return { proposalId, timestamp }; + } + + const [PASS, FAIL] = [1, 2]; + async function vote({ proposalId, outcome, voter, amount = 0 }) { + const { blockNumber } = await genesisProtocol.methods + .vote(proposalId, outcome, amount, voter) + .send({ from: voter }); + const { timestamp } = await web3.eth.getBlock(blockNumber); + return timestamp; + } + + const { proposalId: p1, timestamp: p1Creation } = await propose(); + //console.log(p1) + const getProposal = `{ + proposal(id: "${p1}") { id - message - } - }` + descriptionHash + stage + createdAt + executedAt + proposer + votingMachine + + genericScheme { + id + dao { + id + } + contractToCall + callData + value + executed + returnValue + } + scheme { + uGenericSchemeParams { + contractToCall + } + } + } +}`; - const metadata = await sendQuery(metaq, 5000); - console.log(metadata); - // - // expect(metadata).toMatchObject({ - // signals:[ - // { - // data: - // '{"signal": {"Header":"https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg"}}', - // id: - // '0xe7a2c59e134ee81d4035ae6db2254f79308e334f' - // } - // ] - // }); + let proposal = (await sendQuery(getProposal)).proposal; + expect(proposal).toMatchObject({ + id: p1, + descriptionHash: descHash, + stage: 'Queued', + createdAt: p1Creation.toString(), + executedAt: null, + proposer: web3.eth.defaultAccount.toLowerCase(), + votingMachine: genesisProtocol.options.address.toLowerCase(), + + genericScheme: { + id: p1, + dao: { + id: addresses.TestAvatar.toLowerCase(), + }, + contractToCall: actionMock.options.address.toLowerCase(), + callData, + value: '0', + executed: false, + returnValue: null, + }, + scheme: { + uGenericSchemeParams: { + contractToCall: actionMock.options.address.toLowerCase(), + }, + }, + }); + + await vote({ + proposalId: p1, + outcome: PASS, + voter: accounts[0].address, + }); + await vote({ + proposalId: p1, + outcome: PASS, + voter: accounts[1].address, + }); + await vote({ + proposalId: p1, + outcome: PASS, + voter: accounts[2].address, + }); + + let executedAt = await vote({ + proposalId: p1, + outcome: PASS, + voter: accounts[3].address, + }); + + const executedIsIndexed = async () => { + return (await sendQuery(getProposal)).proposal.executedAt != null; + }; + + await waitUntilTrue(executedIsIndexed); + + proposal = (await sendQuery(getProposal)).proposal; + expect(proposal).toMatchObject({ + id: p1, + descriptionHash: descHash, + stage: 'Executed', + createdAt: p1Creation.toString(), + executedAt: executedAt + '', + proposer: web3.eth.defaultAccount.toLowerCase(), + votingMachine: genesisProtocol.options.address.toLowerCase(), + + genericScheme: { + id: p1, + dao: { + id: addresses.TestAvatar.toLowerCase(), + }, + contractToCall: actionMock.options.address.toLowerCase(), + callData, + value: '0', + executed: true, + returnValue: '0x0000000000000000000000000000000000000000000000000000000000000001', + }, + }); + + const metaq = `{ + signals{ + id + data + } + }` + + const metadata = await sendQuery(metaq, 5000); + + expect(metadata).toMatchObject({ + signals:[ + { + data: + '{"Header":"https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg","Icon":"https://en.wikipedia.org/wiki/River#/media/File:Melting_Toe_of_Athabasca_Glacier.jpg"}', + id: + '0xe7a2c59e134ee81d4035ae6db2254f79308e334f' + } + ] + }); + + + +}, 100000); - }, 100000); }); From 259bcb427b94f7c4ba8d01ac60f7fb10e6004e9a Mon Sep 17 00:00:00 2001 From: p Date: Thu, 16 Jan 2020 17:13:21 +0100 Subject: [PATCH 18/32] add 2 testcases --- test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts | 326 ++++++------------ 1 file changed, 99 insertions(+), 227 deletions(-) diff --git a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts index d3b52c24..2e16c595 100644 --- a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts +++ b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts @@ -11,215 +11,7 @@ const ActionMock = require('@daostack/arc/build/contracts/ActionMock.json'); const GenericScheme = require('@daostack/arc/build/contracts/UGenericScheme.json'); const GenesisProtocol = require('@daostack/arc/build/contracts/GenesisProtocol.json'); -describe('Generic Signal Scheme', () => { - let web3; - let addresses; - let opts; - - beforeAll(async () => { - web3 = await getWeb3(); - addresses = getContractAddresses(); - opts = await getOptions(web3); - }); - - it('generic scheme proposal generate ', async () => { - const accounts = web3.eth.accounts.wallet; - - const genericScheme = new web3.eth.Contract( - GenericScheme.abi, - addresses.GenericScheme, - opts, - ); - const genesisProtocol = new web3.eth.Contract( - GenesisProtocol.abi, - addresses.GenesisProtocol, - opts, - ); - - const actionMock = new web3.eth.Contract( - ActionMock.abi, - addresses.ActionMock, - opts, - ); - - let proposalIPFSData = { - description: 'Setting new header Image', - title: 'New Header Image', - url: 'http://swift.org/modest', - key: 'Header', - value: 'https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg', - }; - - let proposalDescription = proposalIPFSData.description; - let proposalTitle = proposalIPFSData.title; - let proposalUrl = proposalIPFSData.url; - - let descHash = await writeProposalIPFS(proposalIPFSData); - let callData = await actionMock.methods.test2(addresses.TestAvatar).encodeABI(); - - async function propose() { - const prop = genericScheme.methods.proposeCall(addresses.TestAvatar, callData, 0, descHash); - const proposalId = await prop.call(); - const { blockNumber } = await prop.send(); - const { timestamp } = await web3.eth.getBlock(blockNumber); - return { proposalId, timestamp }; - } - - const [PASS, FAIL] = [1, 2]; - async function vote({ proposalId, outcome, voter, amount = 0 }) { - const { blockNumber } = await genesisProtocol.methods - .vote(proposalId, outcome, amount, voter) - .send({ from: voter }); - const { timestamp } = await web3.eth.getBlock(blockNumber); - return timestamp; - } - - const { proposalId: p1, timestamp: p1Creation } = await propose(); - //console.log(p1) - const getProposal = `{ - proposal(id: "${p1}") { - id - descriptionHash - stage - createdAt - executedAt - proposer - votingMachine - - genericScheme { - id - dao { - id - } - contractToCall - callData - value - executed - returnValue - } - scheme { - uGenericSchemeParams { - contractToCall - } - } - } - }`; - - - let proposal = (await sendQuery(getProposal)).proposal; - expect(proposal).toMatchObject({ - id: p1, - descriptionHash: descHash, - stage: 'Queued', - createdAt: p1Creation.toString(), - executedAt: null, - proposer: web3.eth.defaultAccount.toLowerCase(), - votingMachine: genesisProtocol.options.address.toLowerCase(), - - genericScheme: { - id: p1, - dao: { - id: addresses.TestAvatar.toLowerCase(), - }, - contractToCall: actionMock.options.address.toLowerCase(), - callData, - value: '0', - executed: false, - returnValue: null, - }, - scheme: { - uGenericSchemeParams: { - contractToCall: actionMock.options.address.toLowerCase(), - }, - }, - }); - - await vote({ - proposalId: p1, - outcome: PASS, - voter: accounts[0].address, - }); - - await vote({ - proposalId: p1, - outcome: PASS, - voter: accounts[1].address, - }); - - await vote({ - proposalId: p1, - outcome: PASS, - voter: accounts[2].address, - }); - - let executedAt = await vote({ - proposalId: p1, - outcome: PASS, - voter: accounts[3].address, - }); - - const executedIsIndexed = async () => { - return (await sendQuery(getProposal)).proposal.executedAt != null; - }; - - await waitUntilTrue(executedIsIndexed); - - proposal = (await sendQuery(getProposal)).proposal; - expect(proposal).toMatchObject({ - id: p1, - descriptionHash: descHash, - stage: 'Executed', - createdAt: p1Creation.toString(), - executedAt: executedAt + '', - proposer: web3.eth.defaultAccount.toLowerCase(), - votingMachine: genesisProtocol.options.address.toLowerCase(), - - genericScheme: { - id: p1, - dao: { - id: addresses.TestAvatar.toLowerCase(), - }, - contractToCall: actionMock.options.address.toLowerCase(), - callData, - value: '0', - executed: true, - returnValue: '0x0000000000000000000000000000000000000000000000000000000000000001', - }, - }); - - const metaq = `{ - signals{ - id - data - } - }` - - - // const metaq = `{ - // debugs{ - // id - // message - // } - // }` - - - const metadata = await sendQuery(metaq, 5000); - - expect(metadata).toMatchObject({ - signals:[ - { - data: - '{"Header":"https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg"}', - id: - '0xe7a2c59e134ee81d4035ae6db2254f79308e334f' - } - ] - }); - - - - }, 100000); -it('generic scheme proposal append ', async () => { +const maintest = async (web3,addresses,opts,proposalIPFSData,matchto) => { const accounts = web3.eth.accounts.wallet; const genericScheme = new web3.eth.Contract( @@ -239,14 +31,6 @@ it('generic scheme proposal append ', async () => { opts, ); - let proposalIPFSData = { - description: 'Setting new Icon', - title: 'New Icon', - url: 'http://swift.org/modest', - key: 'Icon', - value: 'https://en.wikipedia.org/wiki/River#/media/File:Melting_Toe_of_Athabasca_Glacier.jpg', - }; - let proposalDescription = proposalIPFSData.description; let proposalTitle = proposalIPFSData.title; let proposalUrl = proposalIPFSData.url; @@ -391,21 +175,109 @@ it('generic scheme proposal append ', async () => { } }` + + // const metaq = `{ + // debugs{ + // id + // message + // } + // }` + + const metadata = await sendQuery(metaq, 5000); + expect(metadata).toMatchObject(matchto); - expect(metadata).toMatchObject({ - signals:[ - { - data: - '{"Header":"https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg","Icon":"https://en.wikipedia.org/wiki/River#/media/File:Melting_Toe_of_Athabasca_Glacier.jpg"}', - id: - '0xe7a2c59e134ee81d4035ae6db2254f79308e334f' - } - ] +} + + + +describe('Generic Signal Scheme', () => { + let web3; + let addresses; + let opts; + + beforeAll(async () => { + web3 = await getWeb3(); + addresses = getContractAddresses(); + opts = await getOptions(web3); }); + it('generic scheme proposal generate ', async () => { + + let proposalIPFSData = { + description: 'Setting new header Image', + title: 'New Header Image', + url: 'http://swift.org/modest', + key: 'Header', + value: 'https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg', + }; + + let matchto = { + signals:[ + { + data: + '{"Header":"https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg"}', + id: + '0xe7a2c59e134ee81d4035ae6db2254f79308e334f' + } + ] + } + + const test = await maintest(web3,addresses,opts,proposalIPFSData,matchto) + + + }, 100000); + + it('generic scheme proposal append ', async () => { + + let proposalIPFSData = { + description: 'Setting new Icon', + title: 'New Icon', + url: 'http://swift.org/modest', + key: 'Icon', + value: 'https://en.wikipedia.org/wiki/River#/media/File:Melting_Toe_of_Athabasca_Glacier.jpg', + }; + let matchto = { + signals:[ + { + data: + '{"Header":"https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg","Icon":"https://en.wikipedia.org/wiki/River#/media/File:Melting_Toe_of_Athabasca_Glacier.jpg"}', + id: + '0xe7a2c59e134ee81d4035ae6db2254f79308e334f' + } + ] + } + + const test = await maintest(web3,addresses,opts,proposalIPFSData,matchto) + + }, 100000); -}, 100000); + + it('generic scheme proposal replace ', async () => { + + let proposalIPFSData = { + description: 'Replace the Header', + title: 'New Header Image', + url: 'http://swift.org/modest', + key: 'Header', + value: 'https://de.wikipedia.org/wiki/Wasserfall#/media/Datei:Russell_Falls_2.jpg', + }; + + let matchto = { + signals:[ + { + data: + '{"Header":"https://de.wikipedia.org/wiki/Wasserfall#/media/Datei:Russell_Falls_2.jpg","Icon":"https://en.wikipedia.org/wiki/River#/media/File:Melting_Toe_of_Athabasca_Glacier.jpg"}', + id: + '0xe7a2c59e134ee81d4035ae6db2254f79308e334f' + } + ] + } + + const test = await maintest(web3,addresses,opts,proposalIPFSData,matchto) + + + }, 100000); }); From 2ce6df2af872504e350cd90fa95a403e450e1f5f Mon Sep 17 00:00:00 2001 From: p Date: Thu, 16 Jan 2020 19:16:32 +0100 Subject: [PATCH 19/32] fixed timer --- test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts index 2e16c595..23aba7ed 100644 --- a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts +++ b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts @@ -7,6 +7,8 @@ import { writeProposalIPFS, } from './util'; +jest.setTimeout(30000); + const ActionMock = require('@daostack/arc/build/contracts/ActionMock.json'); const GenericScheme = require('@daostack/arc/build/contracts/UGenericScheme.json'); const GenesisProtocol = require('@daostack/arc/build/contracts/GenesisProtocol.json'); @@ -87,7 +89,7 @@ const maintest = async (web3,addresses,opts,proposalIPFSData,matchto) => { }`; - let proposal = (await sendQuery(getProposal)).proposal; + let proposal = (await sendQuery(getProposal,60000)).proposal; expect(proposal).toMatchObject({ id: p1, descriptionHash: descHash, @@ -184,7 +186,7 @@ const maintest = async (web3,addresses,opts,proposalIPFSData,matchto) => { // }` - const metadata = await sendQuery(metaq, 5000); + const metadata = await sendQuery(metaq, 15000); expect(metadata).toMatchObject(matchto); } From 2ef4277ed7d7ed11c220a197185625dadcc79109 Mon Sep 17 00:00:00 2001 From: p Date: Sun, 19 Jan 2020 23:35:14 +0100 Subject: [PATCH 20/32] modifyed Signal Test to fit new merged master --- test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts index 23aba7ed..1961c3da 100644 --- a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts +++ b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts @@ -1,4 +1,5 @@ import { + getArcVersion, getContractAddresses, getOptions, getWeb3, @@ -9,9 +10,10 @@ import { jest.setTimeout(30000); -const ActionMock = require('@daostack/arc/build/contracts/ActionMock.json'); -const GenericScheme = require('@daostack/arc/build/contracts/UGenericScheme.json'); -const GenesisProtocol = require('@daostack/arc/build/contracts/GenesisProtocol.json'); +const ActionMock = require('@daostack/migration/contracts/' + getArcVersion() + '/ActionMock.json'); +const GenericScheme = require('@daostack/migration/contracts/' + getArcVersion() + '/GenericScheme.json'); +const GenesisProtocol = require('@daostack/migration/contracts/' + getArcVersion() + '/GenesisProtocol.json'); + const maintest = async (web3,addresses,opts,proposalIPFSData,matchto) => { const accounts = web3.eth.accounts.wallet; @@ -89,7 +91,7 @@ const maintest = async (web3,addresses,opts,proposalIPFSData,matchto) => { }`; - let proposal = (await sendQuery(getProposal,60000)).proposal; + let proposal = (await sendQuery(getProposal,80000)).proposal; expect(proposal).toMatchObject({ id: p1, descriptionHash: descHash, @@ -220,7 +222,7 @@ describe('Generic Signal Scheme', () => { data: '{"Header":"https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg"}', id: - '0xe7a2c59e134ee81d4035ae6db2254f79308e334f' + '0x86e9fe552e75e4fc51f46e4efc128628ecd5ada7' } ] } @@ -246,7 +248,7 @@ describe('Generic Signal Scheme', () => { data: '{"Header":"https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg","Icon":"https://en.wikipedia.org/wiki/River#/media/File:Melting_Toe_of_Athabasca_Glacier.jpg"}', id: - '0xe7a2c59e134ee81d4035ae6db2254f79308e334f' + '0x86e9fe552e75e4fc51f46e4efc128628ecd5ada7' } ] } @@ -272,7 +274,7 @@ describe('Generic Signal Scheme', () => { data: '{"Header":"https://de.wikipedia.org/wiki/Wasserfall#/media/Datei:Russell_Falls_2.jpg","Icon":"https://en.wikipedia.org/wiki/River#/media/File:Melting_Toe_of_Athabasca_Glacier.jpg"}', id: - '0xe7a2c59e134ee81d4035ae6db2254f79308e334f' + '0x86e9fe552e75e4fc51f46e4efc128628ecd5ada7' } ] } From 28d1cdac843aacddd79db7b2ed7daa610bccdbc6 Mon Sep 17 00:00:00 2001 From: p Date: Wed, 22 Jan 2020 12:12:44 +0100 Subject: [PATCH 21/32] add save character test --- src/domain/signal.ts | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/domain/signal.ts b/src/domain/signal.ts index 3d776ddb..7baeb88f 100644 --- a/src/domain/signal.ts +++ b/src/domain/signal.ts @@ -1,4 +1,4 @@ -import { Bytes, ipfs, json, JSONValueKind, store } from '@graphprotocol/graph-ts'; +import { Bytes, ipfs, json, JSONValue, JSONValueKind, store } from '@graphprotocol/graph-ts'; import { Signal, Proposal } from '../types/schema'; import { debug } from '../utils'; @@ -10,6 +10,7 @@ export function getSignal(id: string): Signal { return sig; } + function saveSignal(signal: Signal): void { signal.save() } @@ -75,10 +76,22 @@ function appenddict(keypair: string, signal: Signal, curlybraceclosed:string, co saveSignal(signal); } +function teststring(key: string, value: string): boolean { + var returnboolean: boolean = true; + const comma: string = String.fromCharCode(44); + let searchkey: number = key.indexOf(comma) + let searchvalue: number = value.indexOf(comma) + if(searchkey != -1 || searchvalue != -1 ){ + returnboolean = false + } + return returnboolean +} + export function readProposal(id: string, proposalId: string): void { - let signal = getSignal(id); - var key = ''; - var value = ''; + let signal: Signal = getSignal(id); + var key: string = null; + var value: string = null; + let proposal = store.get('Proposal', proposalId) as Proposal; let ipfsData = ipfs.cat('/ipfs/' + proposal.descriptionHash); @@ -94,8 +107,11 @@ export function readProposal(id: string, proposalId: string): void { if (descJson.toObject().get('value') != null) { value = descJson.toObject().get('value').toString(); } - } - generatestring(key,value,signal) + if (key !== null && value !== null ){ + if (teststring(key,value)){ + generatestring(key,value,signal) + } + } } From 561eaf1c01e2be446c5b50297afee622e450a838 Mon Sep 17 00:00:00 2001 From: p Date: Wed, 22 Jan 2020 12:23:01 +0100 Subject: [PATCH 22/32] small fix --- test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts index 1961c3da..db3f6c8d 100644 --- a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts +++ b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts @@ -91,7 +91,7 @@ const maintest = async (web3,addresses,opts,proposalIPFSData,matchto) => { }`; - let proposal = (await sendQuery(getProposal,80000)).proposal; + let proposal = (await sendQuery(getProposal,90000)).proposal; expect(proposal).toMatchObject({ id: p1, descriptionHash: descHash, @@ -230,7 +230,7 @@ describe('Generic Signal Scheme', () => { const test = await maintest(web3,addresses,opts,proposalIPFSData,matchto) - }, 100000); + }, 200000); it('generic scheme proposal append ', async () => { @@ -255,7 +255,7 @@ describe('Generic Signal Scheme', () => { const test = await maintest(web3,addresses,opts,proposalIPFSData,matchto) - }, 100000); + }, 200000); it('generic scheme proposal replace ', async () => { @@ -282,6 +282,6 @@ describe('Generic Signal Scheme', () => { const test = await maintest(web3,addresses,opts,proposalIPFSData,matchto) - }, 100000); + }, 200000); }); From 9cadf6e78bc8b0c49a3e9ba5bb8439edaccf80cb Mon Sep 17 00:00:00 2001 From: p Date: Thu, 23 Jan 2020 17:55:23 +0100 Subject: [PATCH 23/32] before testnet --- src/mappings/GenericScheme/mapping.ts | 2 ++ src/mappings/UGenericScheme/mapping.ts | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mappings/GenericScheme/mapping.ts b/src/mappings/GenericScheme/mapping.ts index a137927c..e23fac74 100644 --- a/src/mappings/GenericScheme/mapping.ts +++ b/src/mappings/GenericScheme/mapping.ts @@ -1,4 +1,5 @@ import { store } from '@graphprotocol/graph-ts'; +import { debug } from '../../utils'; // Import event types from the Reputation contract ABI import { @@ -23,6 +24,7 @@ function insertNewProposal(event: NewCallProposal): void { ent.callData = event.params._callData; ent.value = event.params._value; ent.executed = false; + debug("Test1") store.set('GenericSchemeProposal', event.params._proposalId.toHex(), ent); } diff --git a/src/mappings/UGenericScheme/mapping.ts b/src/mappings/UGenericScheme/mapping.ts index 79731f24..74a53d1d 100644 --- a/src/mappings/UGenericScheme/mapping.ts +++ b/src/mappings/UGenericScheme/mapping.ts @@ -1,5 +1,4 @@ import { store } from '@graphprotocol/graph-ts'; -import { debug } from '../../utils'; // Import event types from the Reputation contract ABI import { @@ -54,6 +53,5 @@ export function handleProposalExecuted( var proposalId = event.params._proposalId.toHex(); domain.addSignal(signalId, proposalId); - store.set('GenericSchemeProposal', event.params._proposalId.toHex(), ent); } From daffbfc6bb8db20a7b56e50675a189b654a424cf Mon Sep 17 00:00:00 2001 From: Shubhendu Shekhar Date: Wed, 19 Feb 2020 09:48:31 +0100 Subject: [PATCH 24/32] update deps and migration image --- docker-compose.yml | 2 +- package-lock.json | 24 ++++++++++++------------ package.json | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 1725c0ae..b3635931 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -31,6 +31,6 @@ services: environment: POSTGRES_PASSWORD: letmein ganache: - image: 'daostack/migration:0.0.1-rc.37-v2' + image: 'daostack/migration:0.0.1-rc.37-v3' ports: - '8545:8545' diff --git a/package-lock.json b/package-lock.json index 48108ded..8cea9c8a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -229,9 +229,9 @@ } }, "@daostack/migration": { - "version": "0.0.1-rc.37-v2", - "resolved": "https://registry.npmjs.org/@daostack/migration/-/migration-0.0.1-rc.37-v2.tgz", - "integrity": "sha512-gY//EScVv1Wc1CliiA47QXNOSdwpuR67X6ioZssLLRZyyWa5OtJFWi+D7hu98gC5Kw/cZszBKRVFv9sf5T2HHQ==", + "version": "0.0.1-rc.37-v3", + "resolved": "https://registry.npmjs.org/@daostack/migration/-/migration-0.0.1-rc.37-v3.tgz", + "integrity": "sha512-+/cpbpzCJiJVQ4khDLQVkewoXGxXmRoPhvDdTPKMrdWvJhY+Bx+Ll4FbzQwy/tQTbQZgBSa8DWKBPoJALmKlGQ==", "dev": true, "requires": { "@daostack/arc": "0.0.1-rc.37", @@ -10743,9 +10743,9 @@ }, "dependencies": { "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true } } @@ -10760,9 +10760,9 @@ }, "dependencies": { "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true } } @@ -10779,9 +10779,9 @@ }, "dependencies": { "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true } } diff --git a/package.json b/package.json index 78c5b4ca..cc9d9cfd 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "test:watch": "npm run test -- --watch" }, "devDependencies": { - "@daostack/migration": "0.0.1-rc.37-v2", + "@daostack/migration": "0.0.1-rc.37-v3", "@types/jest": "^23.3.7", "@types/mocha": "^5.2.5", "babel-eslint": "^10.0.1", From e5ef415d3b5b4c03853edf307b278d6a4d76a371 Mon Sep 17 00:00:00 2001 From: Shubhendu Shekhar Date: Wed, 19 Feb 2020 09:49:29 +0100 Subject: [PATCH 25/32] add signal scheme mapping --- src/domain/signal.ts | 24 +++++++++-------------- src/mappings/SignalScheme/datasource.yaml | 6 ++++++ src/mappings/SignalScheme/mapping.ts | 8 ++++++++ src/mappings/SignalScheme/schema.graphql | 0 4 files changed, 23 insertions(+), 15 deletions(-) create mode 100644 src/mappings/SignalScheme/datasource.yaml create mode 100644 src/mappings/SignalScheme/mapping.ts create mode 100644 src/mappings/SignalScheme/schema.graphql diff --git a/src/domain/signal.ts b/src/domain/signal.ts index 7baeb88f..72f419ca 100644 --- a/src/domain/signal.ts +++ b/src/domain/signal.ts @@ -1,5 +1,5 @@ -import { Bytes, ipfs, json, JSONValue, JSONValueKind, store } from '@graphprotocol/graph-ts'; -import { Signal, Proposal } from '../types/schema'; +import { Bytes, ipfs, json, JSONValueKind, store } from '@graphprotocol/graph-ts'; +import { Signal } from '../types/schema'; import { debug } from '../utils'; export function getSignal(id: string): Signal { @@ -88,13 +88,10 @@ function teststring(key: string, value: string): boolean { } export function readProposal(id: string, proposalId: string): void { - let signal: Signal = getSignal(id); - var key: string = null; - var value: string = null; - - let proposal = store.get('Proposal', proposalId) as Proposal; - - let ipfsData = ipfs.cat('/ipfs/' + proposal.descriptionHash); + let signal = getSignal(id); + let key = ''; + let value = ''; + let ipfsData = ipfs.cat('/ipfs/' + proposalId); if (ipfsData != null && ipfsData.toString() !== '{}') { let descJson = json.fromBytes(ipfsData as Bytes); @@ -107,11 +104,8 @@ export function readProposal(id: string, proposalId: string): void { if (descJson.toObject().get('value') != null) { value = descJson.toObject().get('value').toString(); } - } - if (key !== null && value !== null ){ - if (teststring(key,value)){ - generatestring(key,value,signal) - } } -} + generatestring(key,value,signal) + +} \ No newline at end of file diff --git a/src/mappings/SignalScheme/datasource.yaml b/src/mappings/SignalScheme/datasource.yaml new file mode 100644 index 00000000..dc3eb202 --- /dev/null +++ b/src/mappings/SignalScheme/datasource.yaml @@ -0,0 +1,6 @@ +abis: + - NewSignalScheme + +eventHandlers: + - event: SignalLog(indexed address,string) + handler: handleSignal diff --git a/src/mappings/SignalScheme/mapping.ts b/src/mappings/SignalScheme/mapping.ts new file mode 100644 index 00000000..eebaa6e0 --- /dev/null +++ b/src/mappings/SignalScheme/mapping.ts @@ -0,0 +1,8 @@ +import { SignalLog } from '../../types/NewSignalScheme/NewSignalScheme'; +import * as domain from '../../domain'; + +export function handleSignal( event: SignalLog): void { + let signalId = event.params._sender.toHex(); + let proposalId = event.params._descriptionHash; + domain.addSignal(signalId, proposalId); +} diff --git a/src/mappings/SignalScheme/schema.graphql b/src/mappings/SignalScheme/schema.graphql new file mode 100644 index 00000000..e69de29b From 5aa73e757fa71de20520e54bef90965464c274a9 Mon Sep 17 00:00:00 2001 From: Shubhendu Shekhar Date: Wed, 19 Feb 2020 09:49:41 +0100 Subject: [PATCH 26/32] add signal scheme test --- test/0.0.1-rc.37/SignalSchemeABI.json | 39 +++++ test/0.0.1-rc.37/SignalSchemeSanity.spec.ts | 72 ++++++++ test/0.0.1-rc.37/util.ts | 176 ++++++++++++++++++++ 3 files changed, 287 insertions(+) create mode 100644 test/0.0.1-rc.37/SignalSchemeABI.json create mode 100644 test/0.0.1-rc.37/SignalSchemeSanity.spec.ts create mode 100644 test/0.0.1-rc.37/util.ts diff --git a/test/0.0.1-rc.37/SignalSchemeABI.json b/test/0.0.1-rc.37/SignalSchemeABI.json new file mode 100644 index 00000000..8d45dbb1 --- /dev/null +++ b/test/0.0.1-rc.37/SignalSchemeABI.json @@ -0,0 +1,39 @@ +{ + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "string", + "name": "_descriptionHash", + "type": "string" + } + ], + "name": "SignalLog", + "type": "event" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "string", + "name": "_descriptionHash", + "type": "string" + } + ], + "name": "signal", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5061015c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f613f16114610030575b600080fd5b6100a76004803603602081101561004657600080fd5b810190808035906020019064010000000081111561006357600080fd5b82018360208201111561007557600080fd5b8035906020019184600183028401116401000000008311171561009757600080fd5b90919293919293905050506100a9565b005b3373ffffffffffffffffffffffffffffffffffffffff167fc5e5dee32f45752fe891f97ae70ae8ea7351f3c7d67fa09275a2dc99be92559e838360405180806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050935050505060405180910390a2505056fea265627a7a72315820bb4b2ec14fe5331a03bfc3928923da8afc866df6c3e3e894107f10700c0c552a64736f6c634300050b0032" +} \ No newline at end of file diff --git a/test/0.0.1-rc.37/SignalSchemeSanity.spec.ts b/test/0.0.1-rc.37/SignalSchemeSanity.spec.ts new file mode 100644 index 00000000..4049cd5c --- /dev/null +++ b/test/0.0.1-rc.37/SignalSchemeSanity.spec.ts @@ -0,0 +1,72 @@ +import { + getOptions, + getWeb3, + writeProposalIPFS, + sendQuery + } from './util'; + + jest.setTimeout(30000); + + const SignalScheme = require('./SignalSchemeABI.json') + + const maintest = async (web3, opts, proposalIPFSData, matchto) => { + + const signalSchemeMock = new web3.eth.Contract(SignalScheme.abi, "0xE06d896da40B73Cb02650220E480e20F38e7bE18" ,opts); + /* const signalContract = await signalSchemeMock.deploy({ + data: SignalScheme.bytecode, + arguments: [] + }).send() */ + console.log(signalSchemeMock.options.address, signalSchemeMock.address) + let descHash = await writeProposalIPFS(proposalIPFSData); + + console.log(signalSchemeMock.methods.signal(descHash).encodeABI()) + await signalSchemeMock.methods.signal(descHash).send(); + + const metaq = `{ + signals{ + id + data + } + }` + + const metadata = await sendQuery(metaq, 15000); + expect(metadata).toMatchObject(matchto); + + } + + describe('Generic Signal Scheme', () => { + let web3; + let opts; + + beforeAll(async () => { + web3 = await getWeb3(); + opts = await getOptions(web3); + }); + + it('generic scheme proposal generate ', async () => { + + let proposalIPFSData = { + description: 'Setting new header Image', + title: 'New Header Image', + url: 'https://w.wallhaven.cc/full/13/wallhaven-13mk9v.jpg', + key: 'Header', + value: 'https://w.wallhaven.cc/full/13/wallhaven-13mk9v.jpg', + }; + + let matchto = { + signals: [ + { + data: + '{"Header":"https://en.wikipedia.org/wiki/"}', + id: + '0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1' + } + ] + } + + await maintest(web3, opts, proposalIPFSData, matchto) + + + }, 100000); + + }); \ No newline at end of file diff --git a/test/0.0.1-rc.37/util.ts b/test/0.0.1-rc.37/util.ts new file mode 100644 index 00000000..de28a3ff --- /dev/null +++ b/test/0.0.1-rc.37/util.ts @@ -0,0 +1,176 @@ +require('dotenv').config(); +const IPFSClient = require('ipfs-http-client'); + +process.env = { + ethereum: 'http://127.0.0.1:8545', + ipfs: '/ip4/127.0.0.1/tcp/5001', + node_http: 'http://127.0.0.1:8000/subgraphs/name/daostack', + node_ws: 'http://127.0.0.1:8001/subgraphs/name/daostack', + test_mnemonic: + 'myth like bonus scare over problem client lizard pioneer submit female collect', + ...process.env, +}; + +const { execute } = require('apollo-link'); +const { WebSocketLink } = require('apollo-link-ws'); +const { SubscriptionClient } = require('subscriptions-transport-ws'); +const ws = require('ws'); +import axios from 'axios'; +import * as HDWallet from 'hdwallet-accounts'; +const Web3 = require('web3'); + +const { node_ws, node_http, ethereum, ipfs, test_mnemonic } = process.env; + +export async function sendQuery(q: string, maxDelay = 1000, url = node_http) { + await new Promise((res, rej) => setTimeout(res, maxDelay)); + const { + data: { data }, + } = await axios.post(url, { + query: q, + }); + + return data; +} + +export const addressLength = 40; +export const hashLength = 64; +export const nullAddress = '0x0000000000000000000000000000000000000000'; +export const nullParamsHash = '0x' + padZeros('', 64); + +export async function getWeb3() { + const web3 = new Web3(ethereum); + const hdwallet = HDWallet(10, test_mnemonic); + Array(10) + .fill(10) + .map((_, i) => i) + .forEach((i) => { + const pk = hdwallet.accounts[i].privateKey; + const account = web3.eth.accounts.privateKeyToAccount(pk); + web3.eth.accounts.wallet.add(account); + }); + web3.eth.defaultAccount = web3.eth.accounts.wallet[0].address; + return web3; +} + +export function getContractAddresses() { + const addresses = require(`@daostack/migration/migration.json`); + let arcVersion = '0.0.1-rc.36'; + return { + ...addresses.private.test[arcVersion], + ...addresses.private.dao[arcVersion], + ...addresses.private.base[arcVersion], + ...addresses.private.test[arcVersion].organs, + TestAvatar: addresses.private.test[arcVersion].Avatar, + NativeToken: addresses.private.dao[arcVersion].DAOToken, + NativeReputation: addresses.private.dao[arcVersion].Reputation, + ContributionRewardExt: addresses.private.dao[arcVersion].Schemes[1].address, + Competition: addresses.private.dao[arcVersion].StandAloneContracts[2].address, + }; +} + +export function getArcVersion() { + return '0.0.1-rc.36'; +} + +export function getOrgName() { + return require(`@daostack/migration/migration.json`).private.dao['0.0.1-rc.36'].name; +} + +export async function getOptions(web3) { + const block = await web3.eth.getBlock('latest'); + return { + from: web3.eth.defaultAccount, + gas: block.gasLimit - 100000, + }; +} + +export async function writeProposalIPFS(data: any) { + const ipfsClient = IPFSClient(ipfs); + const ipfsResponse = await ipfsClient.add(new Buffer(JSON.stringify(data))); + + return ipfsResponse[0].path; +} + +export function padZeros(str: string, max = 36) { + str = str.toString(); + return str.length < max ? padZeros('0' + str, max) : str; +} + +export const createSubscriptionObservable = ( + query: string, + variables = 0, + wsurl = node_ws, +) => { + const client = new SubscriptionClient(wsurl, { reconnect: true }, ws); + const link = new WebSocketLink(client); + return execute(link, { query, variables }); +}; + +export async function waitUntilTrue(test: () => Promise | boolean) { + return new Promise((resolve, reject) => { + (async function waitForIt(): Promise { + if (await test()) { return resolve(); } + setTimeout(waitForIt, 30); + })(); + }); +} + +export async function waitUntilSynced() { + const getGraphsSynced = `{ + subgraphDeployments { + synced + } + }`; + const graphIsSynced = async () => { + let result = await sendQuery( + getGraphsSynced, + 1000, + 'http://127.0.0.1:8000/subgraphs'); + return ((result.subgraphDeployments.length > 0) && result.subgraphDeployments[0].synced); + }; + await waitUntilTrue(graphIsSynced); +} + +export const increaseTime = async function(duration, web3) { + const id = await Date.now(); + web3.providers.HttpProvider.prototype.sendAsync = web3.providers.HttpProvider.prototype.send; + + return new Promise((resolve, reject) => { + web3.currentProvider.sendAsync({ + jsonrpc: '2.0', + method: 'evm_increaseTime', + params: [duration], + id, + }, (err1) => { + if (err1) { return reject(err1); } + + web3.currentProvider.sendAsync({ + jsonrpc: '2.0', + method: 'evm_mine', + id: id + 1, + }, (err2, res) => { + return err2 ? reject(err2) : resolve(res); + }); + }); + }); +}; + +export function toFixed(x) { + if (Math.abs(x) < 1.0) { + // tslint:disable-next-line: radix + let e = parseInt(x.toString().split('e-')[1]); + if (e) { + x *= Math.pow(10, e - 1); + x = '0.' + (new Array(e)).join('0') + x.toString().substring(2); + } + } else { + // tslint:disable-next-line: radix + let e = parseInt(x.toString().split('+')[1]); + if (e > 20) { + e -= 20; + x /= Math.pow(10, e); + x += (new Array(e + 1)).join('0'); + } + } + return x; +} From 382b4fc0837e124a9c522ab482de0cf72a84230e Mon Sep 17 00:00:00 2001 From: Shubhendu Shekhar Date: Wed, 19 Feb 2020 09:50:15 +0100 Subject: [PATCH 27/32] update private test dao --- daos/private/testdao16.json | 2 +- daos/private/testdao19.json | 2 +- daos/private/testdao32.json | 2 +- daos/private/testdao33.json | 2 +- daos/private/testdao37.json | 39 +++++++++++++++++++++++++++++++++++++ 5 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 daos/private/testdao37.json diff --git a/daos/private/testdao16.json b/daos/private/testdao16.json index 55350cd1..15ab1073 100644 --- a/daos/private/testdao16.json +++ b/daos/private/testdao16.json @@ -1,5 +1,5 @@ { - "name": "Incendiary Inker", + "name": "Corpulent Musician", "Avatar": "0xE7A2C59e134ee81D4035Ae6DB2254f79308e334f", "DAOToken": "0xcDbe8b52A6c60A5f101d4A0F1f049f19a9e1D35F", "Reputation": "0x93cdbf39fB9e13BD253CA5819247D52fbabf0F2f", diff --git a/daos/private/testdao19.json b/daos/private/testdao19.json index 11cc05e5..69575280 100644 --- a/daos/private/testdao19.json +++ b/daos/private/testdao19.json @@ -1,5 +1,5 @@ { - "name": "Bilious Scenographer", + "name": "Salubrious Model", "Avatar": "0xf88E4C158298323a85dD7678eD60DBfF6DA71007", "DAOToken": "0xa09Cd74C747bf9DDB9154B1C75e271Dd12E45224", "Reputation": "0x5E06A0d7BA9728E3B3140857B26fFD6626D66793", diff --git a/daos/private/testdao32.json b/daos/private/testdao32.json index 2cd02d0b..7e02b46d 100644 --- a/daos/private/testdao32.json +++ b/daos/private/testdao32.json @@ -1,5 +1,5 @@ { - "name": "Feckless Engineering", + "name": "Incendiary Panel beater", "Avatar": "0x98CcB5051fD767e2E89567bCCCA4Efc532250544", "DAOToken": "0x30dB4905b474aff3e1EAfc60394ece85dC524A92", "Reputation": "0x4992595a747d772bF291f64112735064BFc8878f", diff --git a/daos/private/testdao33.json b/daos/private/testdao33.json index 7768c5e0..7c186527 100644 --- a/daos/private/testdao33.json +++ b/daos/private/testdao33.json @@ -1,5 +1,5 @@ { - "name": "Judicious Mermaid eggs", + "name": "Insolent Opera singer", "Avatar": "0x2268317B403ADEc49Fde9241a977335aba406A55", "DAOToken": "0x78B7beA9fB68616E4520DC2F522833616f6413d5", "Reputation": "0x0819C56Db86FbC6Cb3e0ef63F7DF0c4d5e60d915", diff --git a/daos/private/testdao37.json b/daos/private/testdao37.json new file mode 100644 index 00000000..b9c98d26 --- /dev/null +++ b/daos/private/testdao37.json @@ -0,0 +1,39 @@ +{ + "name": "Hubristic Colorist", + "Avatar": "0x66301c44C22E0AEcd8ee8e6073A8300dC138A7af", + "DAOToken": "0xa6b58AE81c37b45BbeAC4C86866fA4b48e378139", + "Reputation": "0xB9e9DfAcb27f42357215aC3942810786C0cb75e2", + "Controller": "0xf577703d169b02e6807f80a4fCe029f7F91124CB", + "Schemes": [ + { + "name": "GenericScheme", + "alias": "GenericSchemeAlias", + "address": "0xCE792fA3A9cd660fFD1be077CB1358A08Cf9106B", + "arcVersion": "0.0.1-rc.37" + }, + { + "name": "ContributionRewardExt", + "alias": "ContributionRewardExt", + "address": "0xA10f1c26d7D4BCB1a93F84652177D2E2b320378B", + "arcVersion": "0.0.1-rc.36" + } + ], + "StandAloneContracts": [ + { + "name": "Wallet", + "address": "0x0E1598278e34793C83A4B1989d410DD0D7652b92", + "arcVersion": "0.0.1-rc.37" + }, + { + "name": "ContributionRewardExt", + "address": "0xA10f1c26d7D4BCB1a93F84652177D2E2b320378B", + "arcVersion": "0.0.1-rc.36" + }, + { + "name": "Competition", + "address": "0xD65d9Cb0fC54c95Ed021D74cB5164b5B30bB4B86", + "arcVersion": "0.0.1-rc.36" + } + ], + "arcVersion": "0.0.1-rc.37" +} \ No newline at end of file From 36395e8657f5a4340a8efede2883379bef617640 Mon Sep 17 00:00:00 2001 From: Shubhendu Shekhar Date: Wed, 19 Feb 2020 09:50:26 +0100 Subject: [PATCH 28/32] add sample mapping --- ops/mappings.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/ops/mappings.json b/ops/mappings.json index 1f61a52c..d79ebc58 100644 --- a/ops/mappings.json +++ b/ops/mappings.json @@ -30,6 +30,13 @@ "mapping": "UGenericScheme", "arcVersion": "0.0.1-rc.16" }, + { + "name": "NewSignalScheme", + "dao": "address", + "mapping": "SignalScheme", + "arcVersion": "0.0.1-rc.37", + "address": "0xE06d896da40B73Cb02650220E480e20F38e7bE18" + }, { "name": "SchemeRegistrar", "contractName": "SchemeRegistrar", @@ -747,6 +754,13 @@ "mapping": "DAOToken", "arcVersion": "0.0.1-rc.19" }, + { + "name": "NewSignalScheme", + "dao": "address", + "mapping": "SignalScheme", + "arcVersion": "0.0.1-rc.37", + "address": "0xE06d896da40B73Cb02650220E480e20F38e7bE18" + }, { "name": "Reputation", "contractName": "Reputation", From dc3883a95463447882396fb20098d062d02b11fa Mon Sep 17 00:00:00 2001 From: Shubhendu Shekhar Date: Wed, 4 Mar 2020 17:05:59 +0100 Subject: [PATCH 29/32] update signal scheme writing logic --- src/domain/signal.ts | 57 +++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/src/domain/signal.ts b/src/domain/signal.ts index 72f419ca..101952bc 100644 --- a/src/domain/signal.ts +++ b/src/domain/signal.ts @@ -2,7 +2,7 @@ import { Bytes, ipfs, json, JSONValueKind, store } from '@graphprotocol/graph-ts import { Signal } from '../types/schema'; import { debug } from '../utils'; -export function getSignal(id: string): Signal { +function getSignal(id: string): Signal { let sig = store.get('Signal', id) as Signal; if (sig == null) { sig = new Signal(id); @@ -11,29 +11,31 @@ export function getSignal(id: string): Signal { } -function saveSignal(signal: Signal): void { - signal.save() +export function writesignal(signalId: string, proposalIpfsId: string): void { + readProposal(signalId, proposalIpfsId) } -export function writesignal(signalId: string, proposalId: string): void { - readProposal(signalId, proposalId) -} - -export function generatestring(key: string, value: string, signal: Signal ): void { - const curlybraceopen = String.fromCharCode(123) - const curlybraceclose = String.fromCharCode(125) - const colon = String.fromCharCode(58) - const comma = String.fromCharCode(44) - const quotation = String.fromCharCode(34) - const newkeypair = quotation.concat(key).concat(quotation).concat(colon).concat(quotation).concat(value).concat(quotation) +function generatestring(key: string, value: string, signal: Signal ): void { + let curlybraceopen = String.fromCharCode(123) + let curlybraceclose = String.fromCharCode(125) + let colon = String.fromCharCode(58) + let comma = String.fromCharCode(44) + let quotation = String.fromCharCode(34) + let newkeypair = quotation.concat(key).concat(quotation).concat(colon).concat(quotation).concat(value).concat(quotation) + debug(newkeypair) if (signal.data == null){ + debug("Going-in-Generate") generatenewdict(newkeypair,signal,curlybraceopen, curlybraceclose) }else{ + debug("In-Else") + debug(key) + let searchstringposition = signal.data.indexOf(key) + debug(searchstringposition.toString()) if(searchstringposition === -1){ appenddict(newkeypair,signal,curlybraceclose,comma) } - else{ + else if (key !== ""){ replaceindict(newkeypair,key,signal,curlybraceopen,curlybraceclose,comma) } } @@ -45,8 +47,9 @@ function replaceindict(newkeypair: string, curlybraceopen:string, curlybraceclosed:string, comma:string ):void{ - let lenght = signal.data.length; - let cutstring = signal.data.slice(1,lenght-1); + debug("In-Replace") + let length = signal.data.length; + let cutstring = signal.data.slice(1,length-1); let stringarray = cutstring.split(comma) let finalstring = "" for (let y = 0; y < stringarray.length; ++y) { @@ -59,21 +62,22 @@ function replaceindict(newkeypair: string, signal.data = curlybraceopen.concat(finalstring.slice(1)).concat(curlybraceclosed) debug(signal.data); debug("replace"); - saveSignal(signal); + signal.save(); } function generatenewdict(keypair: string, signal: Signal, curlybraceopen:string, curlybraceclosed:string): void{ - const data = curlybraceopen.concat(keypair).concat(curlybraceclosed); - debug("generate"); + let data = curlybraceopen.concat(keypair).concat(curlybraceclosed); + debug("generate "); signal.data = data; - saveSignal(signal); + signal.save(); } function appenddict(keypair: string, signal: Signal, curlybraceclosed:string, comma:string):void{ + debug("In-Append") let signalsubstring = signal.data.substring(0,signal.data.length-1) signal.data = signalsubstring.concat(comma).concat(keypair).concat(curlybraceclosed) debug(signal.data); - saveSignal(signal); + signal.save(); } function teststring(key: string, value: string): boolean { @@ -87,11 +91,14 @@ function teststring(key: string, value: string): boolean { return returnboolean } -export function readProposal(id: string, proposalId: string): void { +function readProposal(id: string, proposalIpfsId: string): void { let signal = getSignal(id); let key = ''; let value = ''; - let ipfsData = ipfs.cat('/ipfs/' + proposalId); + let ipfsData = ipfs.cat('/ipfs/' + proposalIpfsId); + debug("start proposal id") + debug(proposalIpfsId) + debug("end proposal id") if (ipfsData != null && ipfsData.toString() !== '{}') { let descJson = json.fromBytes(ipfsData as Bytes); @@ -100,9 +107,11 @@ export function readProposal(id: string, proposalId: string): void { } if (descJson.toObject().get('key') != null) { key = descJson.toObject().get('key').toString(); + debug(key) } if (descJson.toObject().get('value') != null) { value = descJson.toObject().get('value').toString(); + debug(value) } } From d9da1dd113eeff071c26cf9234361298b82667be Mon Sep 17 00:00:00 2001 From: Shubhendu Shekhar Date: Fri, 6 Mar 2020 11:12:07 +0100 Subject: [PATCH 30/32] update lint issues --- src/domain/index.ts | 128 +++++++++--------- src/domain/signal.ts | 119 +++++++--------- src/mappings/GenericScheme/mapping.ts | 1 - src/mappings/SignalScheme/mapping.ts | 6 +- src/mappings/UGenericScheme/mapping.ts | 4 +- test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts | 55 ++++---- test/0.0.1-rc.37/SignalSchemeSanity.spec.ts | 70 +++++----- 7 files changed, 177 insertions(+), 206 deletions(-) diff --git a/src/domain/index.ts b/src/domain/index.ts index ccee4958..3de80e26 100644 --- a/src/domain/index.ts +++ b/src/domain/index.ts @@ -1,4 +1,4 @@ -import { Address, BigDecimal, BigInt, Bytes, Entity, store, Value} from '@graphprotocol/graph-ts'; +import { Address, BigDecimal, BigInt, Bytes, Entity, store, Value } from '@graphprotocol/graph-ts'; import { setContractsInfo, setTemplatesInfo } from '../contractsInfo'; import { Transfer } from '../types/DAOToken/DAOToken'; import { @@ -36,23 +36,23 @@ import { import { daoBountyRedemption, insertGPRewards, - insertGPRewardsToHelper , - reputationRedemption , + insertGPRewardsToHelper, + reputationRedemption, tokenRedemption, } from './reward'; +import { writeSignal } from './signal'; import { insertStake } from './stake'; import { getToken, insertToken, updateTokenTotalSupply } from './token'; import { insertVote } from './vote'; -import { writesignal } from './signal' -function isProposalValid(proposalId: string ): boolean { +function isProposalValid(proposalId: string): boolean { let p = Proposal.load(proposalId); - return ((p != null) && (equalsBytes(p.paramsHash, new Bytes(32)) == false)); + return ((p != null) && (equalsBytes(p.paramsHash, new Bytes(32)) == false)); } function handleGPProposalPrivate(proposalId: string): void { - let gpProposal = GenesisProtocolProposal.load(proposalId); - if (gpProposal != null) { + let gpProposal = GenesisProtocolProposal.load(proposalId); + if (gpProposal != null) { updateGPProposal( gpProposal.address as Address, gpProposal.proposalId, @@ -67,7 +67,7 @@ function handleGPProposalPrivate(proposalId: string): void { 3, // Queued gpProposal.address as Address, ); - } + } } export function handleNewContributionProposal( @@ -93,26 +93,26 @@ export function handleNewContributionProposal( } export function handleNewSchemeRegisterProposal( - proposalId: string, - timestamp: BigInt, - avatar: Bytes, - votingMachine: Bytes, - descriptionHash: string, - schemeAddress: Address, - ): void { - if (!daoModule.exists(avatar as Address)) { - return; - } - updateSRProposal( - proposalId, - timestamp, - avatar as Address, - votingMachine as Address, - descriptionHash, - schemeAddress, - ); - handleGPProposalPrivate(proposalId); - } + proposalId: string, + timestamp: BigInt, + avatar: Bytes, + votingMachine: Bytes, + descriptionHash: string, + schemeAddress: Address, +): void { + if (!daoModule.exists(avatar as Address)) { + return; + } + updateSRProposal( + proposalId, + timestamp, + avatar as Address, + votingMachine as Address, + descriptionHash, + schemeAddress, + ); + handleGPProposalPrivate(proposalId); +} export function handleNewCallProposal( avatar: Address, @@ -139,12 +139,12 @@ export function handleStake(event: Stake): void { if (equalsBytes(proposal.paramsHash, new Bytes(32))) { return; } - if (event.params._vote.toI32() == 1) { + if (event.params._vote.toI32() == 1) { proposal.stakesFor = proposal.stakesFor.plus(event.params._amount); } else { proposal.stakesAgainst = proposal.stakesAgainst.plus(event.params._amount); } - proposal.confidence = (new BigDecimal(proposal.stakesFor)) / (new BigDecimal(proposal.stakesAgainst)); + proposal.confidence = (new BigDecimal(proposal.stakesFor)) / (new BigDecimal(proposal.stakesAgainst)); saveProposal(proposal); insertStake( eventId(event), @@ -193,16 +193,12 @@ export function handleVoteProposal(event: VoteProposal): void { export function confidenceLevelUpdate(proposalId: Bytes, confidenceThreshold: BigInt): void { if (isProposalValid(proposalId.toHex())) { - updateProposalconfidence(proposalId, confidenceThreshold); + updateProposalconfidence(proposalId, confidenceThreshold); } } -export function handleRegisterScheme(avatar: Address, - nativeTokenAddress: Address, - nativeReputationAddress: Address, - scheme: Address , - paramsHash: Bytes, - timestamp: BigInt): void { +export function handleRegisterScheme(avatar: Address, nativeTokenAddress: Address, nativeReputationAddress: Address, + scheme: Address, paramsHash: Bytes, timestamp: BigInt): void { // Detect the first register scheme event which indicates a new DAO let isFirstRegister = store.get( 'FirstRegisterSchemeFlag', @@ -210,7 +206,7 @@ export function handleRegisterScheme(avatar: Address, ); if (isFirstRegister == null) { setContractsInfo(); - let dao = daoModule.insertNewDAO(avatar, nativeTokenAddress , nativeReputationAddress); + let dao = daoModule.insertNewDAO(avatar, nativeTokenAddress, nativeReputationAddress); insertToken(hexToAddress(dao.nativeToken), avatar.toHex()); insertReputation( hexToAddress(dao.nativeReputation), @@ -266,20 +262,20 @@ export function handleNativeTokenTransfer(event: Transfer): void { } export function handleExecuteProposal(event: ExecuteProposal): void { - if (isProposalValid(event.params._proposalId.toHex())) { - updateProposalExecution(event.params._proposalId, event.params._totalReputation, event.block.timestamp); - } + if (isProposalValid(event.params._proposalId.toHex())) { + updateProposalExecution(event.params._proposalId, event.params._totalReputation, event.block.timestamp); + } } export function handleStateChange(event: StateChange): void { if (isProposalValid(event.params._proposalId.toHex())) { - updateProposalState(event.params._proposalId, event.params._proposalState, event.address); - if ((event.params._proposalState == 1) || - (event.params._proposalState == 2)) { - insertGPRewards(event.params._proposalId, event.block.timestamp, event.address, event.params._proposalState); - } + updateProposalState(event.params._proposalId, event.params._proposalState, event.address); + if ((event.params._proposalState == 1) || + (event.params._proposalState == 2)) { + insertGPRewards(event.params._proposalId, event.block.timestamp, event.address, event.params._proposalState); + } - addProposalStateChangeEvent(event.params._proposalId, event.transaction.from, event.block.timestamp); + addProposalStateChangeEvent(event.params._proposalId, event.transaction.from, event.block.timestamp); } } @@ -289,20 +285,20 @@ export function handleExecutionStateChange(event: GPExecuteProposal): void { } } -export function handleGPRedemption(proposalId: Bytes, beneficiary: Address , timestamp: BigInt , type: string): void { - if (isProposalValid(proposalId.toHex())) { - if (type == 'token') { - tokenRedemption(proposalId, beneficiary, timestamp); - } else if (type == 'reputation') { - reputationRedemption(proposalId, beneficiary, timestamp); - } else { - daoBountyRedemption(proposalId, beneficiary, timestamp); - } +export function handleGPRedemption(proposalId: Bytes, beneficiary: Address, timestamp: BigInt, type: string): void { + if (isProposalValid(proposalId.toHex())) { + if (type == 'token') { + tokenRedemption(proposalId, beneficiary, timestamp); + } else if (type == 'reputation') { + reputationRedemption(proposalId, beneficiary, timestamp); + } else { + daoBountyRedemption(proposalId, beneficiary, timestamp); } + } } export function daoRegister(dao: Address, tag: string): void { - daoModule.register(dao, tag); + daoModule.register(dao, tag); } export function addDaoMember(reputationHolder: ReputationHolder): void { @@ -322,14 +318,14 @@ export function addDaoMember(reputationHolder: ReputationHolder): void { } export function removeDaoMember(reputationHolder: ReputationHolder): void { - let dao = getReputation(reputationHolder.contract.toHex()).dao; - if (dao == null) { - // reputation that's not attached to a DAO - return; - } - daoModule.decreaseDAOmembersCount(dao); + let dao = getReputation(reputationHolder.contract.toHex()).dao; + if (dao == null) { + // reputation that's not attached to a DAO + return; + } + daoModule.decreaseDAOmembersCount(dao); } -export function addSignal(signalId: string, proposalId: string): void{ - writesignal(signalId,proposalId); +export function addSignal(signalId: string, proposalId: string): void { + writeSignal(signalId, proposalId); } diff --git a/src/domain/signal.ts b/src/domain/signal.ts index 101952bc..e15f2f56 100644 --- a/src/domain/signal.ts +++ b/src/domain/signal.ts @@ -4,117 +4,98 @@ import { debug } from '../utils'; function getSignal(id: string): Signal { let sig = store.get('Signal', id) as Signal; - if (sig == null) { + if (!sig) { sig = new Signal(id); } return sig; } - -export function writesignal(signalId: string, proposalIpfsId: string): void { - readProposal(signalId, proposalIpfsId) +export function writeSignal(signalId: string, proposalIpfsId: string): void { + readProposal(signalId, proposalIpfsId); } -function generatestring(key: string, value: string, signal: Signal ): void { - let curlybraceopen = String.fromCharCode(123) - let curlybraceclose = String.fromCharCode(125) - let colon = String.fromCharCode(58) - let comma = String.fromCharCode(44) - let quotation = String.fromCharCode(34) - let newkeypair = quotation.concat(key).concat(quotation).concat(colon).concat(quotation).concat(value).concat(quotation) - debug(newkeypair) - if (signal.data == null){ - debug("Going-in-Generate") - generatenewdict(newkeypair,signal,curlybraceopen, curlybraceclose) - }else{ - debug("In-Else") - debug(key) - - let searchstringposition = signal.data.indexOf(key) - debug(searchstringposition.toString()) - if(searchstringposition === -1){ - appenddict(newkeypair,signal,curlybraceclose,comma) +function generateString(key: string, value: string, signal: Signal): void { + let curlybraceopen = '{'; + let curlybraceclose = '}'; + let colon = ':'; + let comma = ','; + let quotation = '"'; + let newkeypair = quotation.concat(key).concat(quotation).concat(colon) + .concat(quotation).concat(value).concat(quotation); + debug(newkeypair); + if (signal.data == null) { + debug('Going-in-Generate'); + generateNewDict(newkeypair, signal, curlybraceopen, curlybraceclose); + } else { + debug('In-Else'); + debug(key); + let searchstringposition = signal.data.indexOf(key); + debug(searchstringposition.toString()); + if (searchstringposition === -1) { + appendDict(newkeypair, signal, curlybraceclose, comma); + } else if (key !== '') { + replaceInDict(newkeypair, key, signal, curlybraceopen, curlybraceclose, comma); } - else if (key !== ""){ - replaceindict(newkeypair,key,signal,curlybraceopen,curlybraceclose,comma) } } -} -function replaceindict(newkeypair: string, - key: string, - signal: Signal, - curlybraceopen:string, - curlybraceclosed:string, - comma:string ):void{ - debug("In-Replace") +function replaceInDict(newkeypair: string, key: string, signal: Signal, + curlybraceopen: string, curlybraceclosed: string, + comma: string): void { + debug('In-Replace'); let length = signal.data.length; - let cutstring = signal.data.slice(1,length-1); - let stringarray = cutstring.split(comma) - let finalstring = "" + let cutstring = signal.data.slice(1, length - 1); + let stringarray = cutstring.split(comma); + let finalstring = ''; for (let y = 0; y < stringarray.length; ++y) { - if (stringarray[y].indexOf(key) === -1){ + if (stringarray[y].indexOf(key) === -1) { finalstring = finalstring.concat(comma).concat(stringarray[y]); - }else{ + } else { finalstring = finalstring.concat(comma).concat(newkeypair); - } } - signal.data = curlybraceopen.concat(finalstring.slice(1)).concat(curlybraceclosed) - debug(signal.data); - debug("replace"); - signal.save(); } + signal.data = curlybraceopen.concat(finalstring.slice(1)).concat(curlybraceclosed); + debug(signal.data); + debug('replace'); + signal.save(); +} -function generatenewdict(keypair: string, signal: Signal, curlybraceopen:string, curlybraceclosed:string): void{ +function generateNewDict(keypair: string, signal: Signal, curlybraceopen: string, curlybraceclosed: string): void { let data = curlybraceopen.concat(keypair).concat(curlybraceclosed); - debug("generate "); + debug('generate '); signal.data = data; signal.save(); } -function appenddict(keypair: string, signal: Signal, curlybraceclosed:string, comma:string):void{ - debug("In-Append") - let signalsubstring = signal.data.substring(0,signal.data.length-1) - signal.data = signalsubstring.concat(comma).concat(keypair).concat(curlybraceclosed) +function appendDict(keypair: string, signal: Signal, curlybraceclosed: string, comma: string): void { + debug('In-Append'); + let signalsubstring = signal.data.substring(0, signal.data.length - 1); + signal.data = signalsubstring.concat(comma).concat(keypair).concat(curlybraceclosed); debug(signal.data); signal.save(); } -function teststring(key: string, value: string): boolean { - var returnboolean: boolean = true; - const comma: string = String.fromCharCode(44); - let searchkey: number = key.indexOf(comma) - let searchvalue: number = value.indexOf(comma) - if(searchkey != -1 || searchvalue != -1 ){ - returnboolean = false - } - return returnboolean -} - function readProposal(id: string, proposalIpfsId: string): void { let signal = getSignal(id); let key = ''; let value = ''; let ipfsData = ipfs.cat('/ipfs/' + proposalIpfsId); - debug("start proposal id") - debug(proposalIpfsId) - debug("end proposal id") + debug('Proposal ID ' + proposalIpfsId); if (ipfsData != null && ipfsData.toString() !== '{}') { let descJson = json.fromBytes(ipfsData as Bytes); if (descJson.kind !== JSONValueKind.OBJECT) { - debug("No JSON"); + debug('No JSON'); } if (descJson.toObject().get('key') != null) { key = descJson.toObject().get('key').toString(); - debug(key) + debug(key); } if (descJson.toObject().get('value') != null) { value = descJson.toObject().get('value').toString(); - debug(value) + debug(value); } } - generatestring(key,value,signal) - -} \ No newline at end of file + generateString(key, value, signal); +} diff --git a/src/mappings/GenericScheme/mapping.ts b/src/mappings/GenericScheme/mapping.ts index e23fac74..c0adb168 100644 --- a/src/mappings/GenericScheme/mapping.ts +++ b/src/mappings/GenericScheme/mapping.ts @@ -24,7 +24,6 @@ function insertNewProposal(event: NewCallProposal): void { ent.callData = event.params._callData; ent.value = event.params._value; ent.executed = false; - debug("Test1") store.set('GenericSchemeProposal', event.params._proposalId.toHex(), ent); } diff --git a/src/mappings/SignalScheme/mapping.ts b/src/mappings/SignalScheme/mapping.ts index eebaa6e0..73cc2a6b 100644 --- a/src/mappings/SignalScheme/mapping.ts +++ b/src/mappings/SignalScheme/mapping.ts @@ -1,8 +1,8 @@ -import { SignalLog } from '../../types/NewSignalScheme/NewSignalScheme'; -import * as domain from '../../domain'; +import { addSignal } from '../../domain'; +import { SignalLog } from '../../types/NewSignalScheme/NewSignalScheme'; export function handleSignal( event: SignalLog): void { let signalId = event.params._sender.toHex(); let proposalId = event.params._descriptionHash; - domain.addSignal(signalId, proposalId); + addSignal(signalId, proposalId); } diff --git a/src/mappings/UGenericScheme/mapping.ts b/src/mappings/UGenericScheme/mapping.ts index 74a53d1d..a54c5728 100644 --- a/src/mappings/UGenericScheme/mapping.ts +++ b/src/mappings/UGenericScheme/mapping.ts @@ -49,8 +49,8 @@ export function handleProposalExecuted( ent.returnValue = event.params._genericCallReturnValue; } - var signalId = event.params._avatar.toHex(); - var proposalId = event.params._proposalId.toHex(); + let signalId = event.params._avatar.toHex(); + let proposalId = event.params._proposalId.toHex(); domain.addSignal(signalId, proposalId); store.set('GenericSchemeProposal', event.params._proposalId.toHex(), ent); diff --git a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts index db3f6c8d..36eb4b76 100644 --- a/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts +++ b/test/0.0.1-rc.16/UGenericSchemeSignal.spec.ts @@ -14,8 +14,7 @@ const ActionMock = require('@daostack/migration/contracts/' + getArcVersion() + const GenericScheme = require('@daostack/migration/contracts/' + getArcVersion() + '/GenericScheme.json'); const GenesisProtocol = require('@daostack/migration/contracts/' + getArcVersion() + '/GenesisProtocol.json'); - -const maintest = async (web3,addresses,opts,proposalIPFSData,matchto) => { +const maintest = async (web3, addresses, opts, proposalIPFSData, matchto) => { const accounts = web3.eth.accounts.wallet; const genericScheme = new web3.eth.Contract( @@ -60,7 +59,7 @@ const maintest = async (web3,addresses,opts,proposalIPFSData,matchto) => { } const { proposalId: p1, timestamp: p1Creation } = await propose(); - //console.log(p1) + // console.log(p1) const getProposal = `{ proposal(id: "${p1}") { id @@ -90,8 +89,7 @@ const maintest = async (web3,addresses,opts,proposalIPFSData,matchto) => { } }`; - - let proposal = (await sendQuery(getProposal,90000)).proposal; + let proposal = (await sendQuery(getProposal, 90000)).proposal; expect(proposal).toMatchObject({ id: p1, descriptionHash: descHash, @@ -177,8 +175,7 @@ const maintest = async (web3,addresses,opts,proposalIPFSData,matchto) => { id data } - }` - + }`; // const metaq = `{ // debugs{ @@ -187,13 +184,10 @@ const maintest = async (web3,addresses,opts,proposalIPFSData,matchto) => { // } // }` - const metadata = await sendQuery(metaq, 15000); expect(metadata).toMatchObject(matchto); -} - - +}; describe('Generic Signal Scheme', () => { let web3; @@ -217,18 +211,17 @@ describe('Generic Signal Scheme', () => { }; let matchto = { - signals:[ + signals: [ { data: '{"Header":"https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg"}', id: - '0x86e9fe552e75e4fc51f46e4efc128628ecd5ada7' - } - ] - } - - const test = await maintest(web3,addresses,opts,proposalIPFSData,matchto) + '0x86e9fe552e75e4fc51f46e4efc128628ecd5ada7', + }, + ], + }; + const test = await maintest(web3, addresses, opts, proposalIPFSData, matchto); }, 200000); @@ -243,21 +236,20 @@ describe('Generic Signal Scheme', () => { }; let matchto = { - signals:[ + signals: [ { data: '{"Header":"https://de.wikipedia.org/wiki/Wald#/media/Datei:Laurisilva_en_el_Cubo_de_la_Galga.jpg","Icon":"https://en.wikipedia.org/wiki/River#/media/File:Melting_Toe_of_Athabasca_Glacier.jpg"}', id: - '0x86e9fe552e75e4fc51f46e4efc128628ecd5ada7' - } - ] - } + '0x86e9fe552e75e4fc51f46e4efc128628ecd5ada7', + }, + ], + }; - const test = await maintest(web3,addresses,opts,proposalIPFSData,matchto) + const test = await maintest(web3, addresses, opts, proposalIPFSData, matchto); }, 200000); - it('generic scheme proposal replace ', async () => { let proposalIPFSData = { @@ -269,18 +261,17 @@ describe('Generic Signal Scheme', () => { }; let matchto = { - signals:[ + signals: [ { data: '{"Header":"https://de.wikipedia.org/wiki/Wasserfall#/media/Datei:Russell_Falls_2.jpg","Icon":"https://en.wikipedia.org/wiki/River#/media/File:Melting_Toe_of_Athabasca_Glacier.jpg"}', id: - '0x86e9fe552e75e4fc51f46e4efc128628ecd5ada7' - } - ] - } - - const test = await maintest(web3,addresses,opts,proposalIPFSData,matchto) + '0x86e9fe552e75e4fc51f46e4efc128628ecd5ada7', + }, + ], + }; + const test = await maintest(web3, addresses, opts, proposalIPFSData, matchto); }, 200000); diff --git a/test/0.0.1-rc.37/SignalSchemeSanity.spec.ts b/test/0.0.1-rc.37/SignalSchemeSanity.spec.ts index 4049cd5c..a1e8e949 100644 --- a/test/0.0.1-rc.37/SignalSchemeSanity.spec.ts +++ b/test/0.0.1-rc.37/SignalSchemeSanity.spec.ts @@ -1,50 +1,55 @@ import { getOptions, getWeb3, + sendQuery, writeProposalIPFS, - sendQuery } from './util'; - - jest.setTimeout(30000); - - const SignalScheme = require('./SignalSchemeABI.json') - - const maintest = async (web3, opts, proposalIPFSData, matchto) => { - - const signalSchemeMock = new web3.eth.Contract(SignalScheme.abi, "0xE06d896da40B73Cb02650220E480e20F38e7bE18" ,opts); + +jest.setTimeout(30000); + +const SignalScheme = require('./SignalSchemeABI.json'); + +const maintest = async (web3, opts, proposalIPFSData, matchto) => { + + const signalSchemeMock = new web3.eth.Contract(SignalScheme.abi, + '0xD179D86D5EA20Fc0b2302d0a8Fd538f2Ee01E8D3', + opts); /* const signalContract = await signalSchemeMock.deploy({ data: SignalScheme.bytecode, arguments: [] }).send() */ - console.log(signalSchemeMock.options.address, signalSchemeMock.address) + // console.log(signalSchemeMock.options.address, signalSchemeMock.address); let descHash = await writeProposalIPFS(proposalIPFSData); - console.log(signalSchemeMock.methods.signal(descHash).encodeABI()) + // console.log(signalSchemeMock.methods.signal(descHash).encodeABI()); await signalSchemeMock.methods.signal(descHash).send(); - + const metaq = `{ signals{ id data } - }` - + }`; + const metadata = await sendQuery(metaq, 15000); expect(metadata).toMatchObject(matchto); - - } - - describe('Generic Signal Scheme', () => { + + }; + + /** + * Skipping the test for now + */ +describe.skip('Generic Signal Scheme', () => { let web3; let opts; - + beforeAll(async () => { web3 = await getWeb3(); opts = await getOptions(web3); }); - + it('generic scheme proposal generate ', async () => { - + let proposalIPFSData = { description: 'Setting new header Image', title: 'New Header Image', @@ -52,21 +57,20 @@ import { key: 'Header', value: 'https://w.wallhaven.cc/full/13/wallhaven-13mk9v.jpg', }; - + let matchto = { signals: [ { data: - '{"Header":"https://en.wikipedia.org/wiki/"}', + '{"Header":"https://w.wallhaven.cc/full/13/wallhaven-13mk9v.jpg"}', id: - '0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1' - } - ] - } - - await maintest(web3, opts, proposalIPFSData, matchto) - - + '0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1', + }, + ], + }; + + await maintest(web3, opts, proposalIPFSData, matchto); + }, 100000); - - }); \ No newline at end of file + + }); From d957df9594d9ecefcc9fa3bb3ab72bac0cca3af9 Mon Sep 17 00:00:00 2001 From: Shubhendu Shekhar Date: Sat, 7 Mar 2020 01:24:16 +0100 Subject: [PATCH 31/32] update signal scheme tests --- ops/mappings.json | 7 + .../SignalSchemeABI.json | 0 test/0.0.1-rc.33/SignalSchemeSanity.spec.ts | 251 ++++++++++++++++++ test/0.0.1-rc.37/SignalSchemeSanity.spec.ts | 76 ------ test/0.0.1-rc.37/util.ts | 176 ------------ 5 files changed, 258 insertions(+), 252 deletions(-) rename test/{0.0.1-rc.37 => 0.0.1-rc.33}/SignalSchemeABI.json (100%) create mode 100644 test/0.0.1-rc.33/SignalSchemeSanity.spec.ts delete mode 100644 test/0.0.1-rc.37/SignalSchemeSanity.spec.ts delete mode 100644 test/0.0.1-rc.37/util.ts diff --git a/ops/mappings.json b/ops/mappings.json index d9c23d5c..36824e64 100644 --- a/ops/mappings.json +++ b/ops/mappings.json @@ -8,6 +8,13 @@ "mapping": "DAOToken", "arcVersion": "0.0.1-rc.16" }, + { + "name": "NewSignalScheme", + "dao": "address", + "mapping": "SignalScheme", + "arcVersion": "0.0.1-rc.37", + "address": "0x383A20B3635a10a4da8f733E8eA256cBcAcB4D4E" + }, { "name": "GenesisProtocol", "contractName": "GenesisProtocol", diff --git a/test/0.0.1-rc.37/SignalSchemeABI.json b/test/0.0.1-rc.33/SignalSchemeABI.json similarity index 100% rename from test/0.0.1-rc.37/SignalSchemeABI.json rename to test/0.0.1-rc.33/SignalSchemeABI.json diff --git a/test/0.0.1-rc.33/SignalSchemeSanity.spec.ts b/test/0.0.1-rc.33/SignalSchemeSanity.spec.ts new file mode 100644 index 00000000..acd6b58d --- /dev/null +++ b/test/0.0.1-rc.33/SignalSchemeSanity.spec.ts @@ -0,0 +1,251 @@ +import { + getArcVersion, + getContractAddresses, + getOptions, + getWeb3, + sendQuery, + writeProposalIPFS, +} from './util'; + +jest.setTimeout(30000); + +const DaoCreator = require('@daostack/migration/contracts/' + getArcVersion() + '/DaoCreator.json'); +const Avatar = require('@daostack/migration/contracts/' + getArcVersion() + '/Avatar.json'); +const GenesisProtocol = require('@daostack/migration/contracts/' + getArcVersion() + '/GenesisProtocol.json'); +const GenericScheme = require('@daostack/migration/contracts/' + getArcVersion() + '/GenericScheme.json'); + +/** + * Address and ABI of the SignalScheme Contract. + * Currently SignalScheme is deployed manually and address is added here. + * The Signal Scheme address should also be added/updated + * in ops/mappings.json (required for subgraph tracking). + * + * NOTE: This manual deployment should be done before the subgraph deployment. + * + * Technically this "Scheme" should be part of the arc and migrations package + * and these values should be derived from there. + */ +const SignalScheme = require('./SignalSchemeABI.json'); +const SignalSchemeAddress = '0x383A20B3635a10a4da8f733E8eA256cBcAcB4D4E'; + +describe('Generic Signal Scheme', () => { + let web3; + let avatar; + let genesisProtocol; + let signalScheme; + let genericScheme; + + beforeAll(async () => { + web3 = await getWeb3(); + const addresses = getContractAddresses(); + const opts = await getOptions(web3); + const daoCreator = new web3.eth.Contract(DaoCreator.abi, addresses.DaoCreator, opts); + genesisProtocol = await new web3.eth.Contract(GenesisProtocol.abi, addresses.GenesisProtocol, opts); + const accounts = web3.eth.accounts.wallet; + + const gpParams = { + queuedVoteRequiredPercentage: 50, + queuedVotePeriodLimit: 60, + boostedVotePeriodLimit: 5, + preBoostedVotePeriodLimit: 0, + thresholdConst: 2000, + quietEndingPeriod: 0, + proposingRepReward: 60, + votersReputationLossRatio: 10, + minimumDaoBounty: 15, + daoBountyConst: 10, + activationTime: 0, + voteOnBehalf: '0x0000000000000000000000000000000000000000', + }; + const vmSetParams = genesisProtocol.methods.setParameters( + [ + gpParams.queuedVoteRequiredPercentage, + gpParams.queuedVotePeriodLimit, + gpParams.boostedVotePeriodLimit, + gpParams.preBoostedVotePeriodLimit, + gpParams.thresholdConst, + gpParams.quietEndingPeriod, + gpParams.proposingRepReward, + gpParams.votersReputationLossRatio, + gpParams.minimumDaoBounty, + gpParams.daoBountyConst, + gpParams.activationTime, + ], + gpParams.voteOnBehalf, + ); + const vmParamsHash = await vmSetParams.call(); + await vmSetParams.send(); + + const tx = await daoCreator.methods.forgeOrg( + 'Test DAO', + 'Test Token', + 'TST', + [accounts[0].address, accounts[1].address, accounts[2].address, accounts[3].address], + [1000, 1000, 1000, 1000], + [2000, 2000, 2000, 2000], + '0x0000000000000000000000000000000000000000', + 0, + ).send(); + + const avatarAddress = tx.events.NewOrg.returnValues._avatar; + avatar = await new web3.eth.Contract(Avatar.abi, avatarAddress, opts); + + signalScheme = new web3.eth.Contract( + SignalScheme.abi, + SignalSchemeAddress, + opts, + ); + + genericScheme = await new web3.eth.Contract( + GenericScheme.abi, + undefined, + opts, + ).deploy({ + data: GenericScheme.bytecode, + arguments: [], + }).send(); + + await daoCreator.methods.setSchemes( + avatar.options.address, + [genericScheme.options.address], + [vmParamsHash], + ['0x00000010'], + '', + ).send(); + + await genericScheme.methods.initialize( + avatar.options.address, + genesisProtocol.options.address, + vmParamsHash, + SignalSchemeAddress, + ).send(); + + }); + + it('Insert Signal Data', async () => { + + let proposalIPFSData = { + description: 'Setting new header Image', + title: 'New Header Image', + url: 'https://w.wallhaven.cc/full/13/wallhaven-13mk9v.jpg', + key: 'Header', + value: 'https://w.wallhaven.cc/full/13/wallhaven-13mk9v.jpg', + }; + + let matchto = { + signal: + { + data: + '{"Header":"https://w.wallhaven.cc/full/13/wallhaven-13mk9v.jpg"}', + id: avatar.options.address.toLowerCase(), + }, + }; + + await mainTest(web3, avatar, genericScheme, genesisProtocol, signalScheme, proposalIPFSData, matchto); + + }, 100000); + + it('Update Signal Data', async () => { + + let proposalIPFSData = { + description: 'Update new header Image', + title: 'New Header Image', + url: 'https://w.wallhaven.cc/full/14/wallhaven-13mk9v.jpg', + key: 'Header', + value: 'https://w.wallhaven.cc/full/14/wallhaven-13mk9v.jpg', + }; + + let matchto = { + signal: + { + data: + '{"Header":"https://w.wallhaven.cc/full/14/wallhaven-13mk9v.jpg"}', + id: avatar.options.address.toLowerCase(), + }, + }; + + await mainTest(web3, avatar, genericScheme, genesisProtocol, signalScheme, proposalIPFSData, matchto); + + }, 100000); + + it('Remove Signal Data', async () => { + + let proposalIPFSData = { + description: 'Remove header Image', + title: 'Remove Header Image', + url: '', + key: 'Header', + value: '', + }; + + let matchto = { + signal: + { + data: + '{"Header":""}', + id: avatar.options.address.toLowerCase(), + }, + }; + + await mainTest(web3, avatar, genericScheme, genesisProtocol, signalScheme, proposalIPFSData, matchto); + + }, 100000); + +}); + +const mainTest = async (web3, avatar, genericScheme, genesisProtocol, signalScheme, proposalIPFSData, matchto) => { + const accounts = web3.eth.accounts.wallet; + + const descHash = await writeProposalIPFS(proposalIPFSData); + const callData = await signalScheme.methods.signal(descHash).encodeABI(); + + async function propose() { + const prop = genericScheme.methods.proposeCall(callData, 0, descHash); + const proposalId = await prop.call(); + const { blockNumber } = await prop.send(); + const { timestamp } = await web3.eth.getBlock(blockNumber); + return { proposalId, timestamp }; + } + + const [PASS, FAIL] = [1, 2]; + async function vote({ proposalId, outcome, voter, amount = 0 }) { + const { blockNumber } = await genesisProtocol.methods.vote(proposalId, outcome, amount, voter) + .send({ from: voter, gas: 5000000 }); + const { timestamp } = await web3.eth.getBlock(blockNumber); + return timestamp; + } + + const { proposalId: p1 } = await propose(); + + await vote({ + proposalId: p1, + outcome: PASS, + amount: 0, + voter: accounts[0].address, + }); + + await vote({ + proposalId: p1, + outcome: PASS, + amount: 0, + voter: accounts[1].address, + }); + + await vote({ + proposalId: p1, + outcome: PASS, + amount: 0, + voter: accounts[2].address, + }); + + const metaq = `{ + signal(id: "${avatar.options.address.toLowerCase()}"){ + id + data + } + }`; + + const metadata = await sendQuery(metaq, 5000); + expect(metadata).toMatchObject(matchto); + +}; diff --git a/test/0.0.1-rc.37/SignalSchemeSanity.spec.ts b/test/0.0.1-rc.37/SignalSchemeSanity.spec.ts deleted file mode 100644 index a1e8e949..00000000 --- a/test/0.0.1-rc.37/SignalSchemeSanity.spec.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { - getOptions, - getWeb3, - sendQuery, - writeProposalIPFS, - } from './util'; - -jest.setTimeout(30000); - -const SignalScheme = require('./SignalSchemeABI.json'); - -const maintest = async (web3, opts, proposalIPFSData, matchto) => { - - const signalSchemeMock = new web3.eth.Contract(SignalScheme.abi, - '0xD179D86D5EA20Fc0b2302d0a8Fd538f2Ee01E8D3', - opts); - /* const signalContract = await signalSchemeMock.deploy({ - data: SignalScheme.bytecode, - arguments: [] - }).send() */ - // console.log(signalSchemeMock.options.address, signalSchemeMock.address); - let descHash = await writeProposalIPFS(proposalIPFSData); - - // console.log(signalSchemeMock.methods.signal(descHash).encodeABI()); - await signalSchemeMock.methods.signal(descHash).send(); - - const metaq = `{ - signals{ - id - data - } - }`; - - const metadata = await sendQuery(metaq, 15000); - expect(metadata).toMatchObject(matchto); - - }; - - /** - * Skipping the test for now - */ -describe.skip('Generic Signal Scheme', () => { - let web3; - let opts; - - beforeAll(async () => { - web3 = await getWeb3(); - opts = await getOptions(web3); - }); - - it('generic scheme proposal generate ', async () => { - - let proposalIPFSData = { - description: 'Setting new header Image', - title: 'New Header Image', - url: 'https://w.wallhaven.cc/full/13/wallhaven-13mk9v.jpg', - key: 'Header', - value: 'https://w.wallhaven.cc/full/13/wallhaven-13mk9v.jpg', - }; - - let matchto = { - signals: [ - { - data: - '{"Header":"https://w.wallhaven.cc/full/13/wallhaven-13mk9v.jpg"}', - id: - '0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1', - }, - ], - }; - - await maintest(web3, opts, proposalIPFSData, matchto); - - }, 100000); - - }); diff --git a/test/0.0.1-rc.37/util.ts b/test/0.0.1-rc.37/util.ts deleted file mode 100644 index de28a3ff..00000000 --- a/test/0.0.1-rc.37/util.ts +++ /dev/null @@ -1,176 +0,0 @@ -require('dotenv').config(); -const IPFSClient = require('ipfs-http-client'); - -process.env = { - ethereum: 'http://127.0.0.1:8545', - ipfs: '/ip4/127.0.0.1/tcp/5001', - node_http: 'http://127.0.0.1:8000/subgraphs/name/daostack', - node_ws: 'http://127.0.0.1:8001/subgraphs/name/daostack', - test_mnemonic: - 'myth like bonus scare over problem client lizard pioneer submit female collect', - ...process.env, -}; - -const { execute } = require('apollo-link'); -const { WebSocketLink } = require('apollo-link-ws'); -const { SubscriptionClient } = require('subscriptions-transport-ws'); -const ws = require('ws'); -import axios from 'axios'; -import * as HDWallet from 'hdwallet-accounts'; -const Web3 = require('web3'); - -const { node_ws, node_http, ethereum, ipfs, test_mnemonic } = process.env; - -export async function sendQuery(q: string, maxDelay = 1000, url = node_http) { - await new Promise((res, rej) => setTimeout(res, maxDelay)); - const { - data: { data }, - } = await axios.post(url, { - query: q, - }); - - return data; -} - -export const addressLength = 40; -export const hashLength = 64; -export const nullAddress = '0x0000000000000000000000000000000000000000'; -export const nullParamsHash = '0x' + padZeros('', 64); - -export async function getWeb3() { - const web3 = new Web3(ethereum); - const hdwallet = HDWallet(10, test_mnemonic); - Array(10) - .fill(10) - .map((_, i) => i) - .forEach((i) => { - const pk = hdwallet.accounts[i].privateKey; - const account = web3.eth.accounts.privateKeyToAccount(pk); - web3.eth.accounts.wallet.add(account); - }); - web3.eth.defaultAccount = web3.eth.accounts.wallet[0].address; - return web3; -} - -export function getContractAddresses() { - const addresses = require(`@daostack/migration/migration.json`); - let arcVersion = '0.0.1-rc.36'; - return { - ...addresses.private.test[arcVersion], - ...addresses.private.dao[arcVersion], - ...addresses.private.base[arcVersion], - ...addresses.private.test[arcVersion].organs, - TestAvatar: addresses.private.test[arcVersion].Avatar, - NativeToken: addresses.private.dao[arcVersion].DAOToken, - NativeReputation: addresses.private.dao[arcVersion].Reputation, - ContributionRewardExt: addresses.private.dao[arcVersion].Schemes[1].address, - Competition: addresses.private.dao[arcVersion].StandAloneContracts[2].address, - }; -} - -export function getArcVersion() { - return '0.0.1-rc.36'; -} - -export function getOrgName() { - return require(`@daostack/migration/migration.json`).private.dao['0.0.1-rc.36'].name; -} - -export async function getOptions(web3) { - const block = await web3.eth.getBlock('latest'); - return { - from: web3.eth.defaultAccount, - gas: block.gasLimit - 100000, - }; -} - -export async function writeProposalIPFS(data: any) { - const ipfsClient = IPFSClient(ipfs); - const ipfsResponse = await ipfsClient.add(new Buffer(JSON.stringify(data))); - - return ipfsResponse[0].path; -} - -export function padZeros(str: string, max = 36) { - str = str.toString(); - return str.length < max ? padZeros('0' + str, max) : str; -} - -export const createSubscriptionObservable = ( - query: string, - variables = 0, - wsurl = node_ws, -) => { - const client = new SubscriptionClient(wsurl, { reconnect: true }, ws); - const link = new WebSocketLink(client); - return execute(link, { query, variables }); -}; - -export async function waitUntilTrue(test: () => Promise | boolean) { - return new Promise((resolve, reject) => { - (async function waitForIt(): Promise { - if (await test()) { return resolve(); } - setTimeout(waitForIt, 30); - })(); - }); -} - -export async function waitUntilSynced() { - const getGraphsSynced = `{ - subgraphDeployments { - synced - } - }`; - const graphIsSynced = async () => { - let result = await sendQuery( - getGraphsSynced, - 1000, - 'http://127.0.0.1:8000/subgraphs'); - return ((result.subgraphDeployments.length > 0) && result.subgraphDeployments[0].synced); - }; - await waitUntilTrue(graphIsSynced); -} - -export const increaseTime = async function(duration, web3) { - const id = await Date.now(); - web3.providers.HttpProvider.prototype.sendAsync = web3.providers.HttpProvider.prototype.send; - - return new Promise((resolve, reject) => { - web3.currentProvider.sendAsync({ - jsonrpc: '2.0', - method: 'evm_increaseTime', - params: [duration], - id, - }, (err1) => { - if (err1) { return reject(err1); } - - web3.currentProvider.sendAsync({ - jsonrpc: '2.0', - method: 'evm_mine', - id: id + 1, - }, (err2, res) => { - return err2 ? reject(err2) : resolve(res); - }); - }); - }); -}; - -export function toFixed(x) { - if (Math.abs(x) < 1.0) { - // tslint:disable-next-line: radix - let e = parseInt(x.toString().split('e-')[1]); - if (e) { - x *= Math.pow(10, e - 1); - x = '0.' + (new Array(e)).join('0') + x.toString().substring(2); - } - } else { - // tslint:disable-next-line: radix - let e = parseInt(x.toString().split('+')[1]); - if (e > 20) { - e -= 20; - x /= Math.pow(10, e); - x += (new Array(e + 1)).join('0'); - } - } - return x; -} From 3c9a88bc4dfe95f34a57d0409d57429e249e03ee Mon Sep 17 00:00:00 2001 From: Shubhendu Shekhar Date: Sat, 7 Mar 2020 01:48:19 +0100 Subject: [PATCH 32/32] refactor test --- test/0.0.1-rc.33/SignalSchemeSanity.spec.ts | 54 ++++++--------------- 1 file changed, 16 insertions(+), 38 deletions(-) diff --git a/test/0.0.1-rc.33/SignalSchemeSanity.spec.ts b/test/0.0.1-rc.33/SignalSchemeSanity.spec.ts index acd6b58d..cdbd2934 100644 --- a/test/0.0.1-rc.33/SignalSchemeSanity.spec.ts +++ b/test/0.0.1-rc.33/SignalSchemeSanity.spec.ts @@ -35,6 +35,10 @@ describe('Generic Signal Scheme', () => { let signalScheme; let genericScheme; + /** + * Deploy a DAO with Generic Scheme (that has address of the SignalScheme) + * + */ beforeAll(async () => { web3 = await getWeb3(); const addresses = getContractAddresses(); @@ -193,50 +197,24 @@ describe('Generic Signal Scheme', () => { }); +/** + * Creates a Signal Scheme proposal and then votes on it until it is executed (>50%) + */ const mainTest = async (web3, avatar, genericScheme, genesisProtocol, signalScheme, proposalIPFSData, matchto) => { const accounts = web3.eth.accounts.wallet; const descHash = await writeProposalIPFS(proposalIPFSData); const callData = await signalScheme.methods.signal(descHash).encodeABI(); - async function propose() { - const prop = genericScheme.methods.proposeCall(callData, 0, descHash); - const proposalId = await prop.call(); - const { blockNumber } = await prop.send(); - const { timestamp } = await web3.eth.getBlock(blockNumber); - return { proposalId, timestamp }; - } - - const [PASS, FAIL] = [1, 2]; - async function vote({ proposalId, outcome, voter, amount = 0 }) { - const { blockNumber } = await genesisProtocol.methods.vote(proposalId, outcome, amount, voter) - .send({ from: voter, gas: 5000000 }); - const { timestamp } = await web3.eth.getBlock(blockNumber); - return timestamp; - } - - const { proposalId: p1 } = await propose(); - - await vote({ - proposalId: p1, - outcome: PASS, - amount: 0, - voter: accounts[0].address, - }); - - await vote({ - proposalId: p1, - outcome: PASS, - amount: 0, - voter: accounts[1].address, - }); - - await vote({ - proposalId: p1, - outcome: PASS, - amount: 0, - voter: accounts[2].address, - }); + const prop = genericScheme.methods.proposeCall(callData, 0, descHash); + const proposalId = await prop.call(); + await prop.send(); + await genesisProtocol.methods.vote(proposalId, 1 /** YES */, 0, accounts[0].address) + .send({ from: accounts[0].address }); + await genesisProtocol.methods.vote(proposalId, 1 /** YES */, 0, accounts[1].address) + .send({ from: accounts[1].address }); + await genesisProtocol.methods.vote(proposalId, 1 /** YES */, 0, accounts[2].address) + .send({ from: accounts[2].address }); const metaq = `{ signal(id: "${avatar.options.address.toLowerCase()}"){