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

difftreelog

source

tests/src/contracts.test.ts4.5 KiBsourcehistory
1import { 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});