difftreelog
initialize contract by metadata test
in: master
1 file changed
tests/src/contracts.test.tsdiffbeforeafterboth1import { expect } from "chai";2import usingApi from "./substrate/substrate-api";3import fs from "fs";4import { Abi, BlueprintPromise, CodePromise } from "@polkadot/api-contract";5import { IKeyringPair } from "@polkadot/types/types";6import { Keyring } from "@polkadot/api";7import { ApiTypes, SubmittableExtrinsic } from "@polkadot/api/types";89const value = 0;10const gasLimit = 3000n * 1000000n;1112function deployBlueprint(alice: IKeyringPair, code: CodePromise): Promise<BlueprintPromise> {13 return new Promise<BlueprintPromise>(async (resolve, reject) => {14 const unsub = await code15 .createBlueprint()16 .signAndSend(alice, (result) => {17 if (result.status.isInBlock || result.status.isFinalized) {18 // here we have an additional field in the result, containing the blueprint19 resolve(result.blueprint);20 unsub();21 }22 })23 });24}2526function deployContract(alice: IKeyringPair, blueprint: BlueprintPromise) : Promise<any> {27 return new Promise<any>(async (resolve, reject) => {28 const endowment = 1000000000000000n;29 const initValue = true;3031 const unsub = await blueprint.tx32 .new(endowment, gasLimit, initValue)33 .signAndSend(alice, (result) => {34 if (result.status.isInBlock || result.status.isFinalized) {35 unsub();36 resolve(result);37 }38 }); 39 });40}4142function runTransaction(privateKey: IKeyringPair, extrinsic: SubmittableExtrinsic<ApiTypes>) {43 return new Promise<void>(async (resolve, reject) => {44 extrinsic.signAndSend(privateKey, async result => {45 if(!result.isInBlock) {46 return;47 }4849 if(result.findRecord('system', 'ExtrinsicSuccess')) {50 resolve();51 }52 else {53 reject('Failed to flip value.');54 }55 })56 });57}5859describe('Contracts', () => {60 it(`Can deploy smart contract Flipper, instantiate it and call it's get and flip messages.`, async () => {61 await usingApi(async api => {62 const keyring = new Keyring({ type: 'sr25519' });63 const alice = keyring.addFromUri("//Alice");64 65 const wasm = fs.readFileSync('./src/flipper/flipper.wasm');66 67 const metadata = JSON.parse(fs.readFileSync('./src/flipper/metadata.json').toString('utf-8'));68 const abi = new Abi(metadata);6970 const code = new CodePromise(api, abi, wasm);7172 const blueprint = await deployBlueprint(alice, code);73 const contract = (await deployContract(alice, blueprint))['contract'];7475 const getFlipValue = async () => {76 const result = await contract.query.get(alice.address, value, gasLimit);7778 if(!result.result.isSuccess) {79 throw `Failed to get flipper value`;80 }81 return (result.result.asSuccess.data[0] == 0x00) ? false : true;82 }8384 const initialGetResponse = await getFlipValue();85 expect(initialGetResponse).to.be.true;8687 const flip = contract.exec('flip', value, gasLimit);88 await runTransaction(alice, flip);8990 const afterFlipGetResponse = await getFlipValue();9192 expect(afterFlipGetResponse).to.be.false;93 });94 });9596 it.skip('Can transfer balance using smart contract.', async () => {97 await usingApi(async api => {98 // const [alicesBalanceBefore, bobsBalanceBefore] = await getBalance(api, [alicesPublicKey, bobsPublicKey]);99 // const wasm = fs.readFileSync('./src/balance-transfer-contract/calls.wasm');100 // const contract = compactAddLength(u8aToU8a(wasm));101102 // const metadata = JSON.parse(fs.readFileSync('./src/balance-transfer-contract/metadata.json').toString('utf-8'));103 // const abi = new Abi(api.registry as any, metadata);104105 // const alicesPrivateKey = privateKey('//Alice');106107 // const contractHash = await deployContract(api, contract, alicesPrivateKey);108109 // // const args = abi.constructors[0]();110 // const instanceAccountId = await instantiateContract(api, contractHash, /*args,*/ alicesPrivateKey);111 // const contractInstance = new ContractPromise(api, abi, instanceAccountId);112 // const bob = new GenericAccountId(api.registry, bobsPublicKey);113114 // const transfer = contractInstance.exec('balance_transfer', 0, 1000000000000n, [bob, new u128(api.registry, 1000000)]);115 // await runTransaction(alicesPrivateKey, transfer);116117 // const [alicesBalanceAfter, bobsBalanceAfter] = await getBalance(api, [alicesPublicKey, bobsPublicKey]);118119 // expect(alicesBalanceAfter < alicesBalanceBefore).to.be.true;120 // expect(bobsBalanceAfter > bobsBalanceBefore).to.be.true;121 });122 })123});1import { expect } from "chai";2import usingApi from "./substrate/substrate-api";3import fs from "fs";4import { Abi, BlueprintPromise, CodePromise, ContractPromise } from "@polkadot/api-contract";5import { IKeyringPair } from "@polkadot/types/types";6import { Keyring } from "@polkadot/api";7import { ApiTypes, SubmittableExtrinsic } from "@polkadot/api/types";89const value = 0;10const gasLimit = 3000n * 1000000n;11const marketContractAddress = '5CYN9j3YvRkqxewoxeSvRbhAym4465C57uMmX5j4yz99L5H6';1213function deployBlueprint(alice: IKeyringPair, code: CodePromise): Promise<BlueprintPromise> {14 return new Promise<BlueprintPromise>(async (resolve, reject) => {15 const unsub = await code16 .createBlueprint()17 .signAndSend(alice, (result) => {18 if (result.status.isInBlock || result.status.isFinalized) {19 // here we have an additional field in the result, containing the blueprint20 resolve(result.blueprint);21 unsub();22 }23 })24 });25}2627function deployContract(alice: IKeyringPair, blueprint: BlueprintPromise) : Promise<any> {28 return new Promise<any>(async (resolve, reject) => {29 const endowment = 1000000000000000n;30 const initValue = true;3132 const unsub = await blueprint.tx33 .new(endowment, gasLimit, initValue)34 .signAndSend(alice, (result) => {35 if (result.status.isInBlock || result.status.isFinalized) {36 unsub();37 resolve(result);38 }39 }); 40 });41}4243function runTransaction(privateKey: IKeyringPair, extrinsic: SubmittableExtrinsic<ApiTypes>) {44 return new Promise<void>(async (resolve, reject) => {45 extrinsic.signAndSend(privateKey, async result => {46 if(!result.isInBlock) {47 return;48 }4950 if(result.findRecord('system', 'ExtrinsicSuccess')) {51 resolve();52 }53 else {54 reject('Failed to flip value.');55 }56 })57 });58}5960describe('Contracts', () => {61 it(`Can deploy smart contract Flipper, instantiate it and call it's get and flip messages.`, async () => {62 await usingApi(async api => {63 const keyring = new Keyring({ type: 'sr25519' });64 const alice = keyring.addFromUri("//Alice");65 66 const wasm = fs.readFileSync('./src/flipper/flipper.wasm');67 68 const metadata = JSON.parse(fs.readFileSync('./src/flipper/metadata.json').toString('utf-8'));69 const abi = new Abi(metadata);7071 const code = new CodePromise(api, abi, wasm);7273 const blueprint = await deployBlueprint(alice, code);74 const contract = (await deployContract(alice, blueprint))['contract'];7576 const getFlipValue = async () => {77 const result = await contract.query.get(alice.address, value, gasLimit);7879 if(!result.result.isSuccess) {80 throw `Failed to get flipper value`;81 }82 return (result.result.asSuccess.data[0] == 0x00) ? false : true;83 }8485 const initialGetResponse = await getFlipValue();86 expect(initialGetResponse).to.be.true;8788 const flip = contract.exec('flip', value, gasLimit);89 await runTransaction(alice, flip);9091 const afterFlipGetResponse = await getFlipValue();9293 expect(afterFlipGetResponse).to.be.false;94 });95 });9697 it('Can initialize contract instance', async () => {98 await usingApi(async (api) => {99 const metadata = JSON.parse(fs.readFileSync('./src/flipper/metadata.json').toString('utf-8'));100 const abi = new Abi(metadata);101 const newContractInstance = new ContractPromise(api, abi, marketContractAddress);102 expect(newContractInstance).to.have.property('address');103 expect(newContractInstance.address.toString()).to.equal(marketContractAddress);104 });105 });106107 it.skip('Can transfer balance using smart contract.', async () => {108 await usingApi(async api => {109 // const [alicesBalanceBefore, bobsBalanceBefore] = await getBalance(api, [alicesPublicKey, bobsPublicKey]);110 // const wasm = fs.readFileSync('./src/balance-transfer-contract/calls.wasm');111 // const contract = compactAddLength(u8aToU8a(wasm));112113 // const metadata = JSON.parse(fs.readFileSync('./src/balance-transfer-contract/metadata.json').toString('utf-8'));114 // const abi = new Abi(api.registry as any, metadata);115116 // const alicesPrivateKey = privateKey('//Alice');117118 // const contractHash = await deployContract(api, contract, alicesPrivateKey);119120 // // const args = abi.constructors[0]();121 // const instanceAccountId = await instantiateContract(api, contractHash, /*args,*/ alicesPrivateKey);122 // const contractInstance = new ContractPromise(api, abi, instanceAccountId);123 // const bob = new GenericAccountId(api.registry, bobsPublicKey);124125 // const transfer = contractInstance.exec('balance_transfer', 0, 1000000000000n, [bob, new u128(api.registry, 1000000)]);126 // await runTransaction(alicesPrivateKey, transfer);127128 // const [alicesBalanceAfter, bobsBalanceAfter] = await getBalance(api, [alicesPublicKey, bobsPublicKey]);129130 // expect(alicesBalanceAfter < alicesBalanceBefore).to.be.true;131 // expect(bobsBalanceAfter > bobsBalanceBefore).to.be.true;132 });133 })134});