@ixily/activ
Version:
Alpha Capture Trade Idea Verification. Blockchain ownership proven trade ideas and strategies.
359 lines (357 loc) • 14.5 kB
JavaScript
;
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