Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { describe, expect, expectTypeOf, it } from 'vitest';
import { devPairs } from '../utils.js';
import { devPairs } from '../shared';

describe('basic client operations', () => {
it('should get current block number', async () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { describe, expect, it } from 'vitest';
import { renderHook, waitFor } from '@testing-library/react';
import { useBalance, useBalances } from 'typink';
import { ALICE, BOB, CHARLIE, wrapper } from '../../utils';
import { wrapper } from './utils';
import { ALICE, BOB, CHARLIE } from '../shared';

describe('useBalance', () => {
it('should load balance properly', async () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,9 @@
import { beforeAll, describe, expect, it } from 'vitest';
import {
ALICE,
BOB,
ContractId,
deployFlipperContract,
flipperMetadata,
newDeployment,
wrapperFn,
} from '../../utils.js';
import { ContractId, deployFlipperContract, flipperMetadata, newDeployment, wrapperFn } from './utils.js';
import { numberToHex } from 'dedot/utils';
import { ALICE, BOB } from '../shared';
import { Contract } from 'dedot/contracts';
import { FlipperContractApi } from '../../contracts/flipper';
import { FlipperContractApi } from './contracts/flipper';
import { renderHook, waitFor } from '@testing-library/react';
import { useContract } from 'typink';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { beforeAll, describe, expect, it } from 'vitest';
import { ALICE, BOB, CHARLIE, deployPsp22Contract, psp22Metadata, wrapper } from '../../utils.js';
import { deployPsp22Contract, psp22Metadata, wrapper } from './utils.js';
import { ALICE, BOB, CHARLIE } from '../shared';
import { numberToHex } from 'dedot/utils';
import { renderHook, waitFor } from '@testing-library/react';
import { useContractQuery, useContractTx, useRawContract } from 'typink';
import { Contract } from 'dedot/contracts';
import { Psp22ContractApi } from '../../contracts/psp22';
import { Psp22ContractApi } from './contracts/psp22';

describe('useContractQuery', () => {
let contractAddress: string, contract: Contract<Psp22ContractApi>;
Expand Down Expand Up @@ -44,61 +45,61 @@ describe('useContractQuery', () => {
});
});

// it('should automatically call refresh on new block when watch is enabled', async () => {
// const { result: rawContract } = renderHook(() => useRawContract<Psp22ContractApi>(psp22Metadata, contractAddress), {
// wrapper,
// });
//
// await waitFor(() => {
// expect(rawContract.current.contract).toBeDefined();
// expect(rawContract.current.contract?.client.options.signer).toBeDefined();
// });
//
// const contract = rawContract.current.contract;
//
// const { result: balanceOf } = renderHook(
// () => useContractQuery({ contract, fn: 'psp22BalanceOf', args: [ALICE], watch: true }),
// {
// wrapper,
// },
// );
//
// await waitFor(() => {
// expect(balanceOf.current.data).toBeDefined();
// });
//
// const beforeTranfer = balanceOf.current.data!;
// console.log('Before transfer:', beforeTranfer);
//
// const { result: transfer } = renderHook(
// () => useContractTx(contract, 'psp22Transfer'), // prettier-end-here
// {
// wrapper,
// },
// );
//
// await new Promise<void>((resolve) => {
// transfer.current.signAndSend({
// args: [BOB, BigInt(1e12), '0x'],
// callback: ({ status }) => {
// if (status.type === 'Finalized') {
// resolve();
// }
// },
// });
// });
// console.log('Transfer completed!');
//
// await waitFor(
// () => {
// expect(balanceOf.current.data).toBeDefined();
// expect(balanceOf.current.data).toEqual(beforeTranfer - BigInt(1e12));
// },
// { timeout: 12000 },
// );
//
// console.log('After transfer:', balanceOf.current.data);
// });
it('should automatically call refresh on new block when watch is enabled', async () => {
const { result: rawContract } = renderHook(() => useRawContract<Psp22ContractApi>(psp22Metadata, contractAddress), {
wrapper,
});

await waitFor(() => {
expect(rawContract.current.contract).toBeDefined();
expect(rawContract.current.contract?.client.options.signer).toBeDefined();
});

const contract = rawContract.current.contract;

const { result: balanceOf } = renderHook(
() => useContractQuery({ contract, fn: 'psp22BalanceOf', args: [ALICE], watch: true }),
{
wrapper,
},
);

await waitFor(() => {
expect(balanceOf.current.data).toBeDefined();
});

const beforeTranfer = balanceOf.current.data!;
console.log('Before transfer:', beforeTranfer);

const { result: transfer } = renderHook(
() => useContractTx(contract, 'psp22Transfer'), // prettier-end-here
{
wrapper,
},
);

await new Promise<void>((resolve) => {
transfer.current.signAndSend({
args: [BOB, BigInt(1e12), '0x'],
callback: ({ status }) => {
if (status.type === 'Finalized') {
resolve();
}
},
});
});
console.log('Transfer completed!');

await waitFor(
() => {
expect(balanceOf.current.data).toBeDefined();
expect(balanceOf.current.data).toEqual(beforeTranfer - BigInt(1e12));
},
{ timeout: 12000 },
);

console.log('After transfer:', balanceOf.current.data);
});

it('should fail dry-run', async () => {
const { result } = renderHook(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { beforeAll, describe, expect, it } from 'vitest';
import { BOB, deployPsp22Contract, flipperMetadata, psp22Metadata, wrapper } from '../../utils.js';
import { deployPsp22Contract, flipperMetadata, psp22Metadata, wrapper } from './utils.js';
import { BOB } from '../shared';
import { numberToHex } from 'dedot/utils';
import { renderHook, waitFor } from '@testing-library/react';
import { useContractTx, useRawContract } from 'typink';
import { Psp22ContractApi } from '../../contracts/psp22';
import { FlipperContractApi } from '../../contracts/flipper';
import { Psp22ContractApi } from './contracts/psp22';
import { FlipperContractApi } from './contracts/flipper';

describe('useContractTx', () => {
let contractAddress: string;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { describe, expect, it } from 'vitest';
import { renderHook, waitFor } from '@testing-library/react';
import { useDeployer } from 'typink';
import { ALICE, BOB, flipperMetadata, wrapper } from '../../utils.js';
import { FlipperContractApi } from '../../contracts/flipper';
import { flipperMetadata, wrapper } from './utils.js';
import { ALICE, BOB } from '../shared';
import { FlipperContractApi } from './contracts/flipper';

describe('useDeployer', () => {
it('should load deployer properly', async () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { describe, expect, it } from 'vitest';
import { renderHook, waitFor } from '@testing-library/react';
import { useDeployer, useDeployerTx } from 'typink';
import { flipperMetadata, wrapper } from '../../utils.js';
import { FlipperContractApi } from '../../contracts/flipper';
import { flipperMetadata, wrapper } from './utils.js';
import { FlipperContractApi } from './contracts/flipper';
import { numberToHex } from 'dedot/utils';

describe('useDeployerTx', () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { beforeAll, describe, expect, it } from 'vitest';
import { ALICE, BOB, deployPsp22Contract, devPairs, mintPSP22Balance, psp22Metadata, wrapper } from '../../utils.js';
import { deployPsp22Contract, mintPSP22Balance, psp22Metadata, wrapper } from './utils.js';
import { ALICE, BOB, devPairs } from '../shared';
import { numberToHex } from 'dedot/utils';
import { Contract } from 'dedot/contracts';
import { Psp22ContractApi } from '../../contracts/psp22';
import { Psp22ContractApi } from './contracts/psp22';
import { renderHook, waitFor } from '@testing-library/react';
import { usePSP22Balance } from 'typink';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { beforeAll, describe, expect, it } from 'vitest';
import { deployPsp22Contract, psp22Metadata, wrapper } from '../../utils.js';
import { deployPsp22Contract, psp22Metadata, wrapper } from './utils.js';
import { numberToHex } from 'dedot/utils';
import { renderHook, waitFor } from '@testing-library/react';
import { useRawContract } from 'typink';
import { Psp22ContractApi } from '../../contracts/psp22';
import { Psp22ContractApi } from './contracts/psp22';

describe('useRawContract', () => {
let contractAddress: string;
Expand Down
45 changes: 2 additions & 43 deletions e2e/nodes/src/utils.tsx → e2e/nodes/src/legacy/utils.tsx
Original file line number Diff line number Diff line change
@@ -1,42 +1,19 @@
import Keyring from '@polkadot/keyring';
import { KeyringPair } from '@polkadot/keyring/types';
import { cryptoWaitReady } from '@polkadot/util-crypto';
import { Contract, ContractAddress, ContractDeployer } from 'dedot/contracts';
import { assert, deferred, generateRandomHex } from 'dedot/utils';
import { FlipperContractApi } from './contracts/flipper';
import flipperV5 from './contracts/flipper_v5.json';
import flipperV6 from './contracts/flipper_v6.json';
import {
ContractDeployment,
development,
InjectedSigner,
JsonRpcApi,
Props,
SignerPayloadJSON,
TypinkProvider,
} from 'typink';
import { ContractDeployment, development, JsonRpcApi, Props, TypinkProvider } from 'typink';
import { Psp22ContractApi } from './contracts/psp22/index.js';
import psp22Metadata from './contracts/psp22.json';
import { TypeRegistry } from '@polkadot/types';

await cryptoWaitReady();
export const KEYRING = new Keyring({ type: 'sr25519' });
import { ALICE, devPairs, mockSigner } from '../shared';

export const flipperV5Metadata = flipperV5;
export const flipperMetadata = flipperV5Metadata;
export const flipperV6Metadata = flipperV6;
export { psp22Metadata };

export const ALICE = '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY';
export const BOB = '5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty';
export const CHARLIE = '5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y';

export const devPairs = () => {
const alice = KEYRING.addFromUri('//Alice');
const bob = KEYRING.addFromUri('//Bob');
return { alice, bob };
};

export const deployFlipperV5 = async (signer: KeyringPair): Promise<ContractAddress> => {
const deployer = new ContractDeployer<FlipperContractApi>(
contractsClient, // prettier-end-here
Expand Down Expand Up @@ -71,24 +48,6 @@ export const deployFlipperV6 = async (signer: KeyringPair): Promise<ContractAddr
return await txResult.contractAddress();
};

export const mockSigner = {
signPayload: async (payloadJSON: SignerPayloadJSON) => {
const { alice } = devPairs();

const registry = new TypeRegistry();
registry.setSignedExtensions(payloadJSON.signedExtensions);

// https://github.com/polkadot-js/extension/blob/master/packages/extension-base/src/background/RequestExtrinsicSign.ts#L18-L22
const payload = registry.createType('ExtrinsicPayload', payloadJSON, { version: payloadJSON.version });
const result = payload.sign(alice);

return {
id: Date.now(),
...result,
};
},
} as InjectedSigner;

export const Wrapper = ({ children, deployments = [] }: Props) => (
<TypinkProvider
supportedNetworks={[{ ...development, jsonRpcApi: JsonRpcApi.LEGACY }]}
Expand Down
16 changes: 8 additions & 8 deletions e2e/nodes/src/setup.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { DedotClient, LegacyClient, WsProvider } from 'dedot';
import { afterAll, beforeAll } from 'vitest';
import { devPairs } from './utils';
import { devPairs } from './shared';
import { mapAccount } from './v6/utils';

const CONTRACTS_NODE_ENDPOINT = 'ws://127.0.0.1:9944';
const INK_NODE_ENDPOINT = 'ws://127.0.0.1:9955';
export const CONTRACTS_NODE_ENDPOINT = 'ws://127.0.0.1:9944';
export const INK_NODE_ENDPOINT = 'ws://127.0.0.1:9955';

beforeAll(async () => {
console.log(`Connect to ${CONTRACTS_NODE_ENDPOINT}`);
Expand All @@ -12,12 +13,11 @@ beforeAll(async () => {
console.log(`Connect to ${INK_NODE_ENDPOINT}`);
global.reviveClient = await DedotClient.new(new WsProvider(INK_NODE_ENDPOINT));

const alice = devPairs().alice;
const { alice, bob, charlie } = devPairs();

await reviveClient.tx.revive
.mapAccount() // --
.signAndSend(alice)
.untilFinalized();
await mapAccount(alice);
await mapAccount(bob);
await mapAccount(charlie);
}, 120_000);

afterAll(async () => {
Expand Down
36 changes: 36 additions & 0 deletions e2e/nodes/src/shared.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { cryptoWaitReady } from '@polkadot/util-crypto';
import Keyring from '@polkadot/keyring';
import { InjectedSigner, SignerPayloadJSON } from 'typink';
import { TypeRegistry } from '@polkadot/types';

await cryptoWaitReady();
export const KEYRING = new Keyring({ type: 'sr25519' });

export const ALICE = '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY';
export const BOB = '5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty';
export const CHARLIE = '5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y';

export const devPairs = () => {
const alice = KEYRING.addFromUri('//Alice');
const bob = KEYRING.addFromUri('//Bob');
const charlie = KEYRING.addFromUri('//Charlie');
return { alice, bob, charlie };
};

export const mockSigner = {
signPayload: async (payloadJSON: SignerPayloadJSON) => {
const { alice } = devPairs();

const registry = new TypeRegistry();
registry.setSignedExtensions(payloadJSON.signedExtensions);

// https://github.com/polkadot-js/extension/blob/master/packages/extension-base/src/background/RequestExtrinsicSign.ts#L18-L22
const payload = registry.createType('ExtrinsicPayload', payloadJSON, { version: payloadJSON.version });
const result = payload.sign(alice);

return {
id: Date.now(),
...result,
};
},
} as InjectedSigner;
19 changes: 19 additions & 0 deletions e2e/nodes/src/v6/basic.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { describe, expect, expectTypeOf, it } from 'vitest';
import { devPairs } from '../shared';

describe('basic client operations', () => {
it('should get current block number', async () => {
const blockNumber = await reviveClient.query.system.number();
console.log('Current block number:', blockNumber);
expectTypeOf(blockNumber).toBeNumber();
});

it('should fetch account balance', async () => {
const { alice } = devPairs();
const account = await reviveClient.query.system.account(alice.address);

console.log('Account balance:', account);

expect(account.data.free).toBeGreaterThan(0n);
});
});
Loading