{"_id":"@api3/airkeeper","_rev":"13-1652babd83632829af6300da5b291c79","name":"@api3/airkeeper","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.6":{"name":"@api3/airkeeper","version":"0.0.6","license":"MIT","_id":"@api3/airkeeper@0.0.6","maintainers":[{"name":"aquarat","email":"blue@aquarat.co.za"},{"name":"bbenligiray","email":"bbenligiray@gmail.com"},{"name":"andreogle","email":"ogleandre@gmail.com"}],"dist":{"shasum":"c03f958296572192424b107eb0495884894615ec","tarball":"https://registry.npmjs.org/@api3/airkeeper/-/airkeeper-0.0.6.tgz","fileCount":78,"integrity":"sha512-ZRVBOs1n1KJGHgjHoGhvBtCUtdH/IzLYlsJmRy2zCIbGid40Rw9MzJu9SUCpUefAss3bFRkI3GuyiRRCQM9Ttg==","signatures":[{"sig":"MEUCIQCg5QJb5hYQl8JjdN2+ZtC3bmHg4etAgvX1PmivRJIJvQIgJW3MK4tR8u2eUUgMQK4yVlInr3sV0ogP7egpGPTfvPo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":234466,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiXnfNACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoGoQ//bWYVr1aOaWeecCNL9gHf9UcSRckto1s0J9+lMDosvrHO+/XZ\r\nAoSUWEYsssN6jRoFeqAT7dHTRe2pwT+a2mAmaY5DAZCzybM6FeqfLx1+3uWr\r\nHDBEdlibVgFhZNds+A68e6eFS5H2CuuEbAKs9K00zeLfYHArdz/8xsPeV4sk\r\nYMcjVMF6BJcR3c7MFB7wWpTbfMYYEHCjzKyg80ryG3KXv2VyD0vZ7a1hUmLa\r\nun9hhpvnvjwWkDpsO0sx9dBIEYbWr64XU9aqvWWUm1jL3KdhdfilFeys1Ukb\r\nBTIbw4gBu1a5U739XplWnChfJrTG9wpeHeqVvGhlhviMlbtn3aCXGltUaEwa\r\nDfNXKAtutJaYc9yvDkobqtRRFr3gTSAwKnbdA7qDtck2vFT2mK0Jp0vcLD+l\r\nJoSHQhcx2nNxV0HforXNn3FRI2fjJaN8v0+Yx3rA3+rP+BbS7wD/jtZFxdHI\r\nxTNui4X2OwVzFHO9gd6zT1Mt8ycTzjPqR0Cs/K01UclnLqs+0/86cUAWlWAN\r\nAUxC2UpC9BGZevz5RTQtxIXx/eDZwijXdcwH8Qobe9Yymu8k6sjrEOaYLGgK\r\nFcJQofwN6Avz93TQ9jRsg3q94qMZMahazQeVCo524ZS4AQJtCycsE/SBEeG5\r\nQhxHUmgl+rxZCclzN+eyKhBgmCctqh6T/sY=\r\n=MLvb\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./dist/index","types":"./dist/types","engines":{"node":"^14.17.1"},"private":false,"scripts":{"lint":"yarn run prettier:check && yarn run lint:eslint","test":"jest --selectProjects unit","build":"yarn clean && yarn compile:build","clean":"rimraf -rf ./dist *.tgz","docker":"docker build -t api/airkeeper .","compile":"tsc -p tsconfig.json","dev:api":"ts-node test/server/server.ts","prepare":"husky install","dev:list":"pm2 list","dev:stop":"pm2 stop ecosystem.config.js","test:e2e":"SILENCE_LOGGER=true jest --selectProjects e2e","dev:clean":"rimraf -rf ./logs","dev:delete":"pm2 delete all","sls:config":"sls config credentials --provider aws --key $AWS_ACCESS_KEY_ID --secret $AWS_SECRET_ACCESS_KEY","sls:deploy":"yarn build && sls deploy --region $REGION --stage $STAGE","sls:remove":"sls remove --region $REGION --stage $STAGE","lint:eslint":"eslint . --ext .js,.ts","postinstall":"rm -f hardhat.config.ts; rm -rf airnode; git clone https://github.com/api3dao/airnode.git airnode; cd airnode && git checkout 994d895f37ca871f57224ac1603ea58e79ef071e && yarn run bootstrap && yarn build && cd ..; cp -a airnode/node_modules/@api3/airnode-node/. node_modules/@api3/airnode-node; cp -a test/hardhat.config.ts ./; rm -rf airnode","dev:eth-node":"hardhat node --config test/hardhat.config.ts","compile:build":"tsc -p tsconfig-build.json","dev:background":"yarn run dev:clean && pm2 start ecosystem.config.js","prettier:check":"prettier --check \"./**/*.{js,sol,ts,md,yml,json}\"","prettier:write":"prettier --write \"./**/*.{js,sol,ts,md,yml,json}\" --ignore-unknown","setup:psp-local":"tsc && node scripts/psp-beacon-local-setup.js","sls:invoke:psp-beacon-update":"sls invoke --function psp-beacon-update","sls:invoke:rrp-beacon-update":"sls invoke --function rrp-beacon-update","sls:invoke-local:psp-beacon-update":"yarn build && sls invoke local --function psp-beacon-update --param='provider=local'","sls:invoke-local:rrp-beacon-update":"yarn build && sls invoke local --function rrp-beacon-update"},"_npmUser":{"name":"aquarat","email":"blue@aquarat.co.za"},"repository":{"url":"https://github.com/api3dao/airkeeper.git","type":"git"},"description":"A tool to update a beacon server value on a time interval","directories":{},"licenseText":"MIT License\n\nCopyright (c) 2021 API3\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","lint-staged":{"./**/*.{js,ts}":"yarn lint"},"dependencies":{"zod":"^3.13.4","ethers":"^5.6.0","lodash":"^4.17.21","aws-sdk":"^2.1101.0","dotenv-safe":"^8.2.0","@api3/airnode-abi":"^0.5.0","@api3/airnode-node":"^0.5.0","@api3/promise-utils":"^0.2.0","@api3/airnode-adapter":"^0.5.0","@api3/airnode-protocol":"^0.5.0","@api3/airnode-utilities":"^0.5.0","@api3/airnode-protocol-v1":"^0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"pm2":"^5.2.0","jest":"^27.4.7","husky":"^7.0.4","eslint":"^8.11.0","morgan":"^1.10.0","rimraf":"^3.0.2","express":"^4.17.3","hardhat":"^2.9.3","ts-jest":"^27.1.3","ts-node":"^10.7.0","prettier":"2.5.1","serverless":"^3.7.5","typescript":"^4.6.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","lint-staged":"^12.3.5","@types/lodash":"^4.14.179","@types/morgan":"^1.9.3","@types/express":"^4.17.13","@types/serverless":"^3.0.1","@types/dotenv-safe":"^8.1.2","eslint-plugin-jest":"^26.1.0","eslint-plugin-import":"^2.25.4","eslint-plugin-functional":"^4.2.0","@nomiclabs/hardhat-ethers":"^2.0.5","@typescript-eslint/parser":"^5.15.0","@typescript-eslint/eslint-plugin":"^5.15.0"},"_npmOperationalInternal":{"tmp":"tmp/airkeeper_0.0.6_1650358221083_0.6683804940782101","host":"s3://npm-registry-packages"}},"0.1.0":{"name":"@api3/airkeeper","version":"0.1.0","license":"MIT","_id":"@api3/airkeeper@0.1.0","maintainers":[{"name":"aquarat","email":"blue@aquarat.co.za"},{"name":"bbenligiray","email":"bbenligiray@gmail.com"},{"name":"andreogle","email":"ogleandre@gmail.com"}],"dist":{"shasum":"bfbd0df897fd7a4e72588f6556688967acac6ad8","tarball":"https://registry.npmjs.org/@api3/airkeeper/-/airkeeper-0.1.0.tgz","fileCount":78,"integrity":"sha512-z+xqVKvHNhZ2rQCBmw+DfsZv1KhZ+Nz94EH+c7/W6Xe0YWNzGhe9StXL5xTUwy9tU4lCxtQ/qZFarzpNHx/hmQ==","signatures":[{"sig":"MEQCIBrKIZ02rsy/KyaQm2GADJKE0R2IEKMRRxZvVv2ZyoydAiBfRwQ/KL81y9Z7f1UVXYRCbbkkGejcGi84op/LfwDbRA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":234466,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJincNxACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrVbA//YrnjVaaP+UO4iFppN2IJVogybw/DsxhCMA4IMSa91xmDQKnw\r\nmmu5cvtJFXAgriS6uGUMDZuJtxzVUWi9AhNgqH5Zi6X02atz2Qp4g2lGmM2M\r\nhP4f761/iEerxBgKQanxG/dtS3xpd//bBoQD8Umd6I776HM+VwLtOaEDXSlk\r\nr6j4flwTkSQIHuaueod5CKkeZNvGrv9NAsLAVidZavJQj0i1UH4Ztix1zPiD\r\nBEYEUueZ4Mdeh7fuQH6WmxhYQhNsfmR/Ze5JIvkdA+M8ofSRihHq1cvaBFQB\r\nt4jbizBNSVQKLfP5EuOpwXVdCXY/zWjObpQW6KxF33o5spOy7jvH9UE/EiUq\r\nn1Uess6fygD+po9OtUHv1j0UFvRAYy93gChg+m4Pk6kbv95HmNfsAMBIfgJ4\r\nGSn2HQwageGIcfafKlkbWuWf993I4+X/T886blIksUvEQZfHSl7qnuD3FtnP\r\n9TF4hoIwc/QRkIEHz9sejWbGgsewOEkU1WYuVdluj4zXHjOxd+dHDs+tvU2o\r\nTnt5D5s0P9aO7OM/pMgieS9nhBKs6a7XwDKsdcjtOQzJO+KYh3tNywvRB741\r\nagu0jVlS587HCDutFRakbaDQ/XiUWBJCpzmpSGHqG6qo6vQXkKRnIMYTxL4O\r\nHc5DC6eo/CqtY7aXgM5/jst64wD17q+jnUs=\r\n=gRKm\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./dist/index","types":"./dist/types","engines":{"node":"^14.17.1"},"private":false,"scripts":{"lint":"yarn run prettier:check && yarn run lint:eslint","test":"jest --selectProjects unit","build":"yarn clean && yarn compile:build","clean":"rimraf -rf ./dist *.tgz","docker":"docker build -t api/airkeeper .","compile":"tsc -p tsconfig.json","dev:api":"ts-node test/server/server.ts","prepare":"husky install","dev:list":"pm2 list","dev:stop":"pm2 stop ecosystem.config.js","test:e2e":"SILENCE_LOGGER=true jest --selectProjects e2e","dev:clean":"rimraf -rf ./logs","dev:delete":"pm2 delete all","sls:config":"sls config credentials --provider aws --key $AWS_ACCESS_KEY_ID --secret $AWS_SECRET_ACCESS_KEY","sls:deploy":"yarn build && sls deploy --region $REGION --stage $STAGE","sls:remove":"sls remove --region $REGION --stage $STAGE","lint:eslint":"eslint . --ext .js,.ts","postinstall":"rm -f hardhat.config.ts; rm -rf airnode; git clone https://github.com/api3dao/airnode.git airnode; cd airnode && git checkout 994d895f37ca871f57224ac1603ea58e79ef071e && yarn run bootstrap && yarn build && cd ..; cp -a airnode/node_modules/@api3/airnode-node/. node_modules/@api3/airnode-node; cp -a test/hardhat.config.ts ./; rm -rf airnode","dev:eth-node":"hardhat node --config test/hardhat.config.ts","compile:build":"tsc -p tsconfig-build.json","dev:background":"yarn run dev:clean && pm2 start ecosystem.config.js","prettier:check":"prettier --check \"./**/*.{js,sol,ts,md,yml,json}\"","prettier:write":"prettier --write \"./**/*.{js,sol,ts,md,yml,json}\" --ignore-unknown","setup:psp-local":"tsc && node scripts/psp-beacon-local-setup.js","sls:invoke:psp-beacon-update":"sls invoke --function psp-beacon-update","sls:invoke:rrp-beacon-update":"sls invoke --function rrp-beacon-update","sls:invoke-local:psp-beacon-update":"yarn build && sls invoke local --function psp-beacon-update --param='provider=local'","sls:invoke-local:rrp-beacon-update":"yarn build && sls invoke local --function rrp-beacon-update"},"_npmUser":{"name":"aquarat","email":"blue@aquarat.co.za"},"repository":{"url":"https://github.com/api3dao/airkeeper.git","type":"git"},"description":"A tool to update a beacon server value on a time interval","directories":{},"licenseText":"MIT License\n\nCopyright (c) 2021 API3\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","lint-staged":{"./**/*.{js,ts}":"yarn lint"},"dependencies":{"zod":"^3.13.4","ethers":"^5.6.0","lodash":"^4.17.21","aws-sdk":"^2.1101.0","dotenv-safe":"^8.2.0","@api3/airnode-abi":"^0.5.0","@api3/airnode-node":"^0.5.0","@api3/promise-utils":"^0.2.0","@api3/airnode-adapter":"^0.5.0","@api3/airnode-protocol":"^0.5.0","@api3/airnode-utilities":"^0.5.0","@api3/airnode-protocol-v1":"^0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"pm2":"^5.2.0","jest":"^27.4.7","husky":"^7.0.4","eslint":"^8.11.0","morgan":"^1.10.0","rimraf":"^3.0.2","express":"^4.17.3","hardhat":"^2.9.3","ts-jest":"^27.1.3","ts-node":"^10.7.0","prettier":"2.5.1","serverless":"^3.7.5","typescript":"^4.6.2","@types/jest":"^27.4.1","@types/node":"^17.0.21","lint-staged":"^12.3.5","@types/lodash":"^4.14.179","@types/morgan":"^1.9.3","@types/express":"^4.17.13","@types/serverless":"^3.0.1","@types/dotenv-safe":"^8.1.2","eslint-plugin-jest":"^26.1.0","eslint-plugin-import":"^2.25.4","eslint-plugin-functional":"^4.2.0","@nomiclabs/hardhat-ethers":"^2.0.5","@typescript-eslint/parser":"^5.15.0","@typescript-eslint/eslint-plugin":"^5.15.0"},"_npmOperationalInternal":{"tmp":"tmp/airkeeper_0.1.0_1654506352995_0.7524475179572787","host":"s3://npm-registry-packages"}}},"time":{"created":"2022-04-19T08:50:20.963Z","modified":"2026-04-07T10:33:11.935Z","0.0.5":"2022-04-14T11:53:35.167Z","0.0.6":"2022-04-19T08:50:21.211Z","0.1.0":"2022-06-06T09:05:53.201Z"},"license":"MIT","repository":{"url":"https://github.com/api3dao/airkeeper.git","type":"git"},"description":"A tool to update a beacon server value on a time interval","maintainers":[{"email":"bbenligiray@gmail.com","name":"bbenligiray"},{"email":"e.tesarr@gmail.com","name":"siegrift"}],"readme":"# Airkeeper\n\n> A tool to update a beacon server value on a time interval\n\nAirkeeper will fetch the value from the API (similarly to Airnode) and if a specifided condition is true then it will\nupdate the beacon value.\n\nThere are two different lambda functions that can be used to update the beacon value:\n\n1. `rrp-beacon-update` uses the\n   [RrpBeaconServer](https://github.com/api3dao/airnode/blob/v0.4/packages/airnode-protocol/contracts/rrp/requesters/RrpBeaconServer.sol)\n   contract from airnode-protocol v0.4. See [Beacons](https://docs.api3.org/beacon/v0.1/functions/)\n\n   This function will fetch the API values for all triggers set in the `airkeeper.json` file, read current the beacon\n   value in RrpBeaconServer and update it if the API value is not within the threshold (also defined in the\n   `airkeeper.json` file).\n\n1. `psp-beacon-update` uses the\n   [DapiServer](https://github.com/api3dao/airnode/blob/991af4d69e82c1954a5c6c8e247cde8eb76101de/packages/airnode-protocol-v1/contracts/dapis/DapiServer.sol)\n   contract from airnode-protocol v1. <!-- TODO: DapiServer.sol url might change -->\n\n   This function will fetch the API values for all subscriptions in the `airkeeper.json` file, call a condition function\n   on chain and update the beacon value if the condition is true.\n\nBoth functions will require a sponsor to be defined in the `airkeeper.json` file in order to derive a sponsor wallet\nthat will be used by Airkeeper to submit transactions. These sponsor wallets must be funded by a sponsor before\nAirkeeper can start updating beacon values. The protocol ID to be used when deriving the sponsor wallet for RRP beacon\nupdates is `12345` and for PSP it is `2`.\n\n## Setup\n\n- Airkeeper will require a configuration file that matches the one being used by the target Airnode. The Airnode's\n  `config.json` and `secrets.env` file can be copied from the Airnode repo and placed in the /config directory of this\n  repo. Examples of these two files can be found in the /config directory of this repo.\n\n- Airkeeper will also require an additional configuration file named `airkeeper.json`, which will be merged with the\n  configuration. `airkeeper.json` will contain configuration specific to Airkeeper. An example is available in the\n  /config directory of this repo.\n  <!-- TODO: add more details on each configuration property or link to docs -->\n\n- Another requirement is to have an AWS account where these lambda functions can be deployed. Cloud provider credentials\n  must be provided in the `aws.env` file and placed in the /config directory of this repo.\n\n## Docker instructions\n\nUse the docker image to deploy or remove an Airkeeper to and from a cloud provider such as AWS.\n\nThe docker image supports two commands.\n\n- `deploy`: Deploys both Airkeeper lambda functions using the provided configuration files.\n- `remove`: Removes both previously deployed Airkeeper lambda functions.\n\n### Build docker image\n\nThe docker image can be built by running the following command from the root directory:\n\n```sh\ndocker build . -t api3/airkeeper\n```\n\n### Deployment\n\nThe `deploy` command will create a new AWS lambda function set and a new AWS cloud scheduler. The serverless `stage` and\n`region` variables are set with the following priority order:\n\n1. CLI options\n2. `aws.env` file\n3. default values `stage`: 'dev' and `region`: 'us-east-1'\n\n```sh\ndocker run -it --rm \\\n--env-file config/aws.env \\\n-v \"$(pwd)/config:/app/config\" \\\napi3/airkeeper:latest deploy --stage dev --region us-east-1\n```\n\nFor Windows, use CMD (and not PowerShell).\n\n```sh\ndocker run -it --rm ^\n--env-file config/aws.env ^\n-v \"$(pwd)/config:/app/config\" ^\napi3/airkeeper:latest deploy --stage dev --region us-east-1\n```\n\n### Removal\n\nThe `remove` command will delete the previously deployed AWS lambda function and its AWS cloud scheduler.\n\n```sh\ndocker run -it --rm \\\n--env-file config/aws.env \\\n-v \"$(pwd)/config:/app/config\" \\\napi3/airkeeper:latest remove --stage dev --region us-east-1\n```\n\nFor Windows, use CMD (and not PowerShell).\n\n```sh\ndocker run -it --rm ^\n--env-file config/aws.env ^\n-v \"$(pwd)/config:/app/config\" ^\napi3/airkeeper:latest remove --stage dev --region us-east-1\n```\n\n## Development instructions\n\nMake sure to have yarn installed, then run:\n\n```sh\nyarn install\n```\n\n### Running Airkeeper locally\n\nFollow these steps to run Airkeeper locally:\n\n1. Open a new terminal and start a new local ethereum node.\n1. Open a new terminal and start the local 'Currency Converter API' server.\n1. Deploy all required contracts (RrpBeaconServer, DapiServer, etc) and set everything up (whitelisting, sponsorship,\n   etc).\n1. Switch to the Airkeeper root directory and run `yarn install`.\n1. Add appropriate values to the `config.json` and `airkeeper.json` files.\n1. Finally, run `yarn sls:invoke-local:psp-beacon-update` to invoke the `psp.beaconUpdate` handler function or run\n   `yarn sls:invoke-local:rrp-beacon-update` to invoke the `rrp.beaconUpdate` handler function.\n\n### Running Airkeeper on AWS Lambda\n\nAirkeeper is meant to be deployed to the AWS lambda service and for this you will need to add your credentials to the\n`config/aws.env` file. Once done, the `export-aws-env.sh` script can be used to load them into the environment.\n\n1. (Optional) Run `yarn sls:config` to configure the AWS credentials. You must first configure the `config/aws.env` file\n   with your AWS account details and then run `source export-aws-env.sh` script to load the env vars.\n1. Run `yarn sls:deploy` to deploy the Airkeeper lambda function.\n1. Run `yarn sls:invoke:psp` to invoke the Airkeeper PSP beacon update lambda function.\n1. Run `yarn sls:remove` to remove the Airkeeper lambda function.\n\n## Additional considerations\n\n### RRP beacon update\n\n- The request sponsor account must first call `AirnodeRrp.setSponsorshipStatus(rrpBeaconServer.address, true)` to allow\n  the RrpBeaconServer contract to make requests to AirnodeRrp contract.\n\n- A `keeperSponsorWallet` needs to be derived for the sponsor-airnode pair. This is a similar process to deriving the\n  sponsor wallet used by Airnode to fulfill requests but in this case the wallet derivation path is slightly different.\n  This wallet needs to be funded with the native token in order for Airkeeper to use it to submit beacon updates\n  requests.\n\n- Request sponsor account must also call `RrpBeaconServer.setUpdatePermissionStatus(keeperSponsorWallet.address, true)`\n  to allow the `keeperSponsorWallet` to update beacon server value.\n\n- The template used by the RrpBeaconServer contract is expected to contain all the parameters required in the API call.\n\n### Proto-PSP beacon update\n\n- Current PSP beacon update implementation is a prototype; allocators, authorizers and sponsorship have been ignored.\n  This is because the current implementation is not ready for production.\n\n- Subscription and template details are expected to be provided in the `airkeeper.json` file meaning that Airkeeper will\n  not fetch that information from AirnodeProtocol contract.\n\n## Scripts\n\nThe `scripts` directory contains scripts that can be used to test the lambda functions against a local running eth node.\n\n### Local PSP beacon update\n\nFirst you need to start a local ethereum node and grab private keys of funded test accounts to add them to each account\nin the psp-beacon-local.json config file. Then you need to start the local 'Currency Converter API' server.\n\nAfter that you can run the following command:\n\n- `yarn run setup:psp-local`: Deploys the DapiServer contract and registers a single subscription. Use the values\n  displayed in the console to fill in the `airkeeper.json` file. Then you can run\n  `yarn sls:invoke-local:psp-beacon-update` to update the beacon using PSP.\n\n## Testing\n\n### Unit Tests\n\nUnit tests can then be run with:\n\n```sh\nyarn run test\n```\n\n### E2E Tests\n\nE2E tests are defined in the `test/e2e/` folder and are identified by the `feature.ts` extension.\n\nIn order to run E2E tests, you will need to have both an Ethereum node and the \"dummy\" web API running. The simplest way\nto accomplish this is by running:\n\n```sh\n# Start an Ethereum node and mock API\nyarn run dev:eth-node\nyarn run dev:api\n\n# OR\n\n# Start both an Ethereum node and the \"dummy\" web API as background processes\nyarn run dev:background\n```\n\nE2E tests can then be run with:\n\n```sh\nyarn run test:e2e\n```\n","readmeFilename":"README.md"}