Skip to content
This repository has been archived by the owner on Jan 16, 2025. It is now read-only.

Commit

Permalink
Merge pull request #140 from xmtp/nm/update-frames-validator-protos
Browse files Browse the repository at this point in the history
Update frames validator protos and library
  • Loading branch information
neekolas authored Feb 6, 2024
2 parents 132f4a2 + 05dbcf6 commit 85dba7f
Show file tree
Hide file tree
Showing 7 changed files with 72 additions and 75 deletions.
5 changes: 5 additions & 0 deletions .changeset/large-adults-lick.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@xmtp/frames-validator": minor
---

Update to latest version of our protos
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
"ts-jest": "^29.1.1",
"ts-node": "^10.9.1",
"turbo": "^1.10.16",
"typescript": "~5.2.2",
"typescript": "^5.3.3",
"vitest": "^0.34.6"
},
"packageManager": "[email protected]"
Expand Down
5 changes: 3 additions & 2 deletions packages/frames-validator/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
"provenance": true
},
"dependencies": {
"@xmtp/proto": "3.41.0-beta.2",
"@xmtp/proto": "3.41.0-beta.5",
"@xmtp/xmtp-js": "^11.3.5"
},
"scripts": {
Expand All @@ -32,8 +32,9 @@
"homepage": "https://github.com/xmtp/xmtp-node-js-tools#readme",
"packageManager": "[email protected]",
"devDependencies": {
"@xmtp/frames-client": "^0.1.2",
"@xmtp/frames-client": "^0.2.0",
"ethers": "^6.10.0",
"typescript": "^5.3.3",
"vitest": "^1.0.1"
}
}
40 changes: 20 additions & 20 deletions packages/frames-validator/src/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ describe("validations", () => {
let framesClient: FramesClient

const FRAME_URL = "https://frame.xyz"
const CONVERSATION_IDENTIFIER = "/xmtp/0/1234"
const MESSAGE_ID = "abcdefg"
const CONVERSATION_TOPIC = "/xmtp/0/1234"
const PARTICIPANT_ACCOUNT_ADDRESSES = ["0x1234", "0x5678"]
const BUTTON_INDEX = 2

beforeEach(async () => {
Expand All @@ -31,23 +31,23 @@ describe("validations", () => {
framesClient = new FramesClient(client)
})
it("succeeds in the happy path", async () => {
const postData = await framesClient.signFrameAction(
FRAME_URL,
BUTTON_INDEX,
CONVERSATION_IDENTIFIER,
MESSAGE_ID,
)
const postData = await framesClient.signFrameAction({
buttonIndex: BUTTON_INDEX,
frameUrl: FRAME_URL,
conversationTopic: CONVERSATION_TOPIC,
participantAccountAddresses: PARTICIPANT_ACCOUNT_ADDRESSES,
})
const validated = await validateFramesPost(postData)
expect(validated.verifiedWalletAddress).toEqual(client.address)
})

it("fails if the signature verification fails", async () => {
const postData = await framesClient.signFrameAction(
FRAME_URL,
BUTTON_INDEX,
CONVERSATION_IDENTIFIER,
MESSAGE_ID,
)
const postData = await framesClient.signFrameAction({
buttonIndex: BUTTON_INDEX,
frameUrl: FRAME_URL,
conversationTopic: CONVERSATION_TOPIC,
participantAccountAddresses: PARTICIPANT_ACCOUNT_ADDRESSES,
})
// Monkey around with the signature
const deserialized = deserializeProtoMessage(
b64Decode(postData.trustedData.messageBytes),
Expand Down Expand Up @@ -76,12 +76,12 @@ describe("validations", () => {
})

it("fails if the wallet address doesn't match", async () => {
const postData = await framesClient.signFrameAction(
FRAME_URL,
BUTTON_INDEX,
CONVERSATION_IDENTIFIER,
MESSAGE_ID,
)
const postData = await framesClient.signFrameAction({
buttonIndex: BUTTON_INDEX,
frameUrl: FRAME_URL,
conversationTopic: CONVERSATION_TOPIC,
participantAccountAddresses: PARTICIPANT_ACCOUNT_ADDRESSES,
})
// Monkey around with the signature
const deserialized = deserializeProtoMessage(
b64Decode(postData.trustedData.messageBytes),
Expand Down
26 changes: 14 additions & 12 deletions packages/frames-validator/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ export async function validateFramesPost(data: FramePostPayload) {
await checkUntrustedData(untrustedData, actionBody)

return {
untrustedData,
trustedData,
actionBody,
verifiedWalletAddress,
}
}
Expand Down Expand Up @@ -72,26 +71,29 @@ async function getVerifiedWalletAddress(
}

async function checkUntrustedData(
untrusted: FramePostUntrustedData,
{
url,
buttonIndex,
opaqueConversationIdentifier,
timestamp,
}: FramePostUntrustedData,
actionBody: frames.FrameActionBody,
) {
const { url, messageId, buttonIndex, conversationIdentifier } = untrusted

if (new TextDecoder().decode(actionBody.frameUrl) !== url) {
if (actionBody.frameUrl !== url) {
throw new Error("Mismatched URL")
}

if (
new TextDecoder().decode(actionBody.buttonIndex) !== buttonIndex.toString()
) {
if (actionBody.buttonIndex !== buttonIndex) {
throw new Error("Mismatched button index")
}

if (actionBody.conversationIdentifier !== conversationIdentifier) {
if (
actionBody.opaqueConversationIdentifier !== opaqueConversationIdentifier
) {
throw new Error("Mismatched conversation identifier")
}

if (actionBody.messageId !== messageId) {
throw new Error("Mismatched message identifier")
if (actionBody.timestamp.toNumber() !== timestamp) {
throw new Error("Mismatched timestamp")
}
}
11 changes: 5 additions & 6 deletions packages/frames-validator/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
export type FramePostUntrustedData = {
walletAddress: string
url: string
messageId: string
timestamp: number
buttonIndex: number
conversationIdentifier: string
walletAddress: string // Untrusted version of the wallet address
url: string // Frame URL. May be different from the `post_url` this is being sent to
timestamp: number // Timestamp in milliseconds
buttonIndex: number // 1-indexed button that was clicked
opaqueConversationIdentifier: string // A hash of the conversation topic and the participants
}

export type FramePostTrustedData = {
Expand Down
58 changes: 24 additions & 34 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1902,6 +1902,13 @@ __metadata:
languageName: node
linkType: hard

"@noble/hashes@npm:^1.3.3":
version: 1.3.3
resolution: "@noble/hashes@npm:1.3.3"
checksum: 1025ddde4d24630e95c0818e63d2d54ee131b980fe113312d17ed7468bc18f54486ac86c907685759f8a7e13c2f9b9e83ec7b67d1cc20836f36b5e4a65bb102d
languageName: node
linkType: hard

"@noble/secp256k1@npm:^1.5.2":
version: 1.7.1
resolution: "@noble/secp256k1@npm:1.7.1"
Expand Down Expand Up @@ -2944,7 +2951,7 @@ __metadata:
ts-jest: "npm:^29.1.1"
ts-node: "npm:^10.9.1"
turbo: "npm:^1.10.16"
typescript: "npm:~5.2.2"
typescript: "npm:^5.3.3"
vitest: "npm:^0.34.6"
languageName: unknown
linkType: soft
Expand Down Expand Up @@ -2978,25 +2985,28 @@ __metadata:
languageName: unknown
linkType: soft

"@xmtp/frames-client@npm:^0.1.2":
version: 0.1.2
resolution: "@xmtp/frames-client@npm:0.1.2"
"@xmtp/frames-client@npm:^0.2.0":
version: 0.2.0
resolution: "@xmtp/frames-client@npm:0.2.0"
dependencies:
"@xmtp/proto": "npm:3.41.0-beta.2"
"@noble/hashes": "npm:^1.3.3"
"@xmtp/proto": "npm:3.41.0-beta.5"
long: "npm:^5.2.3"
peerDependencies:
"@xmtp/xmtp-js": ">9.3.1"
checksum: eb887dba90ccab0b7cd69010ed647f7bbb8f31dc953afe6223afb64f2d711bddffb936ab92fef54e46ba7f1eade35fa834a3ead7da75a5d45b9c438b165f59eb
checksum: d9ddc2a616b813b222ac282952701a6773abdc3fd360c2fc065d85d38ebdd3d43894c1f2904fb97803cbdc9490dc56f407c2a08732aaeffd7309edc9401ef819
languageName: node
linkType: hard

"@xmtp/frames-validator@workspace:packages/frames-validator":
version: 0.0.0-use.local
resolution: "@xmtp/frames-validator@workspace:packages/frames-validator"
dependencies:
"@xmtp/frames-client": "npm:^0.1.2"
"@xmtp/proto": "npm:3.41.0-beta.2"
"@xmtp/frames-client": "npm:^0.2.0"
"@xmtp/proto": "npm:3.41.0-beta.5"
"@xmtp/xmtp-js": "npm:^11.3.5"
ethers: "npm:^6.10.0"
typescript: "npm:^5.3.3"
vitest: "npm:^1.0.1"
languageName: unknown
linkType: soft
Expand Down Expand Up @@ -3024,15 +3034,15 @@ __metadata:
languageName: unknown
linkType: soft

"@xmtp/proto@npm:3.41.0-beta.2":
version: 3.41.0-beta.2
resolution: "@xmtp/proto@npm:3.41.0-beta.2"
"@xmtp/proto@npm:3.41.0-beta.5":
version: 3.41.0-beta.5
resolution: "@xmtp/proto@npm:3.41.0-beta.5"
dependencies:
long: "npm:^5.2.0"
protobufjs: "npm:^7.0.0"
rxjs: "npm:^7.8.0"
undici: "npm:^5.8.1"
checksum: 494d99f3346bc56e7b80133f7131d86a620c24aff81107288d9eae848f43a0b87071f805ac494ff48c32beb81559a078dabd99e21a2a9a54c2c83fab8d10523b
checksum: 03e9a5d127c5f2af34d80c0b5406fcb862c04dd203142f1d225b11964f9952e811ab97e313a60d8d47c9048b29a7d2196a0c2e8c21d787425543a9e6a9b04e9f
languageName: node
linkType: hard

Expand Down Expand Up @@ -9964,7 +9974,7 @@ __metadata:
languageName: node
linkType: hard

"typescript@npm:^5.1.3":
"typescript@npm:^5.1.3, typescript@npm:^5.3.3":
version: 5.3.3
resolution: "typescript@npm:5.3.3"
bin:
Expand All @@ -9974,16 +9984,6 @@ __metadata:
languageName: node
linkType: hard

"typescript@npm:~5.2.2":
version: 5.2.2
resolution: "typescript@npm:5.2.2"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
checksum: d65e50eb849bd21ff8677e5b9447f9c6e74777e346afd67754934264dcbf4bd59e7d2473f6062d9a015d66bd573311166357e3eb07fea0b52859cf9bb2b58555
languageName: node
linkType: hard

"typescript@patch:typescript@npm%3A^4.8.4#optional!builtin<compat/typescript>":
version: 4.9.5
resolution: "typescript@patch:typescript@npm%3A4.9.5#optional!builtin<compat/typescript>::version=4.9.5&hash=289587"
Expand All @@ -9994,7 +9994,7 @@ __metadata:
languageName: node
linkType: hard

"typescript@patch:typescript@npm%3A^5.1.3#optional!builtin<compat/typescript>":
"typescript@patch:typescript@npm%3A^5.1.3#optional!builtin<compat/typescript>, typescript@patch:typescript@npm%3A^5.3.3#optional!builtin<compat/typescript>":
version: 5.3.3
resolution: "typescript@patch:typescript@npm%3A5.3.3#optional!builtin<compat/typescript>::version=5.3.3&hash=e012d7"
bin:
Expand All @@ -10004,16 +10004,6 @@ __metadata:
languageName: node
linkType: hard

"typescript@patch:typescript@npm%3A~5.2.2#optional!builtin<compat/typescript>":
version: 5.2.2
resolution: "typescript@patch:typescript@npm%3A5.2.2#optional!builtin<compat/typescript>::version=5.2.2&hash=f3b441"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
checksum: f79cc2ba802c94c2b78dbb00d767a10adb67368ae764709737dc277273ec148aa4558033a03ce901406b35fddf4eac46dabc94a1e1d12d2587e2b9cfe5707b4a
languageName: node
linkType: hard

"ufo@npm:^1.3.0":
version: 1.3.2
resolution: "ufo@npm:1.3.2"
Expand Down

0 comments on commit 85dba7f

Please sign in to comment.