Skip to content

Commit b14ac39

Browse files
authored
Nialexsan/account resolve grpc fix (#1798)
* fix duplicated signs * add fix to changeset
1 parent a3143a8 commit b14ac39

File tree

3 files changed

+113
-1
lines changed

3 files changed

+113
-1
lines changed

.changeset/wet-chicken-unite.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"@onflow/fcl": patch
33
"@onflow/sdk": patch
44
"@onflow/transport-http": patch
5+
"@onflow/transport-grpc": patch
56
---
67

78
Fixed duplicate signatures when sending transaction

packages/transport-grpc/src/send-transaction.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,15 @@ export async function sendTransaction(ix, context = {}, opts = {}) {
7171
sig.setAddress(addressBuffer(sansPrefix(acct.addr), context))
7272
sig.setKeyId(acct.keyId)
7373
sig.setSignature(hexBuffer(acct.signature, context))
74-
tx.addPayloadSignatures(sig)
74+
75+
const isSignatureExist = tx.getPayloadSignaturesList().some(
76+
existingSignature => existingSignature.getAddress().toString() === sig.getAddress().toString()
77+
&& existingSignature.getKeyId() === sig.getKeyId()
78+
&& existingSignature.getSignature().toString() === sig.getSignature().toString()
79+
)
80+
if (!isSignatureExist) {
81+
tx.addPayloadSignatures(sig)
82+
}
7583
}
7684
} catch (error) {
7785
console.error("Trouble applying payload signature", {acct, ix})

packages/transport-grpc/src/send-transaction.test.js

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,4 +117,107 @@ describe("Transaction", () => {
117117

118118
expect(response.transactionId).toBe(returnedTransactionId)
119119
})
120+
121+
test("SendTransaction with duplicated payer", async () => {
122+
const unaryMock = jest.fn()
123+
124+
const returnedTransactionId = "a1b2c3"
125+
126+
unaryMock.mockReturnValue({
127+
getId_asU8: () => hexStrToUInt8Array("a1b2c3"),
128+
})
129+
130+
const built = await build([
131+
transaction`cadence transaction`,
132+
proposer({
133+
addr: "abc",
134+
keyId: 1,
135+
sequenceNum: 123,
136+
signingFunction: () => ({
137+
addr: "abc",
138+
keyId: 1,
139+
signature: "abc123",
140+
}),
141+
resolve: null,
142+
role: {
143+
proposer: true,
144+
authorizer: false,
145+
payer: false,
146+
param: false,
147+
},
148+
}),
149+
payer({
150+
addr: "def",
151+
keyId: 1,
152+
sequenceNum: 123,
153+
signingFunction: () => ({
154+
addr: "def",
155+
keyId: 1,
156+
signature: "def456",
157+
}),
158+
resolve: null,
159+
role: {
160+
proposer: false,
161+
authorizer: false,
162+
payer: true,
163+
param: false,
164+
},
165+
}),
166+
authorizations([
167+
{
168+
addr: "abc",
169+
keyId: 1,
170+
sequenceNum: 123,
171+
signingFunction: () => ({
172+
addr: "abc",
173+
keyId: 1,
174+
signature: "abc123",
175+
}),
176+
resolve: null,
177+
role: {
178+
proposer: false,
179+
authorizer: true,
180+
payer: false,
181+
param: false,
182+
},
183+
},
184+
]),
185+
ref("aaaa"),
186+
voucherIntercept(async voucher => {
187+
voucherToTxId(voucher)
188+
}),
189+
])
190+
191+
const resolved = await resolve(built)
192+
193+
const response = await sendTransaction(
194+
resolved,
195+
{
196+
response: responseADT,
197+
Buffer,
198+
},
199+
{
200+
unary: unaryMock,
201+
node: "localhost:3000",
202+
}
203+
)
204+
205+
expect(unaryMock.mock.calls.length).toEqual(1)
206+
207+
const unaryMockArgs = unaryMock.mock.calls[0]
208+
209+
expect(unaryMockArgs.length).toEqual(4)
210+
211+
const unaryType = unaryMock.mock.calls[0][1]
212+
213+
expect(unaryType).toEqual(AccessAPI.SendTransaction)
214+
215+
const unaryMockRequest = unaryMock.mock.calls[0][2]
216+
217+
expect(unaryMockRequest).not.toBeUndefined()
218+
219+
expect(response.transactionId).toBe(returnedTransactionId)
220+
221+
expect(unaryMockRequest.getTransaction().getPayloadSignaturesList()).toHaveLength(1)
222+
})
120223
})

0 commit comments

Comments
 (0)