Compare commits
14 Commits
Author | SHA1 | Date | |
---|---|---|---|
0f872c8f1e | |||
484a9ffcaf | |||
6e9f565587 | |||
f4634fe692 | |||
68968e1fbd | |||
|
a2ebc609ea | ||
beca6afc4f | |||
|
90223dd22e | ||
ea3a591a0c | |||
|
e0f20d363c | ||
|
5e33381f2a | ||
1f91a13f06 | |||
7d2a492fc9 | |||
|
30490ce393 |
@ -31,18 +31,55 @@ const contractCalls = [
|
|||||||
wiki_username: 'Manuel',
|
wiki_username: 'Manuel',
|
||||||
}, { gasLimit: 200000 }]],
|
}, { gasLimit: 200000 }]],
|
||||||
|
|
||||||
['Contribution', 'add', [{ contributorId: 1, contributorIpfsHash: 'QmWKCYGr2rSf6abUPaTYqf98urvoZxGrb7dbspFZA6oyVF', date: '2019-04-11', amount: 500, kind: 'dev', description: '[67P/kredits-contracts] Test this thing', url: '' }, { gasLimit: 350000 }]],
|
['Contribution', 'add', [{
|
||||||
['Contribution', 'add', [{ contributorId: 2, contributorIpfsHash: 'QmcHzEeAM26HV2zHTf5HnZrCtCtGdEccL5kUtDakAB7ozB', date: '2019-04-11', amount: 1500, kind: 'dev', description: '[67P/kredits-web] Reviewed stuff', url: '' }, { gasLimit: 350000 }]],
|
contributorId: 1, contributorIpfsHash: 'QmWKCYGr2rSf6abUPaTYqf98urvoZxGrb7dbspFZA6oyVF',
|
||||||
['Contribution', 'add', [{ contributorId: 1, contributorIpfsHash: 'QmWKCYGr2rSf6abUPaTYqf98urvoZxGrb7dbspFZA6oyVF', date: '2019-04-11', amount: 5000, kind: 'dev', description: '[67P/kredits-contracts] Add tests', url: '' }, { gasLimit: 350000 }]],
|
date: '2019-04-11', amount: 500, kind: 'dev',
|
||||||
['Contribution', 'add', [{ contributorId: 1, contributorIpfsHash: 'QmWKCYGr2rSf6abUPaTYqf98urvoZxGrb7dbspFZA6oyVF', date: '2019-04-11', amount: 1500, kind: 'dev', description: '[67P/kredits-contracts] Introduce contribution token', url: '' }, { gasLimit: 350000 }]],
|
description: '[67P/kredits-contracts] Test this thing',
|
||||||
['Contribution', 'add', [{ contributorId: 2, contributorIpfsHash: 'QmcHzEeAM26HV2zHTf5HnZrCtCtGdEccL5kUtDakAB7ozB', date: '2019-04-11', amount: 5000, kind: 'dev', description: '[67P/kredits-web] Expense UI, first draft', url: '' }, { gasLimit: 350000 }]],
|
url: '',
|
||||||
|
confirmedAtBlock: 1,
|
||||||
|
}, { gasLimit: 350000 }]],
|
||||||
|
|
||||||
['Reimbursement', 'add', [{amount: 1116000, recipientId: 1, token: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599', expenses: [
|
['Contribution', 'add', [{
|
||||||
{ title: 'Server rent', description: 'Dedicated server: andromeda.kosmos.org, April 2020', amount: 61, currency: 'EUR', date: '2020-05-28' },
|
contributorId: 2, contributorIpfsHash: 'QmcHzEeAM26HV2zHTf5HnZrCtCtGdEccL5kUtDakAB7ozB',
|
||||||
{ title: 'Server rent', description: 'Dedicated server: centaurus.kosmos.org, April 2020', amount: 32, currency: 'EUR', date: '2020-05-28' }
|
date: '2019-04-11', amount: 1500, kind: 'dev',
|
||||||
]}, { gasLimit: 300000 }]],
|
description: '[67P/kredits-web] Reviewed stuff',
|
||||||
['Reimbursement', 'add', [{amount: 166800, recipientId: 2, token: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599', expenses: [
|
url: '',
|
||||||
{ title: 'Domain kosmos.chat', description: 'Yearly registration fee for domain kosmos.chat', amount: 13.90, currency: 'EUR', date: '2020-05-30' }
|
confirmedAtBlock: 1,
|
||||||
|
}, { gasLimit: 350000 }]],
|
||||||
|
|
||||||
|
['Contribution', 'add', [{
|
||||||
|
contributorId: 1, contributorIpfsHash: 'QmWKCYGr2rSf6abUPaTYqf98urvoZxGrb7dbspFZA6oyVF',
|
||||||
|
date: '2019-04-11', amount: 5000, kind: 'dev',
|
||||||
|
description: '[67P/kredits-contracts] Add tests',
|
||||||
|
url: '',
|
||||||
|
confirmedAtBlock: 1,
|
||||||
|
}, { gasLimit: 350000 }]],
|
||||||
|
|
||||||
|
['Contribution', 'add', [{
|
||||||
|
contributorId: 1, contributorIpfsHash: 'QmWKCYGr2rSf6abUPaTYqf98urvoZxGrb7dbspFZA6oyVF',
|
||||||
|
date: '2019-04-11', amount: 1500, kind: 'dev',
|
||||||
|
description: '[67P/kredits-contracts] Introduce contribution token',
|
||||||
|
url: '',
|
||||||
|
}, { gasLimit: 350000 }]],
|
||||||
|
|
||||||
|
['Contribution', 'add', [{
|
||||||
|
contributorId: 2, contributorIpfsHash: 'QmcHzEeAM26HV2zHTf5HnZrCtCtGdEccL5kUtDakAB7ozB',
|
||||||
|
date: '2019-04-11', amount: 1500, kind: 'design',
|
||||||
|
description: '[67P/kredits-web] Expense UI, first draft',
|
||||||
|
url: '',
|
||||||
|
}, { gasLimit: 350000 }]],
|
||||||
|
|
||||||
|
['Reimbursement', 'add', [{ amount: 346800, recipientId: 2, token: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599', expenses: [
|
||||||
|
{ title: 'Domain kosmos.social', description: 'Yearly registration fee for domain kosmos.social', amount: 69.00, currency: 'EUR', amountSats: 69216, date: '2020-04-30' },
|
||||||
|
], confirmedAtBlock: 1 }, { gasLimit: 300000 }]],
|
||||||
|
|
||||||
|
['Reimbursement', 'add', [{ amount: 1116000, recipientId: 1, token: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599', expenses: [
|
||||||
|
{ title: 'Server rent', description: 'Dedicated server: andromeda.kosmos.org, April 2020', amount: 61, currency: 'EUR', amountSats: 61191, date: '2020-05-28' },
|
||||||
|
{ title: 'Server rent', description: 'Dedicated server: centaurus.kosmos.org, April 2020', amount: 32, currency: 'EUR', amountSats: 32201, date: '2020-05-28' },
|
||||||
|
], confirmedAtBlock: 1 }, { gasLimit: 300000 }]],
|
||||||
|
|
||||||
|
['Reimbursement', 'add', [{ amount: 166800, recipientId: 2, token: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599', expenses: [
|
||||||
|
{ title: 'Domain kosmos.chat', description: 'Yearly registration fee for domain kosmos.chat', amount: 13.90, currency: 'EUR', amountSats: 13944, date: '2020-05-30' },
|
||||||
]}, { gasLimit: 300000 }]],
|
]}, { gasLimit: 300000 }]],
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -31,18 +31,35 @@ contract Reimbursement is Initializable {
|
|||||||
|
|
||||||
uint32 public blocksToWait;
|
uint32 public blocksToWait;
|
||||||
|
|
||||||
|
// The address that deployed the contract
|
||||||
|
address public deployer;
|
||||||
|
|
||||||
|
// Data migration flag
|
||||||
|
bool public migrationDone;
|
||||||
|
|
||||||
event ReimbursementAdded(uint32 id, address indexed addedByAccount, uint256 amount);
|
event ReimbursementAdded(uint32 id, address indexed addedByAccount, uint256 amount);
|
||||||
event ReimbursementVetoed(uint32 id, address vetoedByAccount);
|
event ReimbursementVetoed(uint32 id, address vetoedByAccount);
|
||||||
|
|
||||||
function initialize() public initializer {
|
|
||||||
blocksToWait = 40320; // 7 days; 15 seconds block time
|
|
||||||
}
|
|
||||||
|
|
||||||
modifier onlyCore {
|
modifier onlyCore {
|
||||||
require(contributorContract.addressIsCore(tx.origin), "Core only");
|
require(contributorContract.addressIsCore(tx.origin), "Core only");
|
||||||
_;
|
_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
modifier onlyDeployer {
|
||||||
|
require(msg.sender == deployer, "Deployer only");
|
||||||
|
_;
|
||||||
|
}
|
||||||
|
|
||||||
|
function initialize() public initializer {
|
||||||
|
deployer = msg.sender;
|
||||||
|
migrationDone = false;
|
||||||
|
blocksToWait = 40320; // 7 days; 15 seconds block time
|
||||||
|
}
|
||||||
|
|
||||||
|
function finishMigration() public onlyDeployer {
|
||||||
|
migrationDone = true;
|
||||||
|
}
|
||||||
|
|
||||||
function setContributorContract(address contributor) public {
|
function setContributorContract(address contributor) public {
|
||||||
require(address(contributorContract) == address(0) || contributorContract.addressIsCore(msg.sender), "Core only");
|
require(address(contributorContract) == address(0) || contributorContract.addressIsCore(msg.sender), "Core only");
|
||||||
contributorContract = ContributorInterface(contributor);
|
contributorContract = ContributorInterface(contributor);
|
||||||
@ -82,7 +99,8 @@ contract Reimbursement is Initializable {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function add(uint256 amount, address token, uint32 recipientId, bytes32 hashDigest, uint8 hashFunction, uint8 hashSize) public onlyCore {
|
function add(uint256 amount, address token, uint32 recipientId, bytes32 hashDigest, uint8 hashFunction, uint8 hashSize, uint256 confirmedAtBlock, bool vetoed) public onlyCore {
|
||||||
|
require((confirmedAtBlock == 0 && vetoed == false) || migrationDone == false, "Extra arguments not allowed");
|
||||||
uint32 reimbursementId = reimbursementsCount + 1;
|
uint32 reimbursementId = reimbursementsCount + 1;
|
||||||
ReimbursementData storage r = reimbursements[reimbursementId];
|
ReimbursementData storage r = reimbursements[reimbursementId];
|
||||||
r.exists = true;
|
r.exists = true;
|
||||||
@ -92,7 +110,14 @@ contract Reimbursement is Initializable {
|
|||||||
r.hashDigest = hashDigest;
|
r.hashDigest = hashDigest;
|
||||||
r.hashFunction = hashFunction;
|
r.hashFunction = hashFunction;
|
||||||
r.hashSize = hashSize;
|
r.hashSize = hashSize;
|
||||||
r.confirmedAtBlock = block.number + blocksToWait;
|
|
||||||
|
if (confirmedAtBlock > 0) {
|
||||||
|
r.confirmedAtBlock = confirmedAtBlock;
|
||||||
|
} else {
|
||||||
|
r.confirmedAtBlock = block.number + 1 + blocksToWait;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vetoed) { r.vetoed = true; }
|
||||||
|
|
||||||
reimbursementsCount++;
|
reimbursementsCount++;
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ task("create-wallet", "Creates a new wallet json", async () => {
|
|||||||
*/
|
*/
|
||||||
module.exports = {
|
module.exports = {
|
||||||
solidity: "0.8.2",
|
solidity: "0.8.2",
|
||||||
defaultNetwork: "hardhat",
|
defaultNetwork: "localhost",
|
||||||
networks: {
|
networks: {
|
||||||
hardhat: {
|
hardhat: {
|
||||||
chainId: 1337,
|
chainId: 1337,
|
||||||
|
@ -1 +1 @@
|
|||||||
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"id","type":"uint32"},{"indexed":true,"internalType":"address","name":"addedByAccount","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReimbursementAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"id","type":"uint32"},{"indexed":false,"internalType":"address","name":"vetoedByAccount","type":"address"}],"name":"ReimbursementVetoed","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint32","name":"recipientId","type":"uint32"},{"internalType":"bytes32","name":"hashDigest","type":"bytes32"},{"internalType":"uint8","name":"hashFunction","type":"uint8"},{"internalType":"uint8","name":"hashSize","type":"uint8"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blocksToWait","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contributorContract","outputs":[{"internalType":"contract ContributorInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"reimbursementId","type":"uint32"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"reimbursementId","type":"uint32"}],"name":"get","outputs":[{"internalType":"uint32","name":"id","type":"uint32"},{"internalType":"uint32","name":"recipientId","type":"uint32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"bytes32","name":"hashDigest","type":"bytes32"},{"internalType":"uint8","name":"hashFunction","type":"uint8"},{"internalType":"uint8","name":"hashSize","type":"uint8"},{"internalType":"uint256","name":"confirmedAtBlock","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"bool","name":"vetoed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"contributorId","type":"uint32"}],"name":"getContributorAddressById","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contributorAccount","type":"address"}],"name":"getContributorIdByAddress","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"reimbursements","outputs":[{"internalType":"uint32","name":"recipientId","type":"uint32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"bytes32","name":"hashDigest","type":"bytes32"},{"internalType":"uint8","name":"hashFunction","type":"uint8"},{"internalType":"uint8","name":"hashSize","type":"uint8"},{"internalType":"uint256","name":"confirmedAtBlock","type":"uint256"},{"internalType":"bool","name":"vetoed","type":"bool"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reimbursementsCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contributor","type":"address"}],"name":"setContributorContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"confirmedOnly","type":"bool"}],"name":"totalAmount","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"reimbursementId","type":"uint32"}],"name":"veto","outputs":[],"stateMutability":"nonpayable","type":"function"}]
|
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"id","type":"uint32"},{"indexed":true,"internalType":"address","name":"addedByAccount","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReimbursementAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"id","type":"uint32"},{"indexed":false,"internalType":"address","name":"vetoedByAccount","type":"address"}],"name":"ReimbursementVetoed","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint32","name":"recipientId","type":"uint32"},{"internalType":"bytes32","name":"hashDigest","type":"bytes32"},{"internalType":"uint8","name":"hashFunction","type":"uint8"},{"internalType":"uint8","name":"hashSize","type":"uint8"},{"internalType":"uint256","name":"confirmedAtBlock","type":"uint256"},{"internalType":"bool","name":"vetoed","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blocksToWait","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contributorContract","outputs":[{"internalType":"contract ContributorInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"reimbursementId","type":"uint32"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finishMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"reimbursementId","type":"uint32"}],"name":"get","outputs":[{"internalType":"uint32","name":"id","type":"uint32"},{"internalType":"uint32","name":"recipientId","type":"uint32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"bytes32","name":"hashDigest","type":"bytes32"},{"internalType":"uint8","name":"hashFunction","type":"uint8"},{"internalType":"uint8","name":"hashSize","type":"uint8"},{"internalType":"uint256","name":"confirmedAtBlock","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"bool","name":"vetoed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"contributorId","type":"uint32"}],"name":"getContributorAddressById","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contributorAccount","type":"address"}],"name":"getContributorIdByAddress","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrationDone","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"reimbursements","outputs":[{"internalType":"uint32","name":"recipientId","type":"uint32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"bytes32","name":"hashDigest","type":"bytes32"},{"internalType":"uint8","name":"hashFunction","type":"uint8"},{"internalType":"uint8","name":"hashSize","type":"uint8"},{"internalType":"uint256","name":"confirmedAtBlock","type":"uint256"},{"internalType":"bool","name":"vetoed","type":"bool"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reimbursementsCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contributor","type":"address"}],"name":"setContributorContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"confirmedOnly","type":"bool"}],"name":"totalAmount","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"reimbursementId","type":"uint32"}],"name":"veto","outputs":[],"stateMutability":"nonpayable","type":"function"}]
|
@ -41,6 +41,8 @@ class Contribution extends Record {
|
|||||||
|
|
||||||
async add (contributionAttr, callOptions = {}) {
|
async add (contributionAttr, callOptions = {}) {
|
||||||
const contribution = new ContributionSerializer(contributionAttr);
|
const contribution = new ContributionSerializer(contributionAttr);
|
||||||
|
const confirmedAtBlock = contributionAttr.confirmedAtBlock || 0;
|
||||||
|
const vetoed = contributionAttr.vetoed || false;
|
||||||
|
|
||||||
try { await contribution.validate(); }
|
try { await contribution.validate(); }
|
||||||
catch (error) { return Promise.reject(error); }
|
catch (error) { return Promise.reject(error); }
|
||||||
@ -56,9 +58,11 @@ class Contribution extends Record {
|
|||||||
ipfsHashAttr.hashDigest,
|
ipfsHashAttr.hashDigest,
|
||||||
ipfsHashAttr.hashFunction,
|
ipfsHashAttr.hashFunction,
|
||||||
ipfsHashAttr.hashSize,
|
ipfsHashAttr.hashSize,
|
||||||
|
confirmedAtBlock,
|
||||||
|
vetoed,
|
||||||
];
|
];
|
||||||
|
|
||||||
return this.contract.add(...contribution, 0, false, callOptions);
|
return this.contract.add(...contribution, callOptions);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,6 +52,7 @@ class Contributor extends Record {
|
|||||||
|
|
||||||
const jsonStr = contributor.serialize();
|
const jsonStr = contributor.serialize();
|
||||||
|
|
||||||
|
// console.log('Adding IPFS doc for', contributorAttr.account);
|
||||||
return this.ipfs
|
return this.ipfs
|
||||||
.add(jsonStr)
|
.add(jsonStr)
|
||||||
.then((ipfsHashAttr) => {
|
.then((ipfsHashAttr) => {
|
||||||
@ -62,7 +63,11 @@ class Contributor extends Record {
|
|||||||
ipfsHashAttr.hashSize,
|
ipfsHashAttr.hashSize,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// console.log('Adding onchain record for', contributorAttr.account);
|
||||||
return this.contract.addContributor(...contributor, callOptions);
|
return this.contract.addContributor(...contributor, callOptions);
|
||||||
|
}).catch(err => {
|
||||||
|
console.log('Failed to add IPFS document:', err.message);
|
||||||
|
throw(err);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,6 +23,8 @@ class Reimbursement extends Record {
|
|||||||
const amount = parseInt(attrs.amount);
|
const amount = parseInt(attrs.amount);
|
||||||
const token = attrs.token;
|
const token = attrs.token;
|
||||||
const recipientId = attrs.recipientId;
|
const recipientId = attrs.recipientId;
|
||||||
|
const confirmedAtBlock = attrs.confirmedAtBlock || 0;
|
||||||
|
const vetoed = attrs.vetoed || false;
|
||||||
const expenses = attrs.expenses.map((e) => new ExpenseSerializer(e));
|
const expenses = attrs.expenses.map((e) => new ExpenseSerializer(e));
|
||||||
let errorMessage;
|
let errorMessage;
|
||||||
|
|
||||||
@ -56,6 +58,8 @@ class Reimbursement extends Record {
|
|||||||
ipfsHashAttr.hashDigest,
|
ipfsHashAttr.hashDigest,
|
||||||
ipfsHashAttr.hashFunction,
|
ipfsHashAttr.hashFunction,
|
||||||
ipfsHashAttr.hashSize,
|
ipfsHashAttr.hashSize,
|
||||||
|
confirmedAtBlock,
|
||||||
|
vetoed,
|
||||||
];
|
];
|
||||||
|
|
||||||
return this.contract.add(...reimbursement, callOptions);
|
return this.contract.add(...reimbursement, callOptions);
|
||||||
|
@ -29,6 +29,7 @@ class ExpenseSerializer {
|
|||||||
description,
|
description,
|
||||||
currency,
|
currency,
|
||||||
amount,
|
amount,
|
||||||
|
amountSats,
|
||||||
date,
|
date,
|
||||||
url,
|
url,
|
||||||
tags,
|
tags,
|
||||||
@ -42,6 +43,7 @@ class ExpenseSerializer {
|
|||||||
description,
|
description,
|
||||||
currency,
|
currency,
|
||||||
amount,
|
amount,
|
||||||
|
amountSats,
|
||||||
date,
|
date,
|
||||||
'tags': tags || [],
|
'tags': tags || [],
|
||||||
'details': details || {},
|
'details': details || {},
|
||||||
@ -76,6 +78,7 @@ class ExpenseSerializer {
|
|||||||
description,
|
description,
|
||||||
currency,
|
currency,
|
||||||
amount,
|
amount,
|
||||||
|
amountSats,
|
||||||
date,
|
date,
|
||||||
url,
|
url,
|
||||||
tags,
|
tags,
|
||||||
@ -87,6 +90,7 @@ class ExpenseSerializer {
|
|||||||
description,
|
description,
|
||||||
currency,
|
currency,
|
||||||
amount,
|
amount,
|
||||||
|
amountSats,
|
||||||
date,
|
date,
|
||||||
url,
|
url,
|
||||||
tags,
|
tags,
|
||||||
|
@ -9,6 +9,13 @@ class IPFS {
|
|||||||
}
|
}
|
||||||
this._config = config;
|
this._config = config;
|
||||||
this._ipfsAPI = ipfsClient.create(config);
|
this._ipfsAPI = ipfsClient.create(config);
|
||||||
|
|
||||||
|
this._ipfsAPI.id().then(res => {
|
||||||
|
console.debug('IPFS ID:', res.id);
|
||||||
|
}).catch(e => {
|
||||||
|
console.debug('IPFS config:', config);
|
||||||
|
console.warn('Failed to initialize IPFS:', e.message);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async catAndMerge (contractData, deserialize) {
|
async catAndMerge (contractData, deserialize) {
|
||||||
|
18
package-lock.json
generated
18
package-lock.json
generated
@ -1,15 +1,15 @@
|
|||||||
{
|
{
|
||||||
"name": "@kredits/contracts",
|
"name": "@kredits/contracts",
|
||||||
"version": "7.3.0",
|
"version": "7.5.0",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "@kredits/contracts",
|
"name": "@kredits/contracts",
|
||||||
"version": "7.3.0",
|
"version": "7.5.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@kosmos/schemas": "^3.1.0",
|
"@kosmos/schemas": "^3.2.0",
|
||||||
"ethers": "^5.4.7",
|
"ethers": "^5.4.7",
|
||||||
"ipfs-http-client": "^56.0.3",
|
"ipfs-http-client": "^56.0.3",
|
||||||
"multihashes": "^4.0.3",
|
"multihashes": "^4.0.3",
|
||||||
@ -1022,9 +1022,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@kosmos/schemas": {
|
"node_modules/@kosmos/schemas": {
|
||||||
"version": "3.1.0",
|
"version": "3.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/@kosmos/schemas/-/schemas-3.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@kosmos/schemas/-/schemas-3.2.0.tgz",
|
||||||
"integrity": "sha512-yOTK5WiXFDNAitPByMabE365aEEzFHgSUSgAssbJWt7BZ80HQSVu8XWrQiTbFbCkoIBmXwPP/RoxgXJQVgZTFQ=="
|
"integrity": "sha512-GyWXmWcATcakmEdPOpafdckBgWFqcpSh+tB8nm11VGgtgA94pfoFhKZ3t88WELItKfuP/GFHgMiZmdMB3bSkdQ=="
|
||||||
},
|
},
|
||||||
"node_modules/@metamask/eth-sig-util": {
|
"node_modules/@metamask/eth-sig-util": {
|
||||||
"version": "4.0.1",
|
"version": "4.0.1",
|
||||||
@ -20786,9 +20786,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@kosmos/schemas": {
|
"@kosmos/schemas": {
|
||||||
"version": "3.1.0",
|
"version": "3.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/@kosmos/schemas/-/schemas-3.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@kosmos/schemas/-/schemas-3.2.0.tgz",
|
||||||
"integrity": "sha512-yOTK5WiXFDNAitPByMabE365aEEzFHgSUSgAssbJWt7BZ80HQSVu8XWrQiTbFbCkoIBmXwPP/RoxgXJQVgZTFQ=="
|
"integrity": "sha512-GyWXmWcATcakmEdPOpafdckBgWFqcpSh+tB8nm11VGgtgA94pfoFhKZ3t88WELItKfuP/GFHgMiZmdMB3bSkdQ=="
|
||||||
},
|
},
|
||||||
"@metamask/eth-sig-util": {
|
"@metamask/eth-sig-util": {
|
||||||
"version": "4.0.1",
|
"version": "4.0.1",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@kredits/contracts",
|
"name": "@kredits/contracts",
|
||||||
"version": "7.3.0",
|
"version": "7.5.0",
|
||||||
"description": "Smart contracts and JavaScript API for Kredits",
|
"description": "Smart contracts and JavaScript API for Kredits",
|
||||||
"main": "./lib/kredits.js",
|
"main": "./lib/kredits.js",
|
||||||
"directories": {
|
"directories": {
|
||||||
@ -22,7 +22,9 @@
|
|||||||
"lint:contract-tests": "eslint apps/*/test",
|
"lint:contract-tests": "eslint apps/*/test",
|
||||||
"lint:wrapper": "eslint lib/",
|
"lint:wrapper": "eslint lib/",
|
||||||
"test": "hardhat test",
|
"test": "hardhat test",
|
||||||
"setup-git-hooks": "sh scripts/git-hooks/install"
|
"setup-git-hooks": "sh scripts/git-hooks/install",
|
||||||
|
"preversion": "npm test && npm run build",
|
||||||
|
"version": "git add lib/abis"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -64,7 +66,7 @@
|
|||||||
"yargs": "^15.0.0"
|
"yargs": "^15.0.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@kosmos/schemas": "^3.1.0",
|
"@kosmos/schemas": "^3.2.0",
|
||||||
"ethers": "^5.4.7",
|
"ethers": "^5.4.7",
|
||||||
"ipfs-http-client": "^56.0.3",
|
"ipfs-http-client": "^56.0.3",
|
||||||
"multihashes": "^4.0.3",
|
"multihashes": "^4.0.3",
|
||||||
|
@ -39,7 +39,7 @@ async function main() {
|
|||||||
contractWrapper.contract[method];
|
contractWrapper.contract[method];
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// console.log('trying', func);
|
// console.log('trying', contractName, method, args);
|
||||||
const result = await func.apply(contractWrapper, args);
|
const result = await func.apply(contractWrapper, args);
|
||||||
// console.log('result:', result);
|
// console.log('result:', result);
|
||||||
await result.wait();
|
await result.wait();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user