UNPKG

@unilogin/sdk

Version:

SDK is a JS library, that communicates with relayer. SDK allows managing contract, by creating basic contract-calling messages.

150 lines (137 loc) 6.03 kB
import {createKeyPair, TEST_EXECUTION_OPTIONS, KeyPair} from '@unilogin/commons'; import {BlockchainService} from '@unilogin/contracts'; import {RelayerUnderTest} from '@unilogin/relayer'; import chai, {expect} from 'chai'; import {createMockProvider, getWallets, solidity} from 'ethereum-waffle'; import sinon from 'sinon'; import sinonChai from 'sinon-chai'; import UniLoginSdk, {DeployedWallet, WalletEventFilter} from '../../../src'; import WalletEventsObserverFactory from '../../../src/core/observers/WalletEventsObserverFactory'; import {createdDeployedWallet} from '../../helpers/createDeployedWallet'; import {setupSdk} from '../../helpers/setupSdk'; import {BlockNumberState} from '../../../src/core/states/BlockNumberState'; import {setupWalletContract, mineBlock} from '@unilogin/contracts/testutils'; import {Contract} from 'ethers'; import {waitExpect} from '@unilogin/commons/testutils'; chai.use(solidity); chai.use(sinonChai); describe('INT: WalletEventsObserverFactory', () => { const provider = createMockProvider(); const [deployer] = getWallets(provider); const {publicKey} = createKeyPair(); let relayer: RelayerUnderTest; let sdk: UniLoginSdk; let deployedWallet: DeployedWallet; let filter: WalletEventFilter; let factory: WalletEventsObserverFactory; let proxyWallet: Contract; let keyPair: KeyPair; describe('beta2', () => { before(async () => { ({relayer, sdk} = await setupSdk(deployer)); const blockchainService = new BlockchainService(sdk.provider); const blockNumberState = new BlockNumberState(blockchainService); factory = new WalletEventsObserverFactory( blockchainService, blockNumberState, ); await factory.start(); ({proxyWallet, keyPair} = await setupWalletContract(deployer)); deployedWallet = new DeployedWallet(proxyWallet.address, '', keyPair.privateKey, sdk); filter = { contractAddress: deployedWallet.contractAddress, key: publicKey, }; }); it('subscribe to KeyAdded', async () => { const callback = sinon.spy(); const unsubscribe = factory.subscribe('KeyAdded', filter, callback); await deployedWallet.addKey(publicKey, TEST_EXECUTION_OPTIONS); await waitExpect(() => expect(callback).to.have.been.calledOnce); expect(callback).to.have.been.calledOnceWith({key: publicKey}); unsubscribe(); }); it('subscribe to KeyRemoved', async () => { const callbackRemove = sinon.spy(); const unsubscribe = factory.subscribe('KeyRemoved', filter, callbackRemove); const execution = await deployedWallet.removeKey(publicKey, TEST_EXECUTION_OPTIONS); await execution.waitToBeSuccess(); await waitExpect(() => expect(callbackRemove).to.have.been.calledOnce); expect(callbackRemove).to.have.been.calledWith({key: publicKey}); unsubscribe(); }); it('callback is called after factory is restarted', async () => { const callback = sinon.spy(); let unsubscribe = factory.subscribe('KeyAdded', filter, callback); const execution = await deployedWallet.addKey(publicKey, TEST_EXECUTION_OPTIONS); factory.stop(); unsubscribe(); await execution.waitToBeSuccess(); await mineBlock(deployer); await factory.start(); unsubscribe = factory.subscribe('KeyAdded', filter, callback); await mineBlock(deployer); await waitExpect(() => expect(callback).to.have.been.calledOnce); expect(callback).to.have.been.calledOnceWith({key: publicKey}); unsubscribe(); }); after(async () => { await relayer.stop(); factory.stop(); }); }); describe('beta3', () => { before(async () => { ({relayer, sdk} = await setupSdk(deployer)); const blockchainService = new BlockchainService(sdk.provider); const blockNumberState = new BlockNumberState(blockchainService); factory = new WalletEventsObserverFactory( blockchainService, blockNumberState, ); await factory.start(); deployedWallet = await createdDeployedWallet('alex.mylogin.eth', sdk, deployer); filter = { contractAddress: deployedWallet.contractAddress, key: publicKey, }; }); it('subscribe to KeyAdded', async () => { const callbackGnosis = sinon.spy(); const unsubscribe = factory.subscribe('AddedOwner', filter, callbackGnosis); const {waitToBeSuccess} = await deployedWallet.addKey(publicKey, TEST_EXECUTION_OPTIONS); await waitToBeSuccess(); await waitExpect(() => expect(callbackGnosis).to.have.been.calledOnce); expect(callbackGnosis).to.have.been.calledWith({key: publicKey}); unsubscribe(); }); it('subscribe to RemovedOwner', async () => { const callbackRemoveGnosis = sinon.spy(); const unsubscribe = factory.subscribe('RemovedOwner', filter, callbackRemoveGnosis); const execution = await deployedWallet.removeKey(publicKey, TEST_EXECUTION_OPTIONS); await execution.waitToBeSuccess(); await waitExpect(() => expect(callbackRemoveGnosis).to.have.been.calledOnce); expect(callbackRemoveGnosis).to.have.been.calledWith({key: publicKey}); unsubscribe(); }); it('callback is called after factory is restarted', async () => { const callback = sinon.spy(); let unsubscribe = factory.subscribe('AddedOwner', filter, callback); const execution = await deployedWallet.addKey(publicKey, TEST_EXECUTION_OPTIONS); factory.stop(); unsubscribe(); await execution.waitToBeSuccess(); await mineBlock(deployer); await factory.start(); unsubscribe = factory.subscribe('AddedOwner', filter, callback); await mineBlock(deployer); await waitExpect(() => expect(callback).to.have.been.calledOnce); expect(callback).to.have.been.calledOnceWith({key: publicKey}); unsubscribe(); }); after(async () => { await relayer.stop(); factory.stop(); }); }); });