Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

indexed only daos with indexed avatar #209

Merged
merged 2 commits into from
May 1, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions ops/mappings.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@
"dao": "test",
"mapping": "DAOToken"
},
{
"name": "Avatar",
"contractName": "Avatar",
"dao": "test",
"mapping": "Avatar"
},
{
"name": "Reputation",
"contractName": "Reputation",
Expand All @@ -44,6 +50,12 @@
"dao": "organs",
"mapping": "DAOToken"
},
{
"name": "Avatar",
"contractName": "DemoAvatar",
"dao": "organs",
"mapping": "Avatar"
},
{
"name": "Reputation",
"contractName": "Reputation",
Expand Down
2 changes: 2 additions & 0 deletions src/mappings/Avatar/datasource.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@ eventHandlers:
handler: handleSendEth
- event: ReceiveEther(address,uint256)
handler: handleReceiveEth
- event: OwnershipTransferred(address,address)
handler: handleOwnershipTransferred
21 changes: 11 additions & 10 deletions src/mappings/Avatar/mapping.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import 'allocator/arena';

import { Address, BigInt, store } from '@graphprotocol/graph-ts';

// Import event types from the Token contract ABI
import { Avatar, ReceiveEther, SendEther } from '../../types/Avatar/Avatar';
// Import event types from the Avatar contract ABI
import { Avatar, OwnershipTransferred, ReceiveEther, SendEther } from '../../types/Avatar/Avatar';

// Import entity types generated from the GraphQL schema
import { AvatarContract } from '../../types/schema';
Expand All @@ -13,17 +13,10 @@ function handleAvatarBalance(
value: BigInt,
received: boolean,
): void {
let avatarSC = Avatar.bind(address);

let avatar = store.get('AvatarContract', address.toHex()) as AvatarContract;
if (avatar == null) {
avatar = new AvatarContract(address.toHex());
avatar.address = address;
avatar.name = avatarSC.orgName();
avatar.nativeReputation = avatarSC.nativeReputation();
avatar.nativeToken = avatarSC.nativeToken();
avatar.owner = avatarSC.owner();
avatar.balance = BigInt.fromI32(0);
return;
}

if (received) {
Expand All @@ -41,3 +34,11 @@ export function handleSendEth(event: SendEther): void {
export function handleReceiveEth(event: ReceiveEther): void {
handleAvatarBalance(event.address, event.params._value, true);
}
export function handleOwnershipTransferred(event: OwnershipTransferred): void {
let avatar = AvatarContract.load(event.address.toHex());
if (avatar == null) {
avatar = new AvatarContract(event.address.toHex());
}
avatar.owner = event.params.newOwner;
avatar.save();
}
25 changes: 15 additions & 10 deletions src/mappings/Controller/mapping.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ function insertOrganization(
controllerAddress: Address,
avatarAddress: Address,
): void {

let controller = Controller.bind(controllerAddress);
let reputation = controller.nativeReputation();

Expand All @@ -100,16 +101,16 @@ function insertOrganization(
ent.nativeReputation = reputation.toHex();
ent.controller = controllerAddress;

let avatarSC = Avatar.bind(avatarAddress);
let avatar = new AvatarContract(avatarAddress.toHex());
avatar.address = avatarAddress;
avatar.name = avatarSC.orgName();
avatar.nativeReputation = avatarSC.nativeReputation();
avatar.nativeToken = avatarSC.nativeToken();
avatar.owner = avatarSC.owner();
avatar.balance = BigInt.fromI32(0);
store.set('AvatarContract', avatar.id, avatar);

let avatar = AvatarContract.load(avatarAddress.toHex());
if (avatar != null) {
let avatarSC = Avatar.bind(avatarAddress);
avatar.address = avatarAddress;
avatar.name = avatarSC.orgName();
avatar.nativeReputation = avatarSC.nativeReputation();
avatar.nativeToken = avatarSC.nativeToken();
avatar.balance = BigInt.fromI32(0);
store.set('AvatarContract', avatar.id, avatar as AvatarContract);
}
store.set('ControllerOrganization', ent.id, ent);
}

Expand Down Expand Up @@ -160,6 +161,10 @@ function deleteGlobalConstraint(
export function handleRegisterScheme(event: RegisterScheme): void {
let controller = Controller.bind(event.address);
let avatar = controller.avatar();

if (AvatarContract.load(avatar.toHex()) == null) {
return;
}
let token = controller.nativeToken();
let reputation = controller.nativeReputation();
domain.handleRegisterScheme(avatar, token, reputation);
Expand Down
27 changes: 16 additions & 11 deletions src/mappings/UController/mapping.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ function insertOrganization(
uControllerAddress: Address,
avatarAddress: Address,
): void {

let uController = UController.bind(uControllerAddress);
let org = uController.organizations(avatarAddress);

Expand All @@ -87,22 +88,22 @@ function insertOrganization(
tokenContract.owner = uControllerAddress;
store.set('TokenContract', tokenContract.id, tokenContract);

let avatar = AvatarContract.load(avatarAddress.toHex());
if (avatar != null) {
let avatarSC = Avatar.bind(avatarAddress);
avatar.address = avatarAddress;
avatar.name = avatarSC.orgName();
avatar.nativeReputation = avatarSC.nativeReputation();
avatar.nativeToken = avatarSC.nativeToken();
avatar.balance = BigInt.fromI32(0);
store.set('AvatarContract', avatar.id, avatar as AvatarContract);
}

let ent = new UControllerOrganization(avatarAddress.toHex());
ent.avatarAddress = avatarAddress;
ent.nativeToken = org.value0.toHex();
ent.nativeReputation = org.value1.toHex();
ent.controller = uControllerAddress;

let avatarSC = Avatar.bind(avatarAddress);
let avatar = new AvatarContract(avatarAddress.toHex());
avatar.address = avatarAddress;
avatar.name = avatarSC.orgName();
avatar.nativeReputation = avatarSC.nativeReputation();
avatar.nativeToken = avatarSC.nativeToken();
avatar.owner = avatarSC.owner();
avatar.balance = BigInt.fromI32(0);
store.set('AvatarContract', avatar.id, avatar);

store.set('UControllerOrganization', ent.id, ent);
}

Expand Down Expand Up @@ -153,6 +154,10 @@ function deleteGlobalConstraint(

export function handleRegisterScheme(event: RegisterScheme): void {
let uController = UController.bind(event.address);
if (AvatarContract.load(event.params._avatar.toHex()) == null) {
return;
}

let org = uController.organizations(event.params._avatar);
domain.handleRegisterScheme(event.params._avatar, org.value0 , org.value1);

Expand Down
53 changes: 45 additions & 8 deletions test/integration/Reputation.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,58 @@ import { getContractAddresses, getOptions, getWeb3, sendQuery } from './util';

const Reputation = require('@daostack/arc/build/contracts/Reputation.json');
const UController = require('@daostack/arc/build/contracts/UController.json');
const Avatar = require('@daostack/arc/build/contracts/Avatar.json');
const DAOToken = require('@daostack/arc/build/contracts/DAOToken.json');

describe('Reputation', () => {
let web3;
let addresses;
let reputation;
let opts;
let uController;
let daoToken;
let accounts;

beforeAll(async () => {
web3 = await getWeb3();
addresses = getContractAddresses();
const opts = await getOptions(web3);
opts = await getOptions(web3);
accounts = web3.eth.accounts.wallet;
uController = new web3.eth.Contract(
UController.abi,
addresses.UController,
opts,
);
reputation = new web3.eth.Contract(
Reputation.abi,
addresses.DemoReputation,
opts,
);
daoToken = new web3.eth.Contract(
DAOToken.abi,
addresses.DemoDAOToken,
opts,
);
const avatar = new web3.eth.Contract(
Avatar.abi,
addresses.DemoAvatar,
opts,
);

if (await avatar.methods.owner().call() === accounts[0].address) {
await avatar.methods.transferOwnership(uController.options.address).send({from: accounts[0].address});

}
if (await reputation.methods.owner().call() === accounts[0].address) {
await reputation.methods.transferOwnership(uController.options.address).send();
}
if (await daoToken.methods.owner().call() === accounts[0].address) {
await daoToken.methods.transferOwnership(uController.options.address).send();
}
let organs = await uController.methods.organizations(avatar.options.address).call();
if (organs[0] !== daoToken.options.address) {
await uController.methods.newOrganization(avatar.options.address).send();
}
});

async function checkTotalSupply(value) {
Expand All @@ -33,23 +70,23 @@ describe('Reputation', () => {
}

it('Sanity', async () => {
const accounts = web3.eth.accounts.wallet;
let txs = [];

txs.push(await reputation.methods.mint(accounts[0].address, '100').send());
txs.push(await uController.methods.mintReputation(100, accounts[0].address, addresses.DemoAvatar)
.send({from : accounts[0].address}));

await checkTotalSupply(100);
txs.push(await reputation.methods.mint(accounts[1].address, '100').send());
txs.push(await uController.methods.mintReputation('100' , accounts[1].address, addresses.DemoAvatar).send());

await checkTotalSupply(200);
txs.push(await reputation.methods.burn(accounts[0].address, '30').send());
txs.push(await uController.methods.burnReputation('30', accounts[0].address, addresses.DemoAvatar).send());
await checkTotalSupply(170);

txs.push(await reputation.methods.mint(accounts[2].address, '300').send());
txs.push(await uController.methods.mintReputation('300', accounts[2].address, addresses.DemoAvatar).send());
await checkTotalSupply(470);
txs.push(await reputation.methods.burn(accounts[1].address, '100').send());
txs.push(await uController.methods.burnReputation('100' , accounts[1].address, addresses.DemoAvatar).send());
await checkTotalSupply(370);
txs.push(await reputation.methods.burn(accounts[2].address, '1').send());
txs.push(await uController.methods.burnReputation( '1', accounts[2].address, addresses.DemoAvatar).send());
await checkTotalSupply(369);

txs = txs.map(({ transactionHash }) => transactionHash);
Expand Down
42 changes: 39 additions & 3 deletions test/integration/Subscription.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,61 @@ import {
} from './util';

const Reputation = require('@daostack/arc/build/contracts/Reputation.json');
const UController = require('@daostack/arc/build/contracts/UController.json');
const Avatar = require('@daostack/arc/build/contracts/Avatar.json');
const DAOToken = require('@daostack/arc/build/contracts/DAOToken.json');
const gql = require('graphql-tag');

describe('Subscriptions', () => {
let web3;
let addresses;
let opts;
let reputation;
let uController;
let accounts;
beforeAll(async () => {
web3 = await getWeb3();
addresses = getContractAddresses();
opts = await getOptions(web3);
accounts = web3.eth.accounts.wallet;

uController = new web3.eth.Contract(
UController.abi,
addresses.UController,
opts,
);
reputation = new web3.eth.Contract(
Reputation.abi,
addresses.DemoReputation,
opts,
);
const daoToken = new web3.eth.Contract(
DAOToken.abi,
addresses.DemoDAOToken,
opts,
);
const avatar = new web3.eth.Contract(
Avatar.abi,
addresses.DemoAvatar,
opts,
);

if (await avatar.methods.owner().call() === accounts[0].address) {
await avatar.methods.transferOwnership(uController.options.address).send({from: accounts[0].address});

}
if (await reputation.methods.owner().call() === accounts[0].address) {
await reputation.methods.transferOwnership(uController.options.address).send();
}
if (await daoToken.methods.owner().call() === accounts[0].address) {
await daoToken.methods.transferOwnership(uController.options.address).send();
}
let organs = await uController.methods.organizations(avatar.options.address).call();
if (organs[0] !== daoToken.options.address) {
await uController.methods.newOrganization(avatar.options.address).send();
}
});
it('Run one subscription and test for updates', async () => {
const accounts = web3.eth.accounts.wallet;
const SUBSCRIBE_QUERY = gql`
subscription {
reputationMints {
Expand Down Expand Up @@ -53,8 +89,8 @@ describe('Subscriptions', () => {
expect(true).toEqual(false);
},
);

await reputation.methods.mint(accounts[4].address, '99').send();
await uController.methods.mintReputation('99', accounts[4].address, addresses.DemoAvatar)
.send({from: accounts[0].address});

// wait until the subscription callback has been called
await waitUntilTrue(() => nextWasCalled);
Expand Down
Loading