mirror of https://github.com/certusone/oyster.git
feat: add PostMessage instruction
This commit is contained in:
parent
e52d6acc61
commit
0b37707fc4
|
@ -0,0 +1,45 @@
|
|||
import { Account, PublicKey, TransactionInstruction } from '@solana/web3.js';
|
||||
import { ParsedAccount } from '@oyster/common';
|
||||
|
||||
import { Proposal } from '../../models/accounts';
|
||||
|
||||
import { sendTransactionWithNotifications } from '../../tools/transactions';
|
||||
import { RpcContext } from '../../models/core/api';
|
||||
import { withPostMessage } from '../../models/chat/withPostMessage';
|
||||
import { MessageBody } from '../../models/chat/accounts';
|
||||
|
||||
export const postMessage = async (
|
||||
{ connection, wallet, programId, walletPubkey }: RpcContext,
|
||||
proposal: ParsedAccount<Proposal>,
|
||||
tokeOwnerRecord: PublicKey,
|
||||
replyTo: PublicKey | undefined,
|
||||
body: MessageBody,
|
||||
) => {
|
||||
let signers: Account[] = [];
|
||||
let instructions: TransactionInstruction[] = [];
|
||||
|
||||
let governanceAuthority = walletPubkey;
|
||||
let payer = walletPubkey;
|
||||
|
||||
await withPostMessage(
|
||||
instructions,
|
||||
signers,
|
||||
programId,
|
||||
proposal.info.governance,
|
||||
proposal.pubkey,
|
||||
tokeOwnerRecord,
|
||||
governanceAuthority,
|
||||
payer,
|
||||
replyTo,
|
||||
body,
|
||||
);
|
||||
|
||||
await sendTransactionWithNotifications(
|
||||
connection,
|
||||
wallet,
|
||||
instructions,
|
||||
signers,
|
||||
'Posting message',
|
||||
'Message post',
|
||||
);
|
||||
};
|
|
@ -1,6 +1,10 @@
|
|||
import { PublicKey } from '@solana/web3.js';
|
||||
import BN from 'bn.js';
|
||||
|
||||
export const governanceChatProgramId = new PublicKey(
|
||||
'gCHAtYKrUUktTVzE4hEnZdLV4LXrdBf6Hh9qMaJALET',
|
||||
);
|
||||
|
||||
export enum GovernanceChatAccountType {
|
||||
Uninitialized = 0,
|
||||
ChatMessage = 1,
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
import { MessageBody } from './accounts';
|
||||
|
||||
export enum GovernanceChatInstruction {
|
||||
PostMessage = 0,
|
||||
}
|
||||
|
||||
export class PostMessageArgs {
|
||||
instruction: GovernanceChatInstruction =
|
||||
GovernanceChatInstruction.PostMessage;
|
||||
body: MessageBody;
|
||||
|
||||
constructor(args: { body: MessageBody }) {
|
||||
this.body = args.body;
|
||||
}
|
||||
}
|
|
@ -4,6 +4,7 @@ import {
|
|||
MessageBody,
|
||||
} from './accounts';
|
||||
import { BorshAccountParser } from '../core/serialisation';
|
||||
import { PostMessageArgs } from './instructions';
|
||||
|
||||
export const GOVERNANCE_CHAT_SCHEMA = new Map<any, any>([
|
||||
[
|
||||
|
@ -30,6 +31,16 @@ export const GOVERNANCE_CHAT_SCHEMA = new Map<any, any>([
|
|||
],
|
||||
},
|
||||
],
|
||||
[
|
||||
PostMessageArgs,
|
||||
{
|
||||
kind: 'struct',
|
||||
fields: [
|
||||
['instruction', 'u8'],
|
||||
['body', MessageBody],
|
||||
],
|
||||
},
|
||||
],
|
||||
]);
|
||||
|
||||
export const ChatAccountParser = (classType: GovernanceChatAccountClass) =>
|
||||
|
|
|
@ -0,0 +1,93 @@
|
|||
import { utils } from '@oyster/common';
|
||||
import {
|
||||
Account,
|
||||
PublicKey,
|
||||
SYSVAR_RENT_PUBKEY,
|
||||
TransactionInstruction,
|
||||
} from '@solana/web3.js';
|
||||
import { GOVERNANCE_CHAT_SCHEMA } from './serialisation';
|
||||
import { serialize } from 'borsh';
|
||||
import { PostMessageArgs } from './instructions';
|
||||
import { governanceChatProgramId, MessageBody } from './accounts';
|
||||
|
||||
export async function withPostMessage(
|
||||
instructions: TransactionInstruction[],
|
||||
signers: Account[],
|
||||
governanceProgramId: PublicKey,
|
||||
governance: PublicKey,
|
||||
proposal: PublicKey,
|
||||
tokenOwnerRecord: PublicKey,
|
||||
governanceAuthority: PublicKey,
|
||||
payer: PublicKey,
|
||||
replyTo: PublicKey | undefined,
|
||||
body: MessageBody,
|
||||
) {
|
||||
const { system: systemId } = utils.programIds();
|
||||
|
||||
const args = new PostMessageArgs({
|
||||
body,
|
||||
});
|
||||
|
||||
const data = Buffer.from(serialize(GOVERNANCE_CHAT_SCHEMA, args));
|
||||
|
||||
const chatMessage = new PublicKey('');
|
||||
|
||||
let keys = [
|
||||
{
|
||||
pubkey: governanceProgramId,
|
||||
isWritable: false,
|
||||
isSigner: false,
|
||||
},
|
||||
{
|
||||
pubkey: governance,
|
||||
isWritable: false,
|
||||
isSigner: false,
|
||||
},
|
||||
{
|
||||
pubkey: proposal,
|
||||
isWritable: false,
|
||||
isSigner: false,
|
||||
},
|
||||
{
|
||||
pubkey: tokenOwnerRecord,
|
||||
isWritable: false,
|
||||
isSigner: false,
|
||||
},
|
||||
{
|
||||
pubkey: governanceAuthority,
|
||||
isWritable: false,
|
||||
isSigner: true,
|
||||
},
|
||||
{
|
||||
pubkey: chatMessage,
|
||||
isWritable: true,
|
||||
isSigner: true,
|
||||
},
|
||||
{
|
||||
pubkey: payer,
|
||||
isWritable: false,
|
||||
isSigner: true,
|
||||
},
|
||||
{
|
||||
pubkey: systemId,
|
||||
isWritable: false,
|
||||
isSigner: false,
|
||||
},
|
||||
];
|
||||
|
||||
if (replyTo) {
|
||||
keys.push({
|
||||
pubkey: replyTo,
|
||||
isWritable: false,
|
||||
isSigner: false,
|
||||
});
|
||||
}
|
||||
|
||||
instructions.push(
|
||||
new TransactionInstruction({
|
||||
keys,
|
||||
programId: governanceChatProgramId,
|
||||
data,
|
||||
}),
|
||||
);
|
||||
}
|
Loading…
Reference in New Issue