ss import: retry with delay for adding post to chain
	
		
			
	
		
	
	
		
			
				
	
				Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 40s
				
					Details
				
			
		
	
				
					
				
			
				
	
				Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 40s
				
					Details
				
			
		
	This commit is contained in:
		
							parent
							
								
									c62c36238a
								
							
						
					
					
						commit
						c643f0d952
					
				| 
						 | 
				
			
			@ -58,9 +58,7 @@ const fetchWithRetry = async (url, retryDelay = 5000) => {
 | 
			
		|||
    throw requestError;
 | 
			
		||||
  } else if (retry) {
 | 
			
		||||
    console.log('retry delay (sec):', retryDelay / 1000);
 | 
			
		||||
    await new Promise((resolve) => {
 | 
			
		||||
      setTimeout(resolve, retryDelay);
 | 
			
		||||
    });
 | 
			
		||||
    await Promise.delay(retryDelay);
 | 
			
		||||
    responseData = await fetchWithRetry(url, retryDelay * 2);
 | 
			
		||||
  } else {
 | 
			
		||||
    responseData = response.data;
 | 
			
		||||
| 
						 | 
				
			
			@ -153,6 +151,22 @@ HREF ${paper.url}`;
 | 
			
		|||
  };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const addPostWithRetry = async (authors, hash, citations, retryDelay = 5000) => {
 | 
			
		||||
  try {
 | 
			
		||||
    await dao.addPost(authors, hash, citations);
 | 
			
		||||
  } catch (e) {
 | 
			
		||||
    if (e.code === 'REPLACEMENT_UNDERPRICED') {
 | 
			
		||||
      console.log('retry delay (sec):', retryDelay / 1000);
 | 
			
		||||
      await Promise.delay(retryDelay);
 | 
			
		||||
      return addPostWithRetry(authors, hash, citations, retryDelay * 2);
 | 
			
		||||
    } if (e.reason === 'A post with this contentId already exists') {
 | 
			
		||||
      return { alreadyAdded: true };
 | 
			
		||||
    }
 | 
			
		||||
    throw e;
 | 
			
		||||
  }
 | 
			
		||||
  return { alreadyAdded: false };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const importPaper = async (paper) => {
 | 
			
		||||
  console.log('references count:', paper.references.length);
 | 
			
		||||
  const { paperId } = paper;
 | 
			
		||||
| 
						 | 
				
			
			@ -188,19 +202,15 @@ const importPaper = async (paper) => {
 | 
			
		|||
    authors, content, signature, embeddedData, citations,
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  // Add the post to the form (on-chain)
 | 
			
		||||
  try {
 | 
			
		||||
    await dao.addPost(authors, hash, citations);
 | 
			
		||||
  } catch (e) {
 | 
			
		||||
    if (e.reason === 'A post with this contentId already exists') {
 | 
			
		||||
      console.log(`Post already added for paper ${paperId}`);
 | 
			
		||||
      return { paperId, postId: hash, alreadyAdded: true };
 | 
			
		||||
    }
 | 
			
		||||
    throw e;
 | 
			
		||||
  // Add the post to the forum (on-chain)
 | 
			
		||||
  const { alreadyAdded } = await addPostWithRetry(authors, hash, citations);
 | 
			
		||||
  if (alreadyAdded) {
 | 
			
		||||
    console.log(`Post already added for paper ${paperId}`);
 | 
			
		||||
  } else {
 | 
			
		||||
    console.log(`Added post to blockchain for paper ${paperId}`);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  console.log(`Added post to blockchain for paper ${paperId}`);
 | 
			
		||||
  return { paperId, postId: hash };
 | 
			
		||||
  return { paperId, postId: hash, alreadyAdded };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
module.exports = async (req, res) => {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,8 +5,6 @@ import "./core/DAO.sol";
 | 
			
		|||
import "./interfaces/IOnValidate.sol";
 | 
			
		||||
import "./interfaces/IOnProposalAccepted.sol";
 | 
			
		||||
 | 
			
		||||
import "hardhat/console.sol";
 | 
			
		||||
 | 
			
		||||
contract Proposals is DAOContract, IOnValidate {
 | 
			
		||||
    enum Stage {
 | 
			
		||||
        Proposal,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,6 @@ import "./core/Forum.sol";
 | 
			
		|||
import "./Proposals.sol";
 | 
			
		||||
import "./interfaces/IAcceptAvailability.sol";
 | 
			
		||||
import "./interfaces/IOnProposalAccepted.sol";
 | 
			
		||||
import "hardhat/console.sol";
 | 
			
		||||
 | 
			
		||||
abstract contract WorkContract is
 | 
			
		||||
    DAOContract,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,6 @@ import "./Reputation.sol";
 | 
			
		|||
import "./ValidationPools.sol";
 | 
			
		||||
import "./Forum.sol";
 | 
			
		||||
import "../interfaces/IAcceptAvailability.sol";
 | 
			
		||||
import "hardhat/console.sol";
 | 
			
		||||
 | 
			
		||||
contract DAO is Reputation, Forum, ValidationPools {
 | 
			
		||||
    /// Authorize a contract to transfer REP, and call that contract's acceptAvailability method
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,6 @@
 | 
			
		|||
pragma solidity ^0.8.24;
 | 
			
		||||
 | 
			
		||||
import "./Reputation.sol";
 | 
			
		||||
import "hardhat/console.sol";
 | 
			
		||||
 | 
			
		||||
struct Citation {
 | 
			
		||||
    int weightPPM;
 | 
			
		||||
| 
						 | 
				
			
			@ -23,6 +22,12 @@ struct Post {
 | 
			
		|||
    // TODO: timestamp
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// struct PostParams {
 | 
			
		||||
//     string contentId;
 | 
			
		||||
//     Author[] authors;
 | 
			
		||||
//     Citation[] citations;
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
contract Forum is Reputation {
 | 
			
		||||
    mapping(string => Post) public posts;
 | 
			
		||||
    string[] public postIds;
 | 
			
		||||
| 
						 | 
				
			
			@ -88,6 +93,16 @@ contract Forum is Reputation {
 | 
			
		|||
        emit PostAdded(contentId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // function addPosts(PostParams[] calldata postParams) external {
 | 
			
		||||
    //     for (uint i = 0; i < postParams.length; i++) {
 | 
			
		||||
    //         this.addPost(
 | 
			
		||||
    //             postParams[i].authors,
 | 
			
		||||
    //             postParams[i].contentId,
 | 
			
		||||
    //             postParams[i].citations
 | 
			
		||||
    //         );
 | 
			
		||||
    //     }
 | 
			
		||||
    // }
 | 
			
		||||
 | 
			
		||||
    function getPostAuthors(
 | 
			
		||||
        string calldata postId
 | 
			
		||||
    ) external view returns (Author[] memory) {
 | 
			
		||||
| 
						 | 
				
			
			@ -95,10 +110,6 @@ contract Forum is Reputation {
 | 
			
		|||
        return post.authors;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function _onValidatePost(string memory postId, uint amount) internal {
 | 
			
		||||
        _propagateReputation(postId, int(amount), false, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function _handleCitation(
 | 
			
		||||
        string memory postId,
 | 
			
		||||
        Citation memory citation,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,6 @@ pragma solidity ^0.8.24;
 | 
			
		|||
import "./Reputation.sol";
 | 
			
		||||
import "./Forum.sol";
 | 
			
		||||
import "../interfaces/IOnValidate.sol";
 | 
			
		||||
import "hardhat/console.sol";
 | 
			
		||||
 | 
			
		||||
struct ValidationPoolStake {
 | 
			
		||||
    uint id;
 | 
			
		||||
| 
						 | 
				
			
			@ -243,7 +242,12 @@ contract ValidationPools is Reputation, Forum {
 | 
			
		|||
            }
 | 
			
		||||
 | 
			
		||||
            // Transfer REP to the forum instead of to the author directly
 | 
			
		||||
            _onValidatePost(pool.postId, pool.minted / 2 + remainder);
 | 
			
		||||
            _propagateReputation(
 | 
			
		||||
                pool.postId,
 | 
			
		||||
                int(pool.minted / 2 + remainder),
 | 
			
		||||
                false,
 | 
			
		||||
                0
 | 
			
		||||
            );
 | 
			
		||||
        } else {
 | 
			
		||||
            // If vote does not pass, divide the losing stake among the winners
 | 
			
		||||
            totalRewards += pool.minted;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -63,6 +63,37 @@ describe('Forum', () => {
 | 
			
		|||
      expect(postAuthors[0].authorAddress).to.equal(account1);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // it('should be able to add multiple posts', async () => {
 | 
			
		||||
    //   await expect(dao.addPost([{
 | 
			
		||||
    //     authors: [{ weightPPM: 100, authorAddress: account1 }],
 | 
			
		||||
    //     contentId: 'some-id',
 | 
			
		||||
    //     citations: [],
 | 
			
		||||
    //   }, {
 | 
			
		||||
    //     authors: [{ weightPPM: 100, authorAddress: account2 }],
 | 
			
		||||
    //     contentId: 'some-other-id',
 | 
			
		||||
    //     citations: [],
 | 
			
		||||
 | 
			
		||||
    //   },
 | 
			
		||||
    //   ]))
 | 
			
		||||
    //     .to.emit(dao, 'PostAdded').withArgs('some-id')
 | 
			
		||||
    //     .to.emit(dao, 'PostAdded').withArgs('some-other-id');
 | 
			
		||||
    //   let post = await dao.posts('some-id');
 | 
			
		||||
    //   expect(post.sender).to.equal(account1);
 | 
			
		||||
    //   expect(post.id).to.equal('some-id');
 | 
			
		||||
    //   let postAuthors = await dao.getPostAuthors('some-id');
 | 
			
		||||
    //   expect(postAuthors).to.have.length(1);
 | 
			
		||||
    //   expect(postAuthors[0].weightPPM).to.equal(1000000);
 | 
			
		||||
    //   expect(postAuthors[0].authorAddress).to.equal(account1);
 | 
			
		||||
 | 
			
		||||
    //   post = await dao.posts('some-other-id');
 | 
			
		||||
    //   expect(post.sender).to.equal(account2);
 | 
			
		||||
    //   expect(post.id).to.equal('some-other-id');
 | 
			
		||||
    //   postAuthors = await dao.getPostAuthors('some-other-id');
 | 
			
		||||
    //   expect(postAuthors).to.have.length(1);
 | 
			
		||||
    //   expect(postAuthors[0].weightPPM).to.equal(1000000);
 | 
			
		||||
    //   expect(postAuthors[0].authorAddress).to.equal(account2);
 | 
			
		||||
    // });
 | 
			
		||||
 | 
			
		||||
    it('should be able to add a post on behalf of another account', async () => {
 | 
			
		||||
      const contentId = 'some-id';
 | 
			
		||||
      await addPost(account2, contentId, []);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue