difftreelog
chore compile fractionalizer in typescript
in: master
4 files changed
.maintain/scripts/compile_fractionalizer.shdiffbeforeafterbothno changes
Makefilediffbeforeafterboth78 INPUT=$(COLLECTION_HELPER_STUBS)/$< OUTPUT=$(COLLECTION_HELPER_STUBS)/CollectionHelpers.raw ./.maintain/scripts/compile_stub.sh78 INPUT=$(COLLECTION_HELPER_STUBS)/$< OUTPUT=$(COLLECTION_HELPER_STUBS)/CollectionHelpers.raw ./.maintain/scripts/compile_stub.sh79 INPUT=$(COLLECTION_HELPER_STUBS)/$< OUTPUT=$(COLLECTION_HELPER_ABI) ./.maintain/scripts/generate_abi.sh79 INPUT=$(COLLECTION_HELPER_STUBS)/$< OUTPUT=$(COLLECTION_HELPER_ABI) ./.maintain/scripts/generate_abi.sh8081Fractionalizer:82 ./.maintain/scripts/compile_fractionalizer.sh838084evm_stubs: UniqueFungible UniqueNFT UniqueRefungible UniqueRefungibleToken ContractHelpers CollectionHelpers Fractionalizer81evm_stubs: UniqueFungible UniqueNFT UniqueRefungible UniqueRefungibleToken ContractHelpers CollectionHelpers858286.PHONY: _bench83.PHONY: _bench87_bench:84_bench:tests/src/eth/fractionalizer/fractionalizer.test.tsdiffbeforeafterboth19import {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';272728import 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;3637async 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'];5657 fractionalizer = {58 abi: out.abi,59 object: '0x' + out.evm.bytecode.object,60 };61 }62 return fractionalizer;63}6465async 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();7172 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}358336async 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}439344async 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);94144183 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);185235186 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();189239196 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);198248199 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();201251202 await expect(fractionalizer.methods.setRFTCollection(collectionIdAddress).call())252 await expect(fractionalizer.methods.setRFTCollection(collectionIdAddress).call())205255206 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);210260211 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);221271234 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();236286237 const fractionalizer = await deployFractionalizer(api, web3, owner);287 const fractionalizer = await deployFractionalizer(web3, owner);238288239 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);293343294 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);320370321 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);323373324 await refungibleContract.methods.addCollectionAdmin(fractionalizer.options.address).send();374 await refungibleContract.methods.addCollectionAdmin(fractionalizer.options.address).send();tests/src/eth/util/helpers.tsdiffbeforeafterboth250 return Web3.utils.toChecksumAddress(subToEthLowercase(eth));250 return Web3.utils.toChecksumAddress(subToEthLowercase(eth));251}251}252253export interface CompiledContract {254 abi: any,255 object: string,256}252257253export function compileContract(name: string, src: string) {258export function compileContract(name: string, src: string) : CompiledContract {254 const out = JSON.parse(solc.compile(JSON.stringify({259 const out = JSON.parse(solc.compile(JSON.stringify({255 language: 'Solidity',260 language: 'Solidity',256 sources: {261 sources: {