Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 12 additions & 10 deletions examples/paymaster-demo.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import DKG from '../index.js';
import { sleepForMilliseconds } from '../services/utilities.js';

const ENVIRONMENT = 'testnet';
const OT_NODE_HOSTNAME = 'https://v6-pegasus-node-06.origin-trail.network';
const OT_NODE_HOSTNAME = 'https://v6-pegasus-node-02.origin-trail.network';
const OT_NODE_PORT = '8900';
const PUBLIC_KEY = '';
const PRIVATE_KEY = '';
Expand Down Expand Up @@ -56,15 +56,19 @@ function divider() {

//Publish paymaster

// const deployedAddress = await DkgClient.paymaster.deployPaymasterContract({
// epochsNum: 2,
// minimumNumberOfFinalizationConfirmations: 3,
// minimumNumberOfNodeReplications: 3,
// });
const paymasterAddress = await DkgClient.paymaster.deployPaymasterContract({
epochsNum: 2,
minimumNumberOfFinalizationConfirmations: 3,
minimumNumberOfNodeReplications: 3,
});

// console.log('Deployed Address:', deployedAddress);
console.log('Deployed Address:', paymasterAddress);

await DkgClient.paymaster.addAllowedAddress('0x1d23852331eDA24d1b6F5E21fdc419A38B0de28c',);
await DkgClient.paymaster.addAllowedAddress(paymasterAddress, '0x1d23852331eDA24d1b6F5E21fdc419A38B0de28c',{
epochsNum: 2,
minimumNumberOfFinalizationConfirmations: 3,
minimumNumberOfNodeReplications: 3,
});
console.log('Added allowed address.');

// await DkgClient.paymaster.removeAllowedAddress('0x404028D4Bda2B3f2558695A09a9a31dF138Dc5F6', {
Expand All @@ -87,8 +91,6 @@ function divider() {
minimumNumberOfFinalizationConfirmations: 3,
minimumNumberOfNodeReplications: 3,
});

//


console.time('Publish (5 replications, 5 finalizations)');
Expand Down
25 changes: 13 additions & 12 deletions managers/paymaster-operations-manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export default class PaymasterOperationsManager {
* @returns {Object} Object containing hash of blockchain transaction and status.
*/

async deployPaymasterContract(options) {
async deployPaymasterContract(options = {}) {
try {
const blockchain = this.inputService.getBlockchain(options);

Expand All @@ -28,56 +28,57 @@ export default class PaymasterOperationsManager {
}
}

async addAllowedAddress(addresToBeWhitelested, options) {
async addAllowedAddress(paymasterAddress,addresToBeWhitelested, options = {}) {
try {
const blockchain = this.inputService.getBlockchain(options);

this.validationService.validatePaymasterAddress(blockchain, addresToBeWhitelested);
this.validationService.validatePaymasterAddress(blockchain, paymasterAddress, addresToBeWhitelested);

await this.blockchainService.addAllowedAddress(blockchain, addresToBeWhitelested);
await this.blockchainService.addAllowedAddress(blockchain, paymasterAddress, addresToBeWhitelested);

} catch (error) {
console.error('Error adding allowed address:', error);
}
}

async removeAllowedAddress(addresToBeWhitelested, options) {
async removeAllowedAddress(paymasterAddress, addresToBeWhitelested, options = {}) {
try {
const blockchain = this.inputService.getBlockchain(options);

this.validationService.validatePaymasterAddress(blockchain, addresToBeWhitelested);
this.validationService.validatePaymasterAddress(blockchain, paymasterAddress, addresToBeWhitelested);

await this.blockchainService.removeAllowedAddress(blockchain, addresToBeWhitelested);
await this.blockchainService.removeAllowedAddress(blockchain,paymasterAddress, addresToBeWhitelested);

} catch (error) {
console.error('Error removing allowed address:', error);
}
}

async fundPaymaster(tokenAmount, options) {
async fundPaymaster(paymasterAddress, tokenAmount, options = {}) {
try {
const blockchain = this.inputService.getBlockchain(options);

this.validationService.validatePaymasterToken(blockchain, tokenAmount);
this.validationService.validatePaymasterToken(blockchain, paymasterAddress, tokenAmount);

await this.blockchainService.fundPaymaster(blockchain, tokenAmount);
await this.blockchainService.fundPaymaster(blockchain, paymasterAddress, tokenAmount);

} catch (error) {
console.error('Error funding paymaster:', error);
}
}

async withdraw(recipient, tokenAmount, options) {
async withdraw(paymasterAddress, recipient, tokenAmount, options = {}) {
try {
const blockchain = this.inputService.getBlockchain(options);

this.validationService.validatePaymasterTokenAdress(
blockchain,
paymasterAddress,
tokenAmount,
recipient,
)

await this.blockchainService.withdrawPaymaster(blockchain, recipient, tokenAmount);
await this.blockchainService.withdrawPaymaster(blockchain, paymasterAddress, recipient, tokenAmount);

} catch (error) {
console.error('Error withdrawing:', error);
Expand Down
62 changes: 54 additions & 8 deletions services/blockchain-service/blockchain-service-base.js
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,44 @@ export default class BlockchainServiceBase {
}
}

async callContractFunctionPaymaster(paymasterAddress, contractName, functionName, args, blockchain) {
await this.ensureBlockchainInfo(blockchain);

const web3Instance = await this.getWeb3Instance(blockchain);

let paymasterContractInstance = new web3Instance.eth.Contract(
this.abis[contractName],
paymasterAddress,
{ from: blockchain.publicKey },
)

try {
return await paymasterContractInstance.methods[functionName](...args).call();
} catch (error) {
if (/revert|VM Exception/i.test(error.message)) {
let status;
try {
status = await paymasterContractInstance.methods.status().call();
} catch (_) {
status = false;
}

if (!status && contractName !== 'ParanetNeuroIncentivesPool') {
await this.updateContractInstance(contractName, blockchain, true);
let paymasterContractInstance = new web3Instance.eth.Contract(
this.abis[contractName],
this[blockchain.name].contractAddress[blockchain.hubContract][contractName],
{ from: blockchain.publicKey },
)

return paymasterContractInstance.methods[functionName](...args).call();
}
}

throw error;
}
}

async prepareTransaction(contractInstance, functionName, args, blockchain) {
await this.ensureBlockchainInfo(blockchain);
const web3Instance = await this.getWeb3Instance(blockchain);
Expand Down Expand Up @@ -1236,30 +1274,38 @@ export default class BlockchainServiceBase {
return paymasterAddress;
}

async addAllowedAddress(blockchain, public_adress) {
return this.callContractFunction(
async addAllowedAddress(blockchain, paymasterAddress, public_adress) {
return this.callContractFunctionPaymaster(
paymasterAddress,
'Paymaster',
'addAllowedAddress',
[public_adress],
blockchain,
);
}

async removeAllowedAddress(blockchain, public_adress) {
return this.callContractFunction(
async removeAllowedAddress(blockchain, paymasterAddress, public_adress) {
return this.callContractFunctionPaymaster(
paymasterAddress,
'Paymaster',
'removeAllowedAddress',
[public_adress],
blockchain,
);
}

async fundPaymaster(blockchain, tokenAmount) {
return this.callContractFunction('Paymaster', 'fundPaymaster', [tokenAmount], blockchain);
async fundPaymaster(blockchain, paymasterAddress, tokenAmount) {
return this.callContractFunctionPaymaster(
paymasterAddress,
'Paymaster',
'fundPaymaster',
[tokenAmount],
blockchain);
}

async withdrawPaymaster(blockchain, recipient, tokenAmount) {
return this.callContractFunction(
async withdrawPaymaster(blockchain, paymasterAddress, recipient, tokenAmount) {
return this.callContractFunctionPaymaster(
paymasterAddress,
'Paymaster',
'withdraw',
[recipient, tokenAmount],
Expand Down
9 changes: 6 additions & 3 deletions services/validation-service.js
Original file line number Diff line number Diff line change
Expand Up @@ -775,18 +775,21 @@ export default class ValidationService {

//Paymaster validator

validatePaymasterAddress(blockchain, hubAddress) {
validatePaymasterAddress(blockchain, paymasterAddress, hubAddress) {
this.validateBlockchain(blockchain);
this.validateAddress(paymasterAddress);
this.validateAddress(hubAddress);
}

validatePaymasterToken(blockchain, tokenAmount) {
validatePaymasterToken(blockchain, paymasterAddress, tokenAmount) {
this.validateBlockchain(blockchain);
this.validateAddress(paymasterAddress);
this.validateTokenAmount(tokenAmount);
}

validatePaymasterTokenAdress(blockchain, tokenAmount, recipient) {
validatePaymasterTokenAdress(blockchain, paymasterAddress, tokenAmount, recipient) {
this.validateBlockchain(blockchain);
this.validateAddress(paymasterAddress);
this.validateTokenAmount(tokenAmount);
this.validateAddress(recipient);
}
Expand Down