diff --git a/.gitignore b/.gitignore index 7f25fe7..a24140e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules/ .env +*.txt diff --git a/index.js b/index.js index 35bd76f..14ceebb 100644 --- a/index.js +++ b/index.js @@ -1,8 +1,13 @@ // For Node >= v13 / es module environments import BlocknativeSdk from 'bnc-sdk' -import Web3 from 'web3' import WebSocket from 'ws' // only neccessary in server environments +import dotenv from 'dotenv' +dotenv.config() +const API_URL = process.env.API_URL; +import { createAlchemyWeb3 } from "@alch/alchemy-web3" +const web3 = createAlchemyWeb3(API_URL); + import contractABI from './MoonbirdPunks.json' assert { type: 'json' } // create options object @@ -18,10 +23,13 @@ const options = { // initialize and connect to the api const blocknative = new BlocknativeSdk(options) +const contractAddress = "0x7d82a88Efb60Bb83B3f1665757c20D07E5C0f3ED" +// const methodName = "ownerMint" +const methodName = "flipSaleState" await blocknative.configuration({ - scope: "0x7d82a88Efb60Bb83B3f1665757c20D07E5C0f3ED", // [required] - either 'global' or valid Ethereum address - filters: [{"contractCall.methodName":"ownerMint"}], + scope: contractAddress, // [required] - either 'global' or valid Ethereum address + filters: [{"contractCall.methodName":methodName}], abi: contractABI.abi, // [optional] - valid contract ABI watchAddress: true // [optional] - Whether the server should automatically watch the "scope" value if it is an address }) @@ -29,26 +37,48 @@ await blocknative.configuration({ // returns a promise that resolves once the configuration has been applied // or rejects if there was a problem with the configuration -// initialize web3 -// const web3 = new Web3(window.ethereum) - -// get current account -// const accounts = await web3.eth.getAccounts(); -const address = "0x7d82a88Efb60Bb83B3f1665757c20D07E5C0f3ED" - // call with the address of the account that you would like to receive status updates for const { emitter, // emitter object to listen for status updates details // initial account details which are useful for internal tracking: address -} = blocknative.account(address) +} = blocknative.account(contractAddress) + +console.log(`Watching for ${methodName} on ${contractAddress}...`) + +const nftContract = new web3.eth.Contract(contractABI.abi, contractAddress); -console.log(`Watching for events on ${address}...`) +async function mintPunk(maxFee, maxPriorityFee) { + const nonce = await web3.eth.getTransactionCount(process.env.PUBLIC_KEY, 'latest'); //get latest nonce + + //the transaction + const tx = { + 'from': process.env.PUBLIC_KEY, + 'to': contractAddress, + 'nonce': nonce, + 'gas': 100000, + 'maxFeePerGas': maxFee, + 'maxPriorityFeePerGas': maxPriorityFee, + 'data': nftContract.methods.mintPunk(1).encodeABI() + }; + + const signedTx = await web3.eth.accounts.signTransaction(tx, process.env.PRIVATE_KEY); + console.log("Minting punk...") + const transactionReceipt = await web3.eth.sendSignedTransaction(signedTx.rawTransaction); + + console.log(`Transaction receipt: ${JSON.stringify(transactionReceipt)}`); +} // listen to some events emitter.on('txPool', transaction => { +// emitter.on('txSent', transaction => { console.log(`Sending ${transaction.value} wei to ${transaction.to}`) + blocknative.unsubscribe(contractAddress) + mintPunk(transaction.maxFeePerGas, + transaction.maxPriorityFeePerGas) }) +// blocknative.unsubscribe(contractAddress) + // emitter.on('txConfirmed', transaction => { // console.log('Transaction is confirmed!') // }) @@ -57,3 +87,4 @@ emitter.on('txPool', transaction => { // emitter.on('all', transaction => { // console.log(`Transaction event: ${transaction.eventCode}`) // }) +// diff --git a/mint-nft.js b/mint-nft.js index 3d02e70..ea91b81 100644 --- a/mint-nft.js +++ b/mint-nft.js @@ -14,19 +14,22 @@ const contractAddress = "0x7d82a88Efb60Bb83B3f1665757c20D07E5C0f3ED"; const nftContract = new web3.eth.Contract(contractABI.abi, contractAddress); async function mintOwnerNFT() { - const nonce = await web3.eth.getTransactionCount(process.env.PUBLIC_KEY, 'latest'); //get latest nonce + const nonce = await web3.eth.getTransactionCount(process.env.PUBLIC_OWNER_KEY, 'latest'); //get latest nonce //the transaction const tx = { - 'from': process.env.PUBLIC_KEY, + 'from': process.env.PUBLIC_OWNER_KEY, 'to': contractAddress, 'nonce': nonce, 'gas': 100000, - 'maxPriorityFeePerGas': 1000000000, + 'maxFeePerGasGwei': 50, + // 'maxPriorityFeePerGas': 1000000000, + 'maxPriorityFeePerGasGwei': 2, 'data': nftContract.methods.ownerMint([process.env.PUBLIC_KEY], 1).encodeABI() }; - const signedTx = await web3.eth.accounts.signTransaction(tx, process.env.PRIVATE_KEY); + const signedTx = await web3.eth.accounts.signTransaction(tx, process.env.PRIVATE_OWNER_KEY); + console.log("Minting punk...") const transactionReceipt = await web3.eth.sendSignedTransaction(signedTx.rawTransaction); console.log(`Transaction receipt: ${JSON.stringify(transactionReceipt)}`); diff --git a/watch.js b/watch.js new file mode 100644 index 0000000..967b145 --- /dev/null +++ b/watch.js @@ -0,0 +1,67 @@ +// For Node >= v13 / es module environments +import BlocknativeSdk from 'bnc-sdk' +import WebSocket from 'ws' // only neccessary in server environments + +import dotenv from 'dotenv' +dotenv.config() +const API_URL = process.env.API_URL; +import { createAlchemyWeb3 } from "@alch/alchemy-web3" +const web3 = createAlchemyWeb3(API_URL); + +import contractABI from './MoonbirdPunks.json' assert { type: 'json' } + +// create options object +const options = { + dappId: 'd30463f1-eb29-42b8-8059-e5596e13d0fe', + networkId: 3, + system: 'ethereum', // optional, defaults to ethereum + transactionHandlers: [event => console.log(event.transaction)], + ws: WebSocket, // only neccessary in server environments + name: 'Instance name here', // optional, use when running multiple instances + onerror: (error) => {console.log(error)} //optional, use to catch errors +} + +// initialize and connect to the api +const blocknative = new BlocknativeSdk(options) +const contractAddress = "0x7d82a88Efb60Bb83B3f1665757c20D07E5C0f3ED" +const methodName = "ownerMint" +// const methodName = "flipSaleState" + +await blocknative.configuration({ + scope: contractAddress, // [required] - either 'global' or valid Ethereum address + // filters: [{"contractCall.methodName":methodName}], + abi: contractABI.abi, // [optional] - valid contract ABI + watchAddress: true // [optional] - Whether the server should automatically watch the "scope" value if it is an address +}) + +// returns a promise that resolves once the configuration has been applied +// or rejects if there was a problem with the configuration + +// call with the address of the account that you would like to receive status updates for +const { + emitter, // emitter object to listen for status updates + details // initial account details which are useful for internal tracking: address +} = blocknative.account(contractAddress) + +// console.log(`Watching for ${methodName} on ${contractAddress}...`) +console.log(`Watching for all methods on ${contractAddress}...`) + +const nftContract = new web3.eth.Contract(contractABI.abi, contractAddress); + +// listen to some events +emitter.on('txPool', transaction => { +// emitter.on('txSent', transaction => { + console.log(`Sending ${transaction.value} wei to ${transaction.to}`) +}) + +// blocknative.unsubscribe(contractAddress) + +// emitter.on('txConfirmed', transaction => { + // console.log('Transaction is confirmed!') +// }) + +// catch every other event that occurs and log it +// emitter.on('all', transaction => { + // console.log(`Transaction event: ${transaction.eventCode}`) +// }) +//