@openzeppelin/relayer-plugin-channels 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -21
- package/README.md +239 -60
- package/dist/client/channels-client.d.ts +142 -0
- package/dist/client/channels-client.d.ts.map +1 -0
- package/dist/client/channels-client.js +245 -0
- package/dist/client/errors.d.ts +47 -0
- package/dist/client/errors.d.ts.map +1 -0
- package/dist/client/errors.js +61 -0
- package/dist/client/index.d.ts +10 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +16 -0
- package/dist/client/types.d.ts +119 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -109
- package/dist/plugin/build.d.ts.map +1 -0
- package/dist/plugin/config.d.ts.map +1 -0
- package/dist/plugin/constants.d.ts.map +1 -0
- package/dist/plugin/fee.d.ts.map +1 -0
- package/dist/plugin/handler.d.ts +12 -0
- package/dist/plugin/handler.d.ts.map +1 -0
- package/dist/plugin/handler.js +117 -0
- package/dist/plugin/index.d.ts +7 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/index.js +10 -0
- package/dist/plugin/management.d.ts.map +1 -0
- package/dist/plugin/pool.d.ts.map +1 -0
- package/dist/plugin/simulation.d.ts.map +1 -0
- package/dist/plugin/submit.d.ts.map +1 -0
- package/dist/plugin/tx.d.ts.map +1 -0
- package/dist/plugin/types.d.ts.map +1 -0
- package/dist/plugin/validation.d.ts.map +1 -0
- package/package.json +3 -2
- package/dist/build.d.ts.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/constants.d.ts.map +0 -1
- package/dist/fee.d.ts.map +0 -1
- package/dist/management.d.ts.map +0 -1
- package/dist/pool.d.ts.map +0 -1
- package/dist/simulation.d.ts.map +0 -1
- package/dist/submit.d.ts.map +0 -1
- package/dist/test/config.test.d.ts +0 -2
- package/dist/test/config.test.d.ts.map +0 -1
- package/dist/test/config.test.js +0 -43
- package/dist/test/fee.test.d.ts +0 -2
- package/dist/test/fee.test.d.ts.map +0 -1
- package/dist/test/fee.test.js +0 -34
- package/dist/test/helpers/fakeKV.d.ts +0 -17
- package/dist/test/helpers/fakeKV.d.ts.map +0 -1
- package/dist/test/helpers/fakeKV.js +0 -60
- package/dist/test/management.test.d.ts +0 -2
- package/dist/test/management.test.d.ts.map +0 -1
- package/dist/test/management.test.js +0 -66
- package/dist/test/pool.busy.test.d.ts +0 -2
- package/dist/test/pool.busy.test.d.ts.map +0 -1
- package/dist/test/pool.busy.test.js +0 -23
- package/dist/test/pool.test.d.ts +0 -2
- package/dist/test/pool.test.d.ts.map +0 -1
- package/dist/test/pool.test.js +0 -29
- package/dist/test/tx.test.d.ts +0 -2
- package/dist/test/tx.test.d.ts.map +0 -1
- package/dist/test/tx.test.js +0 -29
- package/dist/test/validation.test.d.ts +0 -2
- package/dist/test/validation.test.d.ts.map +0 -1
- package/dist/test/validation.test.js +0 -31
- package/dist/tx.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/validation.d.ts.map +0 -1
- /package/dist/{build.d.ts → plugin/build.d.ts} +0 -0
- /package/dist/{build.js → plugin/build.js} +0 -0
- /package/dist/{config.d.ts → plugin/config.d.ts} +0 -0
- /package/dist/{config.js → plugin/config.js} +0 -0
- /package/dist/{constants.d.ts → plugin/constants.d.ts} +0 -0
- /package/dist/{constants.js → plugin/constants.js} +0 -0
- /package/dist/{fee.d.ts → plugin/fee.d.ts} +0 -0
- /package/dist/{fee.js → plugin/fee.js} +0 -0
- /package/dist/{management.d.ts → plugin/management.d.ts} +0 -0
- /package/dist/{management.js → plugin/management.js} +0 -0
- /package/dist/{pool.d.ts → plugin/pool.d.ts} +0 -0
- /package/dist/{pool.js → plugin/pool.js} +0 -0
- /package/dist/{simulation.d.ts → plugin/simulation.d.ts} +0 -0
- /package/dist/{simulation.js → plugin/simulation.js} +0 -0
- /package/dist/{submit.d.ts → plugin/submit.d.ts} +0 -0
- /package/dist/{submit.js → plugin/submit.js} +0 -0
- /package/dist/{tx.d.ts → plugin/tx.d.ts} +0 -0
- /package/dist/{tx.js → plugin/tx.js} +0 -0
- /package/dist/{types.d.ts → plugin/types.d.ts} +0 -0
- /package/dist/{types.js → plugin/types.js} +0 -0
- /package/dist/{validation.d.ts → plugin/validation.d.ts} +0 -0
- /package/dist/{validation.js → plugin/validation.js} +0 -0
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const vitest_1 = require("vitest");
|
|
4
|
-
const management_1 = require("../management");
|
|
5
|
-
const fakeKV_1 = require("./helpers/fakeKV");
|
|
6
|
-
(0, vitest_1.describe)("management", () => {
|
|
7
|
-
const OLD_ENV = process.env;
|
|
8
|
-
(0, vitest_1.beforeEach)(() => {
|
|
9
|
-
process.env = { ...OLD_ENV };
|
|
10
|
-
process.env.PLUGIN_ADMIN_SECRET = "test";
|
|
11
|
-
process.env.STELLAR_NETWORK = "testnet";
|
|
12
|
-
process.env.SOROBAN_RPC_URL = "http://localhost:9999";
|
|
13
|
-
process.env.FUND_RELAYER_ID = "fund";
|
|
14
|
-
});
|
|
15
|
-
(0, vitest_1.afterEach)(() => {
|
|
16
|
-
process.env = OLD_ENV;
|
|
17
|
-
});
|
|
18
|
-
(0, vitest_1.test)("isManagementRequest detects shape", () => {
|
|
19
|
-
(0, vitest_1.expect)((0, management_1.isManagementRequest)({ management: {} })).toBe(true);
|
|
20
|
-
(0, vitest_1.expect)((0, management_1.isManagementRequest)({})).toBe(false);
|
|
21
|
-
});
|
|
22
|
-
(0, vitest_1.test)("list and set channel accounts", async () => {
|
|
23
|
-
const kv = new fakeKV_1.FakeKV();
|
|
24
|
-
const ctx = {
|
|
25
|
-
kv,
|
|
26
|
-
params: {
|
|
27
|
-
management: { adminSecret: "test", action: "listChannelAccounts" },
|
|
28
|
-
},
|
|
29
|
-
};
|
|
30
|
-
const list1 = await (0, management_1.handleManagement)(ctx);
|
|
31
|
-
(0, vitest_1.expect)(Array.isArray(list1.relayerIds)).toBe(true);
|
|
32
|
-
const ctxSet = {
|
|
33
|
-
kv,
|
|
34
|
-
params: {
|
|
35
|
-
management: {
|
|
36
|
-
adminSecret: "test",
|
|
37
|
-
action: "setChannelAccounts",
|
|
38
|
-
relayerIds: ["A", "B"],
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
|
-
const set = await (0, management_1.handleManagement)(ctxSet);
|
|
43
|
-
(0, vitest_1.expect)(set.ok).toBe(true);
|
|
44
|
-
(0, vitest_1.expect)(set.appliedRelayerIds).toEqual(["a", "b"]);
|
|
45
|
-
const list2 = await (0, management_1.handleManagement)(ctx);
|
|
46
|
-
(0, vitest_1.expect)(list2.relayerIds).toEqual(["a", "b"]);
|
|
47
|
-
});
|
|
48
|
-
(0, vitest_1.test)("locked conflict on removal", async () => {
|
|
49
|
-
const kv = new fakeKV_1.FakeKV();
|
|
50
|
-
// Seed list
|
|
51
|
-
await kv.set("testnet:channel:relayer-ids", { relayerIds: ["a", "b"] });
|
|
52
|
-
// Simulate lock on 'b'
|
|
53
|
-
await kv.set("testnet:channel:in-use:b", { token: "t" });
|
|
54
|
-
const ctx = {
|
|
55
|
-
kv,
|
|
56
|
-
params: {
|
|
57
|
-
management: {
|
|
58
|
-
adminSecret: "test",
|
|
59
|
-
action: "setChannelAccounts",
|
|
60
|
-
relayerIds: ["a"],
|
|
61
|
-
},
|
|
62
|
-
},
|
|
63
|
-
};
|
|
64
|
-
await (0, vitest_1.expect)((0, management_1.handleManagement)(ctx)).rejects.toThrow("Locked relayer IDs cannot be removed");
|
|
65
|
-
});
|
|
66
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pool.busy.test.d.ts","sourceRoot":"","sources":["../../src/test/pool.busy.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const vitest_1 = require("vitest");
|
|
4
|
-
const pool_1 = require("../pool");
|
|
5
|
-
const fakeKV_1 = require("./helpers/fakeKV");
|
|
6
|
-
(0, vitest_1.describe)("ChannelPool busy mutex", () => {
|
|
7
|
-
(0, vitest_1.test)("acquire retries when global mutex is busy, then succeeds", async () => {
|
|
8
|
-
const kv = new fakeKV_1.FakeKV();
|
|
9
|
-
const pool = new pool_1.ChannelPool("testnet", kv);
|
|
10
|
-
// Configure a single relayer
|
|
11
|
-
await kv.set("testnet:channel:relayer-ids", { relayerIds: ["p1"] });
|
|
12
|
-
// Simulate busy global mutex briefly, then release
|
|
13
|
-
const globalKey = "testnet:channel-pool-lock";
|
|
14
|
-
await kv.set(globalKey, { token: "busy" });
|
|
15
|
-
setTimeout(() => {
|
|
16
|
-
void kv.del(globalKey);
|
|
17
|
-
}, 50);
|
|
18
|
-
const lock = await pool.acquire();
|
|
19
|
-
(0, vitest_1.expect)(lock.relayerId).toBe("p1");
|
|
20
|
-
// Release for cleanliness
|
|
21
|
-
await pool.release(lock);
|
|
22
|
-
});
|
|
23
|
-
});
|
package/dist/test/pool.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pool.test.d.ts","sourceRoot":"","sources":["../../src/test/pool.test.ts"],"names":[],"mappings":""}
|
package/dist/test/pool.test.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const vitest_1 = require("vitest");
|
|
4
|
-
const pool_1 = require("../pool");
|
|
5
|
-
const fakeKV_1 = require("./helpers/fakeKV");
|
|
6
|
-
(0, vitest_1.describe)("ChannelPool", () => {
|
|
7
|
-
(0, vitest_1.test)("acquire distributes and release removes lock", async () => {
|
|
8
|
-
const kv = new fakeKV_1.FakeKV();
|
|
9
|
-
const pool = new pool_1.ChannelPool("testnet", kv);
|
|
10
|
-
await kv.set("testnet:channel:relayer-ids", { relayerIds: ["p1", "p2"] });
|
|
11
|
-
const l1 = await pool.acquire();
|
|
12
|
-
const l2 = await pool.acquire();
|
|
13
|
-
(0, vitest_1.expect)(["p1", "p2"]).toContain(l1.relayerId);
|
|
14
|
-
(0, vitest_1.expect)(["p1", "p2"]).toContain(l2.relayerId);
|
|
15
|
-
(0, vitest_1.expect)(l1.relayerId).not.toEqual(l2.relayerId);
|
|
16
|
-
// Next acquire should fail (both locked)
|
|
17
|
-
await (0, vitest_1.expect)(pool.acquire()).rejects.toThrow("Too many transactions queued");
|
|
18
|
-
// Release one and ensure lock key gone
|
|
19
|
-
await pool.release(l1);
|
|
20
|
-
const stillLocked = await kv.exists(`testnet:channel:in-use:${l1.relayerId}`);
|
|
21
|
-
(0, vitest_1.expect)(stillLocked).toBe(false);
|
|
22
|
-
});
|
|
23
|
-
(0, vitest_1.test)("acquire fails on empty membership", async () => {
|
|
24
|
-
const kv = new fakeKV_1.FakeKV();
|
|
25
|
-
const pool = new pool_1.ChannelPool("testnet", kv);
|
|
26
|
-
await kv.set("testnet:channel:relayer-ids", { relayerIds: [] });
|
|
27
|
-
await (0, vitest_1.expect)(pool.acquire()).rejects.toThrow("No channel accounts configured");
|
|
28
|
-
});
|
|
29
|
-
});
|
package/dist/test/tx.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tx.test.d.ts","sourceRoot":"","sources":["../../src/test/tx.test.ts"],"names":[],"mappings":""}
|
package/dist/test/tx.test.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const vitest_1 = require("vitest");
|
|
4
|
-
const stellar_sdk_1 = require("@stellar/stellar-sdk");
|
|
5
|
-
const tx_1 = require("../tx");
|
|
6
|
-
(0, vitest_1.describe)("tx validation", () => {
|
|
7
|
-
const passphrase = stellar_sdk_1.Networks.TESTNET;
|
|
8
|
-
(0, vitest_1.test)("throws on far future timebounds", () => {
|
|
9
|
-
const acc = new stellar_sdk_1.Account("GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF", "1");
|
|
10
|
-
const tx = new stellar_sdk_1.TransactionBuilder(acc, {
|
|
11
|
-
fee: "100",
|
|
12
|
-
networkPassphrase: passphrase,
|
|
13
|
-
})
|
|
14
|
-
.setTimeout(300)
|
|
15
|
-
.build();
|
|
16
|
-
(0, vitest_1.expect)(() => (0, tx_1.validateExistingTransactionForSubmitOnly)(tx)).toThrow("too far into the future");
|
|
17
|
-
});
|
|
18
|
-
(0, vitest_1.test)("passes on short timeout", () => {
|
|
19
|
-
const acc = new stellar_sdk_1.Account("GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF", "1");
|
|
20
|
-
const tx = new stellar_sdk_1.TransactionBuilder(acc, {
|
|
21
|
-
fee: "100",
|
|
22
|
-
networkPassphrase: passphrase,
|
|
23
|
-
})
|
|
24
|
-
.setTimeout(30)
|
|
25
|
-
.build();
|
|
26
|
-
const out = (0, tx_1.validateExistingTransactionForSubmitOnly)(tx);
|
|
27
|
-
(0, vitest_1.expect)(out).toBe(tx);
|
|
28
|
-
});
|
|
29
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation.test.d.ts","sourceRoot":"","sources":["../../src/test/validation.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const vitest_1 = require("vitest");
|
|
4
|
-
const stellar_sdk_1 = require("@stellar/stellar-sdk");
|
|
5
|
-
const validation_1 = require("../validation");
|
|
6
|
-
(0, vitest_1.describe)("validation", () => {
|
|
7
|
-
(0, vitest_1.test)("accepts xdr-only request", () => {
|
|
8
|
-
const out = (0, validation_1.validateAndParseRequest)({ xdr: "BASE64XDR" });
|
|
9
|
-
(0, vitest_1.expect)(out).toEqual({ type: "xdr", xdr: "BASE64XDR" });
|
|
10
|
-
});
|
|
11
|
-
(0, vitest_1.test)("rejects xdr with extra keys", () => {
|
|
12
|
-
(0, vitest_1.expect)(() => (0, validation_1.validateAndParseRequest)({ xdr: "X", extra: 1 })).toThrow("`xdr` request must not include other parameters");
|
|
13
|
-
});
|
|
14
|
-
(0, vitest_1.test)("accepts func+auth with valid base64", () => {
|
|
15
|
-
const contract = new stellar_sdk_1.Contract("CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC");
|
|
16
|
-
const op = contract.call("no_auth_bump", stellar_sdk_1.xdr.ScVal.scvU32(1));
|
|
17
|
-
const body = op.body();
|
|
18
|
-
const inv = body.invokeHostFunctionOp();
|
|
19
|
-
const func = inv.hostFunction().toXDR("base64");
|
|
20
|
-
const auth = (inv.auth() ?? []).map((a) => a.toXDR("base64"));
|
|
21
|
-
const out = (0, validation_1.validateAndParseRequest)({ func, auth });
|
|
22
|
-
(0, vitest_1.expect)(out.type).toBe("func-auth");
|
|
23
|
-
});
|
|
24
|
-
(0, vitest_1.test)("rejects missing both", () => {
|
|
25
|
-
(0, vitest_1.expect)(() => (0, validation_1.validateAndParseRequest)({})).toThrow("Must pass either `xdr` or `func` and `auth`");
|
|
26
|
-
});
|
|
27
|
-
(0, vitest_1.test)("rejects missing func or missing auth", () => {
|
|
28
|
-
(0, vitest_1.expect)(() => (0, validation_1.validateAndParseRequest)({ func: "AAAA" })).toThrow("`func` and `auth` are both required");
|
|
29
|
-
(0, vitest_1.expect)(() => (0, validation_1.validateAndParseRequest)({ auth: [] })).toThrow("`func` and `auth` are both required");
|
|
30
|
-
});
|
|
31
|
-
});
|
package/dist/tx.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tx.d.ts","sourceRoot":"","sources":["../src/tx.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAO,MAAM,sBAAsB,CAAC;AAIxD,wBAAgB,wCAAwC,CACtD,EAAE,EAAE,WAAW,GACd,WAAW,CA6Cb"}
|
package/dist/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAEhD,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC5B;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC;IACvB,IAAI,EAAE,GAAG,CAAC,yBAAyB,EAAE,CAAC;CACvC,CAAC;AAEN;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE;QACV,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,qBAAqB,GAAG,oBAAoB,CAAC;QACrD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,OAAO,CAAC;IACZ,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB"}
|
package/dist/validation.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEjD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,GAAG,GAAG,sBAAsB,CAyF3E"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|