git.delta.rocks / unique-network / refs/commits / 7e5f90964b48

difftreelog

chore compile fractionalizer in typescript

Grigoriy Simonov2022-08-11parent: #817fef6.patch.diff
in: master

4 files changed

deleted.maintain/scripts/compile_fractionalizer.shdiffbeforeafterboth
--- a/.maintain/scripts/compile_fractionalizer.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/sh
-set -eu
-
-dir=$PWD
-
-tmp=$(mktemp -d)
-cd $tmp
-mkdir refungible
-mkdir api
-cp $dir/tests/src/eth/fractionalizer/Fractionalizer.sol refungible/input.sol
-cp $dir/tests/src/eth/api/CollectionHelpers.sol api/CollectionHelpers.sol
-cp $dir/tests/src/eth/api/ContractHelpers.sol api/ContractHelpers.sol
-cp $dir/tests/src/eth/api/UniqueRefungibleToken.sol api/UniqueRefungibleToken.sol
-cp $dir/tests/src/eth/api/UniqueRefungible.sol api/UniqueRefungible.sol
-cp $dir/tests/src/eth/api/UniqueNFT.sol api/UniqueNFT.sol
-solcjs --optimize --bin refungible/input.sol -o $PWD
-solcjs --abi -p refungible/input.sol
-
-mv refungible_input_sol_Fractionalizer.bin $dir/tests/src/eth/fractionalizer/Fractionalizer.bin
-mv refungible_input_sol_Fractionalizer.abi refungible_input_sol_Fractionalizer.json
-prettier refungible_input_sol_Fractionalizer.json > $dir/tests/src/eth/fractionalizer/FractionalizerAbi.json
modifiedMakefilediffbeforeafterboth
--- a/Makefile
+++ b/Makefile
@@ -78,10 +78,7 @@
 	INPUT=$(COLLECTION_HELPER_STUBS)/$< OUTPUT=$(COLLECTION_HELPER_STUBS)/CollectionHelpers.raw ./.maintain/scripts/compile_stub.sh
 	INPUT=$(COLLECTION_HELPER_STUBS)/$< OUTPUT=$(COLLECTION_HELPER_ABI) ./.maintain/scripts/generate_abi.sh
 
-Fractionalizer:
-	./.maintain/scripts/compile_fractionalizer.sh
-
-evm_stubs: UniqueFungible UniqueNFT UniqueRefungible UniqueRefungibleToken ContractHelpers CollectionHelpers Fractionalizer
+evm_stubs: UniqueFungible UniqueNFT UniqueRefungible UniqueRefungibleToken ContractHelpers CollectionHelpers
 
 .PHONY: _bench
 _bench:
modifiedtests/src/eth/fractionalizer/fractionalizer.test.tsdiffbeforeafterboth
19import {ApiPromise} from '@polkadot/api';19import {ApiPromise} from '@polkadot/api';
20import {evmToAddress} from '@polkadot/util-crypto';20import {evmToAddress} from '@polkadot/util-crypto';
21import {readFile} from 'fs/promises';21import {readFile} from 'fs/promises';
22import fractionalizerAbi from './FractionalizerAbi.json';
23import {submitTransactionAsync} from '../../substrate/substrate-api';22import {submitTransactionAsync} from '../../substrate/substrate-api';
24import {UNIQUE} from '../../util/helpers';23import {UNIQUE} from '../../util/helpers';
25import {collectionIdToAddress, createEthAccountWithBalance, createNonfungibleCollection, createRefungibleCollection, GAS_ARGS, itWeb3, tokenIdFromAddress, uniqueNFT, uniqueRefungible, uniqueRefungibleToken} from '../util/helpers';24import {collectionIdToAddress, CompiledContract, createEthAccountWithBalance, createNonfungibleCollection, createRefungibleCollection, GAS_ARGS, itWeb3, tokenIdFromAddress, uniqueNFT, uniqueRefungible, uniqueRefungibleToken} from '../util/helpers';
26import {Contract} from 'web3-eth-contract';25import {Contract} from 'web3-eth-contract';
26import * as solc from 'solc';
2727
28import chai from 'chai';28import chai from 'chai';
29import chaiAsPromised from 'chai-as-promised';29import chaiAsPromised from 'chai-as-promised';
32chai.use(chaiAsPromised);32chai.use(chaiAsPromised);
33chai.use(chaiLike);33chai.use(chaiLike);
34const expect = chai.expect;34const expect = chai.expect;
35let fractionalizer: CompiledContract;
36
37async function compileFractionalizer() {
38 if (!fractionalizer) {
39 const input = {
40 language: 'Solidity',
41 sources: {
42 ['Fractionalizer.sol']: {
43 content: (await readFile(`${__dirname}/Fractionalizer.sol`)).toString(),
44 },
45 },
46 settings: {
47 outputSelection: {
48 '*': {
49 '*': ['*'],
50 },
51 },
52 },
53 };
54 const json = JSON.parse(solc.compile(JSON.stringify(input), {import: await findImports()}));
55 const out = json.contracts['Fractionalizer.sol']['Fractionalizer'];
56
57 fractionalizer = {
58 abi: out.abi,
59 object: '0x' + out.evm.bytecode.object,
60 };
61 }
62 return fractionalizer;
63}
64
65async function findImports() {
66 const collectionHelpers = (await readFile(`${__dirname}/../api/CollectionHelpers.sol`)).toString();
67 const contractHelpers = (await readFile(`${__dirname}/../api/ContractHelpers.sol`)).toString();
68 const uniqueRefungibleToken = (await readFile(`${__dirname}/../api/UniqueRefungibleToken.sol`)).toString();
69 const uniqueRefungible = (await readFile(`${__dirname}/../api/UniqueRefungible.sol`)).toString();
70 const uniqueNFT = (await readFile(`${__dirname}/../api/UniqueNFT.sol`)).toString();
71
72 return function(path: string) {
73 switch (path) {
74 case 'api/CollectionHelpers.sol': return {contents: `${collectionHelpers}`};
75 case 'api/ContractHelpers.sol': return {contents: `${contractHelpers}`};
76 case 'api/UniqueRefungibleToken.sol': return {contents: `${uniqueRefungibleToken}`};
77 case 'api/UniqueRefungible.sol': return {contents: `${uniqueRefungible}`};
78 case 'api/UniqueNFT.sol': return {contents: `${uniqueNFT}`};
79 default: return {error: 'File not found'};
80 }
81 };
82}
3583
36async function deployFractionalizer(api: ApiPromise, web3: Web3, owner: string) {84async function deployFractionalizer(web3: Web3, owner: string) {
85 const compiled = await compileFractionalizer();
37 const fractionalizerContract = new web3.eth.Contract(fractionalizerAbi as any, undefined, {86 const fractionalizerContract = new web3.eth.Contract(compiled.abi, undefined, {
87 data: compiled.object,
38 from: owner,88 from: owner,
39 ...GAS_ARGS,89 ...GAS_ARGS,
40 });90 });
41 return await fractionalizerContract.deploy({data: (await readFile(`${__dirname}/Fractionalizer.bin`)).toString()}).send({from: owner});91 return await fractionalizerContract.deploy({data: compiled.object}).send({from: owner});
42}92}
4393
44async function initFractionalizer(api: ApiPromise, web3: Web3, privateKeyWrapper: (account: string) => IKeyringPair, owner: string) {94async function initFractionalizer(api: ApiPromise, web3: Web3, privateKeyWrapper: (account: string) => IKeyringPair, owner: string) {
45 const fractionalizer = await deployFractionalizer(api, web3, owner);95 const fractionalizer = await deployFractionalizer(web3, owner);
46 const tx = api.tx.balances.transfer(evmToAddress(fractionalizer.options.address), 10n * UNIQUE);96 const tx = api.tx.balances.transfer(evmToAddress(fractionalizer.options.address), 10n * UNIQUE);
47 const alice = privateKeyWrapper('//Alice');97 const alice = privateKeyWrapper('//Alice');
48 await submitTransactionAsync(alice, tx);98 await submitTransactionAsync(alice, tx);
71describe('Fractionalizer contract usage', () => {121describe('Fractionalizer contract usage', () => {
72 itWeb3('Set RFT collection', async ({api, web3, privateKeyWrapper}) => {122 itWeb3('Set RFT collection', async ({api, web3, privateKeyWrapper}) => {
73 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);123 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
74 const fractionalizer = await deployFractionalizer(api, web3, owner);124 const fractionalizer = await deployFractionalizer(web3, owner);
75 const {collectionIdAddress} = await createRefungibleCollection(api, web3, owner);125 const {collectionIdAddress} = await createRefungibleCollection(api, web3, owner);
76 const refungibleContract = uniqueRefungible(web3, collectionIdAddress, owner);126 const refungibleContract = uniqueRefungible(web3, collectionIdAddress, owner);
77 await refungibleContract.methods.addCollectionAdmin(fractionalizer.options.address).send();127 await refungibleContract.methods.addCollectionAdmin(fractionalizer.options.address).send();
88 itWeb3('Mint RFT collection', async ({api, web3, privateKeyWrapper}) => {138 itWeb3('Mint RFT collection', async ({api, web3, privateKeyWrapper}) => {
89 const alice = privateKeyWrapper('//Alice');139 const alice = privateKeyWrapper('//Alice');
90 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);140 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
91 const fractionalizer = await deployFractionalizer(api, web3, owner);141 const fractionalizer = await deployFractionalizer(web3, owner);
92 const tx = api.tx.balances.transfer(evmToAddress(fractionalizer.options.address), 10n * UNIQUE);142 const tx = api.tx.balances.transfer(evmToAddress(fractionalizer.options.address), 10n * UNIQUE);
93 await submitTransactionAsync(alice, tx);143 await submitTransactionAsync(alice, tx);
94144
183 const {collectionIdAddress} = await createRefungibleCollection(api, web3, owner);233 const {collectionIdAddress} = await createRefungibleCollection(api, web3, owner);
184 const refungibleContract = uniqueRefungible(web3, collectionIdAddress, owner);234 const refungibleContract = uniqueRefungible(web3, collectionIdAddress, owner);
185235
186 const fractionalizer = await deployFractionalizer(api, web3, owner);236 const fractionalizer = await deployFractionalizer(web3, owner);
187 await refungibleContract.methods.addCollectionAdmin(fractionalizer.options.address).send();237 await refungibleContract.methods.addCollectionAdmin(fractionalizer.options.address).send();
188 await fractionalizer.methods.setRFTCollection(collectionIdAddress).send();238 await fractionalizer.methods.setRFTCollection(collectionIdAddress).send();
189239
196 const {collectionIdAddress} = await createNonfungibleCollection(api, web3, owner);246 const {collectionIdAddress} = await createNonfungibleCollection(api, web3, owner);
197 const nftContract = uniqueNFT(web3, collectionIdAddress, owner);247 const nftContract = uniqueNFT(web3, collectionIdAddress, owner);
198248
199 const fractionalizer = await deployFractionalizer(api, web3, owner);249 const fractionalizer = await deployFractionalizer(web3, owner);
200 await nftContract.methods.addCollectionAdmin(fractionalizer.options.address).send();250 await nftContract.methods.addCollectionAdmin(fractionalizer.options.address).send();
201251
202 await expect(fractionalizer.methods.setRFTCollection(collectionIdAddress).call())252 await expect(fractionalizer.methods.setRFTCollection(collectionIdAddress).call())
205255
206 itWeb3('call setRFTCollection while not collection admin', async ({api, web3, privateKeyWrapper}) => {256 itWeb3('call setRFTCollection while not collection admin', async ({api, web3, privateKeyWrapper}) => {
207 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);257 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
208 const fractionalizer = await deployFractionalizer(api, web3, owner);258 const fractionalizer = await deployFractionalizer(web3, owner);
209 const {collectionIdAddress} = await createRefungibleCollection(api, web3, owner);259 const {collectionIdAddress} = await createRefungibleCollection(api, web3, owner);
210260
211 await expect(fractionalizer.methods.setRFTCollection(collectionIdAddress).call())261 await expect(fractionalizer.methods.setRFTCollection(collectionIdAddress).call())
215 itWeb3('call setRFTCollection after createAndSetRFTCollection', async ({api, web3, privateKeyWrapper}) => {265 itWeb3('call setRFTCollection after createAndSetRFTCollection', async ({api, web3, privateKeyWrapper}) => {
216 const alice = privateKeyWrapper('//Alice');266 const alice = privateKeyWrapper('//Alice');
217 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);267 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
218 const fractionalizer = await deployFractionalizer(api, web3, owner);268 const fractionalizer = await deployFractionalizer(web3, owner);
219 const tx = api.tx.balances.transfer(evmToAddress(fractionalizer.options.address), 10n * UNIQUE);269 const tx = api.tx.balances.transfer(evmToAddress(fractionalizer.options.address), 10n * UNIQUE);
220 await submitTransactionAsync(alice, tx);270 await submitTransactionAsync(alice, tx);
221271
234 const nftTokenId = await nftContract.methods.nextTokenId().call();284 const nftTokenId = await nftContract.methods.nextTokenId().call();
235 await nftContract.methods.mint(owner, nftTokenId).send();285 await nftContract.methods.mint(owner, nftTokenId).send();
236286
237 const fractionalizer = await deployFractionalizer(api, web3, owner);287 const fractionalizer = await deployFractionalizer(web3, owner);
238288
239 await expect(fractionalizer.methods.nft2rft(nftCollectionAddress, nftTokenId, 100).call())289 await expect(fractionalizer.methods.nft2rft(nftCollectionAddress, nftTokenId, 100).call())
240 .to.eventually.be.rejectedWith(/RFT collection is not set$/g);290 .to.eventually.be.rejectedWith(/RFT collection is not set$/g);
291 itWeb3('call rft2nft without setting RFT collection for contract', async ({api, web3, privateKeyWrapper}) => {341 itWeb3('call rft2nft without setting RFT collection for contract', async ({api, web3, privateKeyWrapper}) => {
292 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);342 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
293343
294 const fractionalizer = await deployFractionalizer(api, web3, owner);344 const fractionalizer = await deployFractionalizer(web3, owner);
295 const {collectionIdAddress: rftCollectionAddress} = await createRefungibleCollection(api, web3, owner);345 const {collectionIdAddress: rftCollectionAddress} = await createRefungibleCollection(api, web3, owner);
296 const refungibleContract = uniqueRefungible(web3, rftCollectionAddress, owner);346 const refungibleContract = uniqueRefungible(web3, rftCollectionAddress, owner);
297 const rftTokenId = await refungibleContract.methods.nextTokenId().call();347 const rftTokenId = await refungibleContract.methods.nextTokenId().call();
318 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);368 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
319 const {collectionIdAddress: rftCollectionAddress} = await createRefungibleCollection(api, web3, owner);369 const {collectionIdAddress: rftCollectionAddress} = await createRefungibleCollection(api, web3, owner);
320370
321 const fractionalizer = await deployFractionalizer(api, web3, owner);371 const fractionalizer = await deployFractionalizer(web3, owner);
322 const refungibleContract = uniqueRefungible(web3, rftCollectionAddress, owner);372 const refungibleContract = uniqueRefungible(web3, rftCollectionAddress, owner);
323373
324 await refungibleContract.methods.addCollectionAdmin(fractionalizer.options.address).send();374 await refungibleContract.methods.addCollectionAdmin(fractionalizer.options.address).send();
modifiedtests/src/eth/util/helpers.tsdiffbeforeafterboth
--- a/tests/src/eth/util/helpers.ts
+++ b/tests/src/eth/util/helpers.ts
@@ -250,7 +250,12 @@
   return Web3.utils.toChecksumAddress(subToEthLowercase(eth));
 }
 
-export function compileContract(name: string, src: string) {
+export interface CompiledContract {
+  abi: any,
+  object: string,
+}
+
+export function compileContract(name: string, src: string) : CompiledContract {
   const out = JSON.parse(solc.compile(JSON.stringify({
     language: 'Solidity',
     sources: {