@0xcert/ethereum-gateway-contracts
Version:
Smart contracts used by the gateway on the Ethereum blockchain.
553 lines • 26.4 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const types_1 = require("@0xcert/ethereum-proxy-contracts/src/core/types");
const types_2 = require("@0xcert/ethereum-xcert-contracts/src/core/types");
const spec_1 = require("@specron/spec");
const types_3 = require("../../../core/types");
const common = require("../../helpers/common");
const signature_1 = require("../../helpers/signature");
const spec = new spec_1.Spec();
spec.beforeEach((ctx) => __awaiter(void 0, void 0, void 0, function* () {
const accounts = yield ctx.web3.eth.getAccounts();
ctx.set('owner', accounts[0]);
ctx.set('bob', accounts[1]);
ctx.set('jane', accounts[2]);
ctx.set('sara', accounts[3]);
ctx.set('ben', accounts[4]);
ctx.set('zeroAddress', '0x0000000000000000000000000000000000000000');
}));
spec.beforeEach((ctx) => __awaiter(void 0, void 0, void 0, function* () {
ctx.set('id1', '0x0000000000000000000000000000000000000000000000000000000000000001');
ctx.set('id2', '0x0000000000000000000000000000000000000000000000000000000000000002');
ctx.set('id3', '0x0000000000000000000000000000000000000000000000000000000000000003');
ctx.set('id4', '0x0000000000000000000000000000000000000000000000000000000000000004');
ctx.set('digest1', '0x1e205550c221490347e5e2393a02e94d284bbe9903f023ba098355b8d75974c8');
ctx.set('digest2', '0x5e20552dc271490347e5e2391b02e94d684bbe9903f023fa098355bed7597434');
ctx.set('digest3', '0x53f0df2dc671410347e5eef91b02344d687bbe9903f456fa0983eebed7517521');
}));
spec.beforeEach((ctx) => __awaiter(void 0, void 0, void 0, function* () {
const cat = yield ctx.deploy({
src: '@0xcert/ethereum-erc721-contracts/build/nf-token-metadata-enumerable-mock.json',
contract: 'NFTokenMetadataEnumerableMock',
args: ['cat', 'CAT', 'https://0xcert.org/', '.json'],
});
yield cat.instance.methods
.create(ctx.get('jane'), 1)
.send({
from: ctx.get('owner'),
gas: 4000000,
});
yield cat.instance.methods
.create(ctx.get('jane'), 4)
.send({
from: ctx.get('owner'),
gas: 4000000,
});
yield cat.instance.methods
.create(ctx.get('bob'), 2)
.send({
from: ctx.get('owner'),
gas: 4000000,
});
yield cat.instance.methods
.create(ctx.get('bob'), 3)
.send({
from: ctx.get('owner'),
gas: 4000000,
});
ctx.set('cat', cat);
}));
spec.beforeEach((ctx) => __awaiter(void 0, void 0, void 0, function* () {
const jane = ctx.get('jane');
const owner = ctx.get('owner');
const digest1 = ctx.get('digest1');
const digest2 = ctx.get('digest2');
const digest3 = ctx.get('digest3');
const dog = yield ctx.deploy({
src: '@0xcert/ethereum-xcert-contracts/build/xcert-mock.json',
contract: 'XcertMock',
args: ['dog', 'DOG', 'https://0xcert.org/', '.json', '0xa65de9e6', ['0x0d04c3b8']],
});
yield dog.instance.methods
.create(jane, 1, digest1)
.send({
from: owner,
});
yield dog.instance.methods
.create(jane, 2, digest2)
.send({
from: owner,
});
yield dog.instance.methods
.create(jane, 3, digest3)
.send({
from: owner,
});
ctx.set('dog', dog);
}));
spec.beforeEach((ctx) => __awaiter(void 0, void 0, void 0, function* () {
const jane = ctx.get('jane');
const owner = ctx.get('owner');
const fox = yield ctx.deploy({
src: '@0xcert/ethereum-xcert-contracts/build/xcert-mock.json',
contract: 'XcertMock',
args: ['fox', 'FOX', 'https://0xcert.org/', '.json', '0xa65de9e6', ['0x0d04c3b8']],
});
yield fox.instance.methods
.create(jane, 1, '0x0')
.send({
from: owner,
});
ctx.set('fox', fox);
}));
spec.beforeEach((ctx) => __awaiter(void 0, void 0, void 0, function* () {
const jane = ctx.get('jane');
const zxc = yield ctx.deploy({
src: '@0xcert/ethereum-erc20-contracts/build/token-mock.json',
contract: 'TokenMock',
args: ['ERC20', 'ERC', 18, '300000000000000000000000000'],
from: jane,
});
ctx.set('zxc', zxc);
}));
spec.beforeEach((ctx) => __awaiter(void 0, void 0, void 0, function* () {
const jane = ctx.get('jane');
const bnb = yield ctx.deploy({
src: '@0xcert/ethereum-erc20-contracts/build/token-mock.json',
contract: 'TokenMock',
args: ['ERC20', 'ERC', 18, '300000000000000000000000000'],
from: jane,
});
ctx.set('bnb', bnb);
}));
spec.beforeEach((ctx) => __awaiter(void 0, void 0, void 0, function* () {
const bob = ctx.get('bob');
const gnt = yield ctx.deploy({
src: '@0xcert/ethereum-erc20-contracts/build/token-mock.json',
contract: 'TokenMock',
args: ['ERC20', 'ERC', 18, '300000000000000000000000000'],
from: bob,
});
ctx.set('gnt', gnt);
}));
spec.beforeEach((ctx) => __awaiter(void 0, void 0, void 0, function* () {
const tokenProxy = yield ctx.deploy({
src: '@0xcert/ethereum-proxy-contracts/build/token-transfer-proxy.json',
contract: 'TokenTransferProxy',
});
ctx.set('tokenProxy', tokenProxy);
}));
spec.beforeEach((ctx) => __awaiter(void 0, void 0, void 0, function* () {
const nftSafeProxy = yield ctx.deploy({
src: '@0xcert/ethereum-proxy-contracts/build/nftoken-safe-transfer-proxy.json',
contract: 'NFTokenSafeTransferProxy',
});
ctx.set('nftSafeProxy', nftSafeProxy);
}));
spec.beforeEach((ctx) => __awaiter(void 0, void 0, void 0, function* () {
const updateProxy = yield ctx.deploy({
src: '@0xcert/ethereum-proxy-contracts/build/xcert-update-proxy.json',
contract: 'XcertUpdateProxy',
});
ctx.set('updateProxy', updateProxy);
}));
spec.beforeEach((ctx) => __awaiter(void 0, void 0, void 0, function* () {
const createProxy = yield ctx.deploy({
src: '@0xcert/ethereum-proxy-contracts/build/xcert-create-proxy.json',
contract: 'XcertCreateProxy',
});
ctx.set('createProxy', createProxy);
}));
spec.beforeEach((ctx) => __awaiter(void 0, void 0, void 0, function* () {
const abilitableManageProxy = yield ctx.deploy({
src: '@0xcert/ethereum-proxy-contracts/build/abilitable-manage-proxy.json',
contract: 'AbilitableManageProxy',
});
ctx.set('abilitableManageProxy', abilitableManageProxy);
}));
spec.beforeEach((ctx) => __awaiter(void 0, void 0, void 0, function* () {
const tokenProxy = ctx.get('tokenProxy');
const nftSafeProxy = ctx.get('nftSafeProxy');
const updateProxy = ctx.get('updateProxy');
const createProxy = ctx.get('createProxy');
const abilitableManageProxy = ctx.get('abilitableManageProxy');
const owner = ctx.get('owner');
const actionsGateway = yield ctx.deploy({
src: './build/actions-gateway.json',
contract: 'ActionsGateway',
});
yield actionsGateway.instance.methods.grantAbilities(owner, types_3.ActionsGatewayAbilities.SET_PROXIES).send();
yield actionsGateway.instance.methods.addProxy(createProxy.receipt._address, 0).send({ from: owner });
yield actionsGateway.instance.methods.addProxy(tokenProxy.receipt._address, 1).send({ from: owner });
yield actionsGateway.instance.methods.addProxy(nftSafeProxy.receipt._address, 1).send({ from: owner });
yield actionsGateway.instance.methods.addProxy(updateProxy.receipt._address, 2).send({ from: owner });
yield actionsGateway.instance.methods.addProxy(abilitableManageProxy.receipt._address, 3).send({ from: owner });
ctx.set('actionsGateway', actionsGateway);
}));
spec.beforeEach((ctx) => __awaiter(void 0, void 0, void 0, function* () {
const tokenProxy = ctx.get('tokenProxy');
const nftSafeProxy = ctx.get('nftSafeProxy');
const updateProxy = ctx.get('updateProxy');
const createProxy = ctx.get('createProxy');
const abilitableManageProxy = ctx.get('abilitableManageProxy');
const actionsGateway = ctx.get('actionsGateway');
const owner = ctx.get('owner');
yield tokenProxy.instance.methods.grantAbilities(actionsGateway.receipt._address, types_1.TokenTransferProxyAbilities.EXECUTE).send({ from: owner });
yield nftSafeProxy.instance.methods.grantAbilities(actionsGateway.receipt._address, types_1.NFTokenSafeTransferProxyAbilities.EXECUTE).send({ from: owner });
yield updateProxy.instance.methods.grantAbilities(actionsGateway.receipt._address, types_1.XcertUpdateProxyAbilities.EXECUTE).send({ from: owner });
yield createProxy.instance.methods.grantAbilities(actionsGateway.receipt._address, types_1.XcertCreateProxyAbilities.EXECUTE).send({ from: owner });
yield abilitableManageProxy.instance.methods.grantAbilities(actionsGateway.receipt._address, types_1.AbilitableManageProxyAbilities.EXECUTE).send({ from: owner });
}));
spec.test('sucesfully executes multiple actions scenario #1', (ctx) => __awaiter(void 0, void 0, void 0, function* () {
const actionsGateway = ctx.get('actionsGateway');
const updateProxy = ctx.get('updateProxy');
const createProxy = ctx.get('createProxy');
const tokenProxy = ctx.get('tokenProxy');
const nftSafeProxy = ctx.get('nftSafeProxy');
const abilitableManageProxy = ctx.get('abilitableManageProxy');
const jane = ctx.get('jane');
const owner = ctx.get('owner');
const bob = ctx.get('bob');
const sara = ctx.get('sara');
const dog = ctx.get('dog');
const fox = ctx.get('fox');
const id = ctx.get('id1');
const id2 = ctx.get('id2');
const id4 = ctx.get('id4');
const digest1 = ctx.get('digest1');
const digest2 = ctx.get('digest2');
const zxc = ctx.get('zxc');
const gnt = ctx.get('gnt');
const gntAmountDec = 3000;
const gntAmountHex = '0x0000000000000000000000000000000000000000000000000000000000000BB8';
const zxcAmountDec = 1000;
const zxcAmountHex = '0x00000000000000000000000000000000000000000000000000000000000003E8';
const createAbility = '0x0000000000000000000000000000000000000000000000000000000000000010';
const actions = [
{
proxyId: 0,
contractAddress: dog.receipt._address,
params: `${digest1}${id4.substring(2)}${jane.substring(2)}00`,
},
{
proxyId: 1,
contractAddress: gnt.receipt._address,
params: `${gntAmountHex}${owner.substring(2)}02`,
},
{
proxyId: 2,
contractAddress: dog.receipt._address,
params: `${id}${bob.substring(2)}01`,
},
{
proxyId: 2,
contractAddress: dog.receipt._address,
params: `${id2}${bob.substring(2)}01`,
},
{
proxyId: 1,
contractAddress: zxc.receipt._address,
params: `${zxcAmountHex}${bob.substring(2)}01`,
},
{
proxyId: 3,
contractAddress: dog.receipt._address,
params: `${digest2}${id.substring(2)}00`,
},
{
proxyId: 4,
contractAddress: dog.receipt._address,
params: `${createAbility}${bob.substring(2)}00`,
},
{
proxyId: 2,
contractAddress: fox.receipt._address,
params: `${id}${owner.substring(2)}01`,
},
];
const orderData = {
signers: [owner, jane, bob],
actions,
seed: common.getCurrentTime(),
expirationTimestamp: common.getCurrentTime() + 3600,
};
const createTuple = ctx.tuple(orderData);
const claim = yield actionsGateway.instance.methods.getOrderDataClaim(createTuple).call();
const signature = yield signature_1.getSignature(ctx.web3, claim, owner);
const signature2 = yield signature_1.getSignature(ctx.web3, claim, jane);
const signature3 = yield signature_1.getSignature(ctx.web3, claim, bob);
const signatureDataTuple = ctx.tuple([signature, signature2, signature3]);
yield dog.instance.methods.grantAbilities(createProxy.receipt._address, types_2.XcertAbilities.CREATE_ASSET).send({ from: owner });
yield gnt.instance.methods.approve(tokenProxy.receipt._address, gntAmountDec).send({ from: bob });
yield zxc.instance.methods.approve(tokenProxy.receipt._address, zxcAmountDec).send({ from: jane });
yield dog.instance.methods.setApprovalForAll(nftSafeProxy.receipt._address, true).send({ from: jane });
yield dog.instance.methods.grantAbilities(updateProxy.receipt._address, types_2.XcertAbilities.UPDATE_ASSET_IMPRINT).send({ from: owner });
yield dog.instance.methods.grantAbilities(abilitableManageProxy.receipt._address, types_2.XcertAbilities.MANAGE_ABILITIES).send({ from: owner });
yield fox.instance.methods.setApprovalForAll(nftSafeProxy.receipt._address, true).send({ from: jane });
const logs = yield actionsGateway.instance.methods.perform(createTuple, signatureDataTuple).send({ from: sara });
ctx.not(logs.events.Perform, undefined);
const dog4Owner = yield dog.instance.methods.ownerOf(id4).call();
ctx.is(dog4Owner, jane);
const ownerGntBalance = yield gnt.instance.methods.balanceOf(owner).call();
ctx.is(ownerGntBalance, gntAmountDec.toString());
const dog1Owner = yield dog.instance.methods.ownerOf(id).call();
ctx.is(dog1Owner, bob);
const dog2Owner = yield dog.instance.methods.ownerOf(id2).call();
ctx.is(dog2Owner, bob);
const bobZxcBalance = yield zxc.instance.methods.balanceOf(bob).call();
ctx.is(bobZxcBalance, zxcAmountDec.toString());
const dog1Digest = yield dog.instance.methods.tokenURIIntegrity(id).call();
ctx.is(dog1Digest.digest, digest2);
const bobCreateDog = yield dog.instance.methods.isAble(bob, types_2.XcertAbilities.CREATE_ASSET).call();
ctx.true(bobCreateDog);
const fox1Owner = yield fox.instance.methods.ownerOf(id).call();
ctx.is(fox1Owner, owner);
}));
spec.test('sucesfully executes multiple actions scenario #2', (ctx) => __awaiter(void 0, void 0, void 0, function* () {
const actionsGateway = ctx.get('actionsGateway');
const createProxy = ctx.get('createProxy');
const tokenProxy = ctx.get('tokenProxy');
const jane = ctx.get('jane');
const owner = ctx.get('owner');
const bob = ctx.get('bob');
const sara = ctx.get('sara');
const ben = ctx.get('ben');
const fox = ctx.get('fox');
const id2 = ctx.get('id2');
const id3 = ctx.get('id3');
const id4 = ctx.get('id4');
const digest1 = ctx.get('digest1');
const digest2 = ctx.get('digest2');
const digest3 = ctx.get('digest3');
const zxc = ctx.get('zxc');
const gnt = ctx.get('gnt');
const gntAmountDec = 3000;
const gntAmountHex = '0x0000000000000000000000000000000000000000000000000000000000000BB8';
const zxcAmountDec = 3000;
const zxcAmountHex = '0x0000000000000000000000000000000000000000000000000000000000000BB8';
const actions = [
{
proxyId: 0,
contractAddress: fox.receipt._address,
params: `${digest2}${id2.substring(2)}${bob.substring(2)}00`,
},
{
proxyId: 0,
contractAddress: fox.receipt._address,
params: `${digest3}${id3.substring(2)}${jane.substring(2)}00`,
},
{
proxyId: 0,
contractAddress: fox.receipt._address,
params: `${digest1}${id4.substring(2)}${sara.substring(2)}00`,
},
{
proxyId: 1,
contractAddress: gnt.receipt._address,
params: `${gntAmountHex}${sara.substring(2)}02`,
},
{
proxyId: 1,
contractAddress: zxc.receipt._address,
params: `${zxcAmountHex}${sara.substring(2)}01`,
},
];
const orderData = {
signers: [owner, jane, bob],
actions,
seed: common.getCurrentTime(),
expirationTimestamp: common.getCurrentTime() + 3600,
};
const createTuple = ctx.tuple(orderData);
const claim = yield actionsGateway.instance.methods.getOrderDataClaim(createTuple).call();
const signature = yield signature_1.getSignature(ctx.web3, claim, owner);
const signature2 = yield signature_1.getSignature(ctx.web3, claim, jane);
const signature3 = yield signature_1.getSignature(ctx.web3, claim, bob);
const signatureDataTuple = ctx.tuple([signature, signature2, signature3]);
yield fox.instance.methods.grantAbilities(createProxy.receipt._address, types_2.XcertAbilities.CREATE_ASSET).send({ from: owner });
yield gnt.instance.methods.approve(tokenProxy.receipt._address, gntAmountDec).send({ from: bob });
yield zxc.instance.methods.approve(tokenProxy.receipt._address, zxcAmountDec).send({ from: jane });
const logs = yield actionsGateway.instance.methods.perform(createTuple, signatureDataTuple).send({ from: ben });
ctx.not(logs.events.Perform, undefined);
const saraGntBalance = yield gnt.instance.methods.balanceOf(sara).call();
ctx.is(saraGntBalance, gntAmountDec.toString());
const saraZxcBalance = yield zxc.instance.methods.balanceOf(sara).call();
ctx.is(saraZxcBalance, zxcAmountDec.toString());
const fox2Owner = yield fox.instance.methods.ownerOf(id2).call();
ctx.is(fox2Owner, bob);
const fox3Owner = yield fox.instance.methods.ownerOf(id3).call();
ctx.is(fox3Owner, jane);
const fox4Owner = yield fox.instance.methods.ownerOf(id4).call();
ctx.is(fox4Owner, sara);
}));
spec.test('sucesfully executes multiple actions scenario #3', (ctx) => __awaiter(void 0, void 0, void 0, function* () {
const actionsGateway = ctx.get('actionsGateway');
const updateProxy = ctx.get('updateProxy');
const createProxy = ctx.get('createProxy');
const abilitableManageProxy = ctx.get('abilitableManageProxy');
const owner = ctx.get('owner');
const bob = ctx.get('bob');
const sara = ctx.get('sara');
const ben = ctx.get('ben');
const fox = ctx.get('fox');
const id2 = ctx.get('id2');
const id3 = ctx.get('id3');
const digest1 = ctx.get('digest1');
const digest2 = ctx.get('digest2');
const digest3 = ctx.get('digest3');
const allowManageAbility = '0x0000000000000000000000000000000000000000000000000000000000000002';
const allowCreateAbility = '0x0000000000000000000000000000000000000000000000000000000000000200';
const allowCreateAndAllowUpdateAbilities = '0x0000000000000000000000000000000000000000000000000000000000000600';
const actions = [
{
proxyId: 4,
contractAddress: fox.receipt._address,
params: `${allowManageAbility}${ben.substring(2)}00`,
},
{
proxyId: 4,
contractAddress: fox.receipt._address,
params: `${allowCreateAbility}${bob.substring(2)}01`,
},
{
proxyId: 4,
contractAddress: fox.receipt._address,
params: `${allowCreateAndAllowUpdateAbilities}${sara.substring(2)}01`,
},
{
proxyId: 0,
contractAddress: fox.receipt._address,
params: `${digest2}${id2.substring(2)}${bob.substring(2)}02`,
},
{
proxyId: 0,
contractAddress: fox.receipt._address,
params: `${digest3}${id3.substring(2)}${bob.substring(2)}03`,
},
{
proxyId: 3,
contractAddress: fox.receipt._address,
params: `${digest1}${id3.substring(2)}03`,
},
];
const orderData = {
signers: [owner, ben, bob, sara],
actions,
seed: common.getCurrentTime(),
expirationTimestamp: common.getCurrentTime() + 3600,
};
const createTuple = ctx.tuple(orderData);
const claim = yield actionsGateway.instance.methods.getOrderDataClaim(createTuple).call();
const signature = yield signature_1.getSignature(ctx.web3, claim, owner);
const signature2 = yield signature_1.getSignature(ctx.web3, claim, ben);
const signature3 = yield signature_1.getSignature(ctx.web3, claim, bob);
const signatureDataTuple = ctx.tuple([signature, signature2, signature3]);
yield fox.instance.methods.grantAbilities(createProxy.receipt._address, types_2.XcertAbilities.CREATE_ASSET).send({ from: owner });
yield fox.instance.methods.grantAbilities(abilitableManageProxy.receipt._address, types_2.XcertAbilities.MANAGE_ABILITIES).send({ from: owner });
yield fox.instance.methods.grantAbilities(updateProxy.receipt._address, types_2.XcertAbilities.UPDATE_ASSET_IMPRINT).send({ from: owner });
const logs = yield actionsGateway.instance.methods.perform(createTuple, signatureDataTuple).send({ from: sara });
ctx.not(logs.events.Perform, undefined);
const benAllowManageAbility = yield fox.instance.methods.isAble(ben, types_2.XcertAbilities.ALLOW_MANAGE_ABILITIES).call();
ctx.true(benAllowManageAbility);
const bobAllowCreateAbility = yield fox.instance.methods.isAble(bob, types_2.XcertAbilities.ALLOW_CREATE_ASSET).call();
ctx.true(bobAllowCreateAbility);
const saraAllowCreateAbility = yield fox.instance.methods.isAble(sara, types_2.XcertAbilities.ALLOW_CREATE_ASSET).call();
ctx.true(saraAllowCreateAbility);
const saraAllowUpdateAbility = yield fox.instance.methods.isAble(sara, types_2.XcertAbilities.ALLOW_UPDATE_ASSET_IMPRINT).call();
ctx.true(saraAllowUpdateAbility);
const fox2Owner = yield fox.instance.methods.ownerOf(id2).call();
ctx.is(fox2Owner, bob);
const fox3Owner = yield fox.instance.methods.ownerOf(id3).call();
ctx.is(fox3Owner, bob);
const fox3Digest = yield fox.instance.methods.tokenURIIntegrity(id3).call();
ctx.is(fox3Digest.digest, digest1);
}));
spec.test('sucesfully executes multiple actions scenario #4', (ctx) => __awaiter(void 0, void 0, void 0, function* () {
const actionsGateway = ctx.get('actionsGateway');
const createProxy = ctx.get('createProxy');
const tokenProxy = ctx.get('tokenProxy');
const abilitableManageProxy = ctx.get('abilitableManageProxy');
const jane = ctx.get('jane');
const owner = ctx.get('owner');
const bob = ctx.get('bob');
const sara = ctx.get('sara');
const zeroAddress = ctx.get('zeroAddress');
const fox = ctx.get('fox');
const id2 = ctx.get('id2');
const id3 = ctx.get('id3');
const digest2 = ctx.get('digest2');
const digest3 = ctx.get('digest3');
const zxc = ctx.get('zxc');
const gnt = ctx.get('gnt');
const gntAmountDec = 3000;
const gntAmountHex = '0x0000000000000000000000000000000000000000000000000000000000000BB8';
const zxcAmountDec = 10000;
const zxcAmountHex = '0x0000000000000000000000000000000000000000000000000000000000002710';
const revokeAbility = '0x0000000000000000000000000000000000000000000000000000000000000020';
const actions = [
{
proxyId: 0,
contractAddress: fox.receipt._address,
params: `${digest2}${id2.substring(2)}${zeroAddress.substring(2)}00`,
},
{
proxyId: 0,
contractAddress: fox.receipt._address,
params: `${digest3}${id3.substring(2)}${zeroAddress.substring(2)}00`,
},
{
proxyId: 1,
contractAddress: gnt.receipt._address,
params: `${gntAmountHex}${zeroAddress.substring(2)}01`,
},
{
proxyId: 4,
contractAddress: fox.receipt._address,
params: `${revokeAbility}${zeroAddress.substring(2)}00`,
},
{
proxyId: 1,
contractAddress: zxc.receipt._address,
params: `${zxcAmountHex}${sara.substring(2)}02`,
},
];
const orderData = {
signers: [owner, bob, zeroAddress],
actions,
seed: common.getCurrentTime(),
expirationTimestamp: common.getCurrentTime() + 3600,
};
const createTuple = ctx.tuple(orderData);
const claim = yield actionsGateway.instance.methods.getOrderDataClaim(createTuple).call();
const signature = yield signature_1.getSignature(ctx.web3, claim, owner);
const signature2 = yield signature_1.getSignature(ctx.web3, claim, bob);
const signature3 = yield signature_1.getSignature(ctx.web3, claim, jane);
const signatureDataTuple = ctx.tuple([signature, signature2, signature3]);
yield fox.instance.methods.grantAbilities(createProxy.receipt._address, types_2.XcertAbilities.CREATE_ASSET).send({ from: owner });
yield gnt.instance.methods.approve(tokenProxy.receipt._address, gntAmountDec).send({ from: bob });
yield zxc.instance.methods.approve(tokenProxy.receipt._address, zxcAmountDec).send({ from: jane });
yield fox.instance.methods.grantAbilities(abilitableManageProxy.receipt._address, types_2.XcertAbilities.MANAGE_ABILITIES).send({ from: owner });
const logs = yield actionsGateway.instance.methods.perform(createTuple, signatureDataTuple).send({ from: sara });
ctx.not(logs.events.Perform, undefined);
const fox2Owner = yield fox.instance.methods.ownerOf(id2).call();
ctx.is(fox2Owner, jane);
const fox3Owner = yield fox.instance.methods.ownerOf(id3).call();
ctx.is(fox3Owner, jane);
const janeGntBalance = yield gnt.instance.methods.balanceOf(jane).call();
ctx.is(janeGntBalance, gntAmountDec.toString());
const janeRevokeAbility = yield fox.instance.methods.isAble(jane, types_2.XcertAbilities.REVOKE_ASSET).call();
ctx.true(janeRevokeAbility);
const saraZxcBalance = yield zxc.instance.methods.balanceOf(sara).call();
ctx.is(saraZxcBalance, zxcAmountDec.toString());
}));
exports.default = spec;
//# sourceMappingURL=multi.test.js.map