1import { ApiPromise } from "@polkadot/api";2import { expect } from "chai";3import { default as usingApi, submitTransactionAsync } from "./substrate/substrate-api";4import fs from "fs";5import { Abi, BlueprintPromise, CodePromise } from "@polkadot/api-contract";6import { IKeyringPair } from "@polkadot/types/types";7import { Keyring } from "@polkadot/api";8import { ApiTypes, SubmittableExtrinsic } from "@polkadot/api/types";9import { BigNumber } from 'bignumber.js';10import { findUnusedAddress } from './util/helpers'1112const value = 0;13const gasLimit = 3000n * 1000000n;14const endowment = `1000000000000000`;1516function deployBlueprint(alice: IKeyringPair, code: CodePromise): Promise<BlueprintPromise> {17 return new Promise<BlueprintPromise>(async (resolve, reject) => {18 const unsub = await code19 .createBlueprint()20 .signAndSend(alice, (result) => {21 if (result.status.isInBlock || result.status.isFinalized) {22 23 resolve(result.blueprint);24 unsub();25 }26 })27 });28}2930function deployContract(alice: IKeyringPair, blueprint: BlueprintPromise) : Promise<any> {31 return new Promise<any>(async (resolve, reject) => {32 const initValue = true;3334 const unsub = await blueprint.tx35 .new(endowment, gasLimit, initValue)36 .signAndSend(alice, (result) => {37 if (result.status.isInBlock || result.status.isFinalized) {38 unsub();39 resolve(result);40 }41 }); 42 });43}4445async function prepareDeployer(api: ApiPromise) {46 47 const deployer = await findUnusedAddress(api);4849 50 const keyring = new Keyring({ type: 'sr25519' });51 const alice = keyring.addFromUri(`//Alice`);52 let amount = new BigNumber(endowment);53 amount = amount.plus(1e15);54 const tx = api.tx.balances.transfer(deployer.address, amount.toFixed());55 await submitTransactionAsync(alice, tx);5657 return deployer;58}5960describe('Contracts smoke test', () => {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 deployer = await prepareDeployer(api);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(deployer, code);73 const contract = (await deployContract(deployer, blueprint))['contract'];7475 const getFlipValue = async () => {76 const result = await contract.query.get(deployer.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 submitTransactionAsync(deployer, 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 99 100 101102 103 104105 106107 108109 110 111 112 113114 115 116117 118119 120 121 });122 })123});