git.delta.rocks / unique-network / refs/commits / d49cd5a4dda8

difftreelog

source

tests/src/contracts.test.ts4.6 KiBsourcehistory
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          // here we have an additional field in the result, containing the blueprint23          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  // Find unused address47  const deployer = await findUnusedAddress(api);4849  // Transfer balance to it50  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      // 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 submitTransactionAsync(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});