This issue covers the parts of the Stacks blockchain provider associated with blockchain data retrieval. This includes fetching the latest block height, checking message statuses, querying account balances, extracting cross-chain messages from blocks, and obtaining transaction receipts.
Implement QueryLatestHeight()
This method should query and return the latest block height from the Stacks blockchain.
func (p *Provider) QueryLatestHeight(ctx context.Context) (uint64, error)
Implement ShouldReceiveMessage() and ShouldSendMessage()
These methods always return true, nil, consistent with the ICON and EVM implementations.
func (p *Provider) ShouldReceiveMessage(ctx context.Context, messagekey *types.Message) (bool, error) {
return true, nil
}
func (p *Provider) ShouldSendMessage(ctx context.Context, messageKey *types.Message) (bool, error) {
return true, nil
}
Implement QueryBalance()
This method should query and return the balance of a given Stacks address.
func (p *Provider) QueryBalance(ctx context.Context, addr string) (*types.Coin, error)
Implement GenerateMessages()
This method should:
- Retrieve the Stacks block at the height specified in the key parameter.
- Iterate through the transactions in the block.
- Identify and extract relevant cross-chain events from the transaction logs.
For each relevant event:
- Parse the event data according to Stacks-specific formats.
- Create a types.Message object with the parsed data.
- Return an array of all extracted and parsed types.Message objects.
func (p *Provider) GenerateMessages(ctx context.Context, key *types.MessageKeyWithMessageHeight) ([]*types.Message, error)
Implement QueryTransactionReceipt
This method should query and return the receipt for a given transaction hash on the Stacks blockchain.
func (p *Provider) QueryTransactionReceipt(ctx context.Context, txHash string) (*types.Receipt, error)
Acceptance Criteria
QueryLatestHeight successfully retrieves the latest block height from the Stacks blockchain or returns an error if the Stacks node is unreachable or returns invalid data.
ShouldReceiveMessage and ShouldSendMessage both return true, nil
QueryBalance correctly retrieves the balance for a given Stacks address or returns an error if the Stacks node is unreachable or returns invalid data, or the address is invalid.
GenerateMessages successfully retrieves the block for the given height from the Stacks blockchain, correctly identifies and extracts all relevant cross-chain events from the block's transactions, and accurately parses event data into types.Message objects, including all required fields (MessageHeight, EventType, Src, Dst, Sn, Data) for both EmitMessage and CallMessage. It returns an empty slice and no error if no relevant events are found in the block and returns an error if the block retrieval fails or if there are issues parsing the event data
QueryTransactionReceipt successfully retrieves the transaction receipt for a given transaction hash and correctly populates the types.Receipt struct. It returns an error for non-existent or invalid transaction hashes.
- Unit tests cover all methods and edge cases with >80% code coverage
- Integration tests confirm functionality against Stacks testnet
This issue covers the parts of the Stacks blockchain provider associated with blockchain data retrieval. This includes fetching the latest block height, checking message statuses, querying account balances, extracting cross-chain messages from blocks, and obtaining transaction receipts.
Implement QueryLatestHeight()
This method should query and return the latest block height from the Stacks blockchain.
func (p *Provider) QueryLatestHeight(ctx context.Context) (uint64, error)Implement
ShouldReceiveMessage()andShouldSendMessage()These methods always return
true, nil, consistent with the ICON and EVM implementations.Implement QueryBalance()
This method should query and return the balance of a given Stacks address.
func (p *Provider) QueryBalance(ctx context.Context, addr string) (*types.Coin, error)Implement GenerateMessages()
This method should:
For each relevant event:
func (p *Provider) GenerateMessages(ctx context.Context, key *types.MessageKeyWithMessageHeight) ([]*types.Message, error)Implement
QueryTransactionReceiptThis method should query and return the receipt for a given transaction hash on the Stacks blockchain.
func (p *Provider) QueryTransactionReceipt(ctx context.Context, txHash string) (*types.Receipt, error)Acceptance Criteria
QueryLatestHeightsuccessfully retrieves the latest block height from the Stacks blockchain or returns an error if the Stacks node is unreachable or returns invalid data.ShouldReceiveMessageandShouldSendMessageboth returntrue, nilQueryBalancecorrectly retrieves the balance for a given Stacks address or returns an error if the Stacks node is unreachable or returns invalid data, or the address is invalid.GenerateMessagessuccessfully retrieves the block for the given height from the Stacks blockchain, correctly identifies and extracts all relevant cross-chain events from the block's transactions, and accurately parses event data intotypes.Messageobjects, including all required fields (MessageHeight,EventType,Src,Dst,Sn,Data) for bothEmitMessageandCallMessage. It returns an empty slice and no error if no relevant events are found in the block and returns an error if the block retrieval fails or if there are issues parsing the event dataQueryTransactionReceiptsuccessfully retrieves the transaction receipt for a given transaction hash and correctly populates thetypes.Receiptstruct. It returns an error for non-existent or invalid transaction hashes.