UNPKG

@ixily/activ

Version:

Alpha Capture Trade Idea Verification. Blockchain ownership proven trade ideas and strategies.

359 lines (357 loc) 14.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ContractModule = void 0; const rxjs_1 = require("rxjs"); const log_module_1 = require("../../modules/chunks/log.module"); const __1 = require("../.."); const blockchain_network_i_1 = require("../../interfaces/chunks/blockchain-network.i"); const state = { blockchainNetworks: new Map(), selectedBlockchainNetwork: undefined, selectedContract: undefined, chainId: 0, gateContract: undefined, viewsContract: undefined, updated$: new rxjs_1.BehaviorSubject(false), recordCreds: undefined, browserRecordedWallets: [], browserSelectedWallet: undefined, accountsChangedListener: undefined, remover: undefined, }; const getUpdatedStream = () => { return state.updated$; }; const changeToContract = async (blockchainNetwork, contractName, details) => { if (details !== undefined) { state.recordCreds = details; } if (details === undefined && state.recordCreds !== undefined) { details = state.recordCreds; } if (details === undefined) { throw new Error('Contract Module Error: Details is undefined. You must provide details on how to build contract by the first time you call it.'); } if (details?.userWalletPrivateKey === undefined && details?.webProvider === undefined) { throw new Error('Contract Module Error: You must provide either a web provider or a private key'); } const bn = (await (0, __1.SUPPORTED_BLOCKCHAIN_NETWORKS)())[blockchainNetwork]; if ((0, __1.isNullOrUndefined)(bn)) { throw new Error(`Blockchain network ${blockchainNetwork} not found`); } if (typeof contractName === 'string') { if ((0, __1.isNullOrUndefined)(bn.contracts[contractName])) { throw new Error(`Contract ${contractName} not found`); } } let alreadyContract = state.blockchainNetworks.get(blockchainNetwork); if ((0, __1.isNullOrUndefined)(alreadyContract)) { state.blockchainNetworks.set(blockchainNetwork, bn); alreadyContract = state.blockchainNetworks.get(blockchainNetwork); } let contract; if (typeof contractName === 'string') { contract = alreadyContract.contracts[contractName]; } else { alreadyContract.contracts[contractName.nameOrVersion] = { name: contractName.nameOrVersion, recipe: contractName, gate: undefined, cacheTax5min: undefined, cacheTaxLastTime: undefined, }; contract = alreadyContract.contracts[contractName.nameOrVersion]; } const { gateContract } = await build(contract.recipe, details.userWalletPrivateKey, details.webProvider); contract.gate = gateContract; // contract.core = coreContract state.selectedBlockchainNetwork = blockchainNetwork; state.selectedContract = typeof contractName === 'string' ? contractName : contractName.nameOrVersion; state.browserRecordedWallets = []; state.browserSelectedWallet = undefined; state.updated$.next(true); return contract; }; const buildContract = async (chain, contractAddress, abi, webProvider, providerUrl, userWalletPrivateKey) => { let contract = undefined; // in this context we have a user wallet connected via web3 provider if (!(0, __1.isNullOrUndefined)(webProvider)) { // console.log('chain:') // console.log(chain) state.chainId = (0, __1.CHAIN_IDS)(chain); /* if (chain === 'hardhat') { // console.log('hardhatDemoWalletToUse:') // console.log(hardhatDemoWalletToUse) const provider = new ethers.providers.JsonRpcProvider(providerUrl) const wallet = new ethers.Wallet( userWalletPrivateKey as string, provider, ) // when the user open activ from browser but the user have not installed the wallet we need to use the provider directly instead of the signer try { const signer = wallet.connect(provider) contract = new ethers.Contract(contractAddress, abi, signer) } catch (error) { contract = new ethers.Contract(contractAddress, abi, provider) } } else { */ if ((0, __1.isNullOrUndefined)(userWalletPrivateKey)) { try { const provider = new __1.ethers.providers.Web3Provider(webProvider, (0, __1.CHAIN_IDS)(chain)); // when the user open activ from browser but the user have not installed the wallet we need to use the provider directly instead of the signer const signer = provider.getSigner(); contract = new __1.ethers.Contract(contractAddress, abi, signer); // console.log('contract') // console.log(contract) } catch (error) { const provider = new __1.ethers.providers.JsonRpcProvider(providerUrl); await provider.send('eth_requestAccounts', []); const signer = provider.getSigner(); contract = new __1.ethers.Contract(contractAddress, abi, signer); // console.log('signer') // console.log(signer) // console.log('contractAddress') // console.log(contractAddress) // throw error } } else { if (webProvider.mockedInTesting) { const wallet = new __1.ethers.Wallet(userWalletPrivateKey, webProvider); const signer = wallet.connect(webProvider); contract = new __1.ethers.Contract(contractAddress, abi, signer); } else { const provider = new __1.ethers.providers.Web3Provider(webProvider, chain); const wallet = new __1.ethers.Wallet(userWalletPrivateKey, provider); // when the user open activ from browser but the user have not installed the wallet we need to use the provider directly instead of the signer try { const signer = wallet.connect(provider); contract = new __1.ethers.Contract(contractAddress, abi, signer); } catch (error) { contract = new __1.ethers.Contract(contractAddress, abi, provider); } } } // } } else if ( // in this context the user there are not a wallet connected (0, __1.isNullOrUndefined)(webProvider) && (0, __1.isNullOrUndefined)(userWalletPrivateKey)) { const provider = new __1.ethers.providers.JsonRpcProvider(providerUrl); contract = new __1.ethers.Contract(contractAddress, abi, provider); } else if ( // in this context we have a user wallet connected via private key (0, __1.isNullOrUndefined)(webProvider) && !(0, __1.isNullOrUndefined)(userWalletPrivateKey)) { const provider = new __1.ethers.providers.JsonRpcProvider(providerUrl); const wallet = new __1.ethers.Wallet(userWalletPrivateKey, provider); const signer = wallet.connect(provider); contract = new __1.ethers.Contract(contractAddress, abi, signer); } // await state.provider.request({ // method: 'wallet_switchEthereumChain', // params: [{ chainId }], // }) // console.log('chain:') // console.log(chain) // console.log('contractAddress:') // console.log(contractAddress) // console.log('abi:') // console.log(abi) // console.log('webProvider:') // console.log(webProvider) // console.log('providerUrl:') // console.log(providerUrl) // console.log('userWalletPrivateKey:') // console.log(userWalletPrivateKey) // console.log('----------------') // console.log('----------------') // // console.log('contract:') // console.log(contract) if (contract === undefined) { throw new Error('Could not build Contract'); } await (0, __1.makeSureChainMatches)(chain); return contract; }; const build = async (contractRecipe, userWalletPrivateKey, webProvider) => { log_module_1.LogModule.dev('contractRecipe.gateContractAddress'); log_module_1.LogModule.dev(contractRecipe.gateContractAddress); const gateContract = await buildContract(contractRecipe.chain, contractRecipe.gateContractAddress, contractRecipe.gateAbi, webProvider, contractRecipe.providerUrl, userWalletPrivateKey); // const coreContract = await buildContract( // contractRecipe.chain, // contractRecipe.coreContractAddress, // contractRecipe.coreAbi, // webProvider, // contractRecipe.providerUrl, // userWalletPrivateKey, // ) return { gateContract, // coreContract, }; }; const listBlockchainNetworks = () => { const SUPPORTED_BLOCKCHAIN_NETWORK_NAMES = []; for (const [key, value] of state.blockchainNetworks) { SUPPORTED_BLOCKCHAIN_NETWORK_NAMES.push(value.name); } return SUPPORTED_BLOCKCHAIN_NETWORK_NAMES; }; const listContractsForNetwork = (network) => { const CONTRACT_NAMES = []; const contracts = state.blockchainNetworks.get(network).contracts; for (const key in contracts) { CONTRACT_NAMES.push(key); } return CONTRACT_NAMES; }; const getBlockchainNetwork = () => { return state.blockchainNetworks.get(state.selectedBlockchainNetwork); }; const getBlockchainContract = () => { // console.log('state.selectedBlockchainNetwork') // console.log(state.selectedBlockchainNetwork) // console.log( // 'state.blockchainNetworks.get(state.selectedBlockchainNetwork!)!', // ) // console.log(state.blockchainNetworks.get(state.selectedBlockchainNetwork!)!) return state.blockchainNetworks.get(state.selectedBlockchainNetwork) .contracts[state.selectedContract]; }; const get = () => { return state.blockchainNetworks.get(state.selectedBlockchainNetwork) ?.contracts[state.selectedContract]; }; const getGate = () => { return state.blockchainNetworks.get(state.selectedBlockchainNetwork) ?.contracts[state.selectedContract]?.gate; }; const thisOrGet = (contract) => { if (contract === undefined) { contract = get(); } if (contract === undefined) { throw new Error('Contract is undefined'); } return contract; }; const requestSelectedBrowserWalletAddress = async (contract) => { contract = thisOrGet(contract); if (state.browserRecordedWallets.length === 0) { const wp = getRecordedContractCreds()?.webProvider; if (wp === undefined) { throw new Error('CONTRACT MODULE ERROR: Web provider is undefined'); } if (state.accountsChangedListener !== undefined) { if (state.remover !== undefined) { state.remover(); } state.accountsChangedListener = undefined; state.remover = undefined; } if (state.accountsChangedListener === undefined) { const accounts = await wp.request({ method: 'eth_requestAccounts' }); state.browserRecordedWallets = accounts; state.browserSelectedWallet = accounts[0]; // console.log('state.browserRecordedWallets') // console.log(state.browserRecordedWallets) // console.log('state.browserSelectedWallet') // console.log(state.browserSelectedWallet) state.accountsChangedListener = wp.on('accountsChanged', (accounts) => { state.browserRecordedWallets = accounts; state.browserSelectedWallet = accounts[0]; // console.log('state.browserRecordedWallets') // console.log(state.browserRecordedWallets) // console.log('state.browserSelectedWallet') // console.log(state.browserSelectedWallet) }); state.remover = () => { wp.removeListener('accountsChanged', state.accountsChangedListener); }; } return state.browserSelectedWallet; } return state.browserSelectedWallet; }; const thisOrGetCreator = async (creator, contract) => { contract = thisOrGet(contract); if (creator === undefined) { if (contract.gate?.signer === undefined || contract.gate?.signer === null) { // probalby browser case creator = await requestSelectedBrowserWalletAddress(); } else { // probably node case creator = await contract.gate.signer.getAddress(); } } if (creator === undefined) { throw new Error('Contract signer is undefined'); } return creator; }; const thisOrGetGate = (contract) => { if (contract === undefined) { contract = getGate(); } if (contract === undefined) { throw new Error('Contract is undefined'); } return contract; }; const getWalletSettings = async (contract) => { contract = thisOrGet(contract); const callerAddress = await contract?.gate?.signer?.getAddress(); const balance = await contract?.gate?.signer?.getBalance(); const balanceInEth = Number(__1.ethers?.utils?.formatEther(balance || 0)).toFixed(4); const network = await contract.gate.signer.provider.getNetwork(); const networkName = (0, blockchain_network_i_1.WALLET_NETWORK_CHAIN_NAME)(network.chainId); // | 'sepolia' // | 'goerli' // | 'hardhat' const contracts = { // hardhat: CONTRACTS.IxilyActivV4_HardhatDemo, // goerli: CONTRACTS.IxilyActivV4_Goerli, // sepolia: CONTRACTS.IxilyActivV4_Sepolia, amoy: __1.CONTRACTS.IxilyActivV4_Amoy, }; const contractSelected = contracts[networkName]; const settings = { ...contractSelected, callerAddress: callerAddress, balanceInEth, }; return settings; }; const getRecordedContractCreds = () => { return state.recordCreds; }; exports.ContractModule = { build, getUpdatedStream, listBlockchainNetworks, listContractsForNetwork, getBlockchainNetwork, getBlockchainContract, get, getGate, thisOrGet, thisOrGetCreator, thisOrGetGate, getWalletSettings, changeToContract, getRecordedContractCreds, }; //# sourceMappingURL=contract.module.js.map