Complete Beginner's Guide to being an Honest Keep3rV1

Hello guys,

I was validated yesterday night and started testing and I feel I am pretty close to make it work for the UniswapV2Oracle.

So first you need to provide some ETH to your relayer :slight_smile: (found out after a transaction failed due to no ETH on the relayer).

Here’s the code on my autotask:

const infuraKey = 'my_Infura_Key';
const workableAbi = [{"inputs":[{"internalType":"address","name":"_keep3r","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"KP3R","outputs":[{"internalType":"contract IKeep3rV1","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"consult","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"granularity","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUpdated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"observationIndexOf","outputs":[{"internalType":"uint8","name":"index","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pairObservations","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"price0Cumulative","type":"uint256"},{"internalType":"uint256","name":"price1Cumulative","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairs","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGovernance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keep3r","type":"address"}],"name":"setKeep3r","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"update","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"updateFor","outputs":[{"internalType":"bool","name":"updated","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"updatePair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"updateableFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateableList","outputs":[{"internalType":"address[]","name":"list","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"windowSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"work","outputs":[],"stateMutability":"nonpayable","type":"function"}];
const workableAddr = '0x127a2975c4E1c75f1ed4757a861bbd42523DB035';
const from = 'my bonded Keeper address';
const { ethers } = require("ethers");
const { DefenderRelaySigner } = require('defender-relay-client/lib/ethers');
// Entrypoint for the Autotask
exports.handler = async function(credentials) {
  const provider = new ethers.providers.InfuraProvider('mainnet', infuraKey);
  const signer = new DefenderRelaySigner(credentials, provider, { speed: 'fastest', from });
  const contract = new ethers.Contract(workableAddr, workableAbi, signer);
// Run work if needed
  if (await contract.updateable()) {
    const tx = await contract.work();
    console.log(tx.hash);
  }
} 

Now here is one of the transaction that went almost through:
0xdc9370fa969ddd09ccdc2d02e4cbf898e895cf42bfebcc6b0ae6573f35f1e9d7

The status of transaction shows: Fail with error '::isKeeper: keeper is not registered’

But what I found weird is that in the transaction the “From” address is the one set on my relayer:
0x6b76337433410ee985fbc32d4cf3424b964e820a

So it seems that when executing the contract, the from address is not changed to my bonded keep3r address or did I miss a step to register my Keep3r address on that specific contract ?

Any ideas ? I feel like I’m pretty close to get this one working

@AliDean92 for the MetaKeep3r it seems that you need to bond 100 KPR to be able to execute this one from what I read on Andre’s medium article

2 Likes

Captain’s Log Day 5?:

Extremely emotional, grateful, determined, and blessed right now. [Anyone just joining us understand you are reading the words of a homosapien who aims to put his heart and soul on the line in return for community guidance, and a journey of growth that other beginners will follow and learn from as they pursue a life of a profitable, well-reputed, successful, Keep3r.

With that being said, yesterday was a big big big day for me…all three (Hegic, Yearn, and Uni) keep3r’s are running and have been running successfully for over 24 hours. No, I do not have any money/profit and have essentially only spent gas without reward since I have 0 KP3R bonded. But damn, once you get your Keep3rs working and you know that eventually there will be payoff (for essentially not attacking the system) it is a feeling of euphoria, like finding a secret goldmine (Keep3r mine:)

Some internal truths: Yes, $500 a month is a lot of money, but OpenZeppelin is providing me an opportunity to get myself established by helping me learn what issues need to be fixed to get code up, and getting templates and easy guides out. Also, they look at your code and in a second can tell you what the issue is and how to fix it. <–this is worth $500, not to mention they will create a fair payment system for us low level button pushers :slight_smile:

I want to take a moment right here and explicitly say @spalladino Do you understand how amazing your help was yesterday? I was (as I am starting to find out might be a common theme in this coding world) on the brink of madness trying to get my Keep3r work and you spend the time and effort and also promptly reached out, were patient, and told me what needed to be fixed. Anyone else reading, OpenZeppelin is what we need…this guide is just surface level, this is a community of like minded individuals who will help eachother and in return provide value back. Oh!! Almost forgot @spalladino…man… You telling me to change my API was crucial, I am so lost in learning how to crawl that it dawned on me…yes, there are tons of evil people out there who will take advantage immediately of an idiot mistake like posting my personal keys…wow…thank you for keeping me in check…I know I will mess up again, but now I am aware for this time. Thank you.

Okay, well…I could go into more mumbo jumbo about how many hours I spent readying out what a “provider” is or what an “API provider is” or what the word “const” means…but f’ that…instead I stay true to my word…keep giving to me and I keep giving to others…I will post my code (minus the important keys/identifiying info) for anyone who is still in this journey to literally copy paste for the Uni, Hedgic, and Yearn Autotask defenders.

Finally, @Sams95 dude…thank you for keeping me informed and also sharing your code…legit it better than mine (makes me sad that I suck so much, but happy that you are new and also kicking ass). Yes…I read that Andre wants to create minimum Bond in order to show reputation and also get actual profit from this (again, I am financially motivated in this journey but 0% malicious).

@spalladino @abcoathup @jonathan Will continue to thank each of you for the guidance, patience, and help you are providing to a budding noobie Keep3r :slight_smile:

3 Likes

Things CAPITALIZED and need to be filled in by user.

UniOracle Copy Pasta:

const workableAbi = FIND ABI IN UNI SCRIPT GITHUB CODE
const workableAddr = '0x127a2975c4E1c75f1ed4757a861bbd42523DB035';
const from = YOUR BONDED PUBLIC ADDRESS;
const network = 'homestead';

const { ethers } = require("ethers");
const { DefenderRelaySigner } = require('defender-relay-client/lib/ethers');
// Entrypoint for the Autotask
exports.handler = async function(credentials) {
  const provider = new ethers.providers.InfuraProvider('homestead', GET AN INFURA ACCOUNT AND PUT THE PROJECT ID HERE);
  const signer = new DefenderRelaySigner(credentials, provider, { speed: 'fastest', from });
  const contract = new ethers.Contract(workableAddr, workableAbi, signer);

  // Run work if needed
  if (await contract.updateable()) {
    const tx = await contract.work();
    console.log(tx.hash);
  }
}
1 Like

Here is where it becomes “fun”: So I think each different Job potentially has a different “function” that the Job requires. As of now, I am kinda guessing what the function that needs work done is…if someone can explain how I find and create the correct words for a job, that will allow me to know I can safely get my autotasks working for any job thrown at me.

So…for HEDGIC and YEARN…beginners…do the following: Take the same exact code for UNI, but…Change ABI to the ABI found in the Hedgic/Yearn Script…Change workAddr…to the const Address found on the Keep3r link job description… and change the word “updateable” to the word “workable”! Boom! Example below (trust me, I find this stuff over my head too).

Yearn Autotask Copy and Paste:

Things CAPITALIZED and need to be filled in by user.

Yearn Copy Pasta:

const workableAbi = FIND ABI IN YEARN SCRIPT GITHUB CODE
const workableAddr = USE ADDRESS FROM KEEP3R WEBSITE FOR YEARN JOB ;
const from = YOUR BONDED PUBLIC ADDRESS;
const network = ‘homestead’;

const { ethers } = require(“ethers”);
const { DefenderRelaySigner } = require(‘defender-relay-client/lib/ethers’);
// Entrypoint for the Autotask
exports.handler = async function(credentials) {
const provider = new ethers.providers.InfuraProvider(‘homestead’, GET AN INFURA ACCOUNT AND PUT THE PROJECT ID HERE);
const signer = new DefenderRelaySigner(credentials, provider, { speed: ‘fastest’, from });
const contract = new ethers.Contract(workableAddr, workableAbi, signer);

// Run work if needed
if (await contract.workable()) {
const tx = await contract.work();
console.log(tx.hash);
}
1 Like

I do not have the skills to even address if it is a code issue. However, go back to the keep3r.network website and just double check that the address is “activated”. Yesterday I had to go back and click “Activate” under my bonded address.

1 Like

Let me know if my Copy Pastas work for you. Make sure you sign up with INFURA and get a project ID.

1 Like

Still not working for me. Still getting this error:
Message: Error running autotask: Unhandled

Logs: 2020-11-03T21:20:45.646Z AUTOTASK START
2020-11-03T21:20:46.407Z AUTOTASK COMPLETE

1 Like

Hi @AliDean92,

Awesome to follow your progress !! Thank you for sharing with the community :pray:

As an aside, if you markdown code (``` above and below) it makes it much easier to read. I just added the following to your posts.

```

Code goes here

```

Thanks!
It looks like your code does the job when I manually tested it.
Date

2020-11-03T22:41:39.981Z

Trigger

manual

Status SUCCESS

RUN DETAILS

Result

null

Logs

2020-11-03T22:41:40.997Z AUTOTASK START 2020-11-03T22:41:43.549Z AUTOTASK COMPLETE

1 Like

Hi @andywmo

Congrats, great to see that you managed to get it working. I’m having the same issue you had earlier with the Message: Error running autotask: Unhandled

May I know how you managed to fix it? I’m using the code from @Sams95 too. Thanks

2 Likes

Not quite sure what it was, but It seemed to be working after I switched browsers to chrome with metamask connected properly to openzeppeling. Also make sure you have your infura details correctly inserted.

Hi @Sams95
Did you also received the following error after a transaction was triggered and how did you resolve? I should have enough gas on my wallet:

Message: Error running autotask: Unhandled

Logs: 2020-11-04T05:31:45.411Z AUTOTASK START
2020-11-04T05:31:46.108Z ERROR Invoke Error {“errorType”:“Error”,“errorMessage”:"cannot estimate gas; transaction may fail or may require manual gas limit (error={“reason”:"processing response

1 Like

Thanks @andywmo. I tried Chrome and still get the same error.

I created a project in Infura and got put in the project ID. Did you have to make any other changes in infura apart from just using the project ID? From the Infura project dashboard, I can see no requests logged so I suspect the autotask didn’t actually get that far.

const infuraKey = ‘Infura Project ID’;
const workableAbi = [{"inputs":[{"internalType":"address","name":"_keep3r","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"KP3R","outputs":[{"internalType":"contract IKeep3rV1","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"consult","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"granularity","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUpdated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"observationIndexOf","outputs":[{"internalType":"uint8","name":"index","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pairObservations","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"price0Cumulative","type":"uint256"},{"internalType":"uint256","name":"price1Cumulative","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairs","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGovernance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keep3r","type":"address"}],"name":"setKeep3r","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"update","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"updateFor","outputs":[{"internalType":"bool","name":"updated","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"updatePair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"updateableFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateableList","outputs":[{"internalType":"address[]","name":"list","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"windowSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"work","outputs":[],"stateMutability":"nonpayable","type":"function"}];
const workableAddr = ‘0x127a2975c4E1c75f1ed4757a861bbd42523DB035’;
const from = ‘bonded wallet address’;
const { ethers } = require(“ethers”);
const { DefenderRelaySigner } = require(‘defender-relay-client/lib/ethers’);

// Entrypoint for the Autotask
exports.handler = async function(credentials) {
const provider = new ethers.providers.InfuraProvider('mainnet', infuraKey);
const signer = new DefenderRelaySigner(credentials, provider, { speed: ‘fastest’, from });
const contract = new ethers.Contract(workableAddr, workableAbi, signer);

// Run work if needed
if (await contract.updateable()) {
const tx = await contract.work();
console.log(tx.hash);
}
}

Would any kind soul be able to help me take a look to see if I’ve done something wrong please?

1 Like

Which wallet address are you using at; ’ const from =… ?

I’m also not quite sure what to use but I put my metamask address with eth on it.

So far the code is running but still no transactions triggering or receiving this message:
Message: Error running autotask: Unhandled

Logs: 2020-11-04T07:03:46.590Z AUTOTASK START
2020-11-04T07:03:47.244Z ERROR Invoke Error {“errorType”:“Error”,“errorMessage”:“cannot estimate gas; transaction may fail or may require manual gas limit (error={“reason”:“processing response error”,“code”:“SERVER_ERROR”,“body”:{“jsonrpc”:“2.0”,“id”:43,“error”:{“code”:-32000,“message”:“gas required exceeds allowance (12523565) or always failing transaction”}},“error”:{“code”:-32000},“requestBody”:”{\“method\”:\“eth_estimateGas\”,\“params\”:[{\"from\

Hi Andywmo and others,

Ok so I made some more digging yesterday and find out that this error message (which I also got) provided by Infura is not really explicit so I tried with Alchemy and found out from the failed transactions that it is triggered by the fact that the address we use is not a registered keeper.

This means that the function isKeeper() returns false. Here is the code from the documentation:

/**
 * @notice confirms if the current keeper is registered, can be used for general (non critical) functions
 * @param keeper the keeper being investigated
 * @return true/false if the address is a keeper
 */
function isKeeper(address keeper) external returns (bool)

I am sure that the address I use in const from is a keeper as you can see below:

Therefore, what I did is I got back to Andre’s tutorial to setup the relayer and guys this was in front of our eyes since the beginning. Check the address of the relayer and the address he uses as the const from and you will see that it is the same.

This means that the relayer is the Keeper. So this explains why we get the error “not a registered keeper” if the function isKeeper() makes the check on the relayer address.

Now we have two options from my point of view:

  1. Either we make our relayers keepers but this would imply that we need to be able to access the private keys which is not the case from what I have seen in the console (maybe the support can let us know if there is a way for us to access the private key) so that we can import them in metamask and then register them in Keep3r as keepers.

  2. Find a way to have the function isKeeper() check the address we already have as keepers instead of checking on the relayer address. Honestly I have no idea if that is possible or how to modify the code for that.

I hope this helps and if someone has ideas, do not hesitate to share.

We’re getting close

Cheers

P:S @spalladino @jonathan any thoughts on this ? Do you know if there is a safe way we could obtain the private keys or a way we could use our current active keeper addresses as relayers ?

Thank you in advance

2 Likes

That’s an interesting discovery and does sound logical, although my knowledge of ethereum infrastructure is next to none. Would be great if we can import the relayer address into metamask if what you say is indeed the way to go.

Meanwhile, I’m still a few steps behind you as I’m still struggling to get pass this error, which indicates my code is not even running at all.
image

If you had similar experience, would be great if you can share how you got around it. Thanks

1 Like

Hi @AlvinP,

It seems that your issue is due to the fact that you do not use simple quotes for the addresses.

Copy and replace your segment of code with the below and just change YOUR_INFURA_KEY and YOUR_KEEPER_ADDRESS with your own values.

const infuraKey = 'YOUR_INFURA_KEY';
const workableAbi = [{"inputs":[{"internalType":"address","name":"_keep3r","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"KP3R","outputs":[{"internalType":"contract IKeep3rV1","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"consult","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"granularity","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUpdated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"observationIndexOf","outputs":[{"internalType":"uint8","name":"index","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pairObservations","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"price0Cumulative","type":"uint256"},{"internalType":"uint256","name":"price1Cumulative","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairs","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGovernance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keep3r","type":"address"}],"name":"setKeep3r","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"update","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"updateFor","outputs":[{"internalType":"bool","name":"updated","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"updatePair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"updateableFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateableList","outputs":[{"internalType":"address[]","name":"list","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"windowSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"work","outputs":[],"stateMutability":"nonpayable","type":"function"}];
const workableAddr = '0x127a2975c4E1c75f1ed4757a861bbd42523DB035';
const from = 'YOUR_KEEPER_ADDRESS';

Hope it helps.

1 Like

Yes this is absolutely right. I too thought that my MetaAddress would be the KP3R verification address. However, it seems the Relayer is the address that KP3R uses to verify credentials. This is all and well, except if we start bonding KP3R (including between 40-200 as incentivized by Andre to get max profitability)…we have to know enough proper coding to bond our KP3R on relayer AND know enough how to unbond the keeper. I do believe @spalladino is working on making this more dummy friendly, so give it time. Also, I do not even know how to get my eth back from my relayers. I will put an update tomorrow with links to useful resources. But in the meantime, I have unbonded all my KP3R from main address in anticipation of Open Zeppellin providing us with the hacked code. 14 day unbonding period as well as 3 day rebonding period…So if all goes 100% well… I can be a KP3R by the Holidays :slight_smile: Also, if you are reading this SPallidino, please include a script that can utilize the MetaKp3r Job and Infura provider.

1 Like

Noted! We’re pushing a guide with the vanilla Keep3r (not the MetaKeeper) for now, and the default provider, to simplify the setup as much as possible. I’ll share it here once ready, but the goal is to have a script that can be just copy pasted without any changes required.

2 Likes

Guide is finally out: Running a keeper from Keep3r Network on Defender

5 Likes